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 ci jak zmieniać rozmiary poszczególnych
elementów w naszej siatce css grid jak już wiesz
grid polega na zależności rodzic-dziecko
no i do tej pory definiowaliśmy tylko rozmiary
naszego grida poprzez właściwości takie jak grid-template-columns czy
grid-template-rows no i ustawialiśmy tym samym jawne
tory naszej siatki jeśli chcielibyśmy aby powiedzmy
element numer 3 czyli element z klasą item
3 miał większą szerokość powiedzmy 400
pikseli możemy zrobić to w ten sposób natomiast skutkuje
to tym samym co gdybyśmy zmienili rozmiar faktycznie
treści każdego elementu czyli kolumna będzie rozszerzała się do
najszerszego dziecka w tej kolumnie czyli jeśli
chcielibyśmy aby tylko element trzeci miał tą
szerokość powiedzmy 400 pikseli no to nie możemy tego w ten sposób zrobić
bo tak rozszerzamy całą kolumnę co można zrobić jest
to składnia która przechodzi z css grid i
możemy ustalić rozmiar elementu w
osi x czyli ile kolumn będzie
zajmował dany element i możemy to zrobić za pomocą słówka kluczowego span
no i podając tutaj liczbę kolumn którą dany element ma
zajmować czyli jeśli wpiszemy sobie span 2 na item numer 3
to możesz zauważyć że element
trzeci jest tak szeroki jak siódemka i ósemka razem
czyli po prostu zajmuje dwie kolumny tutaj mamy jak
sobie otworzymy w devtoolsach podgląd torów no to
faktycznie mamy te 5 torów natomiast 3 rozszerza
się na dwa z nich jeśli analogicznie jeśli zwiększymy
tutaj oczywiście liczbę tych kolumn no to nasz element będzie szerszy
jeśli zwiększymy tą liczbę tak że element nie będzie
już się mieścił w naszej siatce czyli w tym momencie 4 css grid
ustawił nam element o identyfikatorze 3 w pierwszym wolnym
miejscu gdzie faktycznie może wstawić go na cztery kolumny no tutaj już nie mógł
bo mieliśmy tylko 3 kolumny dostępne no i wstawił to
w drugim wierszu i zajął pierwsze 4 kolumny jeżeli
zrobimy span 5 no to oczywiście element numer 3 zajmie całą
dostępną przestrzeń w danym wierszu natomiast co się stanie jeżeli damy span
większy niż faktycznie cały nasz grid czyli tutaj definiujemy że
mamy 5 kolumn co się stanie jeżeli zdefiniujemy że dany element ma
się rozszerzyć na więcej niż 5 kolumn powiedzmy że wpiszemy tutaj 8 i grid
w tym momencie stworzył nam dodatkowe kolumny
jak widzicie tutaj tą linią twardą definiujemy 5
kolumn natomiast te trzy dodatkowe które wynikają z tego że tutaj daliśmy
8 a tutaj mamy 5 więc różnica to 3 czyli 3 dodatkowe
kolumny zostały stworzone przez grida i są to tak samo implicit
columns tak samo jak mieliśmy implicit rows czyli niejawne
kolumny stworzone przez to że css grid próbuje zrozumieć o co
nam chodzi no i stworzył nam taki oto layout jeśli
natomiast korzystamy z takich prostszych sytuacji faktycznie i
ustalamy szerokość danego elementu na dwie kolumny no
to nie ma tego problemu grid nam się nie rozszerza no
i możemy ustalić tak naprawdę że co drugi element czyli korzystamy
z pseudoselektora nth child na
się rozszerzyć na dwie kolumny no to mamy w tym momencie taki layout
no ale tutaj mamy dziury te dziury się biorą stąd ponieważ grid
renderując się domyślnie nie patrzy w tył czyli grid
ustawił nam pierwszy element ze spanem jeden drugi element ze
spanem dwa trzeci element ze spanem jeden no i mamy
już tylko jeden jedną kolumnę dostępną w tym konkretnym wierszu a
kolejny element ma już span 2 dlatego
leci do następnej linii i dlatego zostaje nam tutaj kropeczka
jesteśmy w stanie te puste pola wypełnić
za pomocą grid-auto-flow natomiast o tym będziemy mówili trochę
później więc przejdźmy jeszcze raz do
tego ustawienia spanów na konkretnych elementach jeśli uznamy
że chcielibyśmy aby nasz element rozszerzał się nie tylko w
osi x ale również w osi y możemy
wykorzystać do tego grid-row czyli ustalamy
że element ma się rozszerzyć powiedzmy na trzy wiersze
i po zapisaniu mamy taki layout może jeżeli na razie wykomentujemy
tą kolumnę to będzie to lepiej widoczne i mamy faktycznie
już teraz dosyć ciekawy layout czyli jedynka ma wysokość
jednego wiersza dwójka ma wysokość trzech wierszy no tutaj
dlatego tutaj mamy tą przestrzeń dodatkową trójka jest normalnie czwórka znowu
jest większa piątka jest normalna szóstka znowu jest większa
tutaj nie wstawiają się elementy ponieważ ta dwójka zajmuje więcej miejsca
no i tak generalnie layout się układa
akurat nam się złożyło tak że mamy fajny ładny prostokąt i
nie ma żadnych dziur natomiast widzimy teraz że ta numeracja przestaje
mieć większy sens ponieważ mamy 12345 tutaj jest szóstka
tutaj nagle jest dziesiątka siódemka ósemka dziewiątka jedenastka
12 13 14 no i to się tak rozchodzi niestety to
jest jedna z wad css grid że niestety elementy mogą
mieć nie taką kolejność jaką byśmy się spodziewali jeżeli korzystamy
z zaawansowanych właściwości pobawmy się jeszcze trochę tym przykładem
czyli ustalimy że co drugie dziecko albo powiedzmy
co trzecie będzie miało szerokość 2 i
co piąte będzie miało wysokość
czyli tak na pewno musimy ustawić grid-row ponieważ będziemy zajmować więcej
wierszy równą no powiedzmy
też dwóm jednostkom tutaj musimy użyć pseudoklasy
a nie klasy zapisujemy no i mamy taki oto layout
zmieniając tylko te pojedyncze dwie wartości możemy zupełnie zmienić
sposób renderowania naszego layoutu i oczywiście
możemy też pojedyncze elementy łapać za pomocą normalnych selektorów
i ustalić im inne właściwości
na przykład span 5 i w tym momencie element
20 będzie rozciągał się na całą szerokość naszego grida ponieważ mamy
zdefiniowane 5 kolumn ale jeśli zmienimy ilość kolumn powiedzmy w tym
momencie na 8 no to oczywiście layout
układa się nam zupełnie inaczej podsumowując css-grid
daje nam możliwość definiowania rozmiarów poszczególnych elementów w
bardzo elastyczny sposób ponieważ zmieniamy tylko pojedyncze właściwości a
zmienia się cały layout natomiast musimy w bardzo przemyślany sposób tworzyć
te layouty by najmniejsza zmiana nie powodowała
nam takiego chaosu jak tutaj w tym momencie widzimy w
kolejnej lekcji opowiem o tym jak umieszczać konkretne elementy
wewnątrz grid containera na konkretnym torze
czyli kolumnie bądź wierszu
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);
}
</style>