n00b pro

04. CSS layout

Dit hoofdstuk is onderdeel van de cursus CSS. Andere cursussen in dezelfde reeks: HTML, Javascript, C#, Ontwikkelomgeving.

Layout technieken overzicht

Je kan layouttechnieken onderverdelen in ruwweg 5 groepen:

Alignering

Standaard staat content linksboven gealigneerd:

<div class="container">
   <img src="img/04_layout/spongebob.webp" alt="">
   <p>parmesan cheese slices when the cheese comes out everybody's happy cow cheese and wine cheese and biscuits. Roquefort when the cheese comes out...</p>
</div>

parmesan cheese slices when the cheese comes out everybody's happy cow cheese and wine cheese and biscuits. Roquefort when the cheese comes out...

horizontaal uitlijnen

Om inhoud (tekst, afbeeldingen enz...) horizontaal uit te lijnen, gebruik text-align op de parent:

<div class="container">
   <img src="img/04_layout/spongebob.webp" alt="">
   <p>parmesan cheese slices when the cheese comes out everybody's happy cow cheese and wine cheese and biscuits. Roquefort when the cheese comes out...</p>
</div>
.container {
   text-align: center; /* probeer ook left, right, justify */
}

parmesan cheese slices when the cheese comes out everybody's happy cow cheese and wine cheese and biscuits. Roquefort when the cheese comes out...

centreren of rechts plaatsen

Om een content in het midden of rechts te plaatsen, zet je het typisch in een <div class="wrapper">, en gebruik je margin-left: auto en/of margin-right: auto:

<div class="container">
   <div class="wrapper">					
      <img src="img/04_layout/spongebob.webp" alt="">
      <p>parmesan cheese slices when the cheese comes out everybody's happy cow cheese and wine cheese and biscuits. Roquefort when the cheese comes out...</p>
   </div>	  
</div>
.wrapper {
   background-color: #cccc;					
   margin-left: auto;
   margin-right: auto; /* probeer ook 0px */
   padding: 10px;
   width: 300px;
}

parmesan cheese slices when the cheese comes out everybody's happy cow cheese and wine cheese and biscuits. Roquefort when the cheese comes out...

verticaal centreren

Als de hoogte van de container flexibel is, kan je de alle content verticaal visueel in het midden krijgen met gelijke padding boven en onder op de parent:

<div id="container">
   <img src="img/04_layout/spongebob.webp" alt="">
   <p>parmesan cheese slices when the cheese comes out everybody's happy cow cheese and wine cheese and biscuits. Roquefort when the cheese comes out...</p>
</div>
.container {
   padding-bottom: 50px; 
   padding-top: 50px; 
}

parmesan cheese slices when the cheese comes out everybody's happy cow cheese and wine cheese and biscuits. Roquefort when the cheese comes out...

Dit lukt uiteraard niet als de container een vaste hoogte heeft. De mogelijkheden zijn dus beperkt: voor verfijndere layouts gebruik je flexbox of grid.

één regel verticaal centreren

Een oud trukje om één regel verticaal te centreren is height en line-height dezelfde waarde geven:

<a href="">button tekst </a>
/* button layout */
.button {
   box-sizing: content-box; /* afmetingen zijn voor content bedoeld */
   display: block; /* anders kan je geen afmetingen instellen */
   height: 60px; /* zelfde waarde */
   line-height: 60px; /* zelfde waarde */
   text-align: center; /* centreer horizontaal */
   white-space: nowrap; /* vermijd line breaks */
   width: 120px;
}

/* button styling */
.button {
   background-color: beige;
   border: 2px solid #ccc;
   cursor: pointer;
}

Floating

Standaard weergave

Blocklevel elementen als <h3> en <p> starten standaard op een nieuwe regel:

<div id="wrapper">
  <section>
    <img src="img/04_layout/portrait.jpg" alt="foto">
    <h3>Procured</h3>
    <p>Civility not absolute put continue. Overcame breeding or my concerns removing desirous so absolute. My melancholy unpleasing imprudence considered in advantages so impression. Almost unable put piqued talked likely houses her met.</p>
  </section>
</div>
foto

Procured

Civility not absolute put continue. Overcame breeding or my concerns removing desirous so absolute. My melancholy unpleasing imprudence considered in advantages so impression. Almost unable put piqued talked likely houses her met.

Floaten

Met float: left; kan je blocklevel elementen rond een afbeelding laten vloeien:

img {
   float: left; /* probeer ook float: right; */
   margin: 0 10px 10px 0; /* werk af met margin rechtsonder */
}
foto

Procured

Civility not absolute put continue. Overcame breeding or my concerns removing desirous so absolute. My melancholy unpleasing imprudence considered in advantages so impression. Almost unable put piqued talked likely houses her met.

Dit werkt ook met andere block-elementen als pullquotes:

<section>
  <h3>Procured</h3>
  <p> Civility not absolute put continue. Overcame breeding or my concerns removing desirous so absolute. My melancholy unpleasing imprudence considered in advantages so impression. My melancholy unpleasing imprudence considered in advantages so impression.</p>
  <aside>
    spoke as as other again ye; Hard on to roof he drew
  </aside>
  <p>Her are its honoured drawings nor. Pretty see mutual thrown all not edward ten. Particular an boisterous up he reasonably frequently. Several any had enjoyed shewing studied two. Up intention remainder sportsmen behaviour ye happiness. Few again any alone style added abode ask. Nay projecting unpleasing boisterous eat discovered solicitude. Own six moments produce elderly pasture far arrival. Hold our year they ten upon. Gentleman contained so intention sweetness in on resolving.</p>
</section>
aside {
   float: right;
   margin: 10px 0 10px 10px;
   width: 130px;
}

Procured

Civility not absolute put continue. Overcame breeding or my concerns removing desirous so absolute. My melancholy unpleasing imprudence considered in advantages so impression. My melancholy unpleasing imprudence considered in advantages so impression.

Her are its honoured drawings nor. Pretty see mutual thrown all not edward ten. Particular an boisterous up he reasonably frequently. Several any had enjoyed shewing studied two. Up intention remainder sportsmen behaviour ye happiness. Few again any alone style added abode ask. Nay projecting unpleasing boisterous eat discovered solicitude. Own six moments produce elderly pasture far arrival. Hold our year they ten upon. Gentleman contained so intention sweetness in on resolving.

Parent bleeding

Als een gefloat element niet meer in de parent past, zal het eruit lekken en de content van het volgende blok wegdrukken:

<div id="wrapper">
  <section>
    <img src="img/04_layout/portrait.jpg" alt="foto">
    <h3>Procured</h3>
    <p>Civility not absolute put continue. Overcame breeding or my concerns removing desirous so absolute. </p>
  </section>
  <section>
    <h3>Finished</h3>
    <p>Her are its honoured drawings nor. Pretty see mutual thrown all not edward ten. Particular an boisterous up he reasonably frequently. Several any had enjoyed shewing studied two. Up intention remainder sportsmen behaviour ye happiness. Few again any alone style added abode ask.</p>
  </section>
</div>
img {
  float: left;
  margin-right: 10px;
  width: 160px;
}
foto

Procured

Civility not absolute put continue. Overcame breeding or my concerns removing desirous so absolute.

Finished

Her are its honoured drawings nor. Pretty see mutual thrown all not edward ten. Particular an boisterous up he reasonably frequently. Several any had enjoyed shewing studied two. Up intention remainder sportsmen behaviour ye happiness. Few again any alone style added abode ask.

Dit lijkt vreemd, maar eigenlijk is het niet onlogisch voor waar floating voor bedoeld is: tekst laten vloeien rond afbeeldingen. Het alternatief is een grote leegte tussen de twee paragrafen. Als je niet wil, kan je de parent herstellen met overflow: hidden;:

/* vermijd parent bleeding */
section {
   overflow: hidden;
}

img {
  float: left;
  margin-right: 10px;
  width: 160px;
}
foto

Procured

Civility not absolute put continue. Overcame breeding or my concerns removing desirous so absolute.

Finished

Her are its honoured drawings nor. Pretty see mutual thrown all not edward ten. Particular an boisterous up he reasonably frequently. Several any had enjoyed shewing studied two. Up intention remainder sportsmen behaviour ye happiness. Few again any alone style added abode ask.

Clear

Je kan vermijden dat bepaalde elementen naast een gefloat element komen met clear (waarden left, right of both), bv. de tweede titel, die nu onder de afbeelding blijft:

/* clear tweede titel */
#sect2 h3 {
  clear: left;
}

img {
  float: left;
  margin-right: 10px;
  width: 160px;
}
foto

Procured

Civility not absolute put continue. Overcame breeding or my concerns removing desirous so absolute.

Finished

Her are its honoured drawings nor. Pretty see mutual thrown all not edward ten. Particular an boisterous up he reasonably frequently. Several any had enjoyed shewing studied two. Up intention remainder sportsmen behaviour ye happiness. Few again any alone style added abode ask.

Flexbox

Met flexbox kan je een reeks children, de flex items, schikken in een parent, de flex container. Het meest complete overzicht op het net vind je op https://css-tricks.com/snippets/css/a-guide-to-flexbox/.

overzicht properties

De CSS properties voor de flex container:

eigenschap waarden betekenis
display flex layouten met flex
align-items start|center|space-between|end|stretch|... schikking van items dwars op de lijnen
gap, column-gap, row-gap px|%|... ruimte tussen items/lijnen
justify-content start|center|space-between|end|stretch|... schikking van items langs de lijnen
flex-direction row|column|row-reverse|column-reverse stapelen in rijen of kolommen, al dan niet in omgekeerde richting
flex-wrap wrap|nowrap items op één lijn of meerdere lijnen
flex-flow combinatie van flex-direction en flex-wrap, b.v. flex-flow: row nowrap;
align-content start|center|space-between|end|stretch|... schikking van de flex lijnen in de flex container

De CSS properties voor het flex item:

eigenschap waarden betekenis
align-self start|center|space-between|end|stretch|... overschrijft align-items property voor dit item
flex getal|0 0 px|0 0 auto breedte van de kolom (vast|flexibel|passend)
order geheel getal volgorde van het item in de lijn

Voor de verdere uitleg starten we van een container van 300px hoog, padding 20px (het paarse gebied) met 10 items van afwisselende afmetingen. De standaard weergave, zonder layout:

<div class="flex-container">
   <div class="flex-item">01</div>
   <div class="flex-item">02</div>
   <div class="flex-item">03</div>
   <div class="flex-item">04</div>
</div>
01
02
03
04

display

Met display: flex maak je van de container een flex container. Ze komen standaard op één rij, verticaal uitgerokken:

.flex-container {
   display: flex; /* maak flex container */
}
01
02
03
04

align-items

Lijn items verticaal uit met align-items, b.v. center:

.flex-container {
   display: flex;
   align-items: center; /* probeer ook start, end... */
}
01
02
03
04

gap

Geef ruimte tussen kolommen/rijen met gap, b.v. 10px:

.flex-container {
   display: flex;
   align-items: center;
   gap: 10px; /* tussenruimte */
}
01
02
03
04

justify-content

Lijn de items horizontaal uit met justify-content, b.v. space-between (zo ver mogelijk uit elkaar):

.flex-container {
   align-items: center;
   display: flex;
   /* gap: 10px; -> dit heeft geen effect meer */
   justify-content: space-between; /* probeer ook end, ... */
}
01
02
03
04

flex-direction

Zet items in een kolom i.p.v. rij met flex-direction: column:

.flex-container {
   align-items: center;
   display: flex;
   gap: 10px;
   flex-direction: column; /* zet verticaal */
}
01
02
03
04

flex-wrap

Heb je veel items, dan kan je ze in meerdere rijen (of kolommen) zetten met flex-wrap: wrap:

.flex-container {
   align-items: center;
   display: flex;
   gap: 10px;
   flex-wrap: wrap; /* meerdere rijen */
}
01
02
03
04
05
06
07
08
09
10

align-self

Aligneer een individueel item met align-self:

.flex-container {
   align-items: center;
   display: flex;
   gap: 10px;
}
.flex-item:nth-child(3) {
   align-self: start; /* plaats het derde item bovenaan */
}
01
02
03
04

flex

De flex property duidt de breedte van een item aan. De vorm is flex: flex-grow flex-shrink flex-basis.

Er zijn veel mogelijkheden, maar in praktijk volstaan deze waarden in 99% van de gevallen (te onthouden!):

voorbeeld betekenis
flex: 0 0 200px; vaste afmeting van 200px
flex: 0 0 auto; minimale breedte nodig voor de content
flex: 1; (kort voor flex: 1 1 0) flexibel, normale breedte
flex: 2; (kort voor flex: 2 2 0) flexibel, dubbele breedte

Voorbeeld 1: vaste kolommen links en rechts, flexibele kolom in het midden

.flex-item:nth-child(1) { flex: 0 0 80px; }
.flex-item:nth-child(2) { flex: 1; }
.flex-item:nth-child(3) { flex: 0 0 120px; }
.flex-container {
   display: flex;
   gap: 10px;
}

/* box styles */
.flex-item {
   background-color: #ddd;
   border: 2px solid black;
   font-size: 10px;
   text-align: center;
}

.flex-container {
   background-color: #ddf;
   border: 1px dotted black;
   height: 200px;
   padding: 20px;
   width: 450px;
}
flex: 0 0 80px;
flex: 1;
flex: 0 0 120px;
gebruik de slider om de containerbreedte te veranderen

 

Voorbeeld 2: passende kolom, dubbele kolom en normale kolom

.flex-item:nth-child(1) { flex: 0 0 auto; }
.flex-item:nth-child(2) { flex: 2; }
.flex-item:nth-child(3) { flex: 1; }
.flex-container {
   display: flex;
   gap: 10px;
}

/* box styles */
.flex-item {
   background-color: #ddd;
   border: 2px solid black;
   font-size: 10px;
   text-align: center;
}

.flex-container {
   background-color: #ddf;
   border: 1px dotted black;
   height: 200px;
   padding: 20px;
   width: 510px;
}
flex: 0 0 auto
flex: 2
flex: 1
gebruik de slider om de containerbreedte te veranderen

Grid

Met grid kan je een reeks children, de grid items, schikken met rijen en kolommen in een raster, de grid container. Het meest complete overzicht vind je op https://css-tricks.com/snippets/css/complete-guide-grid/. Om het overzichtelijk te houden behandelen we niet alles van CSS Grid. Dit betekent ook dat wat niet in de cursus staat, mag je niet gebruiken in dit vak (dit is een algemene regel trouwens).

Grid terminologie

Er zijn online verschillende interactieve CSS Grid generators te vinden, b.v. op https://grid.layoutit.com/

overzicht properties

De CSS properties voor de grid container:

eigenschap waarden betekenis
display grid|inline-grid layouten met grid als blockevel of inline element
gap, column-gap, row-gap px|%|... ruimte tussen items
grid-template-columns kolombreedte (zie verder) definitie kolombreedtes
grid-template-rows rijhoogte (zie verder) definitie rijhoogtes
align-items start|center|end|stretch verticale uitlijning van items
justify-items start|center|end|stretch horizontale uitlijning van items
align-content start|center|end|space-between|stretch|... schikking van de grid rijen in de grid container

De CSS properties voor grid items:

eigenschap waarden betekenis
grid-column span n | n1 / n1 overspan n kolommen, of tussen lijn n1 en n2
grid-row span n | n1 / n1 overspan n rijen, of tussen lijn n1 en n2
align-self start|center|end|stretch verticale uitlijning van een item in de cel
justify-self start|center|end|stretch horizontale uitlijning van een item in de cel

We starten van een container van 250px hoog, padding 20px, met 5 items. De standaard weergave, zonder layout:

<div class="grid-container">
   <div class="grid-item item1">01</div>
   <div class="grid-item item2">02</div>
   <div class="grid-item item3">03</div>
   <div class="grid-item item4">04</div>
   <div class="grid-item item5">05</div>
</div>
01
02
03
04
05

display: grid

Met display: grid maak je van de container een grid container. Standaard is er één kolom, en worden rijen aangemaakt zolang nodig, netjes verdeeld over de beschikbare hoogte:

.grid-container {
   display: grid; /* maak grid container */
}
01
02
03
04
05

Merk op: items worden standaard cel per cel geplaatst in rijen.

gap

Net zoals bij flexbox, kan je tussenruimte maken met gap:

.grid-container {
   display: grid;
   gap: 10px;  /* 10px tussenruimte */
}
01
02
03
04
05

grid-template-columns, grid-template-rows

Hiermee definieer je de kolommen en rijen; items worden geplaatst rij per rij. Voorbeeld met drie kolommen (eerste vast, rest flexibel) en twee rijen (eerste passend, tweede flexibel):

.grid-container {
   display: grid; 
   gap: 10px;
   grid-template-columns: 100px 2fr 1fr;  /* drie kolommen */
   grid-template-rows: auto 1fr 1fr;  /* drie rijen */
}
01
02
03
04
05
gebruik de slider om de containerbreedte te veranderen; merk op hoe 2fr twee keer zo snel groeit/krimpt als 1fr

Items worden rij per rij worden. De laatste rij is leeg omdat er geen items meer over zijn.

grid-row, grid-column

We kunnen individuele items over n1 rijen en/of n2 kolommen spannen met grid-column: span n1 en/of grid-row: span n2.

.item4 {
   grid-row: span 2; /* twee kolommen */
}
.item5 {
   grid-column: span 2; /* twee rijen */
}
.grid-container {
   display: grid; 
   gap: 10px;
   grid-template-columns: 100px 2fr 1fr;  /* drie kolommen */
   grid-template-rows: 50px 1fr 1fr;  /* drie rijen */
}
01
02
03
04
05

Alternatief kan je werken met lijnnummers, als volgt bepaald:

.item4 {
   grid-row: 2 / 4; /* tussen rijlijnen 2 en 4 */
}
.item5 {
   grid-column: 2 / 4; /* tussen kolomlijnen 2 en 4 */
}
.grid-container {
   display: grid; 
   gap: 10px;
   grid-template-columns: 100px 2fr 1fr;  /* drie kolommen */
   grid-template-rows: 50px 1fr 1fr;  /* drie rijen */
}
01
02
03
04
05

align-self, justify-self

We kunnen individuele items verticaal of horizontaal uitlijnen (centreren, uitrekken, aan het einde...) in hun cel met align-self resp. justify-self. Zetten we b.v. het vijfde item rechts midden:

.item5 {
   align-self: center; /* probeer ook end, start, stretch */				
   justify-self: end; /* probeer ook center, start, stretch */					
   grid-column: span 2; /* overspan twee kolommen */
   padding: 5px 10px;
}
.grid-container {
   display: grid; 
   gap: 10px;
   grid-template-columns: 100px 2fr 1fr;  /* drie kolommen */
   grid-template-rows: 50px 1fr 1fr;  /* drie rijen */
}
01
02
03
04
05

Eenheden px, fr, auto

Overzicht van de belangrijkste gebruikte eenheden en hun betekenis:

voorbeeld uitleg
200px kolom exact 200px breed
1fr normale flexibele kolom (fr: 'fractie')
2fr twee keer zo brede flexibele kolom (fr: 'fractie')
minmax(100px, 1fr) zelfde als 1fr, maar minstens 100px
auto automatisch, naargelang de breedte van de inhoud
repeat(3, 1fr) drie gelijke kolommen, dus hetzelfde als 1fr 1fr 1fr
repeat(auto-fit, minmax(150px, 1fr)) vul met zoveel kolommen als nodig, maar niet smaller dan 150px

eenheden voorbeeld 1

Voor de duidelijkheid nemen we 5 kolommen, 1 rij.
Een voorbeeld met 1fr 1fr 1fr 100px 100px, dus drie gelijke flexibele kolommen en twee vaste van 100px:

.grid-container {
   display: grid; /* maak grid container */
   gap: 10px;
   grid-template-columns: 1fr 1fr 1fr 100px 100px; 
}
01
1fr
02
1fr
03
1fr
04
100px
05
100px
gebruik de slider om de containerbreedte te veranderen

eenheden voorbeeld 2

Voorbeeld met 100px 2fr 1fr 100px auto, dus een vaste 100px kolom, één van dubbele breedte, één enkele breedte, weer een vaste 100px kolom, en een kolom passend voor de inhoud:

.grid-container {
   display: grid; /* maak grid container */
   gap: 10px;
   grid-template-columns: 100px 2fr 1fr 100px auto;
}
01
100px
02
2fr
03
1fr
04
100px
05
auto (passend)
gebruik de slider om de containerbreedte te veranderen; merk op hoe 2fr twee keer zo snel groeit/krimpt als 1fr

Eenheden voorbeeld 3

Voorbeeld met repeat(auto-fit, minmax(150px, 1fr)), dus automatisch gevuld met gelijke kolommen, maar niet smaller dan 150px:

.grid-container {
   display: grid; /* maak grid container */
   gap: 10px;
   grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}
01
minmax(150px, 1fr)
02
minmax(150px, 1fr)
03
minmax(150px, 1fr)
04
minmax(150px, 1fr)
05
minmax(150px, 1fr)
gebruik de slider om de containerbreedte te veranderen

Dit voorbeeld is ideaal voor b.v. fotogallerijen

Flexbox of Grid?

Flexbox en Grid zijn vaak inwisselbaar; meestal kun je een layoutkwestie zowel met het ene als met het andere oplossen. Vuistregel:

Voorbeeld 1: horizontaal menu — Flexbox

Een typisch menu is een layout op één lijn, dus flexbox:

<ul class="hormenu">
   <li><a href="#">home</a></li>
   <li><a href="#">products</a></li>
   <li><a href="#">about</a></li>
   <li><a href="#">contact</a></li>
</ul>
.hormenu {
   display: flex;
   gap: 10px;
   list-style: none;
}

Voorbeeld 2: header layout — Flexbox

Een typische header layout heeft logo links en menu rechts, op één lijn, dus flexbox:

<header>
   <a href=""><img src="img/logo.jpg" alt="logo"></a>
   <nav>...</nav>
</header>
header {
   display: flex;
   justify-content: space-between;
}

Voorbeeld 3: content kolommen — grid

Kolommen staat naast elkaar, op één lijn, dus technisch kan flexbox:

<main>
   <div class="main__content"></div>
   <aside>...</aside>
</main>
main {
   display: flex;
   gap: 20px;
}
.main__content {
   flex: 1;
}
aside {
   flex: 0 0 200px;
}

In praktijk is kolommen met grid maken makkelijker:

main {
   display: grid;
   gap: 20px;
   grid-template-columns: 1fr 200px;
}

Voorbeeld 4: formulier — Grid

Een formulier heeft rijen en kolommen, dus grid is aangewezen. De HTML en CSS:

<form>
    <label for="login">Login:</label>
    <input type="text" id="login" required>
    <label for="pw">Password:</label>
    <input type="password" id="pw" required>
    <label for="message">Message:</label>
    <textarea id="message"></textarea>
    <button type="submit">Submit</button>
</form>
form {
   display: grid;
   gap: 10px;
   grid-template-columns: 120px 1fr;
   grid-template-rows: auto auto 100px 1fr;
}
/* button rechstonder plaatsen */
button[type=submit] {  
   grid-column: span 2;
   justify-self: end; 
}

Voorbeeld 5: foto gallerij — Grid

<figure id="gallery">
   <img src="img/foto01.jpg" alt="">
   <img src="img/foto02.jpg" alt="">
   <img src="img/foto03.jpg" alt="">
   <img src="img/foto04.jpg" alt="">
   <img src="img/foto05.jpg" alt="">
   <img src="img/foto06.jpg" alt="">
   <img src="img/foto07.jpg" alt="">
</figure>

Maak gewoon het aantal gewenste kolommen:

#gallery {
   display: grid;
   gap: 10px;
   grid-template-columns: 1fr 1fr 1fr;
}

Je kan zelfs een volledig responsive gallery maken met deze CSS grid code (hoef je niet van buiten te kennen):

#gallery {
   display: grid;
   gap: 10px;
   grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
}

Bekijk de demo, maak het browservenster smaller en kijk wat gebeurt.

Positionering

Standaard weergave

Positionering bepaalt de plaats van elementen a.h.v. coördinaten top, right, bottom en/of left. Laat ons starten van volgende code, zonder layout. Aangezien het blocklevel elementen zijn, is de natuurlijke positie van de drie blokken onder elkaar:

<div class="demowrapper">
   <div class="demobox demobox1">1</div>
   <div class="demobox demobox2">2</div>
   <div class="demobox demobox3">3</div>
</div>
1
2
3

Relatief

Met relatieve positionering wordt het element uit zijn natuurlijke positie verschoven; andere elementen blijven waar ze zijn:

<div class="demowrapper">
   <div class="demobox demobox1">1</div>
   <div class="demobox demobox2">2</div>
   <div class="demobox demobox3">3</div>
</div>
.demobox2 {
   position: relative;
   left: 10px; /* verschuif 10px naar rechts */
   top: 20px; /* verschuif 20px naar beneden */
}
1
2
3

Absoluut

Met absolute positionering neem je een element uit de pagina, en positioneer je het ten opzichte van de paginaranden (overlapping is mogelijk); andere elementen vullen de ontstane ruimte.

<div class="demowrapper">
   <div class="demobox demobox1">1</div>
   <div class="demobox demobox2">2</div>
   <div class="demobox demobox3">3</div>
</div>
            
.demobox2 {
   position: absolute;
   left: 5px; /* 5px vanaf links */
   top: 5px; /* 5px vanaf boven */
}
1
2
3

Je kan het ook rechtsonder plaatsen, b.v. met right: 10px; bottom: 10px;

<div class="demowrapper">
   <div class="demobox demobox1">1</div>
   <div class="demobox demobox2">2</div>
   <div class="demobox demobox3">3</div>
</div>
            
/* relative positioning */
.demobox2 {
   position: absolute;
   bottom: 10px; /* 10px vanaf beneden */
   right: 10px; /* 10px vanaf rechts */
}
1
2
3

absoluut-relatief

De coördinaten zijn standaard t.o.v. de pagina. Als je wil positioneren ten opzichte van de parent, stel je die in op position: relative; dit heet absoluut-relatieve positionering.

<div class="demowrapper">
   <div class="demobox demobox1">1</div>
   <div class="demobox demobox2">2</div>
   <div class="demobox demobox3">3</div>
</div>
/* absoluut-relative positioning */
.demowrapper {
   position: relative; /* nieuwe referentie voor coördinaten */
}

.demobox2 {
   position: absolute;
   left: 5px; /* 5px vanaf links */
   top: 5px; /* 5px vanaf boven */
}
1
2
3

overlay voorbeeld

Als je vier coördinaten opgeeft (en width en height weghaalt) wordt het element over de hele pagina uitgerokken (en bedekt het de andere blokken). Met een gedeeltelijk transparante achtergrond kan je dan een overlay maken:


<div class="overlay"><h2>OVERLAY CONTENT HIER</h2></div>
<p>Wij zin rijken ruimer zekere. Loopbaan een district bordeaux mag bevreesd heb. Inkomsten op af singapore behoeften. Het brengen den gedaald menigte markten evenals javanen. Ontwouding middellijn nu geruineerd ptolomaeus denzelfden in handelaars. Vrij in nu kilo west. Wieschen vermengd verbouwd zou was die verschil het geheelen voorzien. </p>
<p>Gebrek loopen kan zee zit andere ton levert zeggen zonder. Rook zoo twee zee hen maal. Wantrouwen ons tot inboorling nog doorzoeken.</p>
/* absolute positioning */
.overlay {
   /* maak overlay */
   background-color: #888c;
   position: absolute;
   bottom: 20px; /* 10px vanaf beneden */
   left: 30px; /* 10px vanaf links */
   right: 30px; /* 10px vanaf rechts */
   top: 20px; /* 10px vanaf boven */
}
.overlay  h2 {
   color: white;
   padding: 20px;
   text-align: center;
}

OVERLAY CONTENT HIER

Wij zin rijken ruimer zekere. Loopbaan een district bordeaux mag bevreesd heb. Inkomsten op af singapore behoeften. Het brengen den gedaald menigte markten evenals javanen. Ontwouding middellijn nu geruineerd ptolomaeus denzelfden in handelaars. Vrij in nu kilo west. Wieschen vermengd verbouwd zou was die verschil het geheelen voorzien.

Gebrek loopen kan zee zit andere ton levert zeggen zonder. Rook zoo twee zee hen maal. Wantrouwen ons tot inboorling nog doorzoeken.

z-index

Je kan de stapelvolgorde van gepositioneerde elementen altijd aanpassen met z-index, een willekeurig geheel getal:

Een voorbeeld met drie absoluut gepositioneerde blokken:

<div class="demobox demobox1">1</div>
<div class="demobox demobox2">2</div>
<div class="demobox demobox3">3</div>
<p>Wij zin rijken ruimer zekere. Loopbaan een district bordeaux mag bevreesd heb. Inkomsten op af singapore behoeften. Het brengen den gedaald menigte markten evenals javanen. Ontwouding middellijn nu geruineerd ptolomaeus denzelfden in handelaars. Vrij in nu kilo west. Wieschen vermengd verbouwd zou was die verschil het geheelen voorzien. </p>
<p>Gebrek loopen kan zee zit andere ton levert zeggen zonder. Rook zoo twee zee hen maal. Wantrouwen ons tot inboorling nog doorzoeken.</p>
/* stapelvolgorde */
.demobox1 {
   z-index: 2; 
}
.demobox2 {
   z-index: -3; /* negatief: onder normale content */
}
.demobox3 {
   z-index: 4;
}

/* absoluut-relatieve positionering */
.demowrapper {
   position: relative;
}
.demobox1 {
   position: absolute;
   left: 25px;
   top: 60px;
}
.demobox2 {
   position: absolute;
   left: 65px;
   top: 65px;
}
.demobox3 {
   left: 45px;
   top: 35px;
   position: absolute;
}

Wij zin rijken ruimer zekere. Loopbaan een district bordeaux mag bevreesd heb. Inkomsten op af singapore behoeften. Het brengen den gedaald menigte markten evenals javanen. Ontwouding middellijn nu geruineerd ptolomaeus denzelfden in handelaars. Vrij in nu kilo west. Wieschen vermengd verbouwd zou was die verschil het geheelen voorzien.

Gebrek loopen kan zee zit andere ton levert zeggen zonder. Rook zoo twee zee hen maal. Wantrouwen ons tot inboorling nog doorzoeken.

1
2
3

Fixed

De fixed positionering fixeert een element op de pagina, onafhankelijk van het scrollen:

<p>(scroll this page)</p>
<p>Folly words widow one downs few age every seven. If miss part by fact he park just shew. Discovered had get considered projection who favourable. Necessary up knowledge it tolerably. Unwilling departure education is be dashwoods or an. Use off agreeable law unwilling sir deficient curiosity instantly. Easy mind life fact with see has bore ten. Parish any chatty can elinor direct for former. Up as meant widow equal an share least. </p>
<p>Examine she brother prudent add day ham. Far stairs now coming bed oppose hunted become his. You zealously departure had procuring suspicion. Books whose front would purse if be do decay. Quitting you way formerly disposed perceive ladyship are. Common turned boy direct and yet. </p>
<p>Ye on properly handsome returned throwing am no whatever. In without wishing he of picture no exposed talking minutes. Curiosity continual belonging offending so explained it exquisite. Do remember to followed yourself material mr recurred carriage. High drew west we no or at john. About or given on witty event. Or sociable up material bachelor bringing landlord confined. Busy so many in hung easy find well up. So of exquisite my an explained remainder. Dashwood denoting securing be on perceive my laughing so.</p>
<a id="toplink" href="#top">back to top ↑</a>
#toplink {
  /* add fixed top link */
  position: fixed;
  right: 10px;
  bottom: 10px;
  /* colors & borders */
  background-color: #ddd;
  border: 2px solid black;
  padding: 5px 10px;
}

Sticky

De sticky positionering scrollt tot een gegeven offset bereikt is, waarna het blijft plakken.

<p>(scroll this page)</p>
<div id="sticky">I am sticky!</div>
<p>Folly words widow one downs few age every seven. If miss part by fact he park just shew. Discovered had get considered projection who favourable. Necessary up knowledge it tolerably. Unwilling departure education is be dashwoods or an. Use off agreeable law unwilling sir deficient curiosity instantly. Easy mind life fact with see has bore ten. Parish any chatty can elinor direct for former. Up as meant widow equal an share least. </p>
<p>Examine she brother prudent add day ham. Far stairs now coming bed oppose hunted become his. You zealously departure had procuring suspicion. Books whose front would purse if be do decay. Quitting you way formerly disposed perceive ladyship are. Common turned boy direct and yet. </p>
<p>Ye on properly handsome returned throwing am no whatever. In without wishing he of picture no exposed talking minutes. Curiosity continual belonging offending so explained it exquisite. Do remember to followed yourself material mr recurred carriage. High drew west we no or at john. About or given on witty event. Or sociable up material bachelor bringing landlord confined. Busy so many in hung easy find well up. So of exquisite my an explained remainder. Dashwood denoting securing be on perceive my laughing so.</p>
#sticky {
   /* make sticky */
   position: sticky;
   top: 0; /* stick to top */
   /* colors & borders */
   background-color: #cae8ca;
   border: 2px solid #4CAF50;
   color: inherit;
   padding: 5px 10px;
   text-decoration: none;
}

Wanneer gebruiken

Studenten hebben vaak de neiging positionering veel te snel terug te grijpen naar positionering. Eigenlijk wordt het zeer weinig gebruikt. Wanneer wel:

Gebruik positionering zeker niet voor:

De vuistregel is: als het anders kan (b.v. met flexbox), gebruik dan geen positionering

Layout case study

We bekijken een samenvattend voorbeeld. Resultaat:

We gebruiken:

De HTML en CSS (enkel layoutcode):

<body>
   <header>
      <h1 class="header_logo">Logo</h1>
      <p class="header_tagline">some great tagline</p>
      <form class="header_search">
         <label><input type="search" placeholder="search for something"></label>
         <button type="submit">🔍</button>
      </form>
   </header>
   <nav>
      <ul>
         <li><a href="">home</a></li>
         <li><a href="">about</a></li>
         <li><a href="">contact</a></li>
      </ul>
   </nav>
   <main>
      <div id="content">
         content here...
      </div>
      <aside>
         aside here...
      </aside>
   </main>
   <footer>
      <p>© 2024</p>
   </footer>
</body>
/* body layout */
body {
   display: grid; /* maak grid */
   grid-template-rows: auto auto 1fr auto; /* vier rijen */
   margin: 0 auto; /* centreer body */
   max-width: 1000px; /* maximaal 1000px breed */
   min-height: 100vh; /* bedek minstens hele viewport */
}

/* header layout */
header {
   align-items: center; /* items verticaal centreren */
   display: flex;
   justify-content: space-between; /* zo ver mogelijk uit elkaar */
   min-height: 150px;
}

.header_logo {
   flex: 0 0 100px;
}

.header_tagline {
   flex: 1;
}

.header_search {
   align-self: end; /* zet zichzelf beneden */
   flex: 0 0 auto;
}

/* nav layout */
nav ul {
   display: flex;
   gap: 10px; /* ruimte tussen items */
   justify-content: center; /* items in het midden */
}

/* main layout */
main {
   display: grid;
   grid-template-columns: 1fr 200px;
}

/* footer layout */
footer {
   text-align: center;
}

Je herkent volgende technieken: