Chcę użyć flexbox, który ma pewną liczbę elementów o tej samej szerokości. Zauważyłem, że flexbox rozdziela przestrzeń równomiernie, a nie samą przestrzeń.
Na przykład:
.header {
display: flex;
}
.item {
flex-grow: 1;
text-align: center;
border: 1px solid black;
}
<div class="header">
<div class="item">asdfasdfasdfasdfasdfasdf</div>
<div class="item">z</div>
</div>
Pierwsza pozycja jest dużo większa niż druga. Jeśli mam 3 elementy, 4 elementy lub n elementów, chcę, aby wszystkie pojawiały się w tym samym wierszu z jednakową ilością miejsca na element.
Jakieś pomysły?
flex
właściwość jest skróconą własnością właściwościflex-grow
,flex-shrink
iflex-basis
. Zaleca się używanie skrótu do poszczególnych właściwości, ponieważ skrót poprawnie resetuje wszystkie nieokreślone komponenty, aby dostosować się do typowych zastosowań. Wartość początkowa to0 1 auto
.min-width: 0
aby osiągnąć użycie elementów potomnych z przepełnionym tekstem. Zobacz css-tricks.com/flexbox-truncated-textMożesz dodać,
flex-basis: 100%
aby to osiągnąć.Zaktualizowany przykład
Za to, co jest warte, możesz również użyć
flex: 1
dla tych samych wyników.Skrót od
flex: 1
jest taki sam jakflex: 1 1 0
, co jest równoważne z:źródło
flex: 0 1 auto
. Co oznacza, że ustawienieflex: 1
spowodujeflex: 1 1 auto
. To nie zadziała. Prawidłowa odpowiedź jest taka,flex: 1 1 0
jak podano powyżej Adamflex: 1
wynikówflex: 1 1 0
nie jestflex: 1 1 auto
taki, jak twierdzisz. Spójrz na oficjalną specyfikację W3 w sekcji „flex shorthand” : kiedyflex-basis
jest „pominięte w skrócie flex, jego określona wartość to0
”, nieauto
. Dzięki za losowy głos przeciw.flex: 1
iflex-direction: column
. Wysokość dzieci nie była taka sama, gdy inne elementy są umieszczane w dzieciach. Jedyną rzeczą, która go naprawiła, było ustawienieflex: 1 1 0
. Nadal stoi dzisiaj z chromem 55.0.2883.87flex: 1
zachowuje się tak samo jakflex: 1 1 0
iflex: 0 1 auto
zachowuje się inaczej.Musisz dodać,
width: 0
aby kolumny były równe, jeśli zawartość elementów powoduje, że rosną.źródło
.item
powoduje, że rozszerza się on bardziej niż.item
byłoby to naturalne.flex: 1 1 0;
, zamiastflex-grow: 1 1 0;
flex-basis
do0
służy temu samemu celowi co ustawieniewidth
do0
.Zaakceptowana odpowiedź Adama (
flex: 1 1 0
) działa doskonale w przypadku kontenerów typu flexbox, których szerokość jest stała lub określona przez przodka. Sytuacje, w których chcesz, aby dzieci pasowały do pojemnika.Może się jednak zdarzyć, że chcesz, aby pojemnik pasował do dzieci, a dzieci powinny mieć równe rozmiary w oparciu o największe dziecko. Możesz dopasować kontener typu flexbox do swoich elementów podrzędnych:
position: absolute
a nie ustawieniewidth
lubright
, lubdisplay: inline-block
W przypadku takich pojemników typu flexbox przyjęta odpowiedź NIE działa, dzieci nie mają równych rozmiarów. Przypuszczam, że jest to ograniczenie flexboksa, ponieważ zachowuje się tak samo w Chrome, Firefox i Safari.
Rozwiązaniem jest użycie siatki zamiast flexboksa.
Demo: https://codepen.io/brettdonald/pen/oRpORG
źródło
Nie jestem ekspertem w dziedzinie flex, ale osiągnąłem to, ustawiając podstawę na 50% dla dwóch rzeczy, z którymi miałem do czynienia. Rosną do 1 i zmniejszają się do 0.
Stylizacja inline:
flex: '1 0 50%',
źródło