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 lekcji kursu flexbox
od podstaw i w tym konkretnym nagraniu opowiem troszkę o tym jak zarządzać rośnięciem
elementów flexbox na każdym elemencie który jest pozycjonowany przez
fletboxa czyli jest bezpośrednim dzieckiem kontenera który
ma na sobie ustawione display flex możemy używać właściwości takiej jak flex-grow
i flex-grow domyślnie przyjmuje wartość 0 i
właściwość ta określa stosunek wzrostu dzieci tego konkretnego
kontenera względem siebie co to znaczy ustawmy na wszystkich
znacznikach o klasie card flex-grow na 1 ponieważ
flex-grow przyjmuje wartości numeryczne całkowite
nieujemne i zobacz że wszystkie elementy rozszerzyły się
tak aby zajmować się jak najwięcej miejsca w danej linii to
znaczy pierwsze cztery elementy rozszerzyły się tylko
troszkę ponieważ są w niej aż cztery elementy natomiast elementy
z drugiej linii rozszerzyły się o wiele bardziej ponieważ miały po prostu więcej miejsca
jeśli teraz rozszerzymy nasz viewport to
zobacz że w zależności od tego jak dużo elementów znajduje
się w danej linii flexboxa tak bardzo konkretne
karty będą nam się rozszerzać jeśli będziemy manipulować
teraz rozmiarem tego viewport'u to zobacz że każda z kart
zajmuje bardzo dużo przestrzeni natomiast dalej respektują
one tutaj ten margines który ustawiliśmy im na początku czyli
5 pikseli z lewej i 5 pikseli z prawej i jako że elementy
rozszerzają się w tym momencie na całą szerokość
kontenera do tego justify-content ustawionego
na center już w tym momencie tak bardzo nie widać ponieważ elementy
zajmują całą dostępną przestrzeń czyli jeśli wstawimy tutaj flex
start to tak naprawdę nie widać różnicy
ponieważ justify-content tak jak inne właściwości flexboxa
operuje na dostępnej przestrzeni jeśli nie mam dostępnej
przestrzeni no to nie będziemy widzieli efektu danej właściwości
natomiast dlaczego
wstawiliśmy tutaj 1 jak już wspomniałem flex-grow jest
to stosunek rozmiarów elementów flexboxa
czyli innymi słowy ustawiając flex-grow na
wszystkich znacznikach kart i ustawiając to na wartość inną niż zero
czyli ustalamy że wszystkie elementy mają rosnąć w jakimkolwiek stopniu mówimy
że każda z tych kart powinna urosnąć i każda z tych kart powinna
urosnąć o tyle samo czerpiąc z dostępnej przestrzeni w
danej linii aby to lepiej zobrazować
przywrócę tutaj wartość domyślną flex-grow na zero i na konkretnej
karcie powiedzmy że w tym momencie na pierwszej ustawie
flex-grow na 1 i zwróć uwagę że pozostałe
elementy które nie mają ustalonego tego flex-grow 1 zupełnie nie urosły
zostały w takich samych rozmiarach jakie miały ustawione początkowo
za pomocą flex-basis natomiast pierwsza karta zajęła
całą dostępną przestrzeń jeśli wpiszemy tutaj
w tym momencie tylko na tym konkretnym selektorze czyli na pierwszej karcie wartość większą
niż 1 to rozmiar tej karty się nie zwiększy ponieważ
flex-grow definiuje stosunek rozmiarów ustawiając
flex-grow na 1 tylko na jednym elemencie mamy pewność
że zajmie on tak dużo przestrzeni jak będzie tylko dostępne
i nie będzie mógł się bardziej rozszerzyć natomiast jeśli ustawimy
flex-grow na 1 dla pierwszej
karty i załóżmy dla drugiej karty flex-grow
na 3 to teraz już widać tą różnicę wielkości ponieważ
i pierwsza i druga karta mają
powiększyć się o tą nadmiarową przestrzeń którą widzimy
tutaj na drugiej linii flexboxa natomiast karta
druga powinna zabrać 3 razy więcej tej przestrzeni niż
karta pierwsza i tutaj też trzeba zauważyć że ustawiając
flex-grow na 3 na karcie numer 2 i
flex-grow 1 na karcie numer 1 nie
mamy gwarancji że karta numer 2 będzie 3
razy większa niż karta numer flexbox dysponuje tylko
tą przestrzenią która jest dostępna w danej linii dostępna
to znaczy nie zajęta przez rozmiary danej
karty wzdłuż osi main axis wliczając
w to margines tej konkretnej karty więc
więc może ja zamienię justify-content na flex-start
na momencik i teraz już troszkę lepiej widzimy jaką przestrzenią dysponujemy
tak naprawdę karta pierwsza i druga dysponują zaledwie około
70 pikselami o które mogą się powiększyć
tutaj z rozszerzenia dimensions pokazuje mi 75 natomiast ja
odejmuję te 5 pikseli ponieważ karta numer 6 ma również swój margines
z prawej strony o wartości 5 pikseli więc zostaje
nam tutaj do dyspozycji tylko 70 pikseli i te 70 pikseli
jest rozdystrybuowane pomiędzy karty
pierwszą i drugą w taki sposób aby karta druga
otrzymała 3 razy więcej tej przestrzeni niż karta
pierwsza czyli jeśli wyłączymy
chwilowo flex-grow na obu tych znacznikach to widzimy że faktycznie karty
rozszerzają się tylko o tyle o ile pozwala
na to przestrzeń w danej linii flexboxa i
oczywiście flex-grow działa wzdłuż osi main axis
czyli tylko i wyłącznie zmieniając właściwość flex-direction
na column zmieniamy sposób
w jaki elementy będą rosły teraz flex-grow nie działa już
wzdłuż osi poziomej działa wzdłuż osi pionowej osi y ponieważ
zmieniliśmy naszą główną oś na oś pionową
można flex-grow traktować jako takie align-items
czy align-content dla osi main axis ponieważ mamy możliwość
rozszerzenia konkretnych elementów wzdłuż osi podstawowej ale
nie powinniśmy myśleć o flex-grow że rozszerza nam
szerokość bądź wysokość danego elementu tylko powinniśmy myśleć
właśnie w kontekście osi jak całym flexboxie ja tu jeszcze zaprezentuję
jeden ciekawy przykład co można zyskać korzystając z właściwości flex-grow
i ustawię że na każdej karcie która
ma na sobie kursor ustawimy flex-grow na
1 możemy tutaj też przywrócić justify-content na center
i teraz w momencie gdy
najedziemy na daną kartę to widzimy że ona się rozrośnie tak
aby zajmować maksymalną domyślną przestrzeń natomiast
taka skokowa zmiana wartości dla szerokości elementu
nie jest zbyt estetyczna więc możemy skorzystać z właściwości transition
i ustawić na głównym selektorze kart transition
flex-grow powiedzmy
na trzy setne sekundy jako timing function
podając ease-in-out
i teraz jeśli najedziemy na konkretny na konkretną kartę
będziemy mieli ładną animację rozszerzania się
co na pewno będzie bardzo estetycznym dodatkiem dla nowoczesnych
layoutów flex-grow pozwala na przestanie korzystania
tak bardzo z wartości procentowych na rzecz proporcji
jakie dane elementy mogą między sobą mieć w konkretnej
linii flexboxa poeksperymentuj z flex-grow na różnych
znacznikach z różnymi wartościami oraz z różnymi osiami
ustawionymi jako oś podstawowa nie przejmuj się jeśli nie
wydaje ci się to bardzo intuicyjne po tych kilku minutach wprowadzenia
ponieważ flex-grow jest to jedna z najbardziej skomplikowanych właściwości
które spotkasz we flexboxie jeśli ją zrozumiesz to na pewno
już wkrótce cały flexbox nie będzie ci straszny