Przejdź do treści

Elastyczność {flex-grow, flex-shrink, flex-basis, flex}

Jak sprawić, aby rozmiary elementów elastycznie dopasowały się do ich zawartości w wolnej przestrzeni na stronie?

CSS 3

Rozciągnięcie elastyczne {flex-grow} #

selektor { flex-grow: rozciągnięcie }
Selektorem mogą być dzieci kontenera elastycznego (ale nie sam kontener).

Rozciągnięcie jest wyrażone liczbą naturalną (większą lub równą zero), która określa proporcje, w jakich będą rozciągane elementy w kontenerze. Domyślna wartość - zero - odbiera elementom elastyczność.

Może się zdarzyć, że w jednym wierszu kontenera elastycznego mogłoby się zmieścić więcej elementów niż mamy zapewnionych. Wtedy zwykle z prawej strony pozostaje wolna przestrzeń. Możemy jednak sprawić, aby w takiej sytuacji szerokość elementów elastycznie dopasowała się w taki sposób, aby wypełniły całą dostępną przestrzeń kontenera. Jeżeli chcemy, aby wszystkie elementy zostały rozciągnięte równomiernie, wystarczy każdemu przypisać styl "flex-grow: 1". Możemy też zadecydować, aby np. jeden z nich rozszerzył się dwa razy bardziej niż inne - przypisujemy mu wartość "flex-grow: 2". Istnieje również możliwość ustalenia, aby tylko jeden element wypełnił całą pozostałą wolną przestrzeń w kontenerze. Wtedy tylko jemu nadajemy styl "flex-grow: 1".

Ściśnięcie elastyczne {flex-shrink} #

selektor { flex-shrink: ściśnięcie }
Selektorem mogą być dzieci kontenera elastycznego (ale nie sam kontener).

Ściśnięcie jest wyrażone liczbą naturalną (większą lub równą zero), która określa proporcje, w jakich będą ściskane elementy w kontenerze (domyślnie - "1").

Jeżeli kontener elastyczny jest zbyt wąski, jego dzieci są ściskane. Zwykle odbywa się to poprzez przełamanie do nowej linii tekstu, który zawiera się w tych blokach.

Baza elastyczna {flex-basis} #

selektor { flex-basis: baza }
Selektorem mogą być dzieci kontenera elastycznego (ale nie sam kontener).

Baza jest wartością określoną w jednostkach długości albo słowem kluczowym "auto" (domyślnie).

Baza określa początkowy rozmiar elementu w kontenerze, zanim wolna przestrzeń zostanie rozłożona pomiędzy dzieci kontenera.

Wartość "0" (zero) spowoduje, że rozmiary elementów będą bezpośrednio proporcjonalne do przypisanych im wartości flex-grow (albo flex-shrink - w przypadku ściśnięcia). Jeżeli wszystkie elementy kontenera będą miały przypisany styl "flex-grow: 1", w efekcie mogą zostać rozciągnięte do dokładnie takiego samego rozmiaru.

Wartość "auto" (domyślnie) spowoduje, że rozmiary absolutne poszczególnych elementów mogą nie być równe, ponieważ wolna przestrzeń rozłoży się proporcjonalnie tylko po bokach wewnątrz elementów.

Wartość "auto" rozkłada wolną przestrzeń równomiernie po bokach elementów, a "0" - na całych ich rozmiarach.

Źródło: CSS Flexible Box Layout Module

Powyższy diagram przedstawia różnice między "absolutną" (baza zerowa) a "relatywną" (baza zależna od zawartości elementów) elastycznością. Kolejne elementy w poszczególnych kontenerach elastycznych mają przypisaną wartość flex-grow odpowiednio: 1, 1, 2.

Atrybuty mieszane elastyczności {flex} #

selektor { flex: wartości atrybutów }

Polecenie to pozwala od razu podać rozciągnięcie, ściśnięcie i bazę elementów w układzie elastycznym. Każda z wartości jest opcjonalna, przy czym jeśli chcemy podać flex-shrink, należy obowiązkowo poprzedzić ją wartością flex-grow. Nie ma możliwości określenia w ten sposób samego ściśnięcia bez ustalania rozciągnięcia. Ponadto jeśli chcemy określić zerową długość flex-basis, trzeba koniecznie dopisać do niej jednostkę. Choć normalnie jednostka przy wartości zero nie jest wymagana, tutaj zapobiega omyłkowemu uznaniu długości bazy za rozciągnięcie lub ściśnięcie. Jednostkę można pominąć tylko, kiedy w deklaracji występują wszystkie trzy wartości.

Jako wartości atrybutów można wpisać również samo słowo kluczowe "none", co odpowiada: "0 0 auto" ("flex-grow: 0; flex-shrink: 0; flex-basis: auto"). Warto zauważyć, że domyślna wartość tych atrybutów jest inna - "0 1 auto".

Z uwagi na fakt, że składnia tego polecenia przewiduje najczęstsze przypadki użycia, zaleca się stosować zawsze atrybuty mieszane zamiast osobnych poleceń.

Przykład {flex}

none
flex: none
none

1 0px
flex: 1 0px
2 0px

1 auto
flex: 1 auto
2 auto

1 1 auto
flex: 1 1 auto
1 2 auto

Pytania i odpowiedzi {flex-basis, flex-shrink, flex-grow}

Co to jest "flex-basis"?

flex-basis to właściwość CSS używana w kontekście flexbox, która określa początkową szerokość elementu w kontenerze flex. Może to być wartość procentowa, pikselowa lub auto. flex-basis pomaga ustalić, ile miejsca element ma początkowo przed podziałem elastycznego miejsca w kontenerze.

Co to jest "flex-shrink"?

flex-shrink to właściwość CSS używana w kontekście flexbox, która określa, jak elementy mają się zmniejszać, gdy brakuje dostępnej przestrzeni w kontenerze. Domyślnie flex-shrink ma wartość 1, co oznacza, że elementy zmniejszą się równomiernie. Jeśli element ma wartość 0 (zero), nie będzie się zmniejszać w przypadku braku miejsca.

Co robi "flex-grow"?

flex-grow to właściwość CSS używana w kontekście flexbox, która określa, jak elementy mają się rozszerzać, gdy istnieje dodatkowa dostępna przestrzeń w kontenerze. Domyślnie flex-grow ma wartość 0 (zero), co oznacza, że elementy nie będą się rozszerzać. Jeśli element ma wartość większą niż 0, to rozszerzy się proporcjonalnie do innych elementów w kontenerze w zależności od ich wartości flex-grow.

Przeglądarki


Chrome

Firefox

Edge

Opera

Safari
Poziom wsparcia
min. 2,5 roku
flex-grow: wartość29
2013-08-20
20
2013-04-02
12
2015-07-29
12.1
2012-11-20
9
2015-09-30
 100%
flex-shrink: wartość29
2013-08-20
20
2013-04-02
12
2015-07-29
12.1
2012-11-20
9
2015-09-30
 100%
flex-basis: wartość29
2013-08-20
22
2013-06-25
12
2015-07-29
12.1
2012-11-20
9
2015-09-30
 100%
flex-basis: auto22
2012-09-25
22
2013-06-25
12
2015-07-29
12.1
2012-11-20
9
2015-09-30
 100%
flex: wartość29
2013-08-20
20
2013-04-02
12
2015-07-29
12.1
2012-11-20
9
2015-09-30
 100%
flex: none21
2012-07-31
≤72
2020-01-07
12
2015-07-29
15
2013-07-02
7
2013-10-22
 100%

Komentarze #

  • Comandeer
    Comandeer

    13.01.2014 21:24
    Roberto: "dobrze przy małych".
    np 20% z 480px - maciupkie to-to ;)
    jak już taki elastyczny chcemy na mobilnych najmniejszym nakładem kosztów, to warto dorzucić min-width itd
    Zobacz więcej

  • Roberto
    Roberto

    13.01.2014 14:38
    Coś tak - dopasowuje się do wielkości ekranu.
    Ale niekoniecznie będzie wyglądać dobrze przy małych/dużych ekranach.
    Więc - jest to jakiś start, ale nie wszystko co potrzeba do tego.
    Zobacz więcej

  • Gość
    Gość

    13.01.2014 12:35
    Czy to ma coś wspólnego z układami responsywnymi?
    http://en.wikipedia.org/wiki/Responsive_web_design
    Zobacz więcej

  • Sławomir Kokłowski
    Sławomir Kokłowski

    03.03.2013 20:52
    Sądzę, że bardziej niż starym Internet Explorerem należy się przejmować przeglądarkami mobilnymi, które w błyskawicznym tempie zdobywają rynek.
    Zobacz więcej

  • Luke
    Luke

    03.03.2013 19:02
    Nie chcę znowu zaczynać marudzić na temat IE, ale jedno jest faktem. Jeśli udział Windowsa XP nie zmniejszy się drastycznie (aktualnie wg ranking.pl ma ~35%), nie będzie można za bardzo robić układu strony na elementach nieobsługiwanych przez IE8 (które z kolei ma ~7% udziału). Dotyczy to w...
    Zobacz więcej

  • Sławomir Kokłowski
    Sławomir Kokłowski

    03.03.2013 13:03
    Specyfikacja CSS Flexible Box Layout Module od prawie pół roku jest w statusie kandydującej rekomendacji. Opera 12 od kilku ostatnich podwersji w 100% ją obsługuje (bez prefiksów).
    Natomiast o prefiksach w deklaracjach CSS nie wspominam w Kursie właśnie dlatego, że dopóki przeglądarka nie...
    Zobacz więcej

  • Comandeer
    Comandeer

    03.03.2013 12:52
    czy przypadkiem flex-box nie jest wciąż na tyle niestabilny, że lepiej wgl go na razie pominąć? wypadałoby też wspomnieć, że inne (Webkit, nie wiem jak Firefox i IE 10) również mają jakieś tam wsparcie dla flex-boxa, ale z vendor prefixami
    Zobacz więcej

Zobacz więcej komentarzy

Facebook