od Podstaw
4 godz. 7 min · HTML i CSS · Full-stack i Programowanie
Wojciech PołowniakSr. Fullstack EngineerFlexbox nie jest trudny - pod warunkiem, że rozumiemy dlaczego elementy renderują się w konkretny sposób. Do tego potrzebna jest szczegółowa wiedza o osiach flexboxa, o tym jak ustalane są ich kierunki i jak elementy będą układać się wzdłuż nich.Dopiero wtedy dobrze można zrozumieć jak działa rozszerzanie i kurczenie elementów, jak elementy będą zachowywać się przy zmianie rozmiaru okna przeglądarki czy przy przełączaniu wyświetlania z układu wierszy na kolumnowy. To wszystko oraz kilka innych mechanizmów ukrytych we Flexboxie znajdziesz dokładnie wyjaśnione w tym kursie - podgląd przykładów czy dodatkowe quizy po zakończeniu kursu pomogą w utrwaleniu zdobytej wiedzy.
Wielu developerów nie jest świadomych, że korzystanie z niektórych właściwości Flexboxa wpływa na dostępność naszych stron WWW - dostosowywanie naszych witryn pod czytniki ekranowe oraz użytkowników korzystających z witryn w sposób niestandardowy to temat który zyskuje na coraz większej popularności (zwłaszcza, jeśli planujesz kiedyś tworzyć strony rządowe - te są zobligowane do tworzenia stron dostępnych dla osób niepełnosprawnych).W tym kursie, dowiesz się jakie problemy może nieść za sobą używanie flexboxa i jak ich unikać.
Kurs ten jest dla wszystkich osób, które dobrze czują się z CSS - wystarczy podstawowa umiejętność pisania selektorów. Nie ma żadnych wymagań dotyczących JavaScript, czy znajomości konkretnych frameworków. Natomiast jeśli do tej pory korzystałeś/aś z innych, starszych technologii do pozycjonowania elementów i chcesz nauczyć się prostszej, dobrze wspieranej współczesnej technologii - nie trać czasu! Flexbox to idealne wprowadzenie do kolejnych sposobów pozycjonowania jak np. CSS Grid.
Cześć witam cię w kolejnej części kursu flexbox od podstaw
w poprzedniej lekcji dowiedziałeś się jak wyrównywać elementy
wzdłuż osi main axis przy użyciu flexboxa
i właściwości justify-content
który to przyjmuje wartości takie jak flex-start flex-end center
space-around space-between czy space-evenly
i w tej lekcji będzie wyrównywanie elementów wzdłuż osi cross axis czyli osi przeciwstawnej
do osi main axis i aby to zrobić trzeba użyć analogicznej właściwości w kontenerze flexboxa
która nazywa się align-content
i align-content przyjmuje prawie takie same właściwości jak justify-content
to znaczy jeśli ustawimy align-content na flex-start
to zobacz że elementy są dociągnięte do początku osi cross axis w tym momencie
w przeciwieństwie do justify-content dociąga nam elementy
do początku osi main axis dlatego w tym momencie
przy takich dwóch parach właściwość wartość
oba ustawione na flex-start elementy będą wyrównane do lewego górnego ekranu
zakładając że mamy ustawione flex-direction na row
jeśli ustawimy align-content na flex-end
no to oczywiście elementy zostaną dociągnięte do końca osi przeciwstawnej
no i analogicznie tak na prawdę działają pozostałe właściwości takie jak center
czyli elementy są wycentrowane wzdłuż osi cross axis
mamy też do dyspozycji space-around space-evenly
i space-between
więc już teraz mamy bardzo dużą kontrolę nad naszym layoutem
powiedzmy że chcielibyśmy aby nasze karty były numerowane w ten sposób jak widzimy teraz na ekranie
czyli od najmniejszej do największej w kierunku
od lewej do prawej i zawiajane elementy będą układać się w dół
natomiast chcielibyśmy aby elementy były wycentrowane w poziomie
i dociągnięte do spodu kontenera
no to możemy to osiągnąć używając wartości center na justify-content
w tym momencie wycentrujemy sobie elementy wzdłuż osi x
no i ustawiając align-content na flex-end
dociągniemy je do końca osi cross axis
osi y i otrzymamy ten efekt
natomiast to że ta para wartości daje nam taki efekt na wyrenderowanej stronie
działa w ten sposób tylko dlatego że ustawiliśmy tutaj flex-direction na row
jeśli zmienimy flex-direction na powiedzmy column
to zobacz że elementy teraz wyglądają zupełnie inaczej
ponieważ zamieniła się nasza cross axis z naszą main axis
i w tym momencie elemnty są dociągnięte do końca osi poziomej
są wycentrowane w pionie jak widzisz tutaj odstęp od góry i dołu jest równy
jeśli byśmy sobie przescrollowali to troszkę to widać teraz że to
jest wycentrowane w pionie
no i analogicznie jeśli byśmy chcieli wycentrować wszystkie elementy
żeby znajdowały się na samym środku
naszej powiedzmy płaszczyzny kartezjańskiej
no to możemy dać do zarówno justify-content jak i align-content wartości center
i teraz jak widzisz nie ważne jaki będzie nasz rozmiar naszego viewportu naszego kontenera
to elementy pozostaną na środku
no i oczywiście będą zawiajały się do następnych wierszy
w tym momencie w układzie kolumnowym ponieważ mamy ustawione flex-direction na column
ale generalnie elementy są już wycentrowane w obu osiach
natomiast jak pewnie zauważyłeś domyślnie
jeśli nie ustawiliśmy tego align-content to te elementy mają tutaj taką dziwną przestrzeń między sobą
to to tylko tutaj powiększę byśmy mieli większy viewport do dyspozycji
i zobacz że ustawiając align-content na flex-start
ten layout wygląda inaczej to znaczy że align-content
nie ma dosmyślnej wartości flex-start tak jak justify-content
align-content ma domyślnie ustawioną wartość
o której jeszcze nie mówiliśmy i tą wartością jest stretch
stretch jest to z angielskiego ściągaj i w tym momencie tego nie widać
natomiast te elementy w każej linii flexa są rozciągnięte
nie widać tego ponieważ my ostylowaliśmy te karty w ten sposób aby te karty miały na sztywno
określoną wysokość bodajże 150 pikseli
natomiast jeśli na siłę zresetujemy sobie wysokość ustawimy ją na auto
to zobacz że te elementy rozciągnęły się w ten sposób aby każdy z nich
zajmował całą wysokość konkretnej linii
oczywiście jeśli mniejszymy wysokość viewportu to te elementy będą się tam tutaj kurczyć
natomiast ta przestrzeń nadmiarowa bierze się właśnie stąd
że my pomimo tego że mamy ustawione na sztywno wysokości
elementów które są pozycjonowane na flexie
to i tak to align-content stretch działa i w pewnym sensie rozciąga te linie
pomimo tego że my tego nie widzimy
natomiast w sytuacji gdy widzimy już znane nam z justify content właściwości
takie jak flex-end flex-start to wszystko zachowuje się w sposób bardziej przystępny
natomiast wartość stretch jest też bardzo ważną właściwością i bardzo często jest
przydatna przy tworzeniu stron www
ale zoabczmy jak te elementy będą się układać gdy nie zdefiniujemy
na sztywno wysokości dla każdej z naszej karty
więc w momencie kiedy ustawimy align-content na stretch
to oczywiście te elementy będą rozciągnięte na całą wysokość danej linii flexboxa
natomiast jeśli ustawimy na align-content flex-start
to zobacz że elementy skurczyły się i zajmują tyle wysokości
ile ma ich treść czyli to jest takie już zachowanie które powinno być ci znane
z tego jak działają elementy blokowe na przykład div'y
natomiast skomplikujmy może jeszcze troszkę tą sytuację
zakładając że każda z tych kart może mieć różną wysokość
zmienimy height auto na powiedzmy 100 pikseli
i ustawimy aby to 100 pikseli było ustawione tylko na
drugim elemencie danego typu czyli na drugiej karcie ustawiamy na sztywno
100 pikseli wszystkie pozostałe karty mają swoje ustawione 150 pikseli
no i domyślnie elementy układają się w ten sposób że dwójka jest dociągnięta
do górnej krawędzi danej linii flexboxa
zobacz że jeśli będziemy manipulować wartością align-content czyli ustawimy
jej powiedzmy flex-end to ta dwójka dalej jest w tej samej pozycji
czyli za pomocą właściwości align-content nie możemy kontrolować położenia elementu
w konkretnej linii flexboxa do tego musimy użyć innej właściwości
i tą właściwością jest align-items
tutaj może się wydawać że domyślną wartością właściwości align-items jest flex-start
natomiast jest nią stretch tak samo jak w przypadku align-content
i to że ona jest dociągnięta do góry to jest właśnie efekt tego
że ustawiliśmy jej wysokość na sztywno
i jest po prostu mniejsza niż pozostałe elementy w danej linii flexboxa
natomiast align-items ma troszkę mniej wartości na dyspozycji
mamy na nim oczywiśćie flex-start flex-end i w tym momencie zobacz że
ta dwójka została dociągnięta do dolnej krawędzi danej linii flexboxa
mamy też center mamy również stretch
natomast wartością unikalną dla align-items jest baseline
i w tym momencie nie widzimy żadnego efektu
natomiast jeśli zmienimy wysokość w tym przypadku pierwszej karty
moglibyśmy tutaj oczywiście użyć selektora first child
i zmienimy wysokość na powiedzmy 200 pikseli i ustawimy padding
górny na 40 pikseli to zobacz że elementy wyrównały się w ten sposób
aby tekst aby wartości tekstowe generalnie treść danego bloku
była równa to znaczy
wszystkie elementy wyrównały się do tej jedynki ta dwójka
pomimo tego że ma mniejszą wysokość niż pozostałe elementy
wypozycjonowała się w ten sposób
aby być na jednej linii no i oczywiście analogicznie pozostałe elementy
też się w ten sposób ułożyły a szóstka jako że jest w osobnej linii
no to już tego tutaj nie widzimy
i zobacz że korzystając tak na prawdę z pięciu właściwości flexboxa
możemy stworzyć na prawdę skomplikowane layouty w kontekście tego
jak całe linie mają się układać używając właściwości align-content
definiować jak elementy w poszczególnych liniach powinny układać się
jeśli są różnej wielkości
i całość możemy oczywiście obracać przy pomocy
różnych właściwości dla flex-direction
aby zaaplikować tą wiedzę w praktyce może wyrównajmy
pozycję numeru każdej karty
w ten sposób aby była ona wycentrowana
więc musimy stworzyć na selektorze kart
dla każdej naszej karty właściwość display flex
aby ustawić że te wszystkie elementy będą zarówno kontenerami flexboxa jak i to
że będą pozycjonowane przez flexboxa jako że są bezpośrednimi dziećmi tego body
flex-direction nie musimy ustawiać ponieważ domyślnie jest ustawiony na row
flex-wrap tak samo nie musimy zmieniać ponieważ mamy tylko jeden element w każdej z kart
to co musimy zrobić to wyrównać te elementy
wzdłuż osi main axis
akurat tutaj zarówno kontener body jak i każda karta ma taki sam układ
więc aby wycentrować to w poziomie używamy justify-content
ustawiony na center i aby
wycentrować to w poziomie używamy align-items center
ponieważ jeśli wykorzystamy align-content to w tym wypadku to nie zadziała ponieważ ponieważ mamy tylko jedną linię flexboxa
więc ona i tak rozciągnie się na całą wysokość kontenera
natomiast zobacz jeszcze ciekawa sytuacja
my tutaj tylko ustawiliśmy align-items na center czyli ustawiliśmy aby ten tekst
był w środku tej karty oczywiście tutaj wizualnie to
się nie zgadza ponieważ mamy ręcznie ustawiony padding jeśli się go pozbędziemy
to w tym momencie wszystko wygląda tak jak powinno
to znaczy jest równe natomiast
elementy natomiast same karty dalej wyrównują się aby mieć baseline
równy pierwszemu znacznikowi który ma w sobie tekst
dlatego ustawienie padding top
na dodatnie wartości powiedzmy 30 pikseli będzie nie tylko przesuwać
położenie tej naszej jedynki w czerwonej karcie
ale również będzie przesuwać wszystkie pozostałe item'y
w ten sposób aby tekst był równy
w kolejnych przykładach będziemy korzystali raczej z uproszczonego layout'u
czyli pozbędziemy się align-items
i całą resztę zostawimy tak jak jest
a w kolejnej lekcji opowiem trochę jak działa
kurczenie się i rozszerzanie elementów używając flexboxa