Довольно часто в верстке приходится создавать такую структуру, при
которой в родительском блоке горизонтально размещается несколько блоков,
чаще всего плавающих. И обычно требуется, чтобы последний блок занимал
всё оставшееся место по ширине. До недавнего времени вполне устраивал
следующий способ, при котором у нас известна ширина первого блока:
HTML
CSS
Пример
Недостатки этого способа лишь:
Но недавно столкнулся с такими требованиями:
Решение было следующим.
HTML
CSS
Преимущества:
Недостатки:
HTML
<div class="container clearfix">
<div class="fixed">Блок с известной шириной</div>
<div class="stretch">Блок, заполняющий оставшееся место</div>
</div>
CSS
.clearfix:before,
.clearfix:after {
content: " ";
display: table;
}
.clearfix:after {
clear: both;
}
.container {
position: relative;
height: 40px;
background: #ddd;
border: 1px solid #999;
overflow: hidden;
}
.fixed {
float: left;
width: 200px;
height: 40px;
background: #eee;
}
.stretch {
margin-left: 210px;
height: 40px;
background: #aaa;
text-overflow: ellipsis;
overflow: hidden;
}
Пример
Недостатки этого способа лишь:
- Нужно задать ширину первому блоку, соответственно такой же отступ второму.
Но недавно столкнулся с такими требованиями:
- Может быть любое количество плавающих блоков;
- Не все блоки с фиксированной шириной (есть с минимальным или максимальным значением ширины);
- Ну и как обычно последний блок должен занимать всё оставшееся место по ширине.
Решение было следующим.
HTML
<div class="container clearfix">
<div class="element">
Плавающий блок
</div>
<div class="element">
Плавающий блок
</div>
<div class="element">
Плавающий блок
</div>
<div class="element">
<div class="stretch-element">
<div class="table-cell">
Блок, заполняющий оставшееся место по ширине
</div>
</div>
</div>
</div>
CSS
.clearfix:before,
.clearfix:after {
content: " ";
display: table;
}
.clearfix:after {
clear: both;
}
.container {
position: relative;
background: #ddd;
border: 1px solid #999;
overflow: hidden;
}
.element {
float: left;
margin-right: 5px;
min-width: 50px;
max-width: 100px;
height: 40px;
background: #eee;
}
.stretch-element {
position: absolute;
height: 40px;
background: #eee;
overflow: hidden;
}
.table-cell {
display: table-cell;
width: 1%;
}
Преимущества:
- Количество блоков перед плавающим, растягивающимся блоком может быть любое;
- Ширина блоков может быть неизвестной.
Недостатки:
- Две лишние обёртки.