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 poprzedniej lekcji z kursu css grid zaawansowane layouty
dowiedziałeś się jak określać rozmiary danego grid itemu w
osi x i osi y czyli ustawiając spinning konkretnie na
kolumnie czy na wierszu przy pomocy grid-column
czy grid-row możemy wykorzystać te
same właściwości czyli grid column bądź grid row aby
ustawić dany element w innym położeniu niż jest
on pierwotnie ustawiony w markup czyli określmy że item 7
będzie miał kolor niebieski ja
tutaj korzystam z css custom properties zwanymi też
css variables i to jest zmienna która pod spodem
trzyma kolor który ja sobie wcześniej zdefiniowałem i teraz jeśli chcemy
powiedzieć aby element siódmy zajął
3 kolumny no to oczywiście możemy użyć grid column
wpisać span 3 i wszystko jasne siódemka
rozciągała się na 3 kolumny natomiast możemy też skorzystać
z innej notacji aby umieścić tą siódemkę w zupełnie innym
miejscu do tego nam się już przydadzą rozszerzenia narzędzi
deweloperskich w firefoksie i tutaj widzimy numeracje
konkretnych linii czyli w momencie tak nasz
grid jego kolumny zaczynają się od jedynki następnie
kolejno każda linia flexboxa jest
numerowana od tej jedynki w górę czyli jeśli chcemy coś umieścić w
pierwszej kolumnie to możemy napisać grid column 1 2
ponieważ tutaj dajemy linię początkową na której element
ma się zacząć renderować i to jest linia końcowa że jeśli
zapiszemy to to faktycznie siódemka jest teraz w pierwszej
kolumnie nie znaczy to że jest ona umieszczona w pierwszym
wierszu ponieważ jeśli chcielibyśmy umieścić ją w pierwszym wierszu no
to analogicznie możemy zrobić grid-row no i dać
taką samą wartość analogicznie ponieważ numeracja działa
tak samo w obie strony i faktycznie siódemka w tym momencie będzie
pierwsza okej czyli jeśli chcielibyśmy
aby siódemka zajęła powiedzmy
trzy kolumny to możemy skorzystać albo z właściwości span
albo dać jawnie linie kończącą na
wartość 4 czyli jeśli ustawimy wartość kończącą na
czwórkę to w tym momencie ten konkretny element
rozciągnie się na 3 kolumny czyli wpisując
grid-column nie możemy sobie wpisać po prostu 3 i oczekiwać
że element rozciągnie się na 3 kolumny tylko musimy podać
jawnie start i koniec miejsc w
których elementy mają się faktycznie renderować jest to o tyle wygodne ponieważ jeśli
chcielibyśmy teraz aby element zaczynał się troszkę później możemy
wstawić tutaj na przykład dwójkę i element
oczywiście będzie miał teraz mniejszą szerokość ponieważ dystans między dwójką a czwórką jest mniejszy ale
mamy możliwość ustalenia w konkretnym miejscu na całej siatce pozycji danego
elementu czyli jeśli chcielibyśmy aby element znajdował
się na trzecim wierszu to wpisujemy jako start point trójeczkę
i jako endpoint 4 oczywiście możemy
też sprawić że element będzie rozciągnięty na kilka kolumn i
kilka wierszy równolegle czyli jeśli zmniejszymy sobie tą wartość to
teraz ta siódemka jest szeroka na dwie kolumny i wysoka na trzy wiersze
to znaczy że zwiększając rozmiary poszczególnych wierszy
powiedzmy
że 3 to 200 pikseli to ten
element faktycznie będzie o wiele większy w związku z czym ustawiając
elementy na siatce grida należy pamiętać jakie
są konkretne rozmiary torów ustalone przez tego grida natomiast
co w przypadku jeśli chcielibyśmy rozciągnąć
element wzdłuż danej osi od początku do końca no powiedzmy
że na razie zaczniemy od osi x czyli ustawimy sobie tutaj jedynkę
żeby to było od początku no i tutaj szóstkę ponieważ widzimy że
to jest indeks nr 6 czyli to jest koniec naszego grida
zapisujemy rozciągnął się nam na 5 kolumn
trzy wiersze ale jeśli teraz zmienimy design naszego grida
i ustalimy że mamy mieć 8 kolumn no to musimy w tym
miejscu to zaktualizować żeby to faktycznie była
ósemka z tym że wartość kolumn funkcji repeat
nie jest równa pozycji końcowej w grid-column ponieważ linia
która definiuje koniec ostatniej kolumny ma indeks
o 1 większy jak widzimy tutaj jest dziewiątka my wpisaliśmy ósemkę bo tutaj tyle
samo kolumn zdefiniowaliśmy no i musimy wpisać 9 żeby faktycznie
to się rozciągnęło od początku do końca no i jeśli faktycznie będziemy
tak modyfikować naszego grida no to może się okazać że bardzo
dużo pojedynczych poprawek w różnych miejscach w kodzie musimy zrobić żeby
po prostu rozciągnąć element wzdłuż danej osi w takiej sytuacji kiedy
mamy 5 kolumn jawnie zdefiniowanych natomiast element rozciąga
się ponad nie no to tak samo jak zrobiliśmy w spanie większą ilość
no to mamy utworzone niejawne tory aby
rozciągać się wzdłuż jedynie zadeklarowanych torów
możemy skorzystać z wartości ujemnej czyli
wpisując pozycję startową jako 1 i pozycję końcową
jako minus 1 sprawimy że element będzie się kończył
na pozycji pierwszej od końca czyli jeśli chcielibyśmy aby
nasz element zajmował wszystkie kolumny poza ostatnią to możemy
tutaj wpisać minus 2 i teraz możemy nawet zwiększać ilość naszych
kolumn a ten element dalej będzie zajmował maksymalną
liczbę maksymalną liczbę kolumn poza ostatnią i
możemy to też zrobić w osi y ustawiając tutaj
minus 1 natomiast to nie zadziała na samym początku
ponieważ my możemy się w osi poziomej poruszać tylko po
jawnie zadeklarowanych trackach czyli torach w związku
z czym że deklarujemy że nasz element ma
się rozciągnąć od początku do końca ale mamy tylko 3 jawnie zadeklarowane
tory no to te automatycznie dodane wiersze nam
tutaj wypływają jeżeli zmniejszymy troszkę szerokość kolumny powiedzmy
na dwie jednostki i zwiększymy trochę liczbę kolumn to
widzimy że teraz faktycznie element zajmuje całą
wysokość grida tylko tego jawnie zadeklarowanego grida
jeśli dodalibyśmy tutaj trochę elementów to
przez to że nie są one zadeklarowane przez jawną
siatkę nie będziemy w stanie rozszerzyć ich na całą wysokość tak
działa grid i to jest coś na co musicie zwracać uwagę gdy będziecie tworzyli
layouty w css gridzie to co można zrobić dodatkowo
to korzystać ze składni spanningowej tej
której poznaliśmy w poprzedniej lekcji i wykorzystać ją w tej składni to znaczy jeśli
chcemy aby element zaczynał się na pierwszej kolumnie i zajmował
3 kolumny i nie chcemy tego liczyć możemy wpisać tutaj span i
faktycznie element będzie szeroki na 3 kolumny i będzie zaczynał się na pierwszej
z nich analogicznie możemy to zastosować też do row i
możemy też zadeklarować rozmiar naszego elementu
i miejsce końcowe odwracając kolejność czyli jeśli
chcielibyśmy aby element zajmował 3
kolumny i renderował się na ostatniej z nich możemy wpisać
tutaj span 3 i
tutaj jedynkę minus jedynkę i
analogicznie sytuacja wygląda dla grid-row więc po
tej lekcji powinieneś wiedzieć już jak pozycjonować elementy
na danej siatce oraz jak ustalać ich elementy pamiętaj
że pozycje dla grid-row czy grid-column określamy
na podstawie linii danej siatki czyli możemy właśnie
otworzyć sobie narzędzia deweloperskie firefoxa żeby podejrzeć gdzie
jest początek a gdzie koniec danej linii i
układamy te elementy wzdłuż jawnie zadeklarowanych torów
to wszystko w tej lekcji gorąco zapraszam do następnej
Stan końcowy · 8 min
<div class="container">
<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 class="item item9">9</div>
<div class="item item10">10</div>
<div class="item item11">11</div>
<div class="item item12">12</div>
<div class="item item13">13</div>
<div class="item item14">14</div>
<div class="item item15">15</div>
<div class="item item16">16</div>
<div class="item item17">17</div>
<div class="item item18">18</div>
<div class="item item19">19</div>
<div class="item item20">20</div>
</div>
<style>
.container {
display: grid;
grid-template-columns: repeat(7, 1fr);
grid-template-rows: repeat(5, 100px);
}
.item7 {
background: var(--blue);
grid-column: span 3 / -1;
grid-row: 1 / span 2;
}
</style>Stan początkowy
<div class="container">
<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 class="item item9">9</div>
<div class="item item10">10</div>
<div class="item item11">11</div>
<div class="item item12">12</div>
<div class="item item13">13</div>
<div class="item item14">14</div>
<div class="item item15">15</div>
<div class="item item16">16</div>
<div class="item item17">17</div>
<div class="item item18">18</div>
<div class="item item19">19</div>
<div class="item item20">20</div>
</div>
<style>
.container {
display: grid;
grid-template-columns: repeat(5, 1fr);
}
.item5 {
grid-column: span 20;
}
</style>