Kada su u pitanju HTML i CSS dosta developera voli misliti da ih zna 90%-100%, a upravo ovakvi tečajevi služe da to demantiraju.
Wes Bos je poduzetnik i autor nekoliko tečajeva, među kojima je i ovaj o CSS Gridu. S obzirom da mi njegov stil podučavanja odgovara neke od tečajeva sam i kupio kako bi na strukturiran način saznao i naučio nešto novo.
Redovito ih se sjetim kada me netko od kolega pita za dobre online resurse, a prema njihovim pozitivnim reakcijama zaključio sam da bi bilo dobro nešto više o tome napisati i na blogu.
Jedan od tih tečajeva je CSS Grid koji je u potpunosti besplatan, a moguće ga je pronaći na adresi https://cssgrid.io/. Sastoji se od 25 videa tj. lekcija od kojih će svaka biti detaljnije pojašnjena u nastavku. Trajanje snimljenog materijala je 4 sata, ali ako se paralelno idu raditi primjeri satnica će vrlo brzo rasti.
1. Introduction
U ovom dijelu Wes Bos daje uvod u tečaj i naglašava kako Firefox stoji iza odluke da tečaj bude besplatan zbog čega ćemo koristiti njihove alate u nastavku tečaja.
Autor također potiče developere koji će krenuti s ovim tečajem da redovito daju povratne informacije, bilo to putem društvenih mreža ili blogova.
Osim toga, na svakome od nas ostaje odluka hoćemo li ovaj tečaj pogledati samo da bismo mogli reći da smo ga prošli ili ćemo paralelno raditi primjere i tako nešto konkretno i naučiti.
2. Starter files
Preporuka ovog dijela tečaja je preuzeti i koristiti Firefox Quantum: Developer Edition koji je sa svojim naprednim rješenjima prilagođen upravo developerima.
Sve starter datoteke moguće je preuzeti na adresi https://courses.wesbos.com/account/ nakon besplatne registracije. Za one nestrpljive datoteke se nalaze i na sljedećoj poveznici https://github.com/wesbos/css-grid.
Nakon preuzimanja moguće je vidjeti package.json datoteku:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{ "name": "css-grid", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "start": "run-script-os", "start:win32": "browser-sync start --server --files '**/*.css, **/*.html, **/*.js, !node_modules/**/*' --directory --port 7777 --browser \"C:\\Program Files\\Firefox Developer Edition\\firefox.exe\"", "//": "Hello! If you are having trouble running this command. Try changing Firefox Developer Edition to FirefoxDeveloperEdition", "start:darwin:linux": "browser-sync start --server --files '**/*.css, **/*.html, **/*.js, !node_modules/**/*' --directory --port 7777 --browser 'Firefox Developer Edition'" }, "author": "", "license": "ISC", "devDependencies": { "browser-sync": "^2.24.5", "run-script-os": "^1.0.3" } } |
Zbog paketa “browser-sync” i “run-script-os” potrebno je na računalu imati instaliran NodeJS.
Pokretanjem ove dvije naredbe instaliram ranije navedene NPM pakete i tečaj mi se otvara u odabranom web pregledniku.
|
1 2 |
$ npm install $ npm start |
Ovo je sada temelj svega što ću u nastavku raditi.
3. CSS Grid Fundamentals
Fokus ovog dijela tečaja je odgovor na pitanje – što je CSS Grid? U donjem primjeru ako smo za klasu container rekli da je display: grid; automatski smo sve unutarnje elemente, u ovom slučaju to su <div class="item">1</div>, klasificirali kao dijelove CSS Grida.
Nakon toga ostaje podijeliti ih u redove i kolone pomoću: grid-template-columns, grid-template-rows i grid-gap.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="../assets/style.css"> <title>CSS Grid Fundamentals!</title> </head> <body> <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> </div> <style> .container{ display: grid; /* grid-template-columns: 200px auto 500px 50px; grid-template-columns: repeat(5, 100px); grid-template-columns: 200px 500px; grid-template-rows: 200px 500px 50px; grid-gap: 20px; */ } </style> </body> </html> |
4. CSS Grid Dev Tools
Desni klik miša tj. odabir “Inspect Elements” vodi nas do dijela web preglednika koji je poznat svakom web developeru.
Ovdje upoznajemo Grid Inspector.
5. CSS Grid Implicit vs Explicit Tracks
Explicit označava sve kolone (grid-template-columns) i redove (grid-template-rows) koje smo sami odredili tj. zadali im parametre. U ovom primjeru to su prve dvije kolone tj. prva dva reda.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<body> <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> </div> <style> .container { display: grid; grid-gap: 20px; grid-template-columns: 200px 400px; grid-template-rows: 50px 100px; /* grid-auto-rows: 200px; */ /* grid-auto-columns: 100px; */ } </style> </body> |
Implicit označava sve preostale kolone (grid-auto-columns) i redove (grid-auto-rows). U ovom primjeru to su zadnja dva, tj. blokovi 5, 6, 7 i 8.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<body> <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> </div> <style> .container { display: grid; grid-gap: 20px; grid-template-columns: 200px 400px; grid-template-rows: 50px 100px; grid-auto-rows: 70px; /* grid-auto-columns: 100px; - u sljedećem dijelu tečaja*/ } </style> </body> |
Zaključno, u sljedećem primjeru explicit su nam kolone dok su redovi implicit jer njih nigdje nismo definirali, a svejedno ih imamo.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<body> <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> </div> <style> .container { display: grid; grid-gap: 20px; grid-template-columns: 200px 400px; } </style> </body> |
6. CSS Grid Auto Flow
U ovom dijelu tečaja pojašnjen je grid-auto-flow pomoću kojega određujemo hoće li implicitno kreirani elementi biti prikazani kao redovi ili stupci.
U startu dodajemo dva elementa i za njih definiramo dva stupca.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<body> <div class="container"> <div class="item">1</div> <div class="item">2</div> </div> <style> .container { display: grid; grid-gap: 20px; grid-template-columns: 400px 200px; } </style> </body> |
Međutim, ako dodamo nekoliko novih elemenata koje nismo eksplicitno odredili pitanje je gdje će se oni prikazati.
Zadano će biti prikazani kao redovi,
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<body> <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> </div> <style> .container { display: grid; grid-gap: 20px; grid-template-columns: 400px 200px; grid-auto-flow: row; } </style> </body> |
a možemo ih prikazati i kao stupce.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<body> <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> </div> <style> .container { display: grid; grid-gap: 20px; grid-template-columns: 400px 200px; grid-auto-flow: column; } </style> </body> |
Zaključno, na taj se način može napraviti horizontalni scroll.
7. Sizing tracks in CSS Grid
Ovdje se upoznajemo s fr (fractional unit) jedinicom koja označava preostali slobodan prostor na ekranu.
Ako definiramo tri stupca na sljedeći način
|
1 2 3 4 5 6 7 8 |
<style> .container { display: grid; grid-gap: 20px; border: 10px solid var(--yellow); grid-template-columns: 150px 150px 1fr; } </style> |
prva dva će biti široka 150px dok će zadnji biti širok koliko god je ostalo viška prostora.
Fr (fractional unit) uzima u obzir grid-gap tako da naši stupci prikazuju u prostoru koji ostane nakon što se zauzme grid-gap.
Isto tako, moguće je koristiti i parametar auto.
Donji primjer označava prvi stupac čija je širina određena kao auto što znači da će on biti širok koliko i sadržaj unutar njega dok će drugi stupac uzeti preostali prostor 1fr.
|
1 2 3 4 5 6 7 8 |
<style> .container { display: grid; grid-gap: 20px; border: 10px solid var(--yellow); grid-template-columns: auto 1fr; } </style> |
8. CSS Grid repeat function
Sve navedeno ranije može se napraviti na jednostavniji način koristeći repeat() funkciju. Npr. umjesto definiranja četiri stupca na standardni način
|
1 |
grid-template-columns: 1fr 1fr 1fr 1fr; |
možemo ih definirati na sljedeći način gdje prva vrijednost označava koliko puta je taj element potrebno ponoviti, a druga vrijednost označava širinu.
|
1 |
grid-template-columns: repeat(4, 1fr); |
Rezultat će biti isti tj. imati ćemo četiri stupca jednake širine.
Mogu se raditi i naprednije stvari. Npr. prvi stupac će biti širok 100px dok će od preostalih osam jedan biti 1fr, drugi 2fr, treći 1fr,…
|
1 2 3 4 5 6 7 |
<style> .container { display: grid; grid-gap: 20px; grid-template-columns: 100px repeat(4, 1fr 2fr); } </style> |
9. Sizing Grid Items
U ovom dijelu fokus je na pojedinačnim elementima kompletnog grida, <div class="item item1">1</div>.
Ako napravimo sljedeće dobit ćemo pet stupaca koji su raspoređeni tako da zauzimaju sav slobodan prostor.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
<body> <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 class="item item21">21</div> <div class="item item22">22</div> <div class="item item23">23</div> <div class="item item24">24</div> <div class="item item25">25</div> <div class="item item26">26</div> <div class="item item27">27</div> <div class="item item28">28</div> <div class="item item29">29</div> <div class="item item30">30</div> </div> <style> .container { display: grid; grid-gap: 20px; grid-template-columns: repeat(5, 1fr); } /*.item17{ background: mistyrose; grid-column: span 2; grid-row: span 2; } */ </style> </body> |
Pomoću parametara grid-column i grid-row možemo zadati visinu odnosno širinu pojedinog elementa, neka to sada bude .item17. Ostali elementi se automatski repozicioniraju.
Pomoću grid-column: span 2; određujemo širinu.
Pomoću grid-row: span 2; određujemo visinu.
Ako ih koristimo zajedno određujemo visinu i širinu.
|
1 2 3 4 5 |
.item17{ background: mistyrose; grid-column: span 2; grid-row: span 2; } |
U primjeru na slici iznad odredili smo visinu i širinu jednog elementa dok su se ostali automatski posložili na svoje nove pozicije.
U nastavku se može vidjeti primjer kada odabranom elementu zadajemo mjesto početka i mjesto završetka.
|
1 2 3 4 5 6 7 8 |
.item17{ grid-column: span 2; grid-column-start: span 2; grid-column-end: auto; grid-row: span 2; grid-row-start: span 2; grid-row-end: auto; } |
10. Placing Grid Items
Početni raspored svih elemenata izgleda ovako i ovdje će fokus biti na pozicioniranju elementa s klasom .poop.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<body> <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 poop">💩</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 class="item item21">21</div> <div class="item item22">22</div> <div class="item item23">23</div> <div class="item item24">24</div> <div class="item item25">25</div> <div class="item item26">26</div> <div class="item item27">27</div> <div class="item item28">28</div> <div class="item item29">29</div> <div class="item item30">30</div> </div> <style> .container { display: grid; grid-gap: 20px; grid-template-columns: repeat(5, 1fr); } .poop { background: #BADA55; } </style> </body> |
Na ovaj način određujem startnu poziciju odabranog elementa.
|
1 2 3 4 |
.poop { background: #BADA55; grid-column-start: 2; } |
Sada ću uz mjesto početka odabranom elementu zadati i mjesto završetka.
To mogu napraviti pojedinačno za početak i završetak.
|
1 2 3 4 5 |
.poop { background: #BADA55; grid-column-start: 2; grid-column-end: 5; } |
A mogu i na skraćeni način.
|
1 2 3 4 |
.poop { background: #BADA55; grid-column: 2 / 5; } |
Rezultat je isti.
Osim što odabranom elementu na gornji način mogu reći gdje počinje i završava također mu na sljedeći način mogu odrediti širinu.
|
1 2 3 4 |
.poop { background: #BADA55; grid-column: span 2 / 5; } |
|
1 2 3 4 |
.poop { background: #BADA55; grid-column: 1 / span 2; } |
Ako želim da odabrani element uvijek počinje na prvom mjestu i završava na posljednjem napravit ću sljedeće. Ovo se može koristiti i kao zamjena za width: 100%;
|
1 2 3 4 |
.poop { background: #BADA55; grid-column: 1 / -1; } |
Isto to možemo napraviti i kada su u pitanju redovi koristeći grid-row.
|
1 2 3 4 |
.poop { background: #BADA55; grid-row: 3 / span 3; } |
Naravno, moguće ih je i kombinirati.
|
1 2 3 4 5 |
.poop { background: #BADA55; grid-column: 1 / span 2; grid-row: 3 / span 3; } |
Nastavak ovog blog posta uskoro pod naslovom “Recenzija: CSS Grid by Wes Bos, 2. dio“.





































