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.
W tej lekcji z kursu css grid zaawansowane layouty opowiem ci o
wadach i zaletach grida czyli w czym jest dobry w czym jest gorszy czego nie
powinieneś robić a do czego grid może ci się faktycznie przydać więc zaczniemy może
od sytuacji gdzie definiujemy że każdy element powiedzmy
co trzeci będzie miał szerokość ustawioną
na cztery kolumny no i mamy
w tym momencie sytuację że faktycznie mamy tutaj te dziury ponieważ
grid nie jest w stanie ich ułożyć możemy w tym momencie ustalić
że chcemy korzystać z auto-flow ustawionego
na dense i w tym momencie te dziury zostają wypełnione natomiast
oprócz tego że grid musi to jeszcze raz wszystko przezanalizować i ustawić
wpływa to też na dostępność co mam konkretnie na myśli jeśli usuniemy
dense'a odświeżyłem stronę i dodamy
na wszystkich naszych elementach właściwość tabindex
0 czyli sprawimy że będą focusowalne za pomocą
nawigacji klawiaturą symulujemy w tym samym sytuację
gdyby te elementy były buttonami oczywiście jeśli jednak mielibyście
buttony na stronie powinniście używać semantycznych tagów
czyli normalnie tutaj wstawić button ja ze względu na dodatkowe stylowanie
które powinniśmy zrobić wtedy aby wyglądał nasz przykład dokładnie tak samo tego
robić nie będę no ale samo tabindex 0 nie zmienia nam kolejności
tabowania się po stronie i umożliwia faktyczne focusowanie
danego elementu czyli jak to zapiszemy i zaczniemy teraz nawigować się tabem
to widzimy że elementy mają tutaj niebieski
border czyli możemy się po nich nawigować klawiaturą i faktycznie jak ja klikam shift bądź
tab no to one albo idą do przodu albo do tyłu i to jest okej to
jest jeszcze w porządku pomimo tego że to wygląda średnio to jest
to dostępne ponieważ widzimy w którym miejscu będzie za chwilę outline
kiedy go klikniemy czyli klikamy tab spodziewamy się że będzie na dwójce
następna pewnie będzie trójka czwórka piątka szóstka siódemka i tak
dalej w przypadku jeśli włączymy grid-auto-flow dense no to
nawigacja klawiaturą będzie zaburzona ponieważ jedynka jest okej dwójka jest okej
ale w tym momencie już nie wchodzimy na czwórkę pomimo tego że naturalne
dla nas byłoby że czytamy od lewej do prawej czyli ten element będzie następnym który
foxusujemy tylko zeszliśmy na dół teraz klikamy dopiero
czwórkę piątkę szóstka jest w ogóle jeszcze niżej niż trójka siódemka
tutaj ósemka dziewiątka tutaj dziesiątka i tak dalej i tak dalej więc
nawigacja klawiaturą jest zdecydowanie utrudniona w związku z czym nie używajcie
grid-auto-flow dense na elementach które mają być docelowo elementami
z którymi użytkownik będzie przeprowadzał interakcje ponieważ jeśli będziecie musieli
dostosować swoją stronę do konkretnych wymogów dostępności będziecie
mieli problem i będziecie musieli to po prostu przepisać tak samo ma się sytuacja z
orderem i to jest dokładnie ta sama sytuacja co we flexboxie jeśli ustawimy powiedzmy
na elemencie 10 order 1 no
to ten element będzie renderowany na końcu i nawet jak się będziemy próbować
doklikać teraz jesteśmy na dziewiątce to faktycznie nawigacja
klawiaturą dalej korzysta z kolejności takiej jaka jest w markupie
możemy próbować zmieniać wartości tutaj tabindexów aby
ta nawigacja wyglądała lepiej natomiast jest to rozwiązanie które totalnie
się nie skaluje jest trudne w utrzymaniu i generalnie przynosi
więcej szkód niż korzyści więc po prostu nie używajcie
grida do elementów nawigacyjnych zwłaszcza w ten sposób
jak zaprezentowałem tutaj bo to po prostu jeśli przyjdą odpowiednie
wymagania będzie do przepisania grid nie jest natomiast największym
złem jeśli chodzi o dostępność stron www wręcz przeciwnie pozwala
często spłaszczyć strukturę markupu bez konieczności dodawania
wrapperów czyli na przykład diva o klasie wrapper
nie musimy robić tego tak dużo jeśli korzystamy z grida oczywiście czasami
wrapery się trafią natomiast nie będzie ich tak dużo jak gdybyśmy
na przykład tworzyli layouty na floatach czy nawet na flexie dodatkowo wiedząc
że właściwość subgrid pojawia się na horyzoncie i
w niedalekiej przyszłości prawdopodobnie będziemy mogli z niej korzystać o
właściwości submit opowiem pod koniec tego kursu w lekcji nadchodzące
zmiany i submit właśnie będzie nam pozwalał zachowywać semantyczną strukturę
dokumentu oraz wizualną strukturę naszej
siatki dlatego grid jak każda inna technologia użyta niepoprawnie będzie
zła dla dostępności performance'u czy po prostu utrzymania
danej witryny ale używana poprawnie będzie faktycznie dawała
duże benefity no i dla niektórych wadą grida
może być to że nie mamy na przykład na konkretnym elemencie możliwości
ustawienia czegoś takiego jak we flexie flex-grow po
prostu nie da się tego w gridzie zrobić dla niektórych będzie wadą to że
nie możemy mieć nierównych kolumn czy wierszy tak jak
w sytuacji z justify-content którą widzieliśmy parę lekcji temu ale
to jest wada nie powiedziałbym po prostu grid jest inną technologią
w inny sposób rozwiązuje problemy układania
layoutu i powinniśmy zawsze dobierać narzędzie do problemu kolejną
z oczywistych zalet grida jest to że jest po prostu prosty w obsłudze i
wymaga stosunkowo mało kodu aby osiągnąć naprawdę
skomplikowane layouty a to przekłada się po prostu na to że
nasze strony będą ładowały się szybciej ponieważ nie musimy robić wielu haków które
musieliśmy na przykład robić przy layoutach związanych z budowaniem stron
na frontachfloatach nie musimy robić clearfix'ów nie musimy dodawać dodatkowych elementów
do naszego markupu grid jako technologia jest
o wiele bardziej wydajny niż floaty i prawdopodobnie
też flexbox ostatnim argumentem z którym
możecie się spotkać w kontekście dlaczego nie używać grida jest
jego wsparcie natomiast w przeciwieństwie do flexboxa grid
miał mniej więcej takie same wsparcie we wszystkich
przeglądarkach w momencie kiedy został dostarczony w momencie
kiedy stał się oficjalnym specyfikacją większość przeglądarek
je wspiera oczywiście starsze internet explorery mogą mieć problem
z renderowaniem grida ponieważ tam jest też troszkę inna składnia konkretnych
właściwości natomiast grid idealnie wpasowuje się w ideę
progressive enhancement czyli dostarczania funkcjonalności
lepszych dla urządzeń które je wspierają a dla
urządzeń słabszych to co jest po prostu możliwe zwłaszcza
że ucząc się grida w tym momencie będziecie znali technologię która za dobrych
parę lat będzie już tak dobrze wspierana i możliwe że wsparcie dla
starszych przeglądarek jak na przykład internet explorer 11 będzie
konieczne tylko jeśli pracujecie w jakiejś korporacji która jest
zależna od tej przeglądarki ponieważ ma swój tooltip zbudowany wokół niego bądź ma
po prostu klientów którzy z tej konkretnej przeglądarki jeszcze korzystają natomiast będzie
to naprawdę ułamek rynku za kilka lat więc
odpowiadając na pytanie czy używać grida moja odpowiedź
brzmi tak biorąc pod uwagę wszystkie problemy z
dostępnością które powoduje biorąc pod uwagę wsparcie przeglądarek
oraz czytelność dla współpracowników którzy po prostu jeszcze z grida
nie korzystali ponieważ jest on dosyć inny w podejściu niż
dotychczasowe techniki tworzenia layoutów w css to wszystko w tej lekcji dzięki za uwagę
Stan początkowy
<div class="grid">
<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>
.grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
}
</style>Stan końcowy · 7 min
<div class="grid">
<div tabindex="0" class="item item1">1</div>
<div tabindex="0" class="item item2">2</div>
<div tabindex="0" class="item item3">3</div>
<div tabindex="0" class="item item4">4</div>
<div tabindex="0" class="item item5">5</div>
<div tabindex="0" class="item item6">6</div>
<div tabindex="0" class="item item7">7</div>
<div tabindex="0" class="item item8">8</div>
<div tabindex="0" class="item item9">9</div>
<div tabindex="0" class="item item10">10</div>
<div tabindex="0" class="item item11">11</div>
<div tabindex="0" class="item item12">12</div>
<div tabindex="0" class="item item13">13</div>
<div tabindex="0" class="item item14">14</div>
<div tabindex="0" class="item item15">15</div>
<div tabindex="0" class="item item16">16</div>
<div tabindex="0" class="item item17">17</div>
<div tabindex="0" class="item item18">18</div>
<div tabindex="0" class="item item19">19</div>
<div tabindex="0" class="item item20">20</div>
</div>
<style>
.grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
grid-auto-flow: dense;
}
.item:nth-child(3n) {
grid-column: span 4;
}
.item10 {
order: 1;
flex-grow: 1;
}
</style>