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.
Do tej pory w kursie css grid zaawansowane layouty dowiedzieliśmy
się czym są tracki wiersze kolumny o tym że składają się z
linii każda linia ma swoją numerację możemy ustawiać
elementy według tych linii zmieniać ich rozmiar oraz
poznaliśmy obszary szablonowe czyli grid-template-areas
które pozwalają nam bardzo wymownie poprzez
korzystanie z dowolnego ciągu znaków na przykład header header header definiować
jak nasz layout ma wyglądać w poprzedniej lekcji wspomniałem że przy
okazji definicji w ten sposób czyli poprzez grid-template-areas
dostajemy w gratisie od css grid pewne
rejony które nie są jawnie zakodowane jeśli otworzymy narzędzia
deweloperskie firefoxa i włączymy sobie debugowanie i będziemy
mieli zaznaczone tutaj nazwy obszarów no to będziemy widzieli
te grid-template-areas które zakodowaliśmy faktycznie naniesione
na naszą siatkę i o ile oczywistym jest to że możemy wziąć item
powiedzmy siódmy wstawić mu background na
niebieski i dać mu grid-area
na content i on się wtedy nam przesunie faktycznie
w ten obszar który zadeklarowaliśmy że ma być strefą o nazwie content
o tyle mniej oczywistym jest to że możemy wypozycjonować
nasze elementy w odniesieniu do tego content ale nie odwołując
się do niego bezpośrednio co to znaczy jeśli ustawimy sobie
grid-column na początkową lokację jako content
start wtedy
item siódmy rozpocznie się tam gdzie
jest początek kolumny content czyli w tym miejscu jeśli
zakończymy go na content end to
wtedy skończy się również na tym miejscu natomiast jego pozycja
wiersza pozostanie bez zmian dlatego też nie wypełnił nam góry jeśli
ustawimy sobie grid column content
start content end
tutaj chodziło mi oczywiście o row żeby w osi pionowej
poszerzyć ten element to jest to tak
naprawdę ekwiwalent tego jak byśmy napisali grid-area content
czyli możemy się odwoływać do konkretnej strefy
szablonowej do ich początku i końca poprzez
suffixy start oraz end do
czego to jest przydatne no bo o ile możemy ustawić sobie że powiedzmy item
pierwszy będzie naszym grid-area content
no i następne też jeszcze wypozycjonujemy w taki sam sposób czy powiedzmy drugi
będzie na footerze trzeci
będzie na sidebarze czwarty
będzie na headerze i faktycznie
w tym momencie nam się to ułożyło w ten sposób może przez tą kolorystykę
nie jest to bardzo widoczne możemy zmienić kolor sidebara na background
powiedzmy o
użyjemy po prostu koloru czerwonego i cała
reszta jest już układana za pomocą torów niejawnych one są automatycznie
generowane i układane w ten sposób to możemy
item siódmy wypozycjonować na przykład w ten sposób że będzie
rozchodził się na cały content tylko
tą część czyli bez drugiego wiersza oraz
na tą część sidebara możemy to potraktować jako notyfikację
czyli mamy jakiś layout strony ma nagłówek treść
sidebar footer i chcemy wyświetlić notyfikacje w tym miejscu no to
możemy to zrobić deklarując grid-column
content start i kończąc na sidebar
end ponieważ tu jest sidebar
end tutaj jest sidebar start ale w tym samym miejscu jest
też content end no i tutaj mamy content start gdy to
zapiszemy to widzimy że faktycznie rozciągnęło nam się to tak
jak poprosiliśmy ale nie wsunęło się na drugi wiersz co
się stanie jeśli spróbujemy zadeklarować kilka elementów w
jednej siatce w tym samym miejscu grid-column row
content start bo tak samo wiersze
mają content start tutaj to tak samo jest z sidebar
start no i tutaj jest dla wierszy content
end i sidebar end piszemy sidebar
end w tym momencie zajął nam całe
miejsce dostępne to że on jest na wierzchu wynika
ze stacking kontekstu czyli
generalnie pozycja w markupie wpływa
na to który element ma pierwszeństwo i wyświetla się nad którym możemy to oczywiście
manipulować poprzez z-index podając na przykład ujemną wartość i wtedy
będzie widoczne to co jest wcześniej w markupie natomiast
nam to pasuje akurat że ta siódemka jest na wierzchu wystarczy teraz tylko że
zmienimy opacity na powiedzmy połowę i
sprawimy że row będzie się zaczynał na
content start ale nie będziemy jawnie podawać jego zakończenia
i w tym momencie faktycznie widać że ta siódemka tutaj jest
tak jakby wypozycjonowana absolutnie ponieważ znajduje się nad naszą
siatką ale dalej widzimy elementy które
są wypozycjonowane na gridzie i znajdują się pod nią może
byłoby to troszkę bardziej czytelne jeśli skorzystalibyśmy tutaj koloru czarnego
o mniejszej przezroczystości zmienili kolor na biały wtedy
możemy zmienić sobie na przykład treść itema numer 7
na notification i w tym momencie nawet widać że
to mogłoby być powiadomienie i oczywiście takie powiadomienie możemy później albo
ukryć za pomocą display none albo zupełnie
usunąć z markupu to już zależy od przypadku jaki chcemy obrać czyli
deklarując grid-template-areas dostajemy w gratisie do
każdego template-area suffix start oraz
end czyli moglibyśmy się odwołać do footer end do footer
start do header end do header start i tak jak się odwoływaliśmy
do content oraz sidebar oczywiście te
nazwy nie zawsze muszą odzwierciedlać to co
w danym miejscu powinno się znaleźć jeśli chcielibyśmy możemy zmienić na
przykład nazwę header na site-start
i wtedy będziemy mogli odwoływać
się pozycjonując nasze elementy na przykład przez site-star
ale o tym opowiem w następnej lekcji gdzie
będziemy mówili o nazywaniu konkretnych linii
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>
<style>
.container {
display: grid;
grid-template-columns: repeat(5, 1fr);
}
</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-areas:
"header header header"
"content content sidebar"
"content content sidebar"
"footer footer footer";
grid-auto-rows: 80px;
}
</style>