Pull to refresh

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

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

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

Пример

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

Недостатки:
  • Две лишние обёртки.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.