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 css grid zaawansowane
layouty stworzymy layout prostej strony przy użyciu
tylko i wyłącznie css grid i ja tutaj już troszkę ostylowałem te elemnty które obecnie
widzicie na stronie wykorzystamy też sekcję albumów
którą stworzyliśmy w jednej z poprzednich lekcji no i stworzymy
jedną pełną kompletną stronę www oczywiście uproszczoną ale
w pełni opartą na systemie siatek css grid więc
zaczniemy może od przejrzenia jak wygląda struktura naszego
markupu mamy tutaj header w klasie header wewnątrz niego znajduje
się input o klasie search oraz znacznik
o klasie account który symuluje tak jakby przycisk do
zarządzania kontem użytkownika w sekcji banner mamy obrazek
oraz dwa przyciski bezpośrednio w znaczniku banner następnie
widzimy listę nawigacyjną składającą się z po prostu odnosników
no i na samym końcu mamy nasze albumy zakodowane
w poprzedniej lekcji więc zaczniemy może od tego że ustawimy
że body będzie naszym kontenerem grida ponieważ widzimy że wszystkie te elementy znajdują
się bezpośrednio w body no i możemy na body ustawić display grid i
tak naprawdę za dużo w tym momencie się nie zmieniło oprócz tego że możemy
ustawić grid gap powiedzmy na 20 pikseli i teraz wszystkie
te elementy będą tutaj miały odstęp 20 pikseli między sobą
dzieje się tak ponieważ stworzyliśmy grida o szerokości
jednej kolumny no i jako że ma jedną kolumnę no to stworzyły
się trzy wiersze ponieważ tyle mamy elementów bezpośrednio w body
tutaj oczywiście będzie czwarty album który mamy zakomentowany no
i grid gap wypełniło nam przestrzenie między tymi wierszami
dobrze więc może ostylujmy naszą klasę banner no
i wewnątrz niej znajduje się obrazek oraz dwa przyciski ustawimy
że banner będzie oczywiście miało display grid i
ustawimy to za pomocą grid-template-areas czyli
zdefiniujemy sobie że pierwszym wierszem w bannerze
będzie obrazek obrazek no i następne będzie call-to-action 1
no i w drugim analogicznie również obrazek
aby zajmował 2/3 przestrzeni w
osi poziomej no i call to action 2 jako że tutaj mamy drugi jeszcze przycisk
zapisujemy to i
możemy to dodać na nasze elementy odpowiednio
banner button grid-area
call-to-action 1 na
banerze obrazku ustawimy grid-area
img ustawimy szerokość na 100%
żeby nie mieć problemu z pozycjonowaniem obrazku no i możemy jeszcze użyć object-fit
żeby dopasować go do kontenera żeby ładnie po
prostu się wpasował okej jak już widzimy mamy ten układ o jaki prosiliśmy
natomiast niejawnie ustawiany jest dalej jeden z przycisków możemy
to zrobić w ten sposób że zdefiniujemy dodatkową
klasę dla tego buttona albo możemy po prostu złapać go za pomocą
selektora banner button nth child
2 i dać mu grid-area call
to action 2 może nie jest to idealne rozwiązanie ponieważ jeśli
faktycznie zmieni się struktura naszego markupu to będziemy musieli to poprawić no ale na ten
przykład jest to wystarczające ustawimy tutaj
jeszcze grid-gap może wszędzie już na 20
pikseli będziemy ustawiać no i widzimy że teraz
ten element faktycznie jest ułożony tak jak chcieliśmy mamy
dwa przyciski po prawej stronie obrazek po lewej no i przy zwężeniu tego
ekranu one oczywiście na razie się nie skalują będziemy robili tak że faktycznie
będą rozszerzaly się na całą szerokość na ekranach mobilnych to już musimy
zrobić przy pomocy media queries w tym konkretnym przypadku następnie
przejdziemy do stylowania tej sekcji nawigacyjnej czyli
navigation no i wewnątrz nich znajdują się li i
każde li ma linka więc navigation również
ustawiamy jako display grid ustawimy mu grid-template-columns
na repeat 4
1fr zapisujemy możemy
jeszcze ustawić grid-auto-rows powiedzmy
na 100 pikseli wtedy te wiersze będą miały szerokość
100 pikseli no i jako że nie zadeklarowaliśmy ich jawnie no to
grid-auto-rows pokrywa nam też pierwszy grid-gap ponownie
na 20 pikseli no i mamy już jakąś tam
responsywność tego menu oczywiście one też
się powinny składać by elementy te zajmowały całą
szerokość danego wiersza możemy spróbować to zrobić przy pomocy funkcji minmax
tylko że wtedy będziemy musieli podać konkretną maksymalną
po prostu rozdzielczość którą chcielibyśmy tam zaaplikować
powiedzmy że minimalnie może być to 0 maksymalnie 300 pikseli
i tutaj nie możemy dać wtedy na stałe czwórki tylko auto-fit
no i możemy to nawet wyrównać justify-content-center
i wyrównaliśmy to w osi poziomej wewnątrz
tego konkretnego kontenera grida bo już mamy trzy kontenery grida jednym
z nich jest body w drugim jest banner i trzecim jest teraz navigation no i
jak to rozszerzymy z powrotem no to oczywiście te elementy będą nam się schodziły powiedzmy
że chcemy żeby tak to menu się zachowywało zostaje jeszcze zająć
się tym górnym paskiem tym headerem i dostosować
widoki mobilne czyli łapiemy selektorem
header ustawiamy display na grid
i możemy zdecydować jak chcemy ustawić nasza kolumny powiedzmy że
tutaj wiemy że będą to zawsze dwa elementy więc możemy
sobie powiedzieć grid-template-columns możemy
użyć repeat nie musimy możemy wpisać po prostu auto
auto w tym momencie mamy dwa równe
tory pionowe które możemy wyrównać w osi x bądź y no
i damy justify-content space-between i
w tym momencie ten element będzie to dociągnięty do prawej ten element będzie dociągnięty
do lewej no i będą miały przestrzeń pomiędzy sobą tak długo jak się da
jest to bardzo podobne do flexboxa dobrze więc zróbmy coś
z tym bannerem żeby wyglądał troszkę lepiej gdy zmiejszamy rozdzielczość możemy stworzyć
regułę media query i
powiedzmy że dla maksymalnie szerokości 500 pikseli najwyżej za chwilę to poprawimy chcemy
aby banner miał grid-template-areas
ustawiane w ten sposób czyli img
img img img call to action 1 call to action
one call to action one call to action one no i analogicznie dwójka zapisujemy
i faktycznie to działa chociaż te elementy powinny
być też w osobnych liniach prawdopodobnie nie dopisałem call
to action 2 call to action jeden
zobaczmy o co tutaj chodzi
spróbujmy dać tutaj banner
button secondary a tak tylko żeby sprawdzić czy to
na pewno o to chodzi i ustawiony na
banner button secondary call to action 2
okej teraz działa ciekawe wydaje mi się że
może to mieć coś na rzeczy z dodatkowym
sterowaniem które faktycznie nadaje nam te kolory które zrobiłem wcześniej to
nie zmienia faktu że nie powinno nam to nie
działać ten selector jest poprawny acha nth child
mogliśmy zrobić może last-child sprawdźmy
nie last child też nie działa dobrze zostańmy może przy tej klasie czyli
secondary no i
możemy ustawić tutaj szerokość na 100% okej i banner button acha
oczywiście po prostu klasa się nie zgadza powinna tutaj powinno być banner
button przez dwa i tutaj ustawiamy teraz
spróbujemy jeszcze raz jest jedna i nie ma drugiej
last child okej teraz wszystko działa
zwracajcie uwagę na nazwy własnych klas i faktycznie czy
selektory chwytają te elementy o które chodzi no bo można się faktycznie troszkę zakręcić
no i możemy nawet powiedzieć że tutaj chcemy mieć min i tu ustawione
na 100 pikseli i wtedy niejawnie ustawiamy też wysokość
całego rzędu ale możemy to zrobić z poziomu pojedynczego buttona nie musimy tego ustawiać na
gridzie no i teraz gdy będziemy zwiększać i zmniejszać rozdzielczość
tej witryny no to faktycznie ona się składa tutaj moglibyśmy chyba wcześniej
ustawić ten breakpoint ustawmy go na te zobaczmy w firefox
jaka to jest rozdzielczość 714
no to ustawię na 715 pikseli to będzie nasza mobilka współczesne
smartfony i tak mają duże ekrany no i faktycznie
ten layout wygląda w porządku na większości rozdzielczości być
może chcielibyśmy aby te elementy były wyrównane do
krawędzi ale moglibyśmy to zrobić wtedy poprzez ustawienie justify-content
space-between zamiast center w ten sposób jeśli
to jest to czego klient mógłby chcieć albo
faktycznie rozszerzanie no to możemy to oczywiście zaimplementować powiedzmy że zostawimy
to przy center no i teraz wystarczy tak naprawdę wykomentować ten
album który stworzyliśmy wcześniej to jest dokładnie to samo co
robiliśmy w lekcji z figure no i tutaj usuwamy koniec komentarza
i mamy naprawdę prostą stronę www
która w zależności od rozdzielczości renderuje
elementy w różny sposób musieliśmy stworzyć tylko jedną regułę
media query i to tylko po to żeby zmienić tutaj grid
template areas to jest jedna reguła media query no i cała reszta to jest kod powiązany
z faktycznym wyświetlaniem elementów grida ważne
jest to że nie musicie wcale mieć jednego grida
na stronę nigdzie nie jest powiedziane że musicie mieć grida który
zarządza wam każdym pojedynczym elementem witryny możecie
mieć grida który w sobie ma inne gridy i oczywiście sobie pomagać
w ten sposób tak jak tutaj zrobiliśmy to z body czyli nadaliśmy po prostu odstęp między
pojedynczymi sekcjami zawsze 20 pikseli i zwróćcie
też uwagę że ten markup jest faktycznie semantyczny nie ma tutaj żadnych dodatkowych wrapperów
mamy znaczniki figure figcaption listy nienumerowane tak
samo możemy mieć buttony bezpośrednio obok obrazka nie potrzebujemy wrapperów więc
kod pod kątem html jest czysty w css też
nie było to dużo pracy a jestem pewien że parsery czy czytniki
ekranowe będą lepiej czytały taki kod niż taki który jest zbudowany na samych divach
ma mnóstwo wrapperów i tak dalej i tak dalej pomijając oczywiście też fakt że
jest to po prostu czytelniejsze jeszcze dla dewelopera i mniej wysyłane jest
do naszych potencjalnych klientów jeśli checielibyście sprawdzić
jak konkretnie stworzona jest ta strona od początku
do końca to możecie przejść w sekcje base.css i
tutaj będzie cały kod który odpowiada za renderowanie tego layoutu jeśli chcielibyście
wprowadzić jakieś poprawki bądź usprawnić jak w tym momencie
to wygląda no to możecie to zrobić w tym pliku bądź na jego podstawie
Stan końcowy · 11 min
<ul class="grid">
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v1" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v2" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v3" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v4" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v5" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v4" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v3" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v2" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v1" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
</ul>
<style>
.grid {
display: grid;
list-style-type: none;
margin: 0;
padding: 0;
grid-gap: 20px;
grid-template-columns: repeat(auto-fit, minmax(0, 400px));
justify-content: center;
}
.grid figure {
background: rgba(255,255,255, 0.1);
padding: 20px;
margin: 0;
display: grid;
grid-gap: 20px;
justify-items: center;
}
.grid img {
max-width: 100%;
}
</style>Stan początkowy
<header class="header">
<input class="search" placeholder="search...">
<div class="account"></div>
</header>
<div class="banner">
<img src="https://source.unsplash.com/random/400x200?v1">
<button class="banner__button">
Learn more
</button>
<button class="banner__button">
About us
</button>
</div>
<ul class="navigation">
<li>
<a href="#">
Forest
</a>
</li>
<li>
<a href="#">
Sea
</a>
</li>
<li>
<a href="#">
Mountains
</a>
</li>
<li>
<a href="#">
Beach
</a>
</li>
</ul>
<!-- <ul class="albums">
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v1" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v2" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v3" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v4" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v5" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v4" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v3" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v2" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
<li>
<figure>
<img src="https://source.unsplash.com/random/200x200?v1" alt="">
<figcaption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Cum nobis fugit dolorem recusandae saepe quidem voluptatibus quaerat, incidunt, enim praesentium ad, vitae modi sunt debitis tempora vel pariatur dolores quos? </figcaption>
</figure>
</li>
</ul> -->
<style>
</style>