Im ищет способ выровнять несколько элементов рядом друг с другом, заставляя их обертывать, как только они заполняют линию, а последний элемент занимает оставшуюся ширину последней строки.
Я уже встречал несколько вопросов по аналогичной теме, так как решения обычно используют элементы float: left
для выравнивания их по строке, а overflow: hidden
- для последнего элемента, что заставляет автоматически занимать оставшееся пространство. Эти решения работают отлично в одной строке, но они перестают работать, когда есть достаточно элементов до последнего элемента, которые они переносят на несколько строк. Затем "последний" элемент по-прежнему отображается в первой строке (если достаточно места), что делает его более не последним элементом.
Тем не менее, я хочу, чтобы последний элемент всегда оставался последним элементом, чтобы он был в последней строке - любая строка, которая есть, - и автоматически занимает оставшееся место там.
Это довольно просто с упаковкой flexbox, так как вам просто нужно поместить flex: 0 auto
на прежние элементы, чтобы они занимали все необходимое пространство (не принимая больше) и flex: 1
на последнем элементе чтобы он занял оставшуюся часть. Однако мне нужно поддерживать Internet Explorer 9, поэтому flexbox, к сожалению, не может быть и речи.
Вот как выглядит ситуация. При запуске фрагмента вы можете использовать кнопку "Toggle flex box" для переключения режима flexbox, который показывает, как он должен выглядеть.
* { box-sizing: border-box; }
.container {
width: 300px;
background: snow;
padding: 5px;
overflow: auto;
}
.element {
float: left;
margin: 2px 5px 2px 0;
background: lavender;
}
.last {
overflow: hidden;
}
.last > input {
width: 100%;
}
/* Working solution with flex box */
.flex .container {
display: flex;
flex-wrap: wrap;
}
.flex .element {
flex: 0 auto;
}
.flex .last {
flex: 1;
}
<div class="container">
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="last"><input type="text" /></div>
</div>
<div class="container">
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="element">Foo</div>
<div class="element">Foo bar</div>
<div class="element">Foo bar baz</div>
<div class="last"><input type="text" /></div>
</div>
<button onclick="this.parentNode.classList.toggle('flex')">Toggle flex box</button>