Rozważać flex-direction
Pierwszą rzeczą, która przychodzi na myśl podczas czytania pytania, jest to, że flex-basis
nie zawsze ma to zastosowanie width
.
Kiedy flex-direction
jest row
, flex-basis
kontroluje szerokość.
Ale kiedy flex-direction
jest column
, flex-basis
kontroluje wysokość.
Kluczowe różnice
Oto kilka ważnych różnic między flex-basis
i width
/ height
:
flex-basis
dotyczy tylko elementów flex. Elastyczne kontenery (które nie są również elastycznymi przedmiotami) będą ignorować, flex-basis
ale mogą używać width
i height
.
flex-basis
działa tylko na głównej osi. Na przykład, jeśli jesteś w środku flex-direction: column
, width
właściwość będzie potrzebna do wymiarowania elastycznych elementów w poziomie.
flex-basis
nie ma wpływu na absolutnie ustawione elementy elastyczne. width
i height
właściwości byłyby konieczne. Absolutnie umieszczone elementy flex nie uczestniczą w układzie flex .
Za pomocą flex
właściwości, trzy właściwości: - flex-grow
, flex-shrink
i flex-basis
- można wygodnie łączy się w jednym zgłoszeniu. Korzystanie z width
tej 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-basis
i width
, chyba że flex-basis
jest auto
lub content
.
Ze specyfikacji:
7.2.3 flex-basis
nieruchomość
Dla wszystkich wartości innych niż auto
a content
, flex-basis
został rozwiązany w ten sam sposób jak width
w poziomym trybie zapisu.
Ale wpływ auto
lub content
może być minimalny lub wcale. Więcej ze specyfikacji:
auto
Po określeniu w elemencie elastycznym auto
sł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 auto
razem z głównym rozmiarem ( width
lub height
) wynoszącym auto
.
Tak więc, zgodnie ze specyfikacją, flex-basis
i width
rozwiązać identycznie, chyba że flex-basis
jest auto
lub content
. W takich przypadkach flex-basis
może użyć szerokości treści (która, przypuszczalnie, również width
skorzystałaby z właściwości).
flex-shrink
czynnikiem
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
/ height
może zostać zastąpione.
Na przykład flex-basis: 100px
lub width: 100px
w połączeniu z flex-shrink: 1
niekoniecznie 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ą flex
stenografii, 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-basis
ignorowane w zagnieżdżonym kontenerze Flex. width
Pracuje.
Podczas używania flex-basis
kontener ignoruje wielkość jego elementów potomnych, a dzieci przepełniają pojemnik. Ale w przypadku tej width
właściwości kontener szanuje wielkość swoich dzieci i odpowiednio się rozszerza.
Bibliografia:
Przykłady:
wyginać przedmioty za pomocą flex-basis
i white-space: nowrap
przepełniać inline-flex
pojemnik. width
Pracuje.
Wygląda na to, że elastyczny zestaw kontenerów inline-flex
, którego nie rozpoznaje flex-basis
dziecko 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 width
wł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-basis
zawodzi 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: absolute
użycie float
i inline-block
spowoduje również wyświetlenie tego samego wadliwego wyniku ( demo jsfiddle ).
Błędy wpływające na IE 10 i 11: