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ść do tej pory w kursie css grid zaawansowane layouty
omówiliśmy wszystkie podstawowe właściwości powiązane
z tworzeniem kolumn wierszy tracków układaniem ich na
siatce oraz ustalaniem ich rozmiarów natomiast do
tej pory zaprezentowaliśmy tylko jedną z możliwych dróg deklaracji
tego typu layoutów drugą są tak zwane obszary szablonowe czyli
grid-template-areas i za ich pomocą możemy
deklarować zarówno wiersze i kolumny natomiast nie musimy wpisywać
tutaj jawnych szerokości czy wysokości ale
możemy nazwać je według naszego uznania czyli jeśli mamy
taką strukturę jak tutaj czyli mamy kontener wewnątrz którego
jest header jakaś treść footer i sidebar no
to możemy stworzyć takie nazwy takie obszary w naszym gridzie
jak to robimy otwieramy ciąg znaków otwieramy stringa
i wewnątrz niego deklarujemy strefy możemy
zadeklarować sobie że chcemy 3 kolumny i chcemy aby header
zajmował wszystkie trzy i był w pierwszym wierszu więc wpiszemy
sobie header header header i tym samym tworzymy 3
kolumny i ustalamy że nazwa tego obszaru będzie
to header jeśli chcemy dać kolejne wiersze do naszej deklaracji
możemy to zrobić poprzez dodanie kolejnego ciągu znaków czyli
jeśli chcielibyśmy żeby treść zajmowała tylko 2/3 całego
wiersza nr 2 no to możemy wpisać sobie tutaj content
content i trzecią kolumnę zagospodarować na coś innego na
przykład na sidebar i możemy dodawać i
dodawać kolejne definicje każdy wiersz jest oddzielony dwoma
cudzysłowiami i jest jakby osobnym ciągiem znaków możemy go zapisać w
jednej linii czyli w ten sposób natomiast
dla czytelności lepiej jest to rozbijać na
osobne linie dla każdego wiersza czyli stwórzmy sobie
jeszcze ostatni wiersz ze stopką jak
zapiszemy to widzimy że już coś się stało w naszym layout'cie
oczywiście nie ma to żadnego sensu bo header chcieliśmy żeby
zajmował 3 kolumny a w tym momencie zajmuje tylko jedną natomiast grid
dostosował treść którą znalazł wewnątrz siebie wewnątrz
kontenera no i stworzył nam 3 kolumny jako że żadna
z naszych elementów czyli ani header ani content
ani footer nie są określone w jakich strefach mają się renderować no
to renderują się tak liniowo jedna po drugiej jeśli chcielibyśmy aby header
faktycznie znajdował się w pierwszym wierszu no to musimy na
klasie header ustawić grid-area czyli przypisać do
konkretnego elementu html konkretną nazwę strefy css
grid czyli jak wpiszemy tutaj header możemy to zamknąć w cudzysłowia
i potraktować jako stringa możemy też zapisać to w ten sposób zapiszemy
i widać że faktycznie w tym momencie header zajął
3 kolumny i znajduje się w pierwszym wierszu co prawda
treść sidebar i stopka dalej są źle ustawione ale
dzieje się tak dlatego bo nie zadeklarowaliśmy jeszcze gdzie te elementy
mają się renderować nie przypisaliśmy konkretnych grid-area
do pozostałych selektorów css'owych czyli zrobimy to teraz szybciutko
dla footera ustawimy grid-area footer dla
sidebara ustawimy grid-area sidebar
po zapisaniu widzimy że faktycznie ten layout
który sobie tutaj zakodowaliśmy jest spójny z tym
który jest faktycznie wyrenderowany jest to zupełnie inne podejście niż w przypadku korzystania
z grid-template-columns grid-template-rows ponieważ w taki
bardziej wizualny sposób możemy tworzyć nasze layouty jedni
to lubią inni nie ja widzę plusy zastosowania grid-template-areas
w przypadku gdzie korzystanie z grid-template-columns czy rows
może być mniej czytelne i jest to jak najbardziej poprawna wspierana składnia
więc jeżeli podoba ci się ten sposób zapisu nie wahaj się go użyć i
notacja grid-template-areas jest o tyle
wygodna że możemy wewnątrz media query powiedzmy
do 700 pikseli zmniejszyć
zmienić sposób renderowania całej
strony czyli skopiujemy sobie grid-template-areas oczywiście
musimy to zrobić na kontenerze przesuwamy
to w odpowiednie miejsce no i teraz możemy sprawdzić w
ten sposób żeby elementy rozpychały się na
całą możliwą szerokość czyli możemy zmienić tutaj sidebar
na content footer
wyświetlić na samym dole no i sidebar dodać jako
kolejny wiersz po
zapisaniu dopóki jesteśmy powyżej 700
pikseli wygląda wszystko tak samo ale jeśli zmniejszymy sobie
ten layout no to faktycznie widzimy że
elementy wyświetlają się jeden pod drugim nie
jestem pewien dlaczego tutaj nasz content wyświetla
się w ten sposób może włączymy tutaj siatkę widzę
że doszły doszły nam tutaj dodatkowe kolumny
jest to całkiem możliwe że po prostu to
pierwotne stylowanie które zamieściłem przed
rozpoczęciem lekcji wpływa nam na to zobaczmy gdzie jest w ogóle acha
bo nie mamy zadeklarowanego kontentu nigdzie no oczywiście trzeba jeszcze zadeklarować
content grid-area content i
w tym momencie wszystko będzie dobrze dopasowane w tym
momencie wszystko wyglądało dobrze ponieważ pomimo tego że nie zadeklarowaliśmy na klasie
content grid-area content to pozostałe elementy były
poprawnie zadeklarowane natomiast jeśli zmniejszyliśmy breakpoint to
mieliśmy cały wiersz strefy która nie została nazwana i nie została
wykorzystana dlatego pomimo tego że na większym breakpoincie to
działało na mniejszym przestało i wniosek jest tylko
taki aby pamiętać by wykorzystać faktycznie wszystkie grid-area
które zostały zadeklarowane ponieważ jeśli tego nie zrobicie no to
później będziecie musieli debugować dlaczego ten
konkretny grid layout nie działa no i na tym przykładzie widać
jak w prosty sposób przy pomocy media queries można zmienić cały design
naszego kontenera naszej siatki w sposób w który tak
naprawdę nie byłoby możliwe przy użyciu innych technik pozycjonowania ponieważ
jeśli stworzymy sobie jeszcze jeden selektor media query i
ustawimy min-width na
powiedzmy 1024 piksele
to możemy sprawić żeby nasz header miał tutaj
mniej przestrzeni i tutaj wypełnimy to
sidebarem tutaj
też damy sidebar zapiszemy no
i teraz w momencie jeśli przekroczymy ten breakpoint i zachowamy
poprawną składnie tego grid-template-areas to nam się ten sidebar
wyświetli ten sidebar jeszcze teraz nie zadziałał ponieważ stworzyłem
nieprostokątny layout danego elementu czyli
jak widać tutaj sidebar ma 100% danego wiersza i
jakiś fragment danej kolumny każdy
grid element każde dziecko grida musi być prostokątem nie
możemy tworzyć tego typu przykładów czyli tutaj musielibyśmy jeszcze
wyrównać content aby też był prostokątem czyli mamy tutaj
kwadracik tutaj mamy też prostokąt no
i tutaj jest prostokąt zapiszemy na tej rozdzielczości mamy
standardowy layout na mobilce mamy taki no i na większej
rozdzielczości sidebar się rozszerza jeszcze jedną
ważną rzeczą którą można zrobić z tą notacją i nie jest ona możliwa z
pozostałymi jest wstawienie takiego placeholdera czyli jeśli
nie chcemy żeby dane miejsce w gridzie było zajmowane przez jakikolwiek element
możemy wstawić kropkę czyli zaznaczając dowolne
miejsce w grid template-areas możemy sprawić że na danej
rozdzielczości kolumna będzie pusta natomiast cała
struktura torów będzie zachowana grid-template-areas
to na pewno bardzo elastyczne rozwiązanie które pozwoli
w prosty sposób tworzyć skomplikowane layouty natomiast
korzystanie z ciągów znaków ascii jako
referencji do naszych obszarów w siatce również
może być problematyczne w debugowaniu czy w tworzeniu bardzo
niestandardowych rozwiązań gdzie po prostu nie możemy tak dobrze
określić położenia naszych elementów w kolejnej lekcji powiem troszkę
więcej o nazywaniu konkretnych linii i jakie nazwy
danych stref dostajemy za darmo jeśli korzystamy z css grida
Stan początkowy
<div class="container">
<div class="header">
Header
</div>
<div class="content">
<h1> Title </h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam quo itaque ea quos nostrum iure minus hic saepe, aut assumenda impedit nulla excepturi incidunt quam pariatur veritatis magnam placeat illum?
Lorem
</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Ipsam, explicabo. Maiores accusantium aliquam, consequatur molestiae dicta omnis quos ipsam vitae provident debitis deserunt obcaecati praesentium minima nihil placeat nam facilis?</p>
</div>
<div class="footer">
Visit our sites!
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Magni recusandae molestias vitae. Incidunt consectetur vitae dolor perspiciatis hic, provident eligendi reiciendis accusantium consequuntur amet eius accusamus ipsum saepe facere molestias.
</p>
</div>
<div class="sidebar">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Omnis consequatur enim ex nihil debitis veniam aspernatur? Praesentium, itaque commodi corporis delectus, veritatis, aliquid quia eum reprehenderit ducimus quasi a repudiandae?
</div>
</div>
<style>
.container {
display: grid;
}
</style>Stan końcowy · 9 min
<div class="container">
<div class="header">
Header
</div>
<div class="content">
<h1> Title </h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aliquam quo itaque ea quos nostrum iure minus hic saepe, aut assumenda impedit nulla excepturi incidunt quam pariatur veritatis magnam placeat illum?
Lorem
</p>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Ipsam, explicabo. Maiores accusantium aliquam, consequatur molestiae dicta omnis quos ipsam vitae provident debitis deserunt obcaecati praesentium minima nihil placeat nam facilis?</p>
</div>
<div class="footer">
Visit our sites!
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Magni recusandae molestias vitae. Incidunt consectetur vitae dolor perspiciatis hic, provident eligendi reiciendis accusantium consequuntur amet eius accusamus ipsum saepe facere molestias.
</p>
</div>
<div class="sidebar">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Omnis consequatur enim ex nihil debitis veniam aspernatur? Praesentium, itaque commodi corporis delectus, veritatis, aliquid quia eum reprehenderit ducimus quasi a repudiandae?
</div>
</div>
<style>
.container {
display: grid;
grid-template-areas:
"header header header"
"content content sidebar"
"footer footer footer";
}
.header {
grid-area: header;
}
.footer {
grid-area: footer;
}
.sidebar {
grid-area: sidebar;
}
.content {
grid-area: content;
}
@media only screen and (max-width: 700px) {
.container {
grid-template-areas:
"header header header"
"content content content"
"sidebar sidebar sidebar"
"footer footer footer";
}
}
@media only screen and (min-width: 1024px) {
.container {
grid-template-areas:
". header sidebar"
"content content sidebar"
"content content sidebar"
"footer footer footer";
}
}
</style>