Rozważać flex-direction
Pierwszą rzeczą, która przychodzi na myśl podczas czytania pytania, jest to, że flex-basisnie zawsze ma to zastosowanie width.
Kiedy flex-directionjest row, flex-basiskontroluje szerokość.
Ale kiedy flex-directionjest column, flex-basiskontroluje wysokość.
Kluczowe różnice
Oto kilka ważnych różnic między flex-basisi width/ height:
flex-basisdotyczy tylko elementów flex. Elastyczne kontenery (które nie są również elastycznymi przedmiotami) będą ignorować, flex-basisale mogą używać widthi height.
flex-basisdziała tylko na głównej osi. Na przykład, jeśli jesteś w środku flex-direction: column, widthwłaściwość będzie potrzebna do wymiarowania elastycznych elementów w poziomie.
flex-basisnie ma wpływu na absolutnie ustawione elementy elastyczne. widthi heightwłaściwości byłyby konieczne. Absolutnie umieszczone elementy flex nie uczestniczą w układzie flex .
Za pomocą flexwłaściwości, trzy właściwości: - flex-grow, flex-shrinki flex-basis- można wygodnie łączy się w jednym zgłoszeniu. Korzystanie z widthtej samej reguły wymagałoby wielu wierszy kodu.
Zachowanie przeglądarki
Pod względem sposobu ich renderowania nie powinno być różnicy między flex-basisi width, chyba że flex-basisjest autolub content.
Ze specyfikacji:
7.2.3 flex-basisnieruchomość
Dla wszystkich wartości innych niż autoa content, flex-basiszostał rozwiązany w ten sam sposób jak widthw poziomym trybie zapisu.
Ale wpływ autolub contentmoże być minimalny lub wcale. Więcej ze specyfikacji:
auto
Po określeniu w elemencie elastycznym autosłowo kluczowe pobiera wartość właściwości rozmiaru głównego jako użytej flex-basis. Jeśli ta wartość jest sama auto, wówczas używana jest wartość content.
content
Wskazuje automatyczną zmianę rozmiaru na podstawie zawartości elementu flex.
Uwaga: ta wartość nie była obecna w początkowej wersji programu Flexible Box Layout, a zatem niektóre starsze implementacje jej nie obsługują. Równoważny efekt można osiągnąć, stosując autorazem z głównym rozmiarem ( widthlub height) wynoszącym auto.
Tak więc, zgodnie ze specyfikacją, flex-basisi widthrozwiązać identycznie, chyba że flex-basisjest autolub content. W takich przypadkach flex-basismoże użyć szerokości treści (która, przypuszczalnie, również widthskorzystałaby z właściwości).
flex-shrinkczynnikiem
Ważne jest, aby pamiętać o początkowych ustawieniach elastycznego pojemnika. Niektóre z tych ustawień obejmują:
flex-direction: row - elementy elastyczne zostaną wyrównane w poziomie
justify-content: flex-start - elementy elastyczne będą układać się w stos na początku linii na głównej osi
align-items: stretch - elementy elastyczne zostaną rozszerzone, aby pokryć pojemnik o przekroju poprzecznym
flex-wrap: nowrap - przedmioty elastyczne są zmuszone pozostać w jednej linii
flex-shrink: 1 - przedmiot elastyczny może się kurczyć
Zwróć uwagę na ostatnie ustawienie.
Ponieważ elementy elastyczne mogą domyślnie się kurczyć (co zapobiega przepełnieniu kontenera), określone flex-basis/ width/ heightmoże zostać zastąpione.
Na przykład flex-basis: 100pxlub width: 100pxw połączeniu z flex-shrink: 1niekoniecznie będzie to 100 pikseli.
Aby wyrenderować określoną szerokość - i utrzymać ją na stałym poziomie - musisz wyłączyć zmniejszanie:
div {
width: 100px;
flex-shrink: 0;
}
LUB
div {
flex-basis: 100px;
flex-shrink: 0;
}
LUB, zgodnie z zaleceniami specyfikacji:
flex: 0 0 100px; /* don't grow, don't shrink, stay fixed at 100px */
7.2 Składniki elastyczności
Autorzy są zachęcani do kontrolowania elastyczności za pomocą flexstenografii, a nie bezpośrednio z jej właściwościami długodystansowymi, ponieważ stenografia poprawnie resetuje nieokreślone komponenty, aby uwzględnić typowe zastosowania .
Błędy przeglądarki
Niektóre przeglądarki mają problemy ze zmianą wielkości elementów elastycznych w zagnieżdżonych kontenerach elastycznych.
flex-basisignorowane w zagnieżdżonym kontenerze Flex. widthPracuje.
Podczas używania flex-basiskontener ignoruje wielkość jego elementów potomnych, a dzieci przepełniają pojemnik. Ale w przypadku tej widthwłaściwości kontener szanuje wielkość swoich dzieci i odpowiednio się rozszerza.
Bibliografia:
Przykłady:
wyginać przedmioty za pomocą flex-basisi white-space: nowrapprzepełniać inline-flexpojemnik. widthPracuje.
Wygląda na to, że elastyczny zestaw kontenerów inline-flex, którego nie rozpoznaje flex-basisdziecko podczas renderowania rodzeństwa white-space: nowrap(chociaż może to być tylko element o nieokreślonej szerokości). Pojemnik nie rozszerza się, aby pomieścić przedmioty.
Ale gdy widthwłaściwość jest używana zamiast flex-basis, kontener uwzględnia wielkość swoich potomków i odpowiednio się rozszerza. To nie jest problem w IE11 i Edge.
Bibliografia:
Przykład:
flex-basis(i flex-grow) nie działa na elemencie tabeli
Bibliografia:
flex-basiszawodzi w Chrome i Firefoksie, gdy pojemnik dziadka jest elementem kurczącym się, aby dopasować. Konfiguracja działa dobrze w Edge.
Podobnie jak w przykładzie przedstawionym w powyższym odsyłaczu, position: absoluteużycie floati inline-blockspowoduje również wyświetlenie tego samego wadliwego wyniku ( demo jsfiddle ).
Błędy wpływające na IE 10 i 11: