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 o nadchodzących zmianach które szykują się by wejść do świata
grida pierwszą z nich jest animacja jak
wiesz pewnie możemy animować różne właściwości css przy pomocy transition czy
animation i do tej pory nie dało się animować rozmiaru
torów czyli szerokości kolumn czy wysokości wierszy
firefox nightly udostępnił taką możliwość i działa to
naprawdę wspaniale zobacz że faktycznie
ta animacja wygląda tutaj w ten sposób że mamy ustawione po prostu breakpointy
no i na konkretnym breakpoincie różne właściwości dostają
różne wartości czyli tutaj grid-template-columns dostaje 3 razy 1fr
no i przy 50% te wartości się zmieniają i tak dalej ta animacja
jest bardzo płynna i nawet jeżeli będziemy rozszerzyli teraz nasz viewport
to zobacz że tak naprawdę ta animacja dalej chodzi więc
jest to naprawdę niesamowity kawał obliczeń które tutaj firefox
dla nas robi w tym momencie firefox nightly wydaje mi się że to nie
jest jeszcze wypuszczone w normalnym firefoxie natomiast wszystko co jest w nightly prędzej
czy później będzie też dostarczone do regularnej przeglądarki mozilli
to jest technologia eksperymentalna na chromie to nie zadziała będziecie
mieli po prostu przeskoki rozmiarów kolumn co dany interwał
nie będzie tej płynnej animacji przejść to jest jedna
rzecz animowanie torów bardzo przydatna sprawa zwłaszcza jeśli chcemy zrobić layout
rwd który będzie faktycznie przy zwężaniu się ładnie
animował a nie przeskakiwał jak to z reguły działa drugą
rzeczą jest subgrid subgrid czyli faktycznie idea
taka że możemy zagnieździć w sobie grida czyli mamy
klasę container która jest gridem i mamy klasę na przykład subgrid
która też jest gridem i robiliśmy już tego typu techniki
w poprzednich lekcjach ale nie korzystaliśmy z subgrida ponieważ jest to też technologia
która jest dostępna tylko w firefox nightly póki co na czym polega subgrid jeżeli
usuniemy stąd display none to pojawi nam się element
numer 5 który ma w sobie 10 dodatkowych elementów jak widzimy
domyślnie rozszerza się on na 3 kolumny i cztery wiersze
takich rozmiarów to co daje nam subgrid to możliwość
wyrównania elementów wewnątrz tego grida do kolumn
i wierszy rodzica to znaczy jeśli włączymy grid-template-columns ustawiony na subgrid
i zapiszemy to widać że faktycznie ten subgrid
pokrywa się kolumnami ze swoim rodzicem w markupie
jeżeli zobaczymy to w devtoolsach to są zupełnie inne elementy
czyli tutaj mamy element zagnieżdżony
to są normalnie dzieci grida container a
tutaj mamy element który jest sam dzieckiem grida
i posiada elementy pozycjonowane na gridzie mimo wszystko tutaj
ta przestrzeń ten grid-gap jest dalej przestrzegany jest to równe z
rozmiarami kolumn rodzica możemy to sprawdzić ustawiając inną
szerokość tutaj kolumn powiedzmy 7 o może trochę za
dużo bo teraz już nie mamy tyle elementów ale faktycznie widać że to dalej działa pomimo
tego że mamy różne szerokości kolumn w tym momencie jeśli ustawimy
to samo dla grid-template-rows zapiszemy
to zobaczcie że tutaj dojdzie przestrzeń której wcześniej tutaj nie
było czyli faktycznie możemy działać na zagnieżdżonych
layoutach i wizualnie prezentować treść w taki sam sposób jakby
nie były zagnieżdżone to jest bardzo duży krok dla css ponieważ w żadnej
innej technologii nie było to możliwe trzeba to było robić po prostu javascriptem
jeśli teraz usuniemy to tło to faktycznie widzimy że och
tutaj element ma jeszcze taki kolor no dobrze w każdym razie to
jest wyrównane z torami rodzica jeśli zmienimy tutaj grid-gap
powiedzmy na 40 pikseli to tutaj w tym zagnieżdżonym
gridzie również ten grid-gap się zaaplikuje pomimo tego że nadajemy
to tylko i wyłącznie na kontenerze i subgrid według specyfikacji może
być zagnieżdżony wielokrotnie czyli tak naprawdę możemy mieć teoretycznie
dowolnie zagnieżdżony markup i
prezentować treści dalej w ten sam kolumnowy i
wierszowy sposób i to jest jeden z argumentów dla
których faktycznie pomimo początkowych obiekcji co
do grida w kontekście dostępności jestem bardzo za tą technologią ponieważ
żadna inna technologia css nie daje nam możliwości tego
typu prezentacji treści a semantyka czasami narzuca nam konieczność
dodania dodatkowego tagu takiego jakby wrappera aby dodać dodatkową
treść do naszego htmla co ciekawe możemy też ten subgrid animować
to może wyglądać dosyć dziwnie bo tutaj mamy deklarację na trzy
kontenery może jak zmniejszymy trochę tego spana to
będzie wyglądać okej i faktycznie widać że ten subgrid również się animuje więc
te dwie technologie działają w nightly bardzo dobrze i są ze sobą kompatybilne natomiast
trzeba pamiętać że jest to technologia eksperymentalna
dostępna tylko w firefox nightly żadna inna przeglądarka w tym momencie nie
implementuje ani subgrida ani animacji dla torów natomiast warto
znać składnię tego co zostanie dodane do grid czemu
wsparcie będzie stopniowo rosło by po prostu być gotowym
w momencie kiedy te właściwości będą już wspierane przez wszystkie przeglądarki
aby sprawdzić stan wsparcia danej
właściwości w przeglądarkach polecam stronę can i use com i tam też możecie
śledzić stan subgrida czy animacji dla torów
Stan końcowy · 5 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 subgrid">
<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>
<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(6, minmax(0, 500px));
grid-gap: 40px;
/* animation: resize 3000ms ease infinite both; */
}
.subgrid {
background: var(--blue);
display: grid;
grid-column: span 2;
grid-row: span 2;
grid-template-columns: subgrid;
grid-template-rows: subgrid;
}
@keyframes resize {
0% {
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr;
}
25% {
grid-template-columns: 1fr 2fr 3fr;
grid-template-rows: 1fr 2fr 3fr;
}
50% {
grid-template-columns: 1fr 5fr 1fr;
grid-template-rows: 1fr 5fr 1fr;
}
75% {
grid-template-columns: 3fr 2fr 1fr;
grid-template-rows: 3fr 2fr 1fr;
}
100% {
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr;
}
}
</style>Stan początkowy
.container {
display: grid;
grid-template-columns: repeat(5, minmax(0, 500px));
grid-gap: 10px;
}