Poznajemy bardzo prosty sposób, aby używając flexboxa mieć elementy równej wielkości, niezależnie od ich ilości. Do dzieła.
Ok, tworzymy taki HTML:
<div class="flex-parent">
<button>Sth</button>
<button>Short</button>
<button>Longer 123</button>
<button>A little longer</button>
<button>Sth</button>
<button>Sth else</button>
</div>
Teraz stylujemy sobie flex parent:
.flex-parent {
display: flex;
/* flex-wrap: nowrap; */
/* flex-direction: row; */
/* flex-flow: row nowrap; */
}
Domyślnie flex wrap to no-wrap, flex direction to row. Warto też przypomnieć o istnieniu flex-flow, które jest takim skrótem, flex direction + flex wrap.
Ok, teraz nasze dzieci, czyli buttony:
.flex-parent > button {
flex-basis: 100%;
/* flex-shrink: 1; */
/* flex-grow: 0; */
/* flex: 0 1 100%; */
}
Flex basis ustawiamy na 100%, przy kierunku row to będzie oznaczać, że początkowo każdy element uzyska 100% width. Domyślnie nie ma flex grow (jest 0) oraz domyślnie flex-shrink ustawione jest na 1.
Teraz cała sztuczka polega na tym, że parent ma nowrap, zaś dzieci shrink 1 oraz taką basis, że mieści się tylko jedna. Gdyby był wrap, to nie mieszczące się elementy byłyby stackowane pod spodem (w sensie praktycznym mielibyśmy column).
Gdyby z kolei wrapa nie było, ale dzieci miały shrink 0, to każdy button zajmowałby 100% width, zaś następny byłby obok niego, mielibyśmy overflow poziomy.
Tego natomiast nie ma. Polecam Firefoxa, do flexboxa w każdym razie. Zobaczmy, co tam się dzieje. Kliknijmy button, po prawej będziemy mieli wypisane po ludzku initial space, negative space, rozmiar wyjściowy:
Wyjściowy rozmiar (flex-basis 100%) : 1800px
Elastyczność (flex-shrink 1): -1500px
Ostateczny rozmiar: 300px
Tak to mniej więcej wygląda. I chyba rozumiemy – width 100% to 1800px. Każdy element dostał początkowo tyle. Gdyby był wrap – wrap poustawiałby je pod spodem, uznając, że nie można zejść poniżej flex basis. Nie byłoby wrapa, ale shrink byłby 0? Byłby overflow poziomy.