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 tym jak został stworzony layout trello nie jest to oczywiście
oficjalny trello jest to codepen stworzony przez george'a parka
link do codepena znajdziecie później w linkach
i przydatnych źródłach natomiast jest to bardzo ciekawy przypadek do
omówienia po prostu jak można tworzyć layouty na gridzie nawet skomplikowanych
aplikacji generalnie trello jest to tablica która
pozwala wam tworzyć kolumny z jakimiś zadaniami i możecie te zadania przyciągać
z jednej kolumny do drugiej jak to zostało stworzone po
pierwsze george uzył tutaj znacznika support który pozwala
na wykrycie czy display grid w tym przypadku ponieważ
taki podaliśmy argument do dyrektywy supports
jest wspierany w danej przeglądarce no i jeśli tak to aplikujemy taki
oto zbiór reguł do przeglądarki i ona się wyrenderuje
to znaczy że możemy stworzyć fallback dla
strony która nie pracuje faktycznie na gridzie która wspiera powiedzmy flexbox albo
tylko floaty i później dopiero napisać w znaczniku supports wszystkie
reguły i deklaracje które chcemy dostarczać do aktualnych
przeglądarek które nadpiszą wszystko co napisaliśmy wcześniej ponieważ grid
ma priorytet ponad innymi metodami renderowania stron czyli
jest to świetne w kontekście progressive enhancement czyli dostarczania
lepszych feature'ów lepszych właściwości do lepszych urządzeń
gdy starsze urządzenia będą miały może troszkę uboższy
experience doświadczenia związane z odbiorem strony natomiast dalej
ta strona będzie mogła być czytelna zobaczmy więc w narzędziach
firefoxa jak ten layout został stworzony jak
widzimy tutaj mamy znacznik masthead no i to
jest też grid jak tutaj zobaczymy mamy tutaj faktycznie zaznaczone że jest
to element który pozycjonuje się na siatce no i jak go zaznaczymy to
faktycznie widać że posiada on jedną kolumnę auto i tu
są faktycznie te przyciski do wybierania innych tablic
jakaś wyszukiwarka następnie kolumna która
zajmuje całą dostępną przestrzeń poprzez 1fr no i ponownie
kolumna z automatyczną szerokością bazującą na ilości
przycisków i ich rozmiarze no i pomiędzy tymi dwoma kolumnami
mamy jeszcze grid-gap o szerokości 2rem czyli jednostce
relatywnej do route'a naszego dokumentu tego typu znacznik
moglibyśmy oczywiście też zrobić na flexie natomiast w gridzie wystarczy tylko i wyłącznie
grid-template-columns auto 1fr auto no i ustawienie
odpowiedniego column gapa w zależności od naszych potrzeb to co jest ciekawe
i niecodzienne w tym konkretnym przykładzie jest to że
elementy faktycznie są zawijane jako kolumny czyli
tutaj mamy ustawiony grid-auto-flow ustawiony na column czyli
każdy dodatkowy element który nie został zdefiniowany w jawnym gridzie
w jednej siatce będzie dodawany jako kolejna kolumna i właśnie wtedy otrzymujemy
taki oto layout że mamy scrollowalną sekcję column
stworzoną na gridzie jeśli znajdziemy sobie element list container
to faktycznie będziemy widzieli jak to jest zdefiniowane mamy po prostu kolumny
o jakiejś tam szerokości tutaj george napisał 27
rem prawdopodobnie taki po prostu jest rozmiar całego
kontenera i żeby to wyglądało w porządku tak to zakodował ale co ważne
ustawił tutaj to grid-auto-flow i jeżeli przełączymy
tą wartość to zobaczycie że teraz kolejne elementy są
układane w wierszach a nie w kolumnach bo to jest wartość domyślna dla grid-auto-flow
czyli jeśli byśmy dodali tutaj dodatkową własność czyli
zdefiniowali kolejną kolumnę to oczywiście ten layout nie będzie już wyglądał
tak dobrze nawet okazuje się że w ogóle w takim razie
nie zawija to do następnych wierszy podejrzewam że dał jakieś sekcje
wrappujące dane znaczniki tak by faktycznie ten
konkretny przypadek obsłużyć natomiast normalnie elementy
byłyby zawijane do następnych wierszy dopiero
jeżeli faktycznie wszystkie kolumny są wypełnione więc jeśli wrócimy do
tego stanu sprzed chwili włączymy z powrotem
grid-auto-flow column no to oczywiście elementy są teraz renderowane poprawnie
no i każda lista również jest gridem to znaczy jeśli
zaznaczymy sobie całą listę no to widzimy że tutaj
możemy znaleźć sobie kropka list nie
widzę tutaj definicji tej listy pojedynczej no
ale widzimy to w devtoolsach generalnie mamy trzy wiersze
czyli rzeczy do zrobienia cała treść oraz
dodaj nową kartę prawdopodobnie będzie tutaj gdzieś to zapisane znajdźmy
grid template rows są no
i faktycznie pierwsza kolumna
tak naprawdę pierwszy wiersz posiada szerokość automatyczną dostosowaną
do treści która się w nim znajduje następnie mamy zakres czyli
faktycznie jeśli będziemy następnie mamy zakres czy jeśli
faktycznie będziemy zwężali viewport a konkretnie
jego wysokość to te kolumny będą nam się rozciągać bardzo fajne no
i ponownie automatyczny wiersz na podstawie treści
jak widać możemy bez problemu zagnieżdżać siatki tutaj
george nawet zagnieździł samo body ponieważ body też
grid containerem i układa nam główny layout witryny w związku
z czym widzicie że to jest cały kod odpowiadający
za pozycjonowanie na samym flexie oczywiście tego kodu jest znacznie więcej
w kontekście kolorowania dodawania symboli
marginesów odpowiednich natomiast to wszystko odpowiada
za część gridową czyli za faktyczne tworzenie layoutu
w gridzie no i musicie przyznać że nie jest to dużo
kodu podsumowując ten konkretny przykład
warto pamiętać że możemy ustawiać konkretne wartości
również na wiersze czyli na przykład auto minmax
i auto ponownie jeżeli chcemy otrzymać elastyczną wysokość
danej kolumny gdy zmieniamy
rozmiar viewportu w pionie no i o grid-auto-flow
ustawionym na column jeśli faktycznie zależy nam na layout'cie który będzie układał się w kolumny
a nie w dodatkowe wiersze jak
w przypadku wartości domyślnej grid-auto-flow row to jest
tak naprawdę dosyć podobne obecny layout czyli ten z grid-auto-flow
column podobny do właściwości columns
która pozwala wam układać elementy w sposób kolumnowy
tak jakby to były artykuły w faktycznej papierowej gazecie to
nie jest właściwość powiązana z gridem czy flexboxem jest to szczerze
mówiąc dosyć stara właściwość istniejąca w css'ie
już od bardzo długiego czasu i pozwala na zawianie
treści w ten sposób że treść leci w kolumnie pierwszej
na całą wysokość kolumny następnie kontynuowana jest w
kolejnej kolumnie również od góry do dołu więc nie tak jak w gridzie
na zasadzie ile elementów jest umieszczone
bezpośrednio w kontenerze tylko bardziej na zasadzie podajemy liczbę kolumn
w jaką chcemy rozstrzelić nasz tekst no i właściwość kolumn
nam to ten tekst rozstrzeli na tyle kolumn to taka ciekawostka generalnie grid-auto-flow
column jest też faktycznie właściwością o której musicie
pamiętać jeśli macie tego typu layout zachęcam
też gorąco do spróbowania stworzenia czegoś takiego na własną rękę albo chociaż
przeanalizowania tego przykładu samodzielnie ponieważ
jest to kawał dobrej roboty w kontekście stworzenia layoutu na gridzie
razem z fallbackiem w przypadku jeśli dana przeglądarka
grida nie wspiera
Znacznik supports
@supports (display: grid) {
body {
display: grid;
grid-template-rows: 4rem 3rem auto;
grid-row-gap: 0.8rem;
}
.masthead {
display: grid;
grid-template-columns: auto 1fr auto;
grid-column-gap: 2rem;
}
.boards-menu {
display: grid;
grid-template-columns: 9rem 18rem;
grid-column-gap: 0.8rem;
}
.user-settings {
display: grid;
grid-template-columns: repeat(4, auto);
grid-column-gap: 0.8rem;
}
.board-controls {
display: grid;
grid-auto-flow: column;
grid-column-gap: 1rem;
}
.lists-container {
display: grid;
grid-auto-columns: 27rem;
grid-auto-flow: column;
grid-column-gap: 1rem;
}
.list {
display: grid;
grid-template-rows: auto minmax(auto, 1fr) auto;
}
.list-items {
display: grid;
grid-row-gap: 0.6rem;
}
.logo,
.list,
.list-items li,
.boards-btn,
.board-info-bar,
.board-controls .btn,
.user-settings-btn {
margin: 0;
}
}