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.
Hej witam cię w kolejnej lekcji z kursu flexbox od podstaw i
tym razem powiem co nieco o marginesach jak
już wiesz flexbox działa na podstawie dostępnej przestrzeni i
tak jak ustawimy sobie justify-content na flex-start tak
elementy które będą miały jakąś dostępną przestrzeń w
danej osi flexboxa będą ustawiały się na początku osi
main axis analogicznie jeśli ustawimy tutaj jako
wartość center elementy będą wycentrowane wzdłuż tej osi dzieje się
tak gdy faktycznie mamy dostępną przestrzeń w danej linii i
możemy te elementy tak ustawić przestrzeń zajmują
zarówno same rozmiary elementu ustawione przez flex-basis czy
width czy height oraz oczywiście flex-grow czy flex-shrink
które jeszcze te wartości modyfikują natomiast
bardzo ważnym czynnikiem jest sam margines margines
czyli część modelu pudełkowego na stronach www zachowuje
się dość specyficznie w przypadku używania go równolegle
z flexboxem więc przejdźmy do przykładu na
pierwszej karcie ustawię
margin-right na 50 pikseli i
tu nie ma tak naprawdę nic dziwnego ponieważ ta karta zajęła
dodatkowe 50 pikseli z prawej strony karty
są układane w ten sposób że są dociągnięte do początku
osi main axis no i oczywiście jeśli już się nie mieszczą
no to są przerzucane do następnych linii natomiast jak będzie teraz wyglądała
sytuacja jeśli zmienimy margin right na
auto widzimy pojawiła się jakaś tutaj dziwna
odległość jeśli ją zmierzymy wyszło że
to jest 32 możemy od tego odjąć 5 pikseli
jako margines karty numer 2 no więc to jest 27
pikseli to nie jest jakaś wartość którą możemy w prosty sposób określić
więc przejdźmy dalej i zobaczymy co do czego dojdziemy na
karcie drugiej ustawimy margin-right
na powiedzmy 200 pikseli
jak widzisz karta zajęła 200 pikseli odstępu
z prawej strony i odstęp z prawej strony karty
numer 1 również się zmienił jest w tym momencie wyższy o co
tutaj chodzi w specyfikacji flexboxa można wyczytać
że ustawianie marginesu z dowolnej strony na
elemencie flexboxa na dziecku spowoduje że
element ten zostanie odepchnięty z tamtej strony jeśli
wartość tego marginesu będzie wynosiła auto czyli innymi słowy my
tutaj ustawiliśmy na drugiej karcie margines 200 pikseli jawnie i
tyle druga karta zajęła przestrzeni natomiast ustawiając
margin-right auto na karcie pierwszej ten element zajął
całą dostępną przestrzeń w tej danej linii flexboxa i został
dociągnięty do lewej strony ekranu ponieważ wstawiliśmy tutaj
margin-right jeśli wpiszemy tutaj margin-left to
zobacz że karta numer 2 dalej ma swoje 200 pikseli natomiast
karta numer 1 tą nadmiarową przestrzeń która została
w tej linii wykorzystała aby dociągnąć się do prawej czyli
odpycha się od lewej strony i
zwróć uwagę że to dalej działa w momencie kiedy mamy ustawiony justify-content
na flex-start czyli kolejne linie na których elementy
nie mają już modyfikowanego marginesu zachowują się tak samo czyli są
układane wzdłuż konkretnej linii flexboxa od
jego początku czyli możemy dojść do wniosku że operując na marginesie możemy
w inny sposób pozycjonować poszczególne linie flexboxa wzdłuż
osi main axis zobrazujemy to w inny sposób powiedzmy
że na razie to wykomentujemy margin-right na pierwszej karcie
ustawimy w ten sposób aby wszystkie pozostałe elementy oprócz
tej jedynki zostały wypchnięte do następnej linii aby to zrobić możemy użyć
funkcji calc i jako parametr podać 100%
i odjąć od tego szerokość naszej karty w
tym momencie wszystkie elementy po tej jedynce zostaną
wypchnięte do następnej linii one tutaj są troszkę nierówno ponieważ
my odejmujemy tylko szerokość karty i nie wliczamy w to prawego
marginesu który tam mieliśmy ustawiony więc zaadaptujemy
tą wartość tak aby ten margines tam był teraz oczywiście jest wszystko
równo więc jeśli miałbyś bądź miałabyś
sytuację że chcesz aby poszczególny element był
jako jedyny w linii i nie chcesz aby urósł on zajmując
całą linię możesz do tego użyć właśnie funkcji calc i
odpowiedniego kierunku marginesu przejdźmy dalej i na karcie
drugiej ustawmy we wszystkich kierunkach margin
automatyczny jak widzisz dostępna przestrzeń która była
dotychczas rozdystrybuowana w ten sposób że znajdowała się po prawej
stronie tego kontenera została rozdystrybuowana
w ten sposób że karta numer 2 ma po lewej stronie i po
prawej stronie taki sam odstęp pomijając to że karta numer 3 dalej
ma tutaj te swoje 5 pikseli dlatego wizualnie nie jest
to równe natomiast fizycznie faktycznie karta numer 2 ma po lewej
i po prawej ten sam odstęp jeśli zmienimy troszkę tę sytuację i ten
margin-right ustawimy na karcie numer 4 to
zobacz co w tym momencie stało się naszym layoutem karta numer 4 zrobiła
dokładnie to samo co robiła wcześniej karta numer 1 czyli zadeklarowała
tyle marginesu aby zmieściła się ona jako
jedyna tej konkretnej linii flexboxa dlatego karta 5
i 6 są w następnej linii natomiast one nie są modyfikowane więc są układane
zgodnie z justify-content ale karta numer 2
jest wycentrowana pomiędzy kartą
1 i numer 3 więc ta linia wygląda jakby była wypozycjonowana
za pomocą justify-content space-between pomimo
tego że faktycznie tak nie jest ponieważ jak widzimy justify-content
jest ustawiona na flex-start i dzieje się to właśnie dlatego że z
lewej i z prawej strony ustawiony jest margines automatyczny
więc karta deklaruje równy odstęp z
obu stron i dzięki czemu jest wycentrowana jeśli
ustawimy sobie line content na stretch i
usuniemy z każdej z kart definicję naszego height
czyli ustawimy je na auto to widzimy że elementy
zostały rozciągnięte ponieważ mamy line content ustawione na stretch
i wszystkie trzy linie flexboxa są rozciągnięte
w ten sposób aby każda linia zajmowała maksymalną
dostępną przestrzeń natomiast karta numer 2 jest wycentrowana zarówno
w pionie jak i w poziomie oczywiście podobny efekt w kontekście samego
pozycjonowania wzdłuż osi cross axis na
poszczególnym elemencie przy użyciu align-self
ustawionego na center jest
to odpowiednik align-content dla poszczególnego
elementu flexboxa natomiast jak widzisz marginesy
z lewej i z prawej strony dalej musimy ręcznie zaaplikować więc
możemy tutaj ustawić margin-left auto i
w tym momencie karta jest dociągnięta do prawej strony ponieważ jest wypychana
z lewej jest wycentrowana przy pomocy align-self
ustawionego na center natomiast jeśli damy
margin-right auto
to karta będzie wycentrowana
również w pionie natomiast możemy to osiągnąć również bez tego align-self
w większości przypadków takie skomplikowane operacje na marginesach
nie są konieczne ponieważ flex box jest dosyć elastycznym modelem
tworzenia layout'ów jak sama nazwa wskazuje natomiast jeśli chodzi o optymalizację
konkretnych małych break-point'ów bez ingerencji w cały
layout ustawianie marginesu na konkretnych dzieciach flexboxa
jest bardzo dobrą praktyką i jest dobrze wspierana więc polecam
używać tej metody i polecam pamiętać o tym że margines
ma bardzo duże znaczenie w kontekście pozycjonowania
layout'ów we flexboxie wiedząc to wszystko masz już na prawdę solidną
wiedzę o flexboxie i możesz śmiało tworzyć layouty w oparciu o ten system
w kolejnym rozdziale problemy które flexbox tworzy
jak je rozwiązywać bądź przynajmniej być świadomym efektów
ubocznych korzystania z flexboxa a tymczasem to wszystko w tej lekcji cieszę
się że udało ci się dotrwać do końca tego rozdziału i do usłyszenia w następnym