H11 - Gridlayout

00 - Je eigen site krijgt de Holy Grail-indeling

De header komt bovenaan, de nav links, main in het midden, aside rechts en de footer onderaan. Body gebruikt grid; het menu en de footer blijven intern flexbox gebruiken. Je eerdere inhoud, achtergrond, kleurvariabelen en stylesheet blijven behouden.

01 - Grid is layout in twee richtingen

Flexbox is vooral handig voor één richting: een rij of een kolom. CSS Grid is handig als je tegelijk met rijen en kolommen werkt. Denk aan een complete pagina met header, menu, inhoud, zijbalk en footer.

Net als bij flexbox is grid een lastig layout-onderdeel. Daarom gaan we niet alle grid-opties uit het hoofd leren. We gebruiken hier één overzichtelijke aanpak: onderdelen een naam geven en daarna een layout tekenen met grid-template-areas.

Wil je grid goed oefenen, speel dan CSS Grid Garden. Speel het spel. Het helpt om grid visueel te begrijpen.

Hoe speel je CSS Grid Garden?

  1. Open cssgridgarden.com/#nl.
  2. Je ziet wortels en water op een speelveld.
  3. Je moet de wortels water geven met CSS Grid-regels.
  4. In de CSS-editor typ je grid-regels.
  5. Als de waterplek goed staat, ga je naar het volgende level.
  6. Lees per level goed welke grid-property je oefent.
  7. Speel rustig. Het doel is begrijpen, niet zo snel mogelijk klikken.

Actie — Alleen oefenen

  1. Bekijk je bestaande pagina met menu, hoofdinhoud, aside en footer. Schets een Holy Grail-indeling: header boven, nav links, main midden, aside rechts en footer onder.
  2. Speel desgewenst de eerste tien levels van CSS Grid Garden via de link hierboven. Dat is een afzonderlijke oefening.
  3. Bouw nu nog geen nieuw grid. Vanaf item 2 gebruik je de bestaande hoofdonderdelen voor je eigen indeling.
02 - De HTML: duidelijke onderdelen

Voor een grid-layout heb je eerst duidelijke HTML-onderdelen nodig. Dit kunnen semantische HTML-tags zijn, zoals <header>, <nav>, <main>, <aside> en <footer>.

<body>
    <header class="site-header">Je bestaande naam en paginakop</header>
    <nav class="site-nav">Je bestaande menulijst</nav>
    <main class="site-main">
        <div class="pagina-breedte">Je bestaande pagina-inhoud</div>
    </main>
    <aside class="site-aside">Je bestaande aanvullende informatie</aside>
    <footer class="site-footer">Je bestaande twee alinea's en contactlink</footer>
</body>

De HTML blijft gewoon inhoud en structuur. De plaatsing doen we met CSS.

Actie — Bouw verder

  1. Controleer op alle vier de pagina's dat header.site-header, nav.site-nav, main.site-main, aside.site-aside en footer.site-footer directe kinderen van body zijn.
  2. De pagina-breedte-wrapper blijft binnen main. Verplaats geen menu of footer in die wrapper.
  3. Behoud de bestaande kaarten, lijsten, tabel, echte links, actieve navigatie en flexboxregels. Je voegt geen lege vervangende pagina toe.
03 - Geef elk onderdeel een grid-area naam

In CSS geef je elk HTML-element een naam met grid-area. Die naam gebruik je later in de layout-tekening.

.site-header { grid-area: header; }
.site-nav { grid-area: nav; }
.site-main { grid-area: main; min-width: 0; }
.site-aside { grid-area: aside; }
.site-footer { grid-area: footer; }
  • De naam mag je zelf kiezen.
  • Kies duidelijke namen, zoals header, nav, main, aside en footer.
  • De naam in grid-area schrijf je zonder punt en zonder hekje.
  • Deze namen zijn geen classnamen en geen id's. Het zijn grid-area namen.

Actie — Bouw verder

  1. Geef in style.css de vijf bestaande hoofdclasses ieder een grid-area: header, nav, main, aside en footer, zoals in de uitleg.
  2. Deze namen bereiden de plaatsing voor; de definitieve indeling verschijnt pas na display:grid en de template in de volgende items.
  3. Behoud de bestaande flexboxregels. Een footer kan tegelijk een grid-item van body én een eigen flex-container zijn.
04 - Zet grid aan op de container

De grid-layout zet je op de container waar de onderdelen direct in staan. In dit eenvoudige voorbeeld gebruiken we de body als grid container.

body {
    display: grid;
}

Daarna kun je rijen, kolommen en gebieden definiëren.

body {
    display: grid;
    grid-template-columns: 190px minmax(0, 1fr) 230px;
    grid-template-rows: auto 1fr auto;
}
  • grid-template-columns bepaalt de kolommen.
  • grid-template-rows bepaalt de rijen.
  • 1fr gebruikt de grid-eenheid fr: één fractie van de beschikbare ruimte.
  • minmax(0, 1fr) geeft de middenkolom de overgebleven ruimte en laat haar zo nodig kleiner worden.
  • min-width: 0 op main voorkomt dat de minimale inhoudsbreedte de kolom onbedoeld blijft opduwen.
  • auto laat de rijhoogte door de inhoud bepalen; de middelste rij kan met 1fr vrije hoogte gebruiken.

Actie — Bouw verder

  1. Zet op body display:grid en maak drie kolommen met 190px minmax(0, 1fr) 230px en drie rijen met auto 1fr auto.
  2. Minmax(0,1fr) laat de middenkolom de overgebleven ruimte gebruiken en zo nodig smaller worden. Geef .site-main ook min-width:0.
  3. Controleer dat oude main-width/max-width-regels in H9 naar de binnenwrapper zijn verhuisd. De definitieve plaatsing volgt in item 5.
05 - Layout tekenen met grid-template-areas

Met grid-template-areas teken je de layout als tekst. Elke regel tussen aanhalingstekens is een rij. Elk woord is een cel.

body {
    min-height: 100vh;
    margin: 0;
    padding: 24px;
    display: grid;
    grid-template-columns: 190px minmax(0, 1fr) 230px;
    grid-template-rows: auto 1fr auto;
    grid-template-areas:
        "header header header"
        "nav    main   aside"
        "footer footer footer";
    gap: 24px;
}
  • De eerste rij bestaat uit drie keer header, dus de header loopt over drie kolommen.
  • De tweede rij bevat nav, main en aside: de Holy Grail-indeling.
  • De derde rij is volledig footer.

Dit is de kracht van named grid areas: je kunt de layout bijna lezen als een plattegrond.

Actie — Bouw verder

  1. Teken op dezelfde body de drie rijen met grid-template-areas: header over de hele breedte, daaronder nav/main/aside en onderaan footer over de hele breedte.
  2. Behoud de grid-area-namen van item 3 en stel gap:24px in.
  3. Open Home en Portfolio breed in de browser: je eigen inhoud staat nu in de Holy Grail-indeling. Nav en footer houden hun flexbox.
06 - De punt betekent: lege cel

Een punt in grid-template-areas betekent dat de cel geen benoemd gebied krijgt. Voor deze proef voegen we tijdelijk een lege rij toe, zodat alle bestaande onderdelen hun bestemming houden.

body {
    grid-template-rows: auto 1fr 40px auto;
    grid-template-areas:
        "header header header"
        "nav    main   aside"
        ".      .      ."
        "footer footer footer";
}

Elke rij heeft evenveel cellen. De derde rij laat hier 40px extra ruimte vrij. Alle vijf hoofdonderdelen blijven bij hun eigen named area. Onze eindlayout heeft deze lege rij niet nodig.

Actie — Alleen oefenen

  1. Bewaar je werkende drie-rijentemplate en probeer tijdelijk de vier rijen uit het voorbeeld op dezelfde body.
  2. Bekijk de extra lege rij boven de footer. Je nav en alle andere hoofdonderdelen blijven zichtbaar.
  3. Herstel daarna grid-template-rows:auto 1fr auto en de oorspronkelijke drie template-rijen. De lege-cel-oefening is geen verplicht onderdeel van het eindproduct.
07 - Volledig basisvoorbeeld

Dit is een compacte basis voor een pagina-layout met named grid areas.

<body>
    <header class="site-header">Je bestaande naam en paginakop</header>
    <nav class="site-nav">Je bestaande menulijst</nav>
    <main class="site-main">
        <div class="pagina-breedte">Je bestaande pagina-inhoud</div>
    </main>
    <aside class="site-aside">Je bestaande aanvullende informatie</aside>
    <footer class="site-footer">Je bestaande twee alinea's en contactlink</footer>
</body>
* {
    box-sizing: border-box;
}

body {
    min-height: 100vh;
    margin: 0;
    padding: 24px;
    display: grid;
    grid-template-columns: 190px minmax(0, 1fr) 230px;
    grid-template-rows: auto 1fr auto;
    grid-template-areas:
        "header header header"
        "nav    main   aside"
        "footer footer footer";
    gap: 24px;
}

.site-header { grid-area: header; }
.site-nav { grid-area: nav; }
.site-main { grid-area: main; min-width: 0; }
.site-aside { grid-area: aside; }
.site-footer { grid-area: footer; }

.site-nav ul {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 16px;
    list-style: none;
    padding: 0;
    margin: 0;
}

/* De bestaande footer- en kaartflexbox, kleuren en achtergrond blijven staan. */
  • min-height: 100vh laat de body minimaal de hoogte van het scherm gebruiken.
  • gap maakt ruimte tussen de grid-vakken.
  • De template bepaalt waar de onderdelen staan.

Actie — Bouw verder

  1. Vergelijk het basisvoorbeeld met je bestaande CSS; vervang niet je eigen HTML-inhoud door de korte labels uit het schema.
  2. Voeg min-height:100vh toe aan body, behoud padding:24px en gap:24px en controleer de bestaande dekkende achtergrondvlakken.
  3. Laat .site-nav ul op het brede scherm nu flex-direction:column en align-items:stretch gebruiken; de vier links staan onder elkaar in de linker kolom.
  4. Controleer alle vier pagina's. Je achtergrondafbeelding met cover blijft achter de hoofdonderdelen zichtbaar.
08 - Grid zichtbaar maken in de browser

Een grid-layout is soms lastig te zien, omdat de lijnen en namen niet automatisch zichtbaar op de pagina staan. In de browser kun je de grid-lijnen tijdelijk zichtbaar maken met de ontwikkelaarstools.

Firefox

  1. Open de pagina in Firefox.
  2. Klik met de rechtermuisknop op de pagina en kies Inspecteren.
  3. Selecteer het element waarop display: grid staat, bijvoorbeeld body.
  4. Zoek in de inspector naar het woord grid of naar het grid-icoon.
  5. Zet de grid-overlay aan.
  • Firefox kan de grid-lijnen over de pagina tekenen.
  • Je kunt de rijnummers en kolomnummers beter zien.
  • Bij named grid areas kun je ook de indeling van je gebieden controleren.
  • Dit verandert niets aan je HTML of CSS. Het is alleen een hulpmiddel in de browser.

Chrome en Edge

  1. Open de pagina in Chrome of Edge.
  2. Klik met de rechtermuisknop op de pagina en kies Inspecteren.
  3. Selecteer het grid-element.
  4. Klik in het tabblad Elements of Styles op het grid-icoon.
  5. Gebruik de layout- of overlay-opties om de grid-lijnen zichtbaar te maken.

Dit is een goede manier om te controleren of jouw tekst-tekening in grid-template-areas overeenkomt met wat je in de browser ziet.

Je kunt eventueel ook tijdelijk opvallende achtergronden of borders aan je onderdelen geven. Dat is handig tijdens het bouwen, maar haal zulke testkleuren later weer weg.

header,
nav,
main,
aside,
footer {
    border: 2px solid red;
}
  • De browser-overlay is meestal de netste optie.
  • Tijdelijke borders zijn handig als je snel wilt zien waar elk onderdeel staat.
  • Laat test-borders niet per ongeluk in je eindversie staan.

Actie — Bouw verder

  1. Open Inspecteren volgens het stappenplan en zet de grid-overlay aan op body van je bestaande pagina.
  2. Vergelijk header, nav, main, aside en footer met de drie rijen van je template.
  3. Zet de overlay na de controle uit. Heb je tijdelijke testborders gebruikt, verwijder die dan; behoud je gewone ontwerpranden.
09 - Best practices
  • Gebruik grid voor layout in twee richtingen: rijen en kolommen.
  • Gebruik flexbox voor kleinere onderdelen in één richting.
  • Gebruik duidelijke grid-area namen.
  • Houd grid-template-areas overzichtelijk.
  • Zorg dat elke regel in grid-template-areas evenveel cellen heeft.
  • Gebruik een punt . voor een lege cel.
  • Gebruik de grid-overlay in de browser om je layout te controleren.
  • Speel CSS Grid Garden om meer grid-opties te oefenen.

Actie — Controleer en rond af

  1. Controleer op elke pagina dezelfde drie kolommen en dezelfde named areas, met de juiste vijf directe kinderen van body.
  2. Controleer dat main zijn eigen inhoud behoudt, de binnenwrapper de leesbreedte begrenst en kaart- en footerflexbox nog werken.
  3. Herstel een verkeerd gespelde area-naam of achtergebleven proefregel. De lege-cel-oefening hoort niet in je eindlayout te staan.
10 - Afronding van je bestaande site

Actie — Controleer en rond af

  1. Rond je bestaande desktopsite af: de vier pagina's delen dezelfde Holy Grail-layout, achtergrond, kleurvariabelen en externe stylesheet.
  2. Controleer menu, footer, portfoliokaarten en echte links. Gebruik de grid-overlay waar nodig; maak geen nieuwe pagina of tweede gridversie.
  3. Een smal scherm kan nu nog te krap zijn. Noteer waar dat gebeurt: in H12 maken we juist deze bestaande indeling responsive.
Quiz
  1. Vraag 1. Waarvoor is CSS Grid vooral handig?



    Goed. Grid werkt sterk in twee richtingen.
    Niet goed. CSS Grid gebruik je voor rijen en kolommen.
  2. Vraag 2. Welke property zet grid aan?



    Goed. Grid zet je aan met display: grid.
    Niet goed. De juiste regel is display: grid;.
  3. Vraag 3. Waarvoor gebruik je grid-area in dit hoofdstuk?



    Goed. Die naam gebruik je in grid-template-areas.
    Niet goed. grid-area geeft een gebiedsnaam.
  4. Vraag 4. Welke property bepaalt de kolommen?



    Goed. Kolommen maak je met grid-template-columns.
    Niet goed. Kolommen horen bij grid-template-columns.
  5. Vraag 5. Welke property bepaalt de rijen?



    Goed. Rijen maak je met grid-template-rows.
    Niet goed. Rijen horen bij grid-template-rows.
  6. Vraag 6. Wat doet 1fr?



    Goed. fr verdeelt beschikbare ruimte.
    Niet goed. 1fr betekent een fractie van de beschikbare ruimte.
  7. Vraag 7. Wat betekent een punt . in grid-template-areas?



    Goed. De punt staat voor een lege grid-cel.
    Niet goed. In grid-template-areas betekent een punt een lege cel.
  8. Vraag 8. Wat moet kloppen bij elke regel in grid-template-areas?



    Goed. Het aantal cellen per rij moet gelijk zijn.
    Niet goed. Elke rij in de template moet evenveel cellen hebben.
  9. Vraag 9. Welke property maakt ruimte tussen grid-vakken?



    Goed. gap werkt ook bij CSS Grid.
    Niet goed. Gebruik gap voor ruimte tussen grid-vakken.
  10. Vraag 10. Wat is een goede manier om meer grid-opties te oefenen?



    Goed. Speel het spel om grid visueel te oefenen.
    Niet goed. CSS Grid Garden is een goede oefening.