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 kursu css grid zaawansowane layouty
opowiem o różnicach między gridem a flexem w kontekście
odwracania kolejności renderowania i
ustalenia kierunku renderowania mamy stworzone dwa kontenery z
dokładnie taką samą ilością elementów są to divy
o klasie item każdy z kontenerów ma dokładnie tyle
samo elementów już widzimy że na pierwszy rzut oka grid domyślnie
zupełnie inaczej renderuje elementy niż flex można
powiedzieć że grid domyślnie renderuje elementy tak jak
flex-direction column mamy
prawie albo niemalże taki sam układ
w tych dwóch kontenerach w tym momencie więc
to jest pierwsza z różnic domyślnie oba tryby
wyświetlania inaczej traktują swoją
treść wróćmy do sytuacji gdzie flex był na jednej linii i
spróbujemy stworzyć kontener który będzie zachowywał się w tym momencie
tak jak flex możemy ustawić grid-auto-flow
na column i
w tym momencie dodać
deklarację grid-template-columns na
repeat auto-fit no i powiedzmy
albo po prostu 10 razy auto
to będzie prostsze nie wiem czemu się to nam nie wyświetla
zróbmy szybkie debugowanie model
pudełkowy nie jest używany okej tutaj nie mamy włączonego grida dobra możemy
zminimalizować teraz tą właściwość i faktycznie widzimy
że elementy są wyświetlane w jednej linii natomiast
flex domyślnie zwęża te elementy do treści moglibyśmy
osiągnąć ten sam efekt albo ustawiając flex-grow na każdym elemencie
flexa albo ustawić na każdej z kolumn wartość
min-content spróbujemy to zrobić grid-template-columns repeat
10 razy min-content zapiszemy
no i mamy generalnie taką samą sytuację możemy dostosować
grida żeby działał mniej więcej jak flex i flexa żeby działał mniej
więcej jak grid natomiast są te rozbieżności między tymi dwoma technologiami których
nie da się pokryć o nich będziemy mówili później ale w kontekście odwracania
kolejności renderowania możemy ustawić flex-direction na
row reverse jeśli korzystamy z flexboxa
i wtedy faktycznie elementy będą renderowane od drugiej strony oczywiście
możemy je dociągnąć do końca linii jeśli chcemy przy pomocy flex przepraszam
justify content flex end i
teraz mamy odwróconą kolejność w grodzie jako
takim nie ma możliwości zastosowania suffixu reverse i
generalnie nie ma możliwości odwracania renderowania treści w ten sposób
da się to zrobić za pomocą innej właściwości css natomiast
nie jest ona przeznaczona stricte do grida tylko do lokalizacji
tekstu to znaczy możemy użyć direction i
tutaj wstawić albo right to left czyli rtl albo
left to czyli ltr no jeśli wpiszemy rtl
to tekst będzie renderowany od prawej strony w lewo i
faktycznie mamy bardzo podobną sytuację do tego którą mieliśmy we flexboxie
możemy teraz dać justify content
na end i
faktycznie mamy dokładnie taką samą sytuację z tym że
używanie direction right to left będzie wiązało się z różnymi
problemami po pierwsze w kontakcie dostępności a po drugie
wszystkie elementy które będziemy teraz zagnieżdżać w
naszych elementach listy również będą miały to direction right
to left więc jeśli chcielibyśmy odwrócić kolejność
renderowania w gridzie w sposób bezpieczny powinniśmy na
wszystkich pozostałych elementach czyli na grid direct
ascendent ustawić direction
left to right w tym momencie nie widać
różnicy natomiast gdyby nasze elementy miały w sobie dzieci to
dopiero teraz mielibyśmy taką samą sytuację generalnie
nie powinniście używać direction do odwracania kierunku
renderowania jeśli korzystacie z grida jeśli macie faktycznie potrzebę odwrócenia
renderowania jest to bardzo mocny znak że
powinniście w tym przypadku użyć flexboxa albo dodać dodatkowy wrapper
który będzie korzystał z flexboxa albo użyć javascriptu używanie
direction w celu odwrócenia renderowania elementów
siatki jest techniką według mnie niepolecaną
i raczej nie spotkacie się w codziennej pracy w takim zapisem więc
owszem da się to zrobić natomiast lepiej jest dla tych sytuacji korzystać
z flexa bo natywnie w gridzie nie
da się odwrócić kolejności renderowania przez suffix reverse czy przez inne słowo
kluczowe direction jest inną właściwością która służy do innych rzeczy co
prawda można ją nadużyć żeby faktycznie
grid działał w podobny sposób ale ja tego nie polecam to
tyle w tej garstce różnic dotyczących grida i flexa do zobaczenia
w kolejnej lekcji
Stan końcowy · 6 min
<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>
<div class="flex">
<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>
<style>
.grid {
display: grid;
grid-auto-flow: column;
grid-template-columns: repeat(10, min-content);
justify-content: end;
direction: rtl;
}
.grid > * {
direction: ltr;
}
.flex {
display: flex;
flex-direction: row-reverse;
justify-content: flex-end;
}
</style>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>
<div class="flex">
<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>
<style>
.container {
display: grid;
}
.flex {
display: flex;
}
</style>