Načrtovanje in razvoj spletnih aplikacij

Grid

CSS Grid je sodoben sistem postavitve za razporejanje elementov v dveh dimenzijah: po vrsticah in stolpcih. Posebej uporaben je za celotne postavitve strani, kartične mreže in primere, kjer želimo natančneje določiti položaj posameznih elementov.

V primerjavi s Flexboxom, ki je namenjen predvsem postavitvi v eni dimenziji, Grid omogoča boljši pregled nad dvodimenzionalno mrežo. Zato je zelo primeren za zahtevnejše razporeditve vsebine.

 

Pomni: Element z lastnostjo display: grid postane nadrejeni grid element, njegovi neposredni otroci pa postanejo grid elementi. Postavitev nato temelji na mreži vrstic in stolpcev.

Grid je posebej uporaben, kadar želimo vnaprej določiti postavitev glave, vsebine, stranskega stolpca in noge ali kadar želimo enakomerno mrežo kartic.

Osnovna pravila

  • CSS Grid ureja elemente v dveh dimenzijah: po vrsticah in stolpcih.
  • Postavitev vključimo z lastnostjo display: grid.
  • Širine stolpcev določamo z lastnostjo grid-template-columns.
  • Višine vrstic določamo z lastnostjo grid-template-rows.
  • Razmike med vrsticami in stolpci določamo z lastnostjo gap.
  • Položaj posameznih grid elementov lahko določimo tudi zelo natančno.

Pozor: Lastnosti Grid postavitve praviloma vplivajo le na neposredne otroke nadrejenega grid elementa. Če je element globlje v strukturi HTML, se nanj mrežna postavitev ne prenese samodejno.

Lastnost display: grid

Z lastnostjo display: grid vključimo mrežno postavitev. Neposredni otroci takega elementa se razporedijo po mreži.

<div class="mreza">
   <div>1</div>
   <div>2</div>
   <div>3</div>
   <div>4</div>
</div>
.mreza {
   display: grid;
   grid-template-columns: 1fr 1fr;
   gap: 10px;
}

.mreza div {
   padding: 15px;
   background-color: #fccc88;
}
1
2
3
4

Če želimo, da se nadrejeni grid element obnaša kot vrstični element, lahko uporabimo tudi display: inline-grid.

Pomni: Grid lahko razumemo kot mrežo celic. Najprej določimo mrežo, nato pa vanjo razporedimo posamezne elemente.

Lastnost grid-template-columns

Lastnost grid-template-columns določa širine stolpcev v mreži. Pogosto uporabljamo enoto fr, ki deli razpoložljivi prostor med stolpce.

Primer Pomen
grid-template-columns: 200px 1fr; prvi stolpec je širok 200 px, drugi zapolni preostanek
grid-template-columns: 1fr 1fr 1fr; trije enako široki stolpci
grid-template-columns: repeat(4, 1fr); štirje enako široki stolpci
grid-template-columns: 2fr 1fr; prvi stolpec zavzame dvakrat več prostora kot drugi
grid-template-columns: 100px auto 100px; srednji stolpec se prilagodi vsebini in prostoru med obema robnima
.triStolpci {
   display: grid;
   grid-template-columns: 1fr 2fr 1fr;
   gap: 10px;
}
1fr
2fr
1fr

Enota fr je zelo uporabna pri odzivnejših postavitvah, ker razdeli preostali prostor glede na razmerja med stolpci.

Lastnost grid-template-rows

Lastnost grid-template-rows določa višine vrstic v mreži. Uporabimo lahko fiksne mere, samodejno višino ali razmerja.

Primer Pomen
grid-template-rows: 80px 80px; dve vrstici po 80 px
grid-template-rows: auto auto; višina vrstic se prilagodi vsebini
grid-template-rows: 100px 1fr; prva vrstica je fiksna, druga zapolni preostali prostor
.mreza {
   display: grid;
   grid-template-columns: 1fr 1fr;
   grid-template-rows: 80px 120px;
   gap: 10px;
}
1
2
3
4

Pozor: Pri višinah vrstic moramo biti previdni pri fiksnih merah. Če je vsebine več, kot je prostora v vrstici, lahko postane prikaz manj pregleden.

Lastnost gap

Lastnost gap določa razmik med vrsticami in stolpci mreže. Če navedemo eno vrednost, velja za obe smeri. Če navedemo dve, prva določa razmik med vrsticami, druga pa med stolpci.

.razmiki {
   display: grid;
   grid-template-columns: repeat(3, 1fr);
   gap: 20px 10px;
}

.razmiki div {
   padding: 15px;
   background-color: #fccc88;
}
1
2
3
4
5
6

Uporaba lastnosti gap je preglednejša kot določanje razmikov z več posameznimi zunanjimi odmiki elementov.

Lastnost grid-template-areas

Z lastnostjo grid-template-areas lahko mrežo opišemo z imeni področij. Ta pristop je zelo uporaben pri večjih postavitvah strani, ker naredi kodo preglednejšo.

<div class="postavitev">
   <header class="glava">Glava</header>
   <main class="vsebina">Vsebina</main>
   <aside class="stran">Stranski stolpec</aside>
   <footer class="noga">Noga</footer>
</div>
.postavitev {
   display: grid;
   grid-template-columns: 2fr 1fr;
   grid-template-areas:
      "glava glava"
      "vsebina stran"
      "noga noga";
   gap: 10px;
}

.glava { grid-area: glava; }
.vsebina { grid-area: vsebina; }
.stran { grid-area: stran; }
.noga { grid-area: noga; }
Glava
Vsebina
Stranski stolpec
Noga

Pomni: Poimenovana področja mreže so zelo uporabna pri postavitvah strani, ker je iz kode hitro razvidno, kateri del pripada glavi, vsebini, stranskemu stolpcu ali nogi.

Lastnosti posameznih elementov

Posameznim grid elementom lahko določimo njihov položaj v mreži. Najpogosteje uporabljamo naslednje lastnosti:

  • grid-column – položaj ali razpon po stolpcih,
  • grid-row – položaj ali razpon po vrsticah,
  • grid-area – ime področja ali bližnjica za položaj.
Lastnost Primer Pomen
grid-column grid-column: 1 / 3; element se razteza čez prvi in drugi stolpec
grid-row grid-row: 1 / 3; element se razteza čez dve vrstici
grid-area grid-area: glava; element uporabimo v poimenovanem področju mreže
.sirsi {
   grid-column: 1 / 3;
}
Širši element
Levo
Desno

Tak način je uporaben, kadar želimo, da določen element zavzame več prostora kot ostali elementi v mreži.

Poravnava v mreži

Pri Grid postavitvi lahko uporabljamo lastnosti poravnave, kot so align-items, justify-items, align-content in justify-content. Z njimi določamo poravnavo vsebine znotraj celic ali pa poravnavo celotne mreže.

Lastnost Nekatere vrednosti Pomen
justify-items start, center, end, stretch poravnava vsebine znotraj posamezne celice po vodoravni osi
align-items start, center, end, stretch poravnava vsebine znotraj posamezne celice po navpični osi
justify-content start, center, end, space-between, space-around, space-evenly poravnava celotne mreže po vodoravni osi
align-content start, center, end, space-between, space-around, space-evenly poravnava celotne mreže po navpični osi
.mreza {
   display: grid;
   grid-template-columns: repeat(3, 1fr);
   gap: 10px;
   justify-items: center;
   align-items: center;
}
A
B
C

Pozor: Pri Grid postavitvi je pomembno razlikovati med poravnavo vsebine znotraj posameznih celic in poravnavo celotne mreže. Ti dve nalogi ne opravljajo iste lastnosti.

Primerjava: Grid in Flexbox

Sistem Najprimernejša uporaba
Grid postavitev v dveh dimenzijah, torej po vrsticah in stolpcih hkrati
Flexbox postavitev v eni dimenziji, na primer vrstica menija ali stolpec kartic

Grid je primernejši od Flexboxa takrat, ko želimo elemente razporejati po vrsticah in stolpcih hkrati. Flexbox pa je navadno primernejši za postavitve v eni dimenziji.

Priporočila

  • Grid uporabi takrat, ko želiš postavitev urejati po vrsticah in stolpcih hkrati.
  • Pri določanju stolpcev pogosto uporabi enoto fr, ker omogoča pregledna razmerja.
  • Za razmike med elementi raje uporabi gap kot več posameznih zunanjih odmikov.
  • Za večje postavitve strani razmisli o uporabi grid-template-areas.
  • Pri položaju posameznih elementov premišljeno uporabi grid-column in grid-row.
  • Za preproste enodimenzionalne vrstice ali stolpce pogosto zadostuje že Flexbox.

Pogoste napake

  • Grid se uporablja tudi tam, kjer bi bila zaradi enostavnosti primernejša Flex postavitev.
  • Lastnosti mrežne postavitve se določajo na elementih, ki niso neposredni otroci nadrejenega grid elementa.
  • Pri stolpcih in vrsticah se uporabljajo preveč toge mere, zato postavitev ni dovolj prilagodljiva.
  • Razmiki se urejajo z neenotnimi zunanjimi odmiki namesto z lastnostjo gap.
  • Poimenovana področja mreže niso usklajena z lastnostjo grid-area.
  • Zamenjuje se pomen poravnave vsebine v celicah in poravnave celotne mreže.