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 powiem ci jak nazywać konkretne
linie w notacji grid-template-columns bądź grid-template-rows funkcja
repeat jest naprawdę bardzo przydatną funkcją ponieważ możemy pisać
mniej deklarując więcej kolumn bądź wierszy
bądź innych properties powiązanych z css grid natomiast
jedną wadą tej notacji jest to że nie możemy określić nazw
pomiędzy poszczególnymi kolumnami jeśli otworzymy sobie devtools
i włączymy podświetlanie siatki i
zmienimy notację na standardową powiedzmy zrobimy
sobie 5 albo 4 kolumny 100 pikseli 300 pikseli 200
pikseli 100 pikseli zrobimy może
piątą jeszcze 50 pikseli no to w tym momencie i
i tak nie moglibyśmy skorzystać z notacji repeat ponieważ mamy
nierówne kolumny natomiast jeśli chcielibyśmy móc
odwołać się do konkretnej linii w sposób jawny
poprzez nazwę zamiast faktyczne indeksy
widoczne tutaj no to możemy użyć do tego notacji nawiasów
kwadratowych i określić jak dana linia ma
się nazywać jeśli wpiszemy sobie tutaj site-end albo w sumie site-start
bo to jest początek no to teraz ta linia będzie
nazywała się site start co prawda firefox tego nie podświetla
natomiast ta linia jest tam tworzona i jak widać jest ona
pierwszą rzeczą którą deklarujemy przy grid-template-columns dlatego jest to
ta linia następnie można to rozumieć w ten sposób że jest
tworzona przestrzeń o wielkości 100 pikseli no i po tych 100
pikselach możemy stworzyć kolejną nazwaną linię czyli
tworzymy kolejny nawias kwadratowy no i nazwiemy go sobie może
content-start następnie mamy kolumnę o
szerokości 300 pikseli czyli tu jest nasz content start tutaj
jest kolumna 300 pikseli tu jest kolumna 200 pikseli no
i powiedzmy że tutaj chcielibyśmy żeby content się kończył czyli pomiędzy
kolumną 200 pikseli a 100 pikseli możemy też oczywiście patrzeć
na indeksy chcemy zakończyć nasz content czyli piszemy content end to
są nazwy które możecie dowolnie według interpretacji tworzyć ja
staram się po prostu trzymać konwencji nazewniczej w ten sposób no
i na samym końcu strony pod koniec deklaracji column możemy
sobie napisać site end widzimy że po odświeżeniu za bardzo
nic nie zmieniło nawet devtoolsy nie pokazują nam żadnych zmian natomiast
możemy teraz zrobić że item numer 3 będzie zaczynał
się przez grid-column
od powiedzmy site-start
albo niech będzie jednak content start do
content end i widzimy że faktycznie rozszerzył
się na te dwie kolumny i nie musieliśmy odwoływać się do tego poprzez
indeksy co oczywiście moglibyśmy zrobić wpisując tutaj dwójkę
ponieważ ta linia ma numer 2 no i kończąc na czwórce
natomiast notacja słowna jest
o tyle lepsza od tej z indeksami bo jeśli
zdecydowalibyśmy się dodać jeszcze jedną kolumnę w tym miejscu powiedzmy 100
pikseli już nam się powoli przestaje mieścić
ten grid to może zmniejszymy to na 50 i tu na 50 to
ta mutacja dalej działa ale jeśli zmienilibyśmy to na tak jak
wtedy 2 i 4 no to nasza trójka jest krótsza niż
byśmy chcieli więc jeśli istnieje
szansa że będziemy dodawać kolumny pomiędzy
daną strefą to lepiej jest używać nazw w
postaci stringa w postaci ciągu znaków ponieważ
nie ma to znaczenia ile kolumn pomiędzy danymi obszarami umieścimy nasz
layout będzie wyglądał tak samo dobrze no i oczywiście
możemy tej samej notacji użyć przy grid-template
rows czyli jeśli stworzymy sobie powiedzmy trzy rowy
pierwszy będzie miał 100 pikseli drugi będzie miał 150 pikseli 3 bęzie miał
300 pikseli no to te trzy rowy są stworzone może
zamkniemy devtoolsy w tym momencie no i pozostałe rowy które zostały
stworzone niejawnie mają tam automatyczną wysokość
ustawioną przez grid-auto-rows no jeśli chcielibyśmy nazwać
tutaj oś y naszej siatki no to możemy
to w taki sam sposób robić czyli ustalamy nawiasy
kwadratowe piszemy sobie site-start
na końcu piszemy site-end zakładamy
że tylko jawne wiersze będą składały się na site możemy
też napisać explicit czyli jawne site-start i
explicit site end oraz umieścić content pomiędzy
nimi czyli ten wiersz byłby po prostu naszym contentem możemy zrobić wtedy content
start i content end
zobaczcie że tutaj używam dokładnie tych samych nazw
co w grid-template-columns natomiast one nie będą ze sobą konfliktować
ponieważ rows będą szukały tylko linii w
wierszach a columns tylko linii w osi pionowej więc
możecie używać tych samych nazw aby tworzyć tego typu obszary no jeśli
ustawimy tutaj grid-row na powiedzmy content
start content end zapiszemy to
faktycznie nasz element znajduje się na
drugim wierszu pomiędzy tymi trzema kolumnami które tutaj
zadeklarowaliśmy zobaczmy czy można to jakoś zaprezentować przez
devtoolsy pierwsza kolumna 100 pikseli druga kolumna 300
pikseli trzecia 50 czwarta 200 no i na
te trzy nasza item numer 3 jest rozciągnięty możemy
jeszcze tylko zmienić kolor żeby było czytelniej i
faktycznie widać jak możemy to wypozycjonować być może nazywanie
linii w ten sposób jest mniej czytelne niż korzystanie z
grid-template-areas czy z grid-template-columns przy pomocy funkcji
repeat czy odwoływania się do rozmiarów kolumn bez
nazywania linii natomiast możliwości które nam
daje nazywanie linii też są duże i warto po prostu rozważyć czy
potrzebujemy tego feature'a css grida czy nie bo w css nie
ma jednej dobrej metody rozwiązywania problemów są
różne zwłaszcza w css grid możemy na bardzo wiele sposobów tworzyć te same layouty
więc to jest kwestia preferencji i danego przypadku natomiast warto
wiedzieć że nazywać linie się da że możemy nazwać je w dowolny sposób i
że można to czytać na zasadzie nazwa linii pierwszej czyli to szerokość
pierwszej kolumny czyli tutaj ta przestrzeń 100 pikseli nazwa
linii drugiej czyli tutaj w tym momencie ta linia kolejne rozmiary kolumn
i tak dalej i tak dalej gdy dodamy jakąś
lokalizację kolejnemu elementowi powiedzmy item
4 będzie miał grid-area sidebar i może
zmniejszymy liczbę kolumn to
w tym momencie widać że mamy pustą przestrzeń ta pusta
przestrzeń oczywiście może wynikać z nie mieszczenia się elementów na stronie czyli
jeśli damy itemowi 15 grid column
span 4 albo chyba 5
teraz będzie trzeba zrobić damy 6 w takim
razie to widzimy że są te dziury i te dziury
da się wypełniać za pomocą tak zwanego zagęszczania natomiast
po zagęszczeniu layoutów opowiem troszkę w kolejnej lekcji
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: [site-start] 100px [content-start] 300px [content-end] 50px 50px [site-end];
grid-template-rows: [explicit-site-start] 100px [content-start] 150px [content-end] 300px [expclit-site-end];
}
.item3 {
grid-column: content-start / content-end;
grid-row: content-start / content-end;
background: var(--blue);
}
.item4 {
grid-area: sidebar;
}
.item15 {
grid-column: span 6;
}
</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);
}
</style>