Pojawiły się pytania i artykuły na ten temat, ale o ile mogę powiedzieć, nic rozstrzygającego. Najlepsze podsumowanie, jakie mogłem znaleźć, to
Flex-Base pozwala określić początkowy / początkowy rozmiar elementu, zanim cokolwiek innego zostanie obliczone. Może to być wartość procentowa lub bezwzględna.
... co samo w sobie niewiele mówi o zachowaniu elementów z zestawem flex- base . Z moją obecną wiedzą na temat flexboksa nie rozumiem, dlaczego nie mógłbym również opisać szerokości .
Chciałbym wiedzieć, jak dokładnie podstawa flex różni się od szerokości w praktyce:
- Gdybym zastąpić szerokość z giętkiego podstawie (i odwrotnie), co zmieni się wizualnie?
- Co się stanie, jeśli ustawię obie na inną wartość? Co się stanie, jeśli będą miały tę samą wartość?
- Czy są jakieś szczególne przypadki, w których użycie albo szerokości, albo elastycznej podstawy miałoby znaczącą różnicę w porównaniu z drugą?
- Czym różni się szerokość i podstawa elastyczności w połączeniu z innymi stylami Flexbox, takimi jak flex-wrap , flex-grow i flex-shrink ?
- Jakieś inne istotne różnice?
Edycja / wyjaśnienie : To pytanie zostało zadane w innym formacie w Co dokładnie w zestawach właściwości flex-base? ale czułem, że bardziej bezpośrednie byłoby porównanie lub podsumowanie różnic w podstawie podstawy i szerokości (lub wysokości ).
Odpowiedzi:
Rozważać
flex-direction
Pierwszą rzeczą, która przychodzi na myśl podczas czytania pytania, jest to, że
flex-basis
nie zawsze ma to zastosowaniewidth
.Kiedy
flex-direction
jestrow
,flex-basis
kontroluje szerokość.Ale kiedy
flex-direction
jestcolumn
,flex-basis
kontroluje wysokość.Kluczowe różnice
Oto kilka ważnych różnic między
flex-basis
iwidth
/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
iheight
.flex-basis
działa tylko na głównej osi. Na przykład, jeśli jesteś w środkuflex-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
iheight
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
iflex-basis
- można wygodnie łączy się w jednym zgłoszeniu. Korzystanie zwidth
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
iwidth
, chyba żeflex-basis
jestauto
lubcontent
.Ze specyfikacji:
Ale wpływ
auto
lubcontent
może być minimalny lub wcale. Więcej ze specyfikacji:Tak więc, zgodnie ze specyfikacją,
flex-basis
iwidth
rozwiązać identycznie, chyba żeflex-basis
jestauto
lubcontent
. W takich przypadkachflex-basis
może użyć szerokości treści (która, przypuszczalnie, równieżwidth
skorzystałaby z właściwości).flex-shrink
czynnikiemWaż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 poziomiejustify-content: flex-start
- elementy elastyczne będą układać się w stos na początku linii na głównej osialign-items: stretch
- elementy elastyczne zostaną rozszerzone, aby pokryć pojemnik o przekroju poprzecznymflex-wrap: nowrap
- przedmioty elastyczne są zmuszone pozostać w jednej liniiflex-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
lubwidth: 100px
w połączeniu zflex-shrink: 1
niekoniecznie będzie to 100 pikseli.Aby wyrenderować określoną szerokość - i utrzymać ją na stałym poziomie - musisz wyłączyć zmniejszanie:
LUB
LUB, zgodnie z zaleceniami specyfikacji:
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 tejwidth
właściwości kontener szanuje wielkość swoich dzieci i odpowiednio się rozszerza.Bibliografia:
Przykłady:
wyginać przedmioty za pomocą
flex-basis
iwhite-space: nowrap
przepełniaćinline-flex
pojemnik.width
Pracuje.Wygląda na to, że elastyczny zestaw kontenerów
inline-flex
, którego nie rozpoznajeflex-basis
dziecko podczas renderowania rodzeństwawhite-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 zamiastflex-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
(iflex-grow
) nie działa na elemencie tabeliBibliografia:
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życiefloat
iinline-block
spowoduje również wyświetlenie tego samego wadliwego wyniku ( demo jsfiddle ).Błędy wpływające na IE 10 i 11:
flex
skrócone deklaracje oflex-basis
wartościach jednostkowych są ignorowaneflex-basis
nie uwzględniabox-sizing: border-box
flex-basis
nie obsługujecalc()
flex-basis
podczas używaniaflex
stenografiiźródło
min-width:100px;
? Czy może to być opcja wyłączenia obkurczania?flex-shrink
zatrzymuje się namin-width
. Równoważna zasada flex byłabyflex: 1 0 100px
.flex: 1 0 100px
prowadzi do tego samego wyniku, ale nie jestem pewien, co rozumiesz przez „równoważny”.flex: 0 0 100px
, na przykład?Oprócz doskonałego podsumowania Michael_B warto to powtórzyć:
Ważna część tutaj jest początkowa .
Samo to rozwiązuje problem szerokości / wysokości, dopóki inne właściwości elastycznego wzrostu / kurczenia się nie wejdą w grę.
Więc. dziecko z
będzie początkowo miał szerokość 25%, ale następnie natychmiast rozszerzy tyle, ile może, dopóki nie zostaną uwzględnione pozostałe elementy. Jeśli nie ma, to będzie 100% szerokości / wysokości.
Szybkie demo:
Pokaż fragment kodu
Eksperymentowanie z
flex-grow
,flex-shrink
iflex-basis
(lub skrótemflex :fg fs fb
) ... może prowadzić do interesujących rezultatów.źródło
flex-basis
iwidth / height
ustawić na początku / wielkość wyjściową elementu. Na przykład wflex-basis: 200px
zasadzie działa tak samo jakflex-basis: auto; width: 200px;
. Wygląda na to, że kiedyflex-basis
nie jest ustawiony,auto
to po prostu przesłaniawidth / height
wartość. Jedyną różnicą, którą widzę, jest sposób obsługi przepełnienia zawartości.Być może najważniejszy punkt do dodania:
Co jeśli przeglądarka nie obsługuje
flex
? W takim przypadkuwidth/height
przejmij i zastosuj ich wartości.To bardzo dobry pomysł - prawie niezbędny - zdefiniować
width/height
na elementach, nawet jeśli masz wtedy zupełnie inną wartośćflex-basis
. Pamiętaj, aby przetestować, wyłączającdisplay:flex
i sprawdzając, co otrzymujesz.źródło
flex
.