Je suis à la recherche d'un moyen d'aligner plusieurs éléments les uns à côté des autres, en les faisant envelopper une fois qu'ils sont remplis de la ligne, et le dernier point de prendre la largeur restante de la dernière ligne.
J'ai trouvé plusieurs questions sur un sujet similaire avant, avec des solutions faisant généralement de l'utilisation par les éléments d' float: left
pour les aligner sur une ligne, et overflow: hidden
sur le dernier élément qui prend de l'espace restant automatiquement. Ces solutions fonctionnent bien dans une seule ligne, mais ils s'arrêtent de travailler une fois il y a suffisamment d'articles avant le dernier élément, qu'ils l'envelopper dans plusieurs lignes. Ensuite, le "dernier" élément est toujours rendu dans la première ligne (si il y a assez d'espace), ce qui n'est plus le dernier élément.
Cependant, je veux que le dernier élément de rester le dernier élément à tout moment, pour l'avoir dans la dernière ligne-quelle que soit la ligne qui est-et de prendre automatiquement le reste de l'espace.
C'est assez simple, avec un emballage flexbox, car vous avez juste besoin de mettre flex: 0 auto
sur les premiers éléments de leur faire prendre tout l'espace dont ils ont besoin (sans prendre de plus), et flex: 1
sur le dernier élément à prendre il prendre le reste. Cependant, j'ai besoin de prendre en charge Internet Explorer 9, flexbox est malheureusement hors de question.
C'est la façon dont la situation ressemble. Lors de l'exécution du fragment de code, vous pouvez utiliser le bouton "Basculer flex zone" bouton pour basculer flexbox mode qui montre la façon dont il devrait ressembler.
* { 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>