Zaawansowane layouty
3 godz. 3 min · HTML i CSS · Full-stack i Programowanie
Wojciech PołowniakSr. Fullstack EngineerW początkowych lekcjach Kursu omówimy podstawową składnię CSS Grid, tak, by zbudować solidny fundament pod poznawanie kolejnych, bardziej rozbudowanych zagadnień. Na praktycznych przykładach poznasz i zrozumiesz różnice, jakie są pomiędzy CSS Grid a CSS Flexbox.
Po poznaniu niezbędnych, podstawowych zagadnień związanych ze składnią CSS Grid przejdziemy do tematu wykorzystania siatek. Wykorzystamy je do stworzenia responsywnych layoutów bez użycia media queries.
W kolejnych, bardziej rozbudowanych lekcjach kursu poznasz implikacje dotyczące dostępności. W obszernym rozdziale omówimy również szerzej najczęstsze błędy i nieporozumienia związane z CSS Grid.
Tak jak każda technologia, Grid ma swoje wady i zalety. Omówimy zarówno pierwsze, jak i drugie, tak, by wykorzystać pełen potencjał CSS Grid i nie dać się zniechęcić przez pewne jego wady. Dowiesz się również nieco na temat nadchodzących elementów w specyfikacji CSS Grid module level 2.
Aby być na bieżąco - warto uważnie śledzić najważniejsze i najbardziej aktualne źródła związane z CSS Grid. W końcowych rozdziałach pokażemy Ci naszym zdaniem najciekawsze źródła oraz osoby związane z Gridem, które warto znać oraz obserwować.
Jeśli chcesz poznać najbardziej aktualną i świetnie wspieraną metodę pozycjonowania elementów jaką jest CSS Grid, ten kurs jest właśnie dla Ciebie! Aby efektywnie korzystać z tego kursu potrzebujesz jedynie podstawowej wiedzy z zakresu HTML i CSS - a jeśli znasz Flexboxa, na pewno będzie Ci łatwiej zrozumieć niektóre koncepty.
Cześć w tej lekcji z kursu css grid zaawansowane layouty opowiem
o różnicach między css grid a css flexboxem
już wiele podobieństw i różnic w ciągu tego kursu
omówiliśmy natomiast przedstawię tutaj jeszcze dwa konkretne przypadki
gdzie grid dopełnia flexa i na odwrót no
i przypomnę wszystkie właściwości które są dla tych dwóch technologii wspólne
widzimy na ekranie dwa kontenery jeden to grid
drugi to flex no i oczywiście domyślnie elementy
te są renderowane inaczej przez to że mają inny display jeśli chcielibyśmy
aby kontener z flexboxem ustawił się w taki
sposób że ustawimy na nim flex-wrap na wrap czyli zawijamy elementy
do następnego wiersza oraz wyrównamy je wzdłuż
linii flexboxa wokół main axis tak
aby było to space-around to
będziemy mieli sytuację gdzie mamy 6 elementów w
równych kolumnach no i dwie ostatnie są wycentrowane pośrodku
linii w ten sposób że posiadają równe odstępy obok siebie
to znaczy każdy z tych elementów ma taki sam odstęp z lewej i z prawej jeśli
chcielibyśmy to zrobić w gridzie no to oczywiście możemy zrobić grid-template-columns
ustawić poprzez funkcje
repeat trzy kolumny powiedzmy o szerokości 1
factional unit no i możemy ustawić grid-gap powiedzmy
na 20 pikseli to będzie wyglądało trochę inaczej no ale generalnie też mamy trzy
kolumny które są oddzielone od siebie jakąś tam przestrzenią
no i pomimo tego że grid tak samo jak flexbox posiada właściwość
justify-content to jeśli spróbujemy zaadaptować dokładnie tą
samą właściwość na gridzie to zobaczymy że to
nie zadziałało dlaczego otóż css grid jako siatka
musi mieć zawsze równe kolumny to znaczy w tym miejscu
widzimy że we flexboxie te kolumny nie są równe w
gridzie one równe być muszą moglibyśmy spróbować to zrobić w
ten sposób że po tniemy nasz layout na o wiele więcej
kolumn i wtedy będziemy ręcznie ustawiać za pomocą
spanu ich pozycję w ten sposób żeby były mniej więcej podobne
natomiast tak czy siak nie osiągniemy takiego efektu na
pewno nie w samym gridzie a we flexie są to zaledwie trzy linijki
kolejną z różnic która można powiedzieć że działa na niekorzyść grida
jest to że nie możemy ustawić na dowolnym elemencie tak
jak w przypadku flexboxa powiedzmy na elemencie numer 5 tutaj
możemy ustawić wartość flex-grow na 1 no i to sprawi
że ten element będzie rozciągał się w którejkolwiek linii obecnie
się znajduje na całą dostępną przestrzeń w gridzie przez
to że układamy nasze layouty w inny sposób to
znaczy myślimy bardziej o wierszach i kolumnach niż o pojedynczych
elementach nie możemy ustawić czegoś takiego jak grid
item 5 i tutaj jakieś
właściwości która nam rozszerzy w ten sposób dany
element jeśli ustawimy tutaj width powiedzmy 50%
to oczywiście o w tym przypadku on się zwęził
do 50% szerokości kolumny natomiast jeśli chcielibyśmy to rozszerzyć
powiedzmy na 800 pikseli co jest dużą wartością no to
oczywiście cała kolumna nam się rozszerzy po pierwsze a po drugie
nie mamy dostępu nawet do jednostki która pozwoli nam zająć całą
dostępną przestrzeń ponieważ jeśli wpiszemy tutaj 1fr no to to
nie zadziała ta piątka nie rozszerzyła się w ten sposób jak
ta piątka tutaj we flexboxie a nawet jeśli rozszerzyłaby się no
to pozostałe elementy w tej samej kolumnie również przyjęłyby tą samą szerokość
z tego też powodu layout zwany masonry layout czyli taki
jak w pintereście jest nie do osiągnięcia w samym css gridzie
można do tego używać oczywiście javascriptu można używać wypełniaczy
i git auto flow dense aby wypełniać puste
pola i tworzyć layout taki jak ma pinterest natomiast w samym
gridzie w samym css nie jest to osiągalne w przyszłych
lekcjach pokażę kilka artykułów gdzie osoby z branży web development
tłumaczą jak można taki layout osiągnąć cechami
wspólnymi dla grida i flexa są oczywiście
właściwości ustawiające elementy wzdłuż danej osi czy
wewnątrz grida w tym przypadku i mamy takie właściwości jak justify-content
justify-items możemy
zrobić center i teraz one nam się zwężają to
są cechy wspólne dla grida i flexa z
tą różnicą że na flex itemie nie możemy ustawić justify-self
nie ma takiej właściwości w gridzie we
flexboxie jeśli spróbujemy tutaj wpisać powiedzmy center to
nic się nie stanie piąty element nam się nie zwęził nawet jeżeli pozbędziemy
się flex-grow natomiast na elemencie numer 5 w gridzie możemy
już ustawić justify-self powiedzmy na stretch
i w tym momencie ten element faktycznie rozciągnął się do całej
szerokości danej kolumny w obu technologiach mamy właściwość
order możemy zmieniać pojedyncze elementy ich
pozycję w siatce czy we flexie względem
kontenera natomiast generalnie
właściwość order powinna być używana z
dużą rozwagą ponieważ może spowodować problemy z dostępnością o
których mówiłem wcześniej poza tym większość rzeczy da
się zrobić zarówno we flexboxie jak i w css
gridzie natomiast często będzie sytuacja taka że daną
funkcjonalność w gridzie osiągniecie szybciej niż we flexie ale
będą też przypadki gdzie grid będzie wymagał większej ilości właściwości
będzie mniej elastyczny niż flexbox więc to są dwie technologie
które dopełniają się wzajemnie i nie traktował bym ich na takiej
zasadzie o używam flexa jeśli pozycjonuję coś tylko
w jednej osi a grida zawsze jeżeli są dwie osie tylko
po prostu patrzcie w taki sposób na wasze layouty
na wasz kod by dobierać technologię do danego przypadku i
wykorzystywać tą która pozwala wam w bardziej elastyczny
sposób rozwiązać dany problem bądź zrobić
to w mniejszej ilości linii kodu po prostu to wszystko
w kontekście flexa i grida i w stosunku do siebie
nawzajem w kolejnych lekcjach podsumujemy wszystkie właściwości grida
które mamy dostępne i przejdziemy do praktycznych przykładów gdzie
można tego grida użyć
Stan końcowy · 7 min
<div class="grid">
<div class="item item1">1</div>
<div class="item item2">2</div>
<div class="item item3">3</div>
<div class="item item4">4</div>
<div class="item item5">5</div>
<div class="item item6">6</div>
<div class="item item7">7</div>
<div class="item item8">8</div>
</div>
<div class="flex">
<div class="item item1">1</div>
<div class="item item2">2</div>
<div class="item item3">3</div>
<div class="item item4">4</div>
<div class="item item5">5</div>
<div class="item item6">6</div>
<div class="item item7">7</div>
<div class="item item8">8</div>
</div>
<style>
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-gap: 20px;
justify-items: center;
justify-content: space-around;
}
.grid .item5 {
justify-self: stretch;
order: 1;
}
.flex {
display: flex;
flex-wrap: wrap;
justify-content: space-around;
}
.flex .item {
width: 25%;
margin: 10px;
order: 1;
}
.flex .item5 {
justify-self: center;
}
</style>Stan początkowy
<div class="grid">
<div class="item item1">1</div>
<div class="item item2">2</div>
<div class="item item3">3</div>
<div class="item item4">4</div>
<div class="item item5">5</div>
<div class="item item6">6</div>
<div class="item item7">7</div>
<div class="item item8">8</div>
</div>
<div class="flex">
<div class="item item1">1</div>
<div class="item item2">2</div>
<div class="item item3">3</div>
<div class="item item4">4</div>
<div class="item item5">5</div>
<div class="item item6">6</div>
<div class="item item7">7</div>
<div class="item item8">8</div>
</div>
<style>
.grid {
display: grid;
}
.flex {
display: flex;
}
.flex .item {
width: 25%;
margin: 10px;
}
</style>