четверг, 26 июня 2014 г.

Плавающий блок на всю оставшуюся ширину

Довольно часто в верстке приходится создавать такую структуру, при которой в родительском блоке горизонтально размещается несколько блоков, чаще всего плавающих. И обычно требуется, чтобы последний блок занимал всё оставшееся место по ширине. До недавнего времени вполне устраивал следующий способ, при котором у нас известна ширина первого блока:

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%;
}

Преимущества:
  • Количество блоков перед плавающим, растягивающимся блоком может быть любое;
  • Ширина блоков может быть неизвестной.

Недостатки:
  • Две лишние обёртки.

IT-записки

comments powered by Disqus