Edukáció

A CSS GRID bemutatása-részletes példákkal, kódokkal együtt!

A CSS GRID bemutatása-részletes példákkal, kódokkal együtt!

Ebben a cikkünkben a CSS GRID-et szeretnénk bemutatni nagy vonalakban. Minden, ami ezzal kapcsolatos, konkrét példákkal, másolható kódrészletekkel együtt. 

Manapság alapvető elvárás a weboldalainktól, hogy azok esztétikusan nézzenek ki. Fontos a megfelelő színárnyalatok, design megteremtése, hogy az elemek jól láthatóan elkülönüljenek egymástól, és az egész oldalunkon egy mindent átható kontrasztosság legyen jelen.

Ez alapvetően a CSS, és a HTML leíró nyelvek segítségével valósulhat meg: a HTML fogja adni az oldalunk tartalmi vázát, és annak a stílusosságáért pedig CSS fog felelni.

Viszont, van még egy nagyon fontos szempont, amint manapság gyakorlatilag minden egyes weboldal megvalósít: ez pedig a különféle elemek megfelelő elrendezési szisztémája. Gondoljunk csak bele: mikor egy űrlapra tévedünk, akkor a különféle elemek egy meghatározott, katonás sorrendben vannak jelen az adott oldalon. Mikor rápillantasz erre az oldalra, te magad is láthatod, hogy a jobb oldali oldalsáv az oldal szélességének egy bizonyos hányadát teszi ki.

Felmerülhet bennünk a kérdés, hogy mindez hogyan valósítható meg ilyen szépen, és elegánsan? Hiszen, számos más eszközzel is lehet a weboldalunk elrendezéseit állítani a CSS-en belül, például marginokkal. Nos, van egy sokkal jobb megoldás is arra, hogy az elemeinket elrendezzük: ez pedig a CSS GRID.

Mi az a GRID?  

A GRID SYSTEM (rácsszerkezet-szisztéma) tulajdonképpen a CSS leíró nyelv egyik eszköze, aminek a segítségével egy tetszőleges rácsszerkezetet hozhatunk létre a weboldalunkon,  amely sorokból, és oszlopokból áll. Ezekbe a cellákba tehetjük bele a különféle elemeinket, amiknek természetesen szintén tetszőleges egyéni stílust adhatunk.

A szisztéma kialakításánál sok mindent megtehetünk: megadhatjuk, hogy pontosan hogyan legyenek a rublikák meghatározva, azok mekkora kiterjedésűek legyenek, mekkora legyen közöttük a térköz, illetve a sorköz.

A GRID-et nem minden egyes böngésző támogatja a Can I Use ellenőrző eszköz szerint, ennek ellenére igen elterjedt a használata.

A GRID segítségével nem csupán arra van lehetőség, hogy a desktopon, nagy képernyőn megjelenő oldalaink szépen nézzenek ki. Segítségével lehetőség nyílik arra, hogy akár mobilon is jól kinéző szerkezetet kapjunk, a cellák egymás alá rendezésével.

Hogyan hozhatjuk létre a GRID-et?  

A GRID tulajdonképpen úgy jön létre, hogy egy anyaelem számára-ez egy alkalmasan megválasztott DIV elem lenne-a display:grid tulajdonságot adjuk. Ahhoz, hogy a rácsszerkezet létrejöhessen, minimum egy másik tulajdonságra szintén szükség lenne: a grid-template-columns definiálása. Ez fogja megadni, hogy a celláink milyen szélesek legyenek.

Az alábbi példában az anya-elemnek adtunk még szélességet ,magasságot, margót, és középre is igazítottuk, hogy jobban látható legye a végeredmény, viszont ezek nem feltétlenül szükséges elemei a GRID-nek.

<style>
  .container-grid {
    /*létrehozzuk a GRID-et */
    display: grid;
    grid-template-columns: 20% 20% 20% 20%;

    /*közpre igazírjuk az egész tartalmat, és méretet adunk neki */
    height: 500px;
    margin: 20px;
    justify-content: center;
    align-content: center;
  }

  /*Egy kis méretet adunk az elemeknek, hogy jobban látható legyen a példa. */
  .container-grid div {
    padding: 20px;
  }

  /*Az érthetőség kedvéért színezzük a DIV-eket  */
  .el1 {
    background: rgba(255, 154, 72, 0.5);
  }
  .el2 {
    background: rgba(255, 0, 0, 0.5);
  }
  .el3 {
    background: rgba(0, 128, 0, 0.5);
  }
  .el4 {
    background: rgba(0, 4, 255, 0.5);
  }
</style>
<div class="container-grid">
  <div class="el1">Elem 1</div>
  <div class="el2">Elem 2</div>
  <div class="el3">Elem 3</div>
  <div class="el4">Elem 4</div>
</div>


Az alap CSS GRID példa.

Ez egy alap bemutatása a GRID-nek, igazából számtalan tulajdonság megadására van lehetőség. Ezeket szeretnénk bemutatni a következő példákban.

Grid-template-colums

A grid-template-columns tulajdonság azt fogja megadni, hogy milyen szélesek legyenek a rácsunk oszlopai, és hogy hány oszlop kerülhet egy sorba. Amennyiben a GRID-en belül valamelyik elem már nem fér ki az adott sorba, akkor az új sorba kerül. Az alábbi kódon belül látható, hogy a grid-template-columns beállításokra milyen lehetőségek vannak. Ezeket sorra tegyük vissza a kommentből, és nézzük meg a végeredményeket. 

<style>
  .container-grid {
    display: grid;
    /*grid-template-columns: 20% 20% 20% 20%; /*Százalékban fejezzük ki */
    /*grid-template-columns: 200px 20vw 20%;  /* Százalékot, pixelt, és vw-t használunk egyszerre*/
    /*grid-template-columns: repeat(4, 25%);  /*ismételt megadás: 4 db 25% széles oszlop kellene */
    /*grid-template-columns: repeat(auto-fill,400px); kitöltéses megadás. 400px-esekből enged annyit egy sorba, amennyi kifér. */
    /*grid-template-columns: 2fr 1fr; /*Arányos felosztás*/
    grid-template-columns: 200px auto; /*Az auto mindig minimális méretre törekszik.*/
    height: 500px;
    margin: 20px;
    justify-content: center;
    align-content: center;
  }
  .container-grid div {
    padding: 20px;
  }
  .el1 {
    background: rgba(255, 154, 72, 0.5);
  }
  .el2 {
    background: rgba(255, 0, 0, 0.5);
  }
  .el3 {
    background: rgba(0, 128, 0, 0.5);
  }
  .el4 {
    background: rgba(0, 4, 255, 0.5);
  }
  .el5 {
    background: rgba(0, 100, 255, 0.5);
  }
  .el6 {
    background: rgba(0, 4, 100, 0.5);
  }
</style>
<div class="container-grid">
  <div class="el1">Elem 1</div>
  <div class="el2">Elem 2</div>
  <div class="el3">Elem 3</div>
  <div class="el4">Elem 4</div>
  <div class="el5">Elem 5</div>
  <div class="el6">Elem 6</div>
</div>

Grid gap

Felmerülhet bennünk a kérdés: lenne valamilyen mód arra, hogy az oszlopaink, és soraink közötti rés méretét megváltoztassuk?

Természetesen lenne, erre jók az úgynevezett grid-column-gap, és grid-row-gap tulajdonságok, melyek ezeket az értékeket állítják be. Ezeket legtöbbször pixelben adjuk meg, de bármilyen érvényes CSS méret-értéket használhatunk (%, em, rem, vw stb…) Amennyiben ugyanakkora értékre szeretnénk állítani a sor és oszlopköz értékét, a szimpla grid-gap tulajdonsággal egy sorban megtehetjük ezt.

Az alábbi példa 30px-es, és 50px-es méretet állít be erre.

<style>
  .container-grid {
    display: grid;
    grid-template-columns: 20% 20% 20% 20%;
    grid-column-gap: 30px; /* Az oszlopok közötti rés mértéke*/
    grid-row-gap: 50px; /*A sorok közötti rés mértéke*/
    height: 500px;
    margin: 20px;
    justify-content: center;
    align-content: center;
  }
  .container-grid div {
    padding: 20px;
  }
  .el1 {
    background: rgba(255, 154, 72, 0.5);
  }
  .el2 {
    background: rgba(255, 0, 0, 0.5);
  }
  .el3 {
    background: rgba(0, 128, 0, 0.5);
  }
  .el4 {
    background: rgba(0, 4, 255, 0.5);
  }
  .el5 {
    background: rgba(0, 100, 255, 0.5);
  }
  .el6 {
    background: rgba(0, 4, 100, 0.5);
  }
</style>
<div class="container-grid">
  <div class="el1">Elem 1</div>
  <div class="el2">Elem 2</div>
  <div class="el3">Elem 3</div>
  <div class="el4">Elem 4</div>
  <div class="el5">Elem 5</div>
  <div class="el6">Elem 6</div>
</div>

A rácsszerkezet középre igazítása

A GRID alapvetően egy valamiféle harmóniával, szimmetriával rendelkező elrendezést valósít meg rendszerint. Ebből kifolyólag, az is nagyon fontos lehet, hogy a teljes rácsszerkezetünket középre tudjuk igazítani. Ekkor a teljes GRID rács úgy igazítható középre, hogy a definiált GRID elemnek az alábbi CSS tulajdonságokat adjuk:

justify-content: center;
align-content: center;

A példáinkban ez eddig mindvégig így szerepelt, ugyanis szerettük volna szemléletesebben bemutatni a példákat. Ennek ellenére szerettük volna kiemelni itt a pontos megoldási módot.

Cellák középre igazítása

Lehetséges, hogy a nagyobb összhang érdekében magukat a cellatartalmakat is középre szeretnénk igazítani, és azok méretét minimálisra venni. Ekkor minden egyes GRID elemnek az align-self: center; justify-self: center; tulajdonságokat kell adnunk. Egészítsük ki a CSS kódunkat az alábbiakkal, és nézzük meg a végeredményt.

.container-grid div {
	align-self: center;
	justify-self: center;
}


Cellák egyesítése

Felmerülhet bennünk a kérdés: nem lenne valami hasonló megoldás ahhoz, mint amikor egy HTML táblázatban szeretnénk cellákat, vagy különféle oszlopokat összevonni? Természetesen megoldható, az úgynevezett grid-column-start, és grid-column-end, valamint a grid-row-start, grid-row-end tulajdonságokkal. Ezeket nem a GRID containernek kell adni, hanem magának a GRID elemeknek.

A számozás mindig úgy értendő, hogy a rácsszerkezet bal oldali, illetve felső határvonala számít egynek.

<style>
  .container-grid {
    display: grid;
    grid-template-columns: 20% 20% 20% 20%;
    grid-column-gap: 30px;
    grid-row-gap: 50px;
    height: 500px;
    margin: 20px;
    justify-content: center;
    align-content: center;
  }
  .container-grid div {
    padding: 20px;
  }
  .el1 {
    background: rgba(255, 154, 72, 0.5);
    grid-column-start: 1;
    grid-column-end: 3;
    grid-row-start: 1;
    grid-row-end: 3;
  }
  .el2 {
    background: rgba(255, 0, 0, 0.5);
  }
  .el3 {
    background: rgba(0, 128, 0, 0.5);
  }
  .el4 {
    background: rgba(0, 4, 255, 0.5);
  }
  .el5 {
    background: rgba(0, 100, 255, 0.5);
  }
  .el6 {
    background: rgba(0, 4, 100, 0.5);
  }
</style>
<div class="container-grid">
  <div class="el1">Elem 1</div>
  <div class="el2">Elem 2</div>
  <div class="el3">Elem 3</div>
  <div class="el4">Elem 4</div>
  <div class="el5">Elem 5</div>
  <div class="el6">Elem 6</div>
</div>

Grid Template Areas

Van egy nagyon egyszerű, és praktikus, valamint emberi szemmel hihetetlenül átlátható módja annak, hogy a GRID-ünkön belül az elemek elrendezését definiáljuk. Ez a grid-template-areas tulajdonsággal érhető el, a lényege, hogy idézőjelek között (stringek) definiáljuk az elemek elrendezését. 

Amennyiben adott az oszlopok szélessége, ennek segítségével nagyon könnyedén definiálhatjuk a pontos kinézetet. Az alábbi egy példát mutat be, a „header”, „footer”, és a többi elem úgy állítható elő, hogy más CSS definíciókban a grid-area tulajdonság segítségével hozzuk létre azokat. 

<style>
  .container-grid div {
    padding: 20px;
  }
  .container-grid {
    display: grid;
    grid-template-columns: 20% 20% 20% 20%;
    grid-template-areas:
      "header header header header"
      "main-left main-left main-right main-right"
      "second-left second-left second-left second-right"
      "footer footer footer footer";
    grid-column-gap: 5px;
    grid-row-gap: 5px;
    height: 500px;
    margin: 20px;
    justify-content: center;
    align-content: center;
  }
  .el1 {
    background: rgba(255, 154, 72, 0.5);
    grid-area: header;
  }
  .el2 {
    background: rgba(255, 0, 0, 0.5);
    grid-area: main-left;
  }
  .el3 {
    background: rgba(0, 128, 0, 0.5);
    grid-area: main-right;
  }
  .el4 {
    background: rgba(0, 4, 255, 0.5);
    grid-area: second-left;
  }
  .el5 {
    background: rgba(0, 100, 255, 0.5);
    grid-area: second-right;
  }
  .el6 {
    background: rgba(0, 4, 100, 0.5);
    grid-area: footer;
  }
</style>
<div class="container-grid">
  <div class="el1">Elem 1</div>
  <div class="el2">Elem 2</div>
  <div class="el3">Elem 3</div>
  <div class="el4">Elem 4</div>
  <div class="el5">Elem 5</div>
  <div class="el6">Elem 6</div>
</div>

Reszponzív rácsszerkezet

Amennyiben megnézzük az előző elrendezéseket, látható, hogy azok nem minősülnek reszponzívnak-ez azt jelenti, hogy azok mobilnézeten nem jelennek meg szépen. Felmerülhet bennünk a kérdés, hogy ezen hogyan lehetne változtatni? A válasz nagyon egyszerű, a CSS-ből ismert Media Query-k segítségével. Adjuk hozzá a CSS kódunkban alulra az alábbiakat: 

/*A reszponzivitás elérése*/
@media (max-width: 768őx) {
  .container-grid {
    grid-template-columns: 100%;
    grid-template-areas:
      "header" "header" "header" "header"
      "main-left" "main-left" "main-right" "main-right"
      "second-left" "second-left" "second-left" "second-right"
      "footer" "footer" "footer" "footer";
  }
}

Ezek után látni fogjuk mobilon az eredményt: 

módosítva: 2020-05-25