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 css grid zaawansowane layouty opowiem troszkę o
tym jak ustalać rozmiary dla torów w poprzedniej
lekcji ustaliliśmy już że możemy kontrolować rozmiary
kolumn poprzez grid-template-columns no i tutaj do tej pory wpisywaliśmy
same wartości w pikselach natomiast rozmiar kolumny może być ustalony
przez dowolną jednostkę css czyli możemy wpisać sobie tutaj na
przykład 20 czy 30 vw
i w tym momencie będzie to 30% naszego viewport-u możemy
ustalać również procenty centymetry dowolna
jednostka css będzie działała zarówno dla grid-template-columns dla
grid-template-rows i do większości innych właściwości powiązanych z
css grid do których jeszcze dojdziemy natomiast jednostkę którą
css grid nam udostępnia jest ona dostępna tylko w css grid jest
jednostka fr działa ona
bardzo podobnie do proporcji którą znacie z flexbox i
w pewnym sensie troszkę podobnie do procentów jeśli ustawimy sobie grid-template-columns
pierwszą wartość na 1fr to jak widzicie pierwsza
kolumna zajęła całą dostępną przestrzeń to znaczy
jeśli nie byłoby tutaj tej kolumny to
szerokość tych dwóch kolumn jest równa tym dwóm kolumnom
jednostka fr jest przydatna w sytuacjach kiedy potrzebujemy albo
zająć całą dostępną przestrzeń albo chcemy równo podzielić nasze elementy
w tym przypadku jeśli chcielibyśmy podzielić po równo powiedzmy nasze
kolumny aby miały 50% szerokości i 50% szerokości to
oczywiście zadziała i jeżeli tutaj wstawimy 1fr i
tutaj 1fr to tak naprawdę nie widać żadnej
różnicy natomiast różnica jest widoczna wtedy kiedy na
przykład zdefiniujemy odstęp pomiędzy kolumnami odstęp pomiędzy
kolumnami można zdefiniować za pomocą właściwości grid-grap jest
to shorthand dla właściwości grid-column-gap grid-row-gap
jeśli wpiszemy tutaj wartość powiedzmy w pikselach 20
pikseli to nasze
elementy zostaną rozstrzelone o 20 pikseli czyli mamy tak naprawdę
margines z każdej strony 20 pikseli oprócz
tutaj tych przy krańcach naszej siatki czyli jest to
taki lepszy margines stworzony specjalnie dla
css grid no i w przypadku jeżeli mamy grid-gap ustawione na 20
pikseli oraz grid-template-columns ustawione na po
jednym fractional unit to wszystko wygląda okej
natomiast jeśli skorzystalibyśmy z 50% tutaj to już będzie
różnica między naszym layoutem jak widzicie w
przypadku wartości 50% 50% i ustalonej
wartości dla grid-gap nasze kolumny są szersze niż
przy 1fr a dlaczego się tak dzieje no bo wartości
procentowe nie biorą pod uwagę po prostu grid-gap czy
też potencjalnie innych właściwości css owych które mogą na to wpływać na
rozmiar siatki czyli algorytm który pozwala
przetłumaczyć jednostkę fr na faktyczną
przestrzeń wygląda w ten sposób że bierzemy całą szerokość kontenera
odejmujemy od niego wszystkie grid-gapy czy jeżeli
mielibyśmy tutaj więcej kolumn to wszystkie
grid-gapy zostałyby odjęte stąd 20 stąd 20
i dopiero później cała przestrzeń zostałaby podzielona przez
3 ponieważ mamy trzy jednostki fr więc
te jednostki są wobec siebie równe no i dostaniemy
jakąś tam wartość w pikselach oczywiście skoro to działa na zasadzie proporcji
to możemy też zdefiniować żeby druga kolumna była 2 razy większa niż pozostałe i
widzimy faktycznie środkowa kolumna jest w tym momencie najszersza natomiast
ponownie działa to na zasadzie gospodarowania dostępną
przestrzenią w siatce tą która do tej pory nie była używana czyli
jeśli wrócimy do sytuacji że mieliśmy tutaj ustawione 100 pikseli i
powiedzmy 5vw no to
nasz layout będzie wyglądał ten sposób jeśli dodamy kolejną kolumnę nasz layout
będzie wyglądał w taki sposób natomiast mamy jeszcze możliwość
zadeklarowania szerokości takiej jaką faktycznie dany
element posiada czyli jeśli wpiszemy zamiast pierwszego 1fr
wartość auto to ta kolumna będzie
tak szeroka jak najszerszy element wewnątrz niej czyli jeśli
zmienimy sobie rozmiar elementu 1 i wpiszemy css
grid to cała ta kolumna dostosuje
swoją szerokość do najdłuższego elementu czyli jest to takie
zachowanie podobne do elementów blokowych w css gdzie elementy
blokowe rozszerzają swoją długość w zależności od tego jak dużo treści w
nich jest natomiast css grid pozwala nam to też zrobić w
osi poziomej no i jeśli oczywiście wykorzystamy
właściwość grid-template-rows
również możemy ustawić
tutaj wartość auto jednak jest to wartość domyślna czyli jeśli nasz
wiersz nie miałby żadnej treści wtedy miałby wysokość 0 a
w tym momencie ten wiersz ma taką wysokość jaką wysokość ma jej content
więc jeśli dodamy tutaj jakąś dodatkową treść która przebija się do
następnej linii to faktycznie rozmiar wiersza również
się do tej szerokości dostosuje możemy też spróbować ustawić
wartość 1fr dla pojedynczych
wierszy i powiedzmy że tutaj damy 200 pikseli tutaj 100 pikseli
i faktycznie drugi wiersz ustalił
swoją wysokość na 200 pikseli natomiast nie ustawił wysokości
pierwszego wiersza dlaczego ponieważ jednostka fr działa
na zasadzie dostępnej przestrzeni a dopóki my nie zdefiniujemy jawnej
wysokości na naszym gridzie no to jednostka fr
w osi pionowej nie będzie działała tak jak
możemy się tego spodziewać jeśli natomiast ustawimy jawnie wysokość
grida na 100% albo powiedzmy po prostu
800 pikseli to wtedy faktycznie widzimy
że to 1fr będzie adaptowało tą wysokość
jeżeli ustawimy że inne wiersze też mają mieć 1fr
no to oczywiście ich rozmiar będzie się dostosowywał do tego ile
jest treści w danym gridzie podsumowując ustalając
rozmiary poszczególnych torów możemy korzystać z dowolnej jednostki
css natomiast jeśli zależy nam na tym aby nasze layouty
brały pod uwagę odstępy między pojedynczymi torami
lepiej jest korzystać z jednostki fr niż z procentów jednostka
fr w osi pionowej nie będzie działać tak długo jak
nie zadeklarujemy wysokości na naszym gridzie oraz
mamy też możliwość wykorzystania słowa kluczowego auto które
będzie dostosowywało szerokość kolumny czy wiersza na podstawie
treści która się faktycznie w danym elemencie znajduje zapraszam
cię serdecznie do kolejnej lekcji
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-columns: 200px 200px 200px;
}
</style>Stan końcowy · 8 min
<div class="container">
<div class="item item1">1 CSS Grid</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;
height: 800px;
grid-template-columns: auto 100px 5vw 1fr;
grid-template-rows: 1fr 1fr 100px;
grid-gap: 20px;
}
</style>