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 zrobić własnego bootstrapa przy użyciu samego css
czyli bez żadnego preprocesoringu na przykład przez sass i tak
dalej do generacji klas oraz opowiem o custom properties czy
css variables zależy którą nazwę preferujecie czyli tak
naprawdę zmiennych natywnych dla css jak wiemy boostrap składa
się z systemu siatki grida bazującego
na 12 kolumnach więc możemy napisać grid-template-columns
repeat 12 1 fractional unit no i
w tym momencie będziemy mieli faktycznie podzielony nasz
grid na 12 kolumn możemy nawet dać grid gap w szerokości
jako wartość 20 pikseli
no i będziemy mieli faktycznie rozstrzał pomiędzy pojedynczymi kolumnami o takiej
właśnie szerokości z tym że żeby
nasz layout miał sens no to oczywiście nie możemy mieć żadnego overthrow żadnego
scrolla poziomego czy pionowego więc możemy użyć funkcji
minmax i tutaj ustawić jakąś minimalną szerokość
jednego wiersza możemy ustawić 10 pikseli ciężko stwierdzić jaka tu powinna być wartość
to zależy od konkretnego przypadku no jak to zapiszemy to faktycznie już
będziemy mieli ten layout 12 kolumnowy teraz
przy pomocy normalnych selektorów css możemy złapać powiedzmy
element numer 28 i ustawić mu
grid column na span 5 no
i w tym momencie faktycznie element rozstrzelił się na 5 kolumn no
tylko nie jest to wygodne jeżeli chcemy pisać w ten sposób każdy element no bo bootstrap
ma tak fajną składnie niektórzy lubią że możemy
faktycznie wpisać po prostu nazwę klasy i element rozszerzy się na taką szerokość
jaką poprosiliśmy co możemy zrobić to skorzystać
z faktu że każdy element grida czyli każde dziecko
w tym momencie elementu o klasie container ma
domyślnie ustawiony span na 1 jeśli wykorzystamy
ten fakt i podstawimy zamiast tej jedynki zmienną
którą za chwilę sobie utworzymy powiedzmy span to będziemy
mogli w markupie zmieniać wartość tej zmiennej poprzez
style inline'owe bądź przez klasy to zależy jaką drogę
obejmiemy natomiast oczywiście nadawanie tego przez klasy wiąże
się z generowaniem wszystkich klas no ale zanim
nadamy wartość tej zmiennej to musimy ją zadeklarować jeszcze w root scope czyli
takim elemencie który jest dostępny dla tak jakby
wszystkich sektorów i możemy tutaj zdefiniować początkową wartość tego
spana czyli jeśli ustawimy span na 1 no to to będzie jego wartość domyślna
która powędruje tutaj tutaj będziemy mieli wstawioną jedynkę no
chyba że zadeklarujemy w innym miejscu tą wartość
tej zmiennej czyli teraz możemy zrobić na przykład na elemencie numer 28
deklarację style i tutaj wpisać sobie span
powiedzmy 4 i faktycznie element
zajmuje teraz 4 kolumny możemy to zmienić na 2 będzie
zajmował dwie kolumny no i możemy tak na każdym z naszych elementów ustawić
wartość na jakiej nam zależy generalnie nie jestem zwolennikiem
stylów inline'nowych ale jest to ciekawa faktycznie technika którą
podpatrzyłem u wes bosa aby zmieniać wartość
zmiennej w markupie bez faktycznej konieczności generowania
wszystkich klas oczywiście musicie się wiązać wtedy z tym że specificity
takiej zmiennej jest ogromne i jeśli będziecie chcieli to nadpisać
no to może to być problematyczne to co można jeszcze zrobić to tak naprawdę
podstawić zmienne pod inne wartości powiązane z gridem na przykład
ustawić zamiast tutaj na sztywno 12 możemy wpisać sobie
columns z fallbackiem
powiedzmy do dwunastu domyślnie czyli teraz działa to tak samo no bo zrobiliśmy fallback na 12
składnia jest taka że bierzemy zmienną columns jeśli jej nie ma na to wstawiamy
dwunastkę no ale możemy też robić tutaj columns powiedzmy
12 i teraz jeśli chcielibyśmy zagnieżdżać nasze
elementy dalej na przykład w tej 27 wstawić jeszcze kilka
elementów poprzez emmeta czyli
div item item dollar
dollar powiedzmy że 5 razy usuniemy
to albo przesuniemy to na górę zapiszemy oczywiście to jest
w tym momencie ogromne ponieważ takie mamy domyślne style dla
tych elementów możemy je nadpisać co prawda może nie jako item ale
jako po prostu nested albo zrobimy taki
trik że zagnieździmy item w item no i ustalimy mu font-size
na dwa rem czyli relatywne do dokumentu
do roota a nie do elementu wewnątrz którego się
znajduje no i teraz element
numer 28 27
możemy ustawić jako grida tak
naprawdę możemy nadać tutaj po prostu jeszcze jedną klasę container 27
a nie 28 container
zapisujemy no i tutaj jeszcze zdefiniować
liczbę kolumn powiedzmy columns będzie dwanaście
zapiszemy okej
coś tu poszło nie tak zobaczmy co się stało weźmy
naszego zagnieżdżonego kontenera podświetlmy faktycznie
ma aż 13 kolumn nie
13 ma indeksów kolumna 12 więc to akurat działa
zobaczmy czy jak zaktualizujemy to na 8 to też zadziała faktycznie
zadziałało zastanawiam
się czy to nie jest po prostu problem z użyciem tych klas które tutaj były definiowane
spróbujmy je usunąć okej możliwe że po prostu miałem
jakieś style które spowodowały że w tym momencie to nie zadziałało
możemy dać tutaj klasę nested swoją drogą w visual
studio code możecie za pomocą skrótu klawiszowego shift option i
zaznaczenie myszką zaznaczyć
blok tekstu i edytować kilka linii równoległe co właśnie
teraz robię więc możemy teraz to nested dać na background
niebieski zapiszemy
i faktycznie widzimy że te elementy zagnieżdżone działają
w ten sposób możemy też te elementy tutaj przenieść zapiszemy
i może jeszcze zmniejszmy zwiększmy
liczbę tutaj tych elementów żeby było widać że faktycznie to jest grid i
mamy w tym momencie zagnieżdżonego grida w którym możemy deklarować zarówno szerokość
względem jego rodzica który jest gridem no i oczywiście
też szerokość column czyli ile kolumn chcemy mieć w tym podgridzie
oczywiście do wszystkich styli inline'owych możecie wygenerować
dodatkowe klasy natomiast to podejście też jest ciekawe i
możecie spróbować tego w swoich prywatnych projektach bądź przegadać to z
kolegami z pracy co sądzą o tym podejściu zagnieżdżaniu gridów
przyda nam się jeszcze właściwość subgrid o której powiem pod koniec tego
kursu a na subgrida warto czekać
Stan końcowy · 7 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 class="item item21">21</div>
<div class="item item22">22</div>
<div class="item item23">23</div>
<div class="item item24">24</div>
<div class="item item25">25</div>
<div class="item item26">26</div>
<div class="item item27 container" style="--span: 8; --columns: 8">
27
<div class="nested">1</div>
<div class="nested">2</div>
<div class="nested">3</div>
<div class="nested">4</div>
<div class="nested">5</div>
<div class="nested">1</div>
<div class="nested">2</div>
<div class="nested">3</div>
<div class="nested">4</div>
<div class="nested">5</div>
<div class="nested">1</div>
<div class="nested">2</div>
<div class="nested">3</div>
<div class="nested">4</div>
<div class="nested">5</div>
</div>
<div class="item item28" style="--span: 2">28</div>
<div class="item item29">29</div>
<div class="item item30">30</div>
<div class="item item31">31</div>
<div class="item item32">32</div>
<div class="item item33">33</div>
<div class="item item34">34</div>
<div class="item item35">35</div>
</div>
<style>
:root {
--span: 1;
--columns: 12;
}
.container {
display: grid;
grid-template-columns: repeat(var(--columns, 12), minmax(10px,1fr));
grid-gap: 20px;
}
.item {
grid-column: span var(--span);
}
.item27 {
display: grid;
}
.nested {
font-size: 2rem;
background: var(--blue);
}
</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 class="item item21">21</div>
<div class="item item22">22</div>
<div class="item item23">23</div>
<div class="item item24">24</div>
<div class="item item25">25</div>
<div class="item item26">26</div>
<div class="item item27">27</div>
<div class="item item28">28</div>
<div class="item item29">29</div>
<div class="item item30">30</div>
<div class="item item31">31</div>
<div class="item item32">32</div>
<div class="item item33">33</div>
<div class="item item34">34</div>
<div class="item item35">35</div>
</div>
<style>
.container {
display: grid;
grid-template-columns: repeat(5, 1fr);
}
</style>