Как сделать чтобы блок footer не опускался за границы родительского контейнера
Всем доброго времени суток. Нужен совет.
Есть 3 блока: .header, .content, .footer помещенные в .container (aqua):
<div class="container" style="background: aqua">
<div class="header"> This is header. . . </div>
<div class="content">
1<br>
2<br>
3
</div>
<div class="footer"> This is footer </div>
</div>
Надо чтобы при увеличении высоты .content элемент .footer опускался до тех пор пока не дойдет до нижней границы .container. Дальнейшее добавление контента в .content не должно приводить к увеличению высоты, а только к появлению скрола (overflow-y: auto):
У кого-то есть идеи как это можно сделать средствами CSS?
P.S. ВАЖНО! Высота .header не известна и вычисляется самим браузером на основании содержимого. Высоту .footer мы можем условно принять в 30 px если это поможет решить задачу.
Ответы (3 шт):
Подходит ли вам данный вариант с использованием гридов?
.container
{
background-color: aqua;
height: 100px;
display: grid;
grid-gap: 5px;
padding: 5px;
margin-bottom: 10px;
align-content: start;
}
.content
{
overflow-y: auto;
}
.header,
.content,
.footer
{
border: 1px solid #ACACAC;
}
<div class="container">
<div class="header">This is header</div>
<div class="content">
Line 01<br>
Line 02<br>
Line 03<br>
Line 04<br>
Line 05<br>
Line 06<br>
Line 07<br>
Line 08<br>
Line 09<br>
Line 10<br>
Line 11<br>
Line 12<br>
Line 13<br>
Line 14
</div>
<div class="footer">footer</div>
</div>
<div class="container">
<div class="header">header</div>
<div class="content">
Line 1<br>
Line 2
</div>
<div class="footer">This is footer</div>
</div>
Можно использовать вертикальный flex, отключив сжатие у .header и .footer
.container{
padding: 5px;
display: flex;
flex-direction: column;
max-height: 160px;
}
.header{
padding: 5px 0;
border: 1px solid blue;
flex: 0 0 auto;
}
.content{
flex: 0 1 auto;
overflow: auto;
padding: 10px 0;
}
.footer{
border: 1px solid blue;
flex: 0 0 auto;
}
<div class="container" style="background: aqua">
<div class="header"> This is header. . . </div>
<div class="content">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
</div>
<div class="footer"> This is footer </div>
</div>
Устанавливаем контейнеру высоту экрана и делаем его флекс блоком, шапке и футеру устанавливаем flex-shrink: 0; чтобы занимали столько места сколько им надо, а контент overflow-y: auto
body {
margin: 0;
padding: 0;
}
.container {
height: 100vh;
display: flex;
flex-direction: column;
}
.header,
.footer {
flex-shrink: 0;
}
.content {
overflow-y: auto
}
<div class="container" style="background: aqua">
<div class="header"> This is header. . . </div>
<div class="content">
1<br>
2<br>
3 1<br>
2<br>
3 1<br>
2<br>
3 1<br>
2<br>
3 1<br>
2<br>
3 1<br>
2<br>
3 1<br>
2<br>
3 1<br>
2<br>
3
</div>
<div class="footer"> This is footer </div>
</div>
body {
margin: 0;
padding: 0;
}
.container {
height: 100vh;
display: flex;
flex-direction: column;
}
.header,
.footer {
flex-shrink: 0;
}
.content {
overflow-y: auto
}
<div class="container" style="background: aqua">
<div class="header"> This is header. . . </div>
<div class="content">
1<br>
2<br>
3
</div>
<div class="footer"> This is footer </div>
</div>

