CSS Grid Layout

HTML/CSS

Basis

CSS Grid Layout

Doel

Met display: grid kunnen we relatief gemakkelijk een visueel grid creëren, bv. onderstaande

.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 10px;
  grid-auto-rows: minmax(100px, auto);
}
.one {
  grid-column: 1 / 3;
  grid-row: 1;
}
.two {
  grid-column: 2 / 4;
  grid-row: 1 / 3;
}
.three {
  grid-column: 1;
  grid-row: 2 / 5;
}
.four {
  grid-column: 3;
  grid-row: 3;
}
.five {
  grid-column: 2;
  grid-row: 4;
}
.six {
  grid-column: 3;
  grid-row: 4;
}

Flexbox of Grid?

In principe kan je de meeste grid-achtige layouts met zowel display: flex als display: grid bekomen.

Als regel neem je meestal de volgende:

  • is je layout twee dimensionaal (horizontaal EN verticaal)? Dan gebruik je grid.
  • Is het één dimensionaal (horizontaal OF verticaal)? Dan gebruik je flexbox

Oefening

CSS Grid Layout

CSS Grid ontdekken

Aangezien CSS Grid veel instellingen heeft waardoor je heel veel variaties hebt, gaan we het samen klassikaal ontdekken.

 

Start daarom met het maken van een nieuw project met volgende structuur. Link het CSS bestand.

CSS Grid ontdekken

Vul nu het CSS en HTML bestand aan:

body {
  margin: 0;
  padding: 0;
  font-family: sans-serif;
}

* {
  box-sizing: border-box;
}

.grid {
  margin: 0;
  padding: 0;
  list-style-type: none;
}

.grid li {
  background: #55ddbd;
  padding: 1rem;
  border: 2px solid #0e4538;
}
<body>
    <ul class="grid">
        <li>Box</li>
        <li>Box</li>
        <li>Box</li>
        <li>Box</li>
        <li>Box</li>
        <li>Box</li>
        <li>Box</li>
        <li>Box</li>
        <li>Box</li>
    </ul>
</body>

CSS Grid ontdekken

Open het project in de browser

CSS Grid ontdekken

Pas de klasse .grid als volgt aan

.grid {
  margin: 0;
  padding: 0;
  list-style-type: none;

  display: grid;
}

Kijk in de browser. Er zal visueel niets gewijzigd zijn. Om het grid te laten werken hebben we nog enkele properties nodig.

Columns

Voeg volgende lijn toe aan .grid

.grid {
  ...
  grid-template-columns: 10vw 30vw;
}

Wat is er gewijzigd? 

Gap

Voeg volgende lijn toe aan .grid en bekijk het resultaat

.grid {
  ...
  gap: 1rem;
}

Net zoals bij een flexbox kunnen we de gap property gebruiken.

Aligneren

Ook align-items en justify-content kunnen we op onze .grid klasse gebruiken. Probeer deze uit met verschillende combinaties.

Waarom heeft justify-content een effect en align-items niet?

Columns / rows

Wijzig nu de waarde van grid-template-columns

.grid {
  ...
  grid-template-columns: 1fr 2fr 1fr;
}

Vergelijk het voor en na resultaat

Columns / rows

Met een fr (fraction) waarde kunnen we gemakkelijk een relatieve waarde creëren binnen een grid

.grid {
  grid-template-columns: 1fr 2fr 1fr;
}

Hier zeggen we dat:

  • er drie kolommen zijn (want drie waarden)
  • de tweede kolom dubbel zo breed moet zijn als de eerste en de laatste

Columns / rows

Voeg nu onderstaande toe aan .grid

.grid {
  ...
  grid-template-rows: 50px 100px 150px;
}

Vergelijk het voor en na resultaat

Columns / rows

Wijzig grid-template-rows en voeg een height toe

.grid {
  ...
  grid-template-rows: 3fr 5fr 1fr;
  height: 100vh;
}

Vergelijk het voor en na resultaat.

Columns / rows

Je kan dus grid-template-rows en grid-template-columns gebruiken om de rows en columns in te stellen.

 

Probeer nu zelf grid-template-rows in te stellen zodat je 3 kolommen hebt die even breed zijn.

Repeat

Vermoedelijk heb je dit als volgt geschreven:

.grid {
  ...
  grid-template-rows: 1fr 1fr 1fr;
}

Dit kan nog korter! Binnen grid kunnen we gebruik maken van repeat

.grid {
  ...
  grid-template-rows: repeat(3, 1fr);
}

Pas 3 aan naar een ander getal. Wat is het resultaat? Pas daarna terug aan naar 3.

Span

Wijzig nu ook je HTML bestand. Voeg een klasse toe aan het tweede list item.

<ul class="grid">
  <li>Box</li>
  <li class="special">Box</li>
  <li>Box</li>
  <li>Box</li>
  <li>Box</li>
  <li>Box</li>
  <li>Box</li>
  <li>Box</li>
  <li>Box</li>
</ul>

Span

Voeg deze klasse in CSS toe

.special {
  background: #09c095;
  grid-column: span 2;
}

Onderzoek het resultaat met inspect element. Wat is er gewijzigd? Hoe toont dit zich via inspect element? Bekijk zeker ook de klasse .grid via inspect element

Span

Voeg het volgende toe

.special {
  ...
  grid-row: span 2;
}

Wat is er gewijzigd? Pas het getal 2 aan naar een andere waarde.

Responsive grid

Verwijder de klasse .special uit CSS.

Pas bij .grid de columns aan als volgt:

.grid {
  ...
  grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr));
}

Bekijk het resultaat in de browser. Maak je scherm eerst zo smal als je kan en dan zo breed als je kan. 

Responsive grid

Met grid kunnen we heel snel een responsive grid maken dat zich aanpast naar de breedte van het scherm, zonder een of meerdere media query te schrijven. Handig!

CSS Grid Layout

By Lecturer GDM

CSS Grid Layout

Pseudo elements and positioning

  • 281