Youtube totaaldemo
Deze video's maken deel uit van een HTML + CSS totaaldemo uit de Basic Web Development playlist, die begint met de video BWD 01. HTML - deel 8: praktijkdemo
Pagina layout
Main content
Andere pagina's
Carousel
Layout technieken overzicht
CSS heeft een lange weg afgelegd; pas met het verdwijnen van oude browsers konden Flexbox en Grid gebruikt worden, de eerste echte layout technieken in CSS.
Je kan layouttechnieken onderverdelen in ruwweg 5 groepen:
- flexbox: bedoeld voor allerhande horizontale en verticale layouts
- alignering: verzamelnaam voor reeks losse technieken voor horizontale en verticale alignering
- floating: gebruikt om content links of rechts rond een blok doen vloeien (bv. foto)
- positionering (absoluut, relatief, fixed, sticky): positionering in lagen op basis van coördinaten; vooral geschikt voor Javascript games en enkele uitzonderlijke gevallen
- grid: iets complexere methode voor grid-achtige layout in rijen en kolommen
→ je kan layouts vaak met verschillende technieken oplossen, maar Flexbox is je standaardtechniek
→ bestudeer zeker nog eerst grondig de display property in vorig deel; veel kleine layoutproblemen kan je daar al mee oplossen
Alignering
Content horizontaal centreren
Om tekst, afbeeldingen enz... horizontaal te aligneren, gebruik text-align
op de parent:
<div id="parent">
<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>
/* alignering content */
.container {
text-align: center; /* probeer ook left, right */
}
/* andere stijlen */
.container {
background-color: #fdd;
padding: 20px;
height: 350px;
}
.visual {
width: 80px;
}
p {
background-color: #fff9;
border: 1px solid #ccc;
padding: 5px;
}
parmesan cheese slices when the cheese comes out everybody's happy cow cheese and wine cheese and biscuits. Roquefort when the cheese comes out...
Block horizontaal centreren
Om blocklevel content (<div>
, <p>
...) horizontaal te aligneren, gebruik je de waarde auto
voor margin-left
en/of margin-right
op het element zelf:
<div id="parent">
<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>
/* horizontale alignering blok */
p {
margin-left: auto;
margin-right: auto; /* probeer ook 0px */
width: 300px;
}
/* andere stijlen */
.container {
background-color: #fdd;
height: 350px;
padding: 20px;
}
p {
background-color: #fff9;
border: 1px solid #ccc;
padding: 5px;
}
parmesan cheese slices when the cheese comes out everybody's happy cow cheese and wine cheese and biscuits. Roquefort when the cheese comes out...
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 {
display: inline-block; /* anders kan je geen hoogte 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;
display: inline-block;
}
Blok verticaal centreren
Als de hoogte van de container flexibel is en er maar één blok is, kan je verticaal centreren met padding
op de parent:
<div id="parent">
<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>
/* verticale alignering blok */
.container {
padding: 50px 20px; /* verticaal horizontaal */
}
/* andere stijlen */
.container {
background-color: #fdd;
}
p {
background-color: #fff9;
border: 1px solid #ccc;
padding: 5px;
}
parmesan cheese slices when the cheese comes out everybody's happy cow cheese and wine cheese and biscuits. Roquefort when the cheese comes out...
Je ziet, de mogelijkheden zijn beperkt: verticaal centreren van meerdere blokken of wanneer de container een vaste hoogte heeft, is enkel mogelijk met flexbox.
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>
<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 {
width: 70px;
}
section {
border: 1px dotted;
margin-bottom: 10px;
padding: 5px
}
h3 {
margin: 0;
margin-bottom: 0.5rem
}
.demowrapper {
font-family: 'Roboto', sans-serif;
max-width: 400px;
}
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.
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.
Floaten
Met float: left;
kan je blocklevel elementen rond een afbeelding laten vloeien:
<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>
<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; /* probeer ook float: right; */
margin-right: 10px;
width: 70px;
}
section {
border: 1px dotted;
margin-bottom: 10px;
padding: 5px
}
h3 {
margin: 0;
margin-bottom: 0.5rem
}
.demowrapper {
max-width: 400px;
font-family: 'Roboto', sans-serif;
}
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.
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 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>
/* float pull quote right */
aside {
float: right;
margin: 10px 0 10px 10px;
width: 130px;
}
/* rest of CSS */
aside {
background-color: #eee;
font-size: 1.2em;
font-style: italic;
padding: 10px;
}
h3, p {
margin: 0;
margin-bottom: 0.5rem
}
section {
max-width: 400px;
font-family: 'Roboto', sans-serif;
border: 1px dotted;
padding: 5px
}
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>
/* float image links */
img {
float: left;
margin-right: 10px;
width: 160px;
}
/* rest van de CSS */
section {
margin: 10px;
border: 1px dotted;
padding: 5px;
}
h3, p {
margin: 0;
margin-bottom: 0.5rem
}
#wrapper {
max-width: 500px;
font-family: 'Roboto', sans-serif;
}
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.
Parent herstellen
Als je niet wil, kan je de parent herstellen met overflow: hidden;
:
<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>
/* vermijd parent bleeding */
section {
overflow: hidden;
}
/* float image links */
img {
float: left;
margin-right: 10px;
width: 160px;
}
/* rest of CSS */
section {
margin: 10px;
border: 1px dotted;
padding: 5px;
}
h3, p {
margin: 0;
margin-bottom: 0.5rem
}
#wrapper {
max-width: 500px;
font-family: 'Roboto', sans-serif;
}
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:
<div id="wrapper">
<section id="sect1">
<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 id="sect2">
<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>
/* clear tweede titel */
#sect2 h3 {
clear: left;
}
/* float image links */
img {
float: left;
margin-right: 10px;
width: 160px;
}
/* rest of CSS */
section {
margin: 10px;
border: 1px dotted;
padding: 5px;
}
h3, p {
margin: 0;
margin-bottom: 0.5rem
}
#wrapper {
max-width: 500px;
font-family: 'Roboto', sans-serif;
}
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.
Wanneer gebruiken
Vóór Flexbox algemeen ondersteund werd, werd float misbruikt voor alle layout (en soms kom je het nog tegen), maar vandaag beperk je het gebruik best waarvoor het bedoeld is. Gebruik floating:
- om tekst rond afbeeldingen te laten vloeien
- voor pull quotes
Gebruik floating niet:
- voor alle andere layout als pagina layout, menus enz...
De vuistregel is: als het anders kan (b.v. met flexbox), gebruik dan geen floating
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/.
Flexbox properties overzicht
De CSS properties voor de flex container:
eigenschap | waarden | betekenis |
---|---|---|
display |
flex|inline-flex |
layouten met flex als blockevel of inline element |
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 |
flex-start|center|space-between|flex-end|stretch|... |
schikking van de flex lijnen in de flex container |
align-items |
flex-start|center|space-between|flex-end|stretch|... |
schikking van items dwars op de lijnen |
justify-content |
flex-start|center|space-between|flex-end|stretch|... |
schikking van items langs de lijnen |
gap , column-gap , row-gap |
px|%|... |
ruimte tussen items/lijnen |
De CSS properties voor het flex item:
eigenschap | waarden | betekenis | |
---|---|---|---|
align-self |
flex-start|center|space-between|flex-end|stretch|... |
overschrijft align-items property voor dit item |
|
order |
geheel getal | volgorde van het item in de lijn | |
flex-grow |
geheel getal | hoeveel het item groeit (indien nodig) proportioneel t.o.v. andere items | |
flex-shrink |
geheel getal | hoeveel het item krimpt (indien nodig) proportioneel t.o.v. andere items | |
flex-basis |
px|%|... |
initiële afmeting van het item | |
flex |
getal getal px|%|... |
hoe snel een item groeit, krimpt en intiële afmeting
combinatie van flex-grow , flex-shrink en flex-basis , b.v. flex: 1 1 200px;
|
Flex container
startcode
We starten van een container 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 class="flex-item">05</div>
<div class="flex-item">06</div>
<div class="flex-item">07</div>
<div class="flex-item">08</div>
<div class="flex-item">09</div>
<div class="flex-item">10</div>
</div>
.flex-item {
background-color: #ddd;
border: 2px solid black;
padding: 5px;
text-align: center;
}
.flex-item:nth-child(even) {
height: 60px;
line-height: 45px;
width: 100px;
}
.flex-item:nth-child(odd) {
height: 40px;
line-height: 25px;
width: 60px;
}
.flex-container {
background-color: #ddf;
border: 1px dotted black;
max-width: 500px;
padding: 20px;
}
display: flex
Met display: flex
maak je van de container een flex container. Ze komen standaard op één rij, samengeperst indien nodig:
.flex-container {
display: flex; /* maak flex container */
}
/* box styles */
.flex-item {
background-color: #ddd;
border: 2px solid black;
padding: 5px;
text-align: center;
}
.flex-item:nth-child(even) {
height: 60px;
line-height: 45px;
width: 100px;
}
.flex-item:nth-child(odd) {
height: 40px;
line-height: 25px;
width: 60px;
}
.flex-container {
background-color: #ddf;
border: 1px dotted black;
height: 335px;
max-width: 500px;
padding: 20px;
}
gap
Geef ruimte tussen kolommen/rijen met gap
:
.flex-container {
display: flex;
gap: 10px; /* ruimte tussen kolommen en rijen */
}
/* box styles */
.flex-item {
background-color: #ddd;
border: 2px solid black;
padding: 5px;
text-align: center;
}
.flex-item:nth-child(even) {
height: 60px;
line-height: 45px;
width: 100px;
}
.flex-item:nth-child(odd) {
height: 40px;
line-height: 25px;
width: 60px;
}
.flex-container {
background-color: #ddf;
border: 1px dotted black;
height: 335px;
max-width: 500px;
padding: 20px;
}
flex-wrap
Sta meerdere lijnen toe met flex-wrap
(en dan hoeven ze niet meer samengeperst te worden):
.flex-container {
display: flex;
flex-wrap: wrap; /* items op meerdere lijnen */
gap: 10px;
}
/* box styles */
.flex-item {
background-color: #ddd;
border: 2px solid black;
padding: 5px;
text-align: center;
}
.flex-item:nth-child(even) {
height: 60px;
line-height: 45px;
width: 100px;
}
.flex-item:nth-child(odd) {
height: 40px;
line-height: 25px;
width: 60px;
}
.flex-container {
background-color: #ddf;
border: 1px dotted black;
height: 335px;
max-width: 500px;
padding: 20px;
}
align-content
Zet de volledige content aan het begin, het midden, einde, uitgespreid e.d. met align-content
:
.flex-container {
align-content: center; /* probeer ook flex-start, flex-end... */
display: flex;
flex-wrap: wrap;
gap: 10px;
}
/* box styles */
.flex-item {
background-color: #ddd;
border: 2px solid black;
padding: 5px;
text-align: center;
}
.flex-item:nth-child(even) {
height: 60px;
line-height: 45px;
width: 100px;
}
.flex-item:nth-child(odd) {
height: 40px;
line-height: 25px;
width: 60px;
}
.flex-container {
background-color: #ddf;
border: 1px dotted black;
height: 335px;
max-width: 500px;
padding: 20px;
}
align-items
Aligneer items op hun lijnen met align-items
:
.flex-container {
align-content: center;
align-items: center; /* probeer ook flex-start, flex-end... */
display: flex;
flex-wrap: wrap;
gap: 10px;
}
/* box styles */
.flex-item {
background-color: #ddd;
border: 2px solid black;
padding: 5px;
text-align: center;
}
.flex-item:nth-child(even) {
height: 60px;
line-height: 45px;
width: 100px;
}
.flex-item:nth-child(odd) {
height: 40px;
line-height: 25px;
width: 60px;
}
.flex-container {
background-color: #ddf;
border: 1px dotted black;
height: 335px;
max-width: 500px;
padding: 20px;
}
justify-content
Bepaal de spreiding langs de lijnen: aan het begin, in het midden, op het einde, zo ver mogelijk uit elkaar... met justify-content
:
.flex-container {
align-content: center;
align-items: center;
display: flex;
flex-wrap: wrap;
justify-content: space-between; /* zo ver mogelijk uit elkaar */
gap: 10px;
}
/* box styles */
.flex-item {
background-color: #ddd;
border: 2px solid black;
padding: 5px;
text-align: center;
}
.flex-item:nth-child(even) {
height: 60px;
line-height: 45px;
width: 100px;
}
.flex-item:nth-child(odd) {
height: 40px;
line-height: 25px;
width: 60px;
}
.flex-container {
background-color: #ddf;
border: 1px dotted black;
height: 335px;
max-width: 500px;
padding: 20px;
}
flex-direction
Zet items in kolommen i.p.v. rijen met flex-direction
:
.flex-container {
align-content: center;
align-items: center;
display: flex;
flex-direction: column; /* row (default) of column */
flex-wrap: wrap;
gap: 20px 5px;
}
/* box styles */
.flex-item {
background-color: #ddd;
border: 2px solid black;
padding: 5px;
text-align: center;
}
.flex-item:nth-child(even) {
height: 60px;
line-height: 45px;
width: 100px;
}
.flex-item:nth-child(odd) {
height: 40px;
line-height: 25px;
width: 60px;
}
.flex-container {
background-color: #ddf;
border: 1px dotted black;
height: 350px;
max-width: 500px;
padding: 20px;
}
Flex item
startcode
We starten van een flex container, met items op één rij, bovenaan de container geplaatst met align-items: flex-start
:
.flex-container {
align-items: flex-start;
display: flex;
gap: 10px;
}
/* box styles */
.flex-item {
background-color: #ddd;
border: 2px solid black;
padding: 15px 25px;
text-align: center;
}
.flex-container {
background-color: #ddf;
border: 1px dotted black;
height: 200px;
max-width: 500px;
padding: 20px;
}
order
Met order
kan je de volgorde bepalen:
- eerst komen items met negatieve
order
- dan komen items zonder
order
- tenslotte komen items met positieve
order
, hoogste als laatste
.flex-item:nth-child(2) {
order: 2; /* zet tweede item als laatste */
}
.flex-item:nth-child(3) {
order: -1; /* zet derde item aan het begin */
}
.flex-item:nth-child(4) {
order: 1; /* zet vierde item als voorlaatste */
}
.flex-container {
align-items: flex-start;
display: flex;
gap: 10px;
}
/* box styles */
.flex-item {
background-color: #ddd;
border: 2px solid black;
padding: 15px 25px;
text-align: center;
}
.flex-container {
background-color: #ddf;
border: 1px dotted black;
height: 200px;
max-width: 500px;
padding: 20px;
}
align-self
Verander de positie ingesteld door align-items
voor individuele items met align-self
:
.flex-item:last-child {
align-self: flex-end; /* overschrijft align-items */
}
.flex-container {
align-items: flex-start;
display: flex;
gap: 10px;
}
/* box styles */
.flex-item {
background-color: #ddd;
border: 2px solid black;
padding: 15px 25px;
text-align: center;
}
.flex-container {
background-color: #ddf;
border: 1px dotted black;
height: 200px;
max-width: 500px;
padding: 20px;
}
flex (flex-grow, flex-shrink en flex-basis)
Deze property combineert flex-grow
, flex-shrink
en flex-basis
. Het is vooral van belang bij kolommen, en zegt wat hun initiële breedte is, en hoe snel ze groeien en krimpen naargelang de breedte van de container.
De meest voorkomende waarden (te onthouden!):
voorbeeld | uitleg | betekenis |
---|---|---|
flex: 0 0 200px; |
groeit of krimpt niet, initieel 200px breed | vaste afmeting van 200px |
flex: 1 1 0; |
groeit en krimpt normaal, initieel 0px breed | flexibel, neemt beschikbare ruimte in |
flex: 2 2 0; |
groeit en krimpt 2x zo snel, initieel 0px breed | flexibel, neemt beschikbare ruimte in |
flex: 0 1 auto; |
groeit niet, kan krimpen, initieel natuurlijke breedte (bepaald door content of, indien ingesteld, width property) |
niet groter dan de content |
Nog andere voorbeelden:
voorbeeld | uitleg | betekenis |
---|---|---|
flex: 1 0 200px; |
groeit normaal, krimpt niet, initieel 200px | minstens 200px |
flex: 0 1 200px; |
groeit niet, krimpt normaal, initieel 200px | maximaal 200px |
flex: 1 1 200px; |
groeit normaal, krimpt normaal, initieel 200px | flexibel, initieel 200px |
flex: 2 1 200px; |
groeit dubbel zo snel, krimpt normaal, initieel 200px | flexibel, initieel 200px, groeit sneller |
flex: 1 2 200px; |
groeit normaal, krimpt dubbel zo snel, initieel 200px breed | flexibel, initieel 200px, krimpt sneller |
Voorbeeld 1: vaste kolommen links en rechts, flexibele kolom in het midden
.flex-item:nth-child(1) { flex: 0 0 150px; }
.flex-item:nth-child(2) { flex: 1 1 0; }
.flex-item:nth-child(3) { flex: 0 0 150px; }
.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;
}
Voorbeeld 2: flexibele kolommen, zelfde initiële breedte, krimpen alledrie even veel, middelste kolom groeit drie keer zo veel
.flex-item:nth-child(1) { flex: 1 1 150px; }
.flex-item:nth-child(2) { flex: 3 1 150px; }
.flex-item:nth-child(3) { flex: 1 1 150px; }
.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;
}
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 laten we b.v. weg (als je niet weet waarover het gaat: maakt niet uit, want je moet het dus niet kennen of kunnen):
- template area's (cfr. properties
grid-template-areas
,grid-template
) - automatische rijen of kolommen (cfr. properties
grid-auto-column
,grid-auto-row
,grid-auto-flow
) - line naming
Dit betekent dus ook dat je dit niet mag gebruiken in dit vak.
Grid terminologie
- grid container: hierbinnen worden rijen en kolommen gedefinieerd
- grid line: lijnen tussen rijen en kolommen, genummerd vanaf 1
- grid area: rechthoekig gebied begrensd door grid lijnen
- grid item: een item gepositioneerd in een grid area
- grid cell: één cel binnen de grid
Er zijn online verschillende interactieve CSS Grid generators te vinden, b.v. op https://grid.layoutit.com/
Grid properties overzicht
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 |
place-items |
combinatie van align-items en justify-items , b.v. place-items: center start; |
De CSS properties voor het grid item:
eigenschap | waarden | betekenis |
---|---|---|
grid-column |
kolomspan (zie verder) | tussen welke verticale lijnen zit het item |
grid-row |
rijspan (zie verder) | tussen welke horizontale lijnen zit het item |
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 |
Grid voorbeeld
startcode
We starten van een container 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>
.grid-item {
background-color: #ddd;
border: 2px solid black;
line-height: 25px;
padding: 5px;
text-align: center;
}
.grid-container {
background-color: #ddf;
border: 1px dotted black;
max-width: 500px;
padding: 20px;
}
display: grid
Met display: grid
maak je van de container een grid container; rijen en kolommen definieer je met grid-template-rows
en grid-template-columns
, b.v. 4 kolommen en 3 rijen.
.grid-container {
display: grid; /* maak grid container */
grid-template-columns: repeat(4, 1fr); /* 4 kolommen, elk 1 fractie */
grid-template-rows: repeat(3, 1fr); /* 3 rijen, elk 1 fractie */
}
/* box styles */
.grid-item {
background-color: #ddd;
border: 2px solid black;
line-height: 25px;
padding: 5px;
text-align: center;
}
.grid-container {
background-color: #ddf;
border: 1px dotted black;
height: 335px;
width: 500px;
padding: 20px;
}
Merk op: items worden standaard cel per cel geplaatst in rijen.
gap
Geef ruimte tussen kolommen/rijen met gap
:
.grid-container {
display: grid; /* maak grid container */
gap: 10px;
grid-template-columns: repeat(4, 1fr); /* 4 kolommen, elk 1 fractie */
grid-template-rows: repeat(3, 1fr); /* 3 rijen, elk 1 fractie */
}
/* box styles */
.grid-item {
background-color: #ddd;
border: 2px solid black;
line-height: 25px;
padding: 5px;
text-align: center;
}
.grid-container {
background-color: #ddf;
border: 1px dotted black;
height: 335px;
width: 500px;
padding: 20px;
}
grid-template-columns, grid-template-rows
Hiermee definieer je de kolommen en rijen, en hoe ze verdeeld worden over de beschikbare breedte/hoogte. Overzicht van de belangrijkste gebruikte eenheden en hun betekenis:
voorbeeld | uitleg |
---|---|
200px |
exacte breedte |
2fr |
twee delen van beschikbare ruimte (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 |
Voorbeeld 1
Voor de duidelijkheid nemen we voorlopig 5 kolommen, evenveel als er items zijn.
Een voorbeeld met repeat(3, 1fr) repeat(2, 100px)
, dus drie gelijke dynamische kolommen en twee vaste van 100px:
.grid-container {
display: grid; /* maak grid container */
gap: 10px;
grid-template-columns: repeat(3, 1fr) repeat(2, 100px); /* of 1fr 1fr 1fr 100px 100px */
}
/* box styles */
.grid-item {
background-color: #ddd;
border: 2px solid black;
line-height: 25px;
padding: 5px;
text-align: center;
}
.grid-container {
background-color: #ddf;
border: 1px dotted black;
height: 200px;
padding: 20px;
width: 500px;
}
1fr
1fr
1fr
100px
100px
Voorbeeld 2
Voorbeeld met 100px 2fr 1fr minmax(100px, 1fr) 100px
, dus een vaste 100px kolom, één van dubbele breedte, één enkele breedte, een enkele breedte maar niet minder dan 100px, en weer een vaste van 100px:
.grid-container {
display: grid; /* maak grid container */
gap: 10px;
grid-template-columns: 100px 2fr 1fr minmax(100px, 1fr) 100px;
}
/* box styles */
.grid-item {
background-color: #ddd;
border: 2px solid black;
line-height: 25px;
padding: 5px;
text-align: center;
}
.grid-container {
background-color: #ddf;
border: 1px dotted black;
height: 200px;
padding: 20px;
width: 500px;
}
100px
2fr
1fr
minmax(100px, 1fr)
100px
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));
}
/* box styles */
.grid-item {
background-color: #ddd;
border: 2px solid black;
line-height: 25px;
padding: 5px;
text-align: center;
}
.grid-container {
background-color: #ddf;
border: 1px dotted black;
height: 335px;
padding: 20px;
width: 500px;
}
minmax(150px, 1fr)
minmax(150px, 1fr)
minmax(150px, 1fr)
minmax(150px, 1fr)
minmax(150px, 1fr)
Dit voorbeeld is ideaal voor b.v. fotogallerijen
grid-row, grid-column
We keren terug naar 4 kolommen, met de eerste kolom vast op 100px, de tweede kolom dubbel zo breed als de derde, en de laatste kolom tussen 50 en 75px:
Positioneer individuele items in gebieden gedefinieerd door grid-column
en grid-row
:
/* items */
.item1 {
grid-column: 2 / 4; /* tussen kolomlijnen 2 en 4 */
/* geen rij(en) opgegeven, neem eerst beschikbare rij */
}
.item2 {
grid-column: 4 / 5; /* tussen kolomlijnen 4 en 5 */
grid-row: 1 / span 3; /* start bij rijlijn 1, span 3 rijen */
}
.item3 {
grid-column: 1 / 2; /* tussen kolomlijnen 1 en 2 */
grid-row: 1 / 3; /* tussen rijlijnen 1 en 3 */
}
/* container */
.grid-container {
display: grid; /* maak grid container */
gap: 10px;
grid-template-columns: repeat(4, 1fr); /* 4 kolommen, elk 1 fractie */
grid-template-rows: repeat(3, 1fr); /* 3 rijen, elk 1 fractie */
}
/* box styles */
.grid-item {
background-color: #ddd;
border: 2px solid black;
line-height: 25px;
padding: 5px;
text-align: center;
}
.grid-container {
background-color: #ddf;
border: 1px dotted black;
height: 335px;
max-width: 500px;
padding: 20px;
}
Merk op:
- er zijn twee notaties:
grid-row: 3 / 5;
(van 3 tot 5) is b.v. hetzelfde alsgrid-row: 3 / span 2;
(van 3 en dan 2 verder) - als geen rij of kolom opgegeven is, wordt de eerstvolgende beschikbare genomen
- als je items plaatst in een grid, maakt hun volgorde in de HTML niet meer uit
- niet geplaatste items (item 4 en 5) vullen de eerst beschikbare cellen in
align-items, justify-content
Deze properties aligneren een item binnen de grid area:
/* alignering */
.grid-container {
align-items: center;
justify-items: start;
}
/* items */
.item1 {
grid-column: 2 / 4; /* tussen kolomlijnen 2 en 4 */
/* geen rij(en) opgegeven, neem eerst beschikbare rij */
}
.item2 {
grid-column: 4 / 5; /* tussen kolomlijnen 4 en 5 */
grid-row: 1 / span 3; /* start bij rijlijn 1, span 3 rijen */
}
.item3 {
grid-column: 1 / 2; /* tussen kolomlijnen 1 en 2 */
grid-row: 1 / 3; /* tussen rijlijnen 1 en 3 */
}
/* container */
.grid-container {
display: grid; /* maak grid container */
gap: 10px;
grid-template-columns: repeat(4, 1fr); /* 4 kolommen, elk 1 fractie */
grid-template-rows: repeat(3, 1fr); /* 3 rijen, elk 1 fractie */
}
/* box styles */
.grid-item {
background-color: #ddd;
border: 2px solid black;
display: inline-block;
line-height: 25px;
padding: 5px;
text-align: center;
}
.grid-container {
background-color: #ddf;
border: 1px dotted black;
height: 335px;
max-width: 500px;
padding: 20px;
}
Probeer de verschillende waarden uit (align-self
en justify-self
worden in deze demo op item1 uitgevoerd):
Met align-self
en justify-self
kan je deze waarden overschrijven voor individuele items, b.v. het eerste item:
→ de waarde auto
betekent: hetzelfde als de container
Flexbox of Grid?
Flexbox en Grid zijn vaak inwisselbaar; meestal kun je een layoutkwestie zowel met het ene als met het andere oplossen. Vuistregel:
- is de layout op één lijn (horizontaal menu, verticale sociale media iconen...)? gebruik dan flexbox
- is de layout in meerdere kolommen en/of rijen (pagina layout, fotogallerij...)? gebruik dan grid
Voorbeeld 1: horizontaal menu
Typische HTML, en CSS fragment voor de horizontale layout met flexbox en grid:
<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;
}
.hormenu {
display: grid;
gap: 10px;
grid-auto-flow: column; /* hebben we niet gezien */
grid-auto-columns: max-content; /* hebben we niet gezien */
}
Winnaar: Flexbox
Voorbeeld 2: header layout
Typische HTML met logo links en menu rechts, en CSS fragment voor de horizontale layout met flexbox en grid:
<header>
<a href=""><img src="img/logo.jpg" alt="logo"></a>
<nav>...</nav>
</header>
header {
display: flex;
justify-content: space-between;
}
header {
display: grid;
grid-template-columns: auto auto;
justify-content: space-between;
}
Winnaar: Flexbox
Voorbeeld 3: content kolommen
Verdelen we de main in een variabele kolom links, en een 200px kolom rechts:
<main>
<div class="main__content"></div>
<aside>...</aside>
</main>
Kolomlayout met flexbox en grid:
main {
display: flex;
}
.main__content {
flex: 1 1 0;
}
aside {
flex: 0 0 200px;
}
main {
display: grid;
grid-template-columns: 1fr 200px;
}
Winnaar: Grid
Voorbeeld 4: formulier
Nemen we een eenvoudig loginformulier. HTML en CSS voor flexbox vs grid:
<form>
<div class="form__control">
<label for="login">Login:</label>
<input type="text" id="login" required>
</div>
<div class="form__control">
<label for="pw">Password:</label>
<input type="password" id="pw" required>
</div>
<div>
<button type="submit">Submit</button>
</div>
</form>
.form__control {
display: flex;
}
label {
flex: 0 0 120px;
}
input {
flex: 1 1 0;
}
<form>
<label for="login">Login:</label>
<input type="text" id="login" required>
<label for="pw">Password:</label>
<input type="password" id="pw" required>
<button type="submit">Submit</button>
</form>
form {
display: grid;
grid-template-columns: 120px 1fr;
}
button[type=submit] {
justify-self: start; /* do not stretch */
}
Winnaar: Grid
Voorbeeld 5: foto gallerij
HTML code en CSS voor Flexbox en 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>
#gallery {
display: flex;
column-gap: calc(8% / 3);
flex-wrap: wrap;
row-gap: 10px;
}
#gallery img {
display: block;
width: 23%; /* 4 kolommen */
}
#gallery {
display: grid;
gap: 10px;
grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));
}
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>
/* box styles */
.demobox {
border: 2px solid black;
width: 80px;
height: 40px;
margin-bottom: 10px;
padding: 5px;
}
.demowrapper {
border: 1px dotted black;
margin: 50px;
max-width: 500px;
padding: 20px;
}
.demobox1 {
background-color: #ddd;
}
.demobox2 {
background-color: #888;
}
.demobox3 {
background-color: #333;
}
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>
/* relative positioning */
.demobox2 {
position: relative;
left: 10px; /* verschuif 10px naar rechts */
top: 20px; /* verschuif 20px naar beneden */
}
/* box styles */
.demobox {
border: 2px solid black;
height: 40px;
margin-bottom: 10px;
padding: 5px;
width: 80px;
}
.demowrapper {
background-color: #fafafa;
border: 1px dotted black;
margin: 50px;
max-width: 500px;
padding: 20px;
}
.demobox1 {
background-color: #ddd;
}
.demobox2 {
background-color: #888;
}
.demobox3 {
background-color: #333;
}
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>
/* relative positioning */
.demobox2 {
position: absolute;
left: 5px; /* 5px vanaf links */
top: 5px; /* 5px vanaf boven */
}
/* box styles */
.demobox {
border: 2px solid black;
height: 40px;
margin-bottom: 10px;
padding: 5px;
width: 80px;
}
.demowrapper {
background-color: #fafafa;
border: 1px dotted black;
margin: 50px;
max-width: 500px;
padding: 20px;
}
.demobox1 {
background-color: #ddd;
}
.demobox2 {
background-color: #888;
}
.demobox3 {
background-color: #333;
}
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 */
}
/* box styles */
.demobox {
border: 2px solid black;
height: 40px;
margin-bottom: 10px;
width: 80px;
padding: 5px;
}
.demowrapper {
background-color: #fafafa;
border: 1px dotted black;
margin: 50px;
max-width: 500px;
padding: 20px;
}
.demobox1 {
background-color: #ddd;
}
.demobox2 {
background-color: #888;
}
.demobox3 {
background-color: #333;
}
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 */
}
/* box styles */
.demobox {
border: 2px solid black;
height: 40px;
margin-bottom: 10px;
padding: 5px;
width: 80px;
}
.demowrapper {
background-color: #fafafa;
border: 1px dotted black;
margin: 50px;
max-width: 500px;
padding: 20px;
}
.demobox1 {
background-color: #ddd;
}
.demobox2 {
background-color: #888;
}
.demobox3 {
background-color: #333;
}
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;
}
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 negatieve z-index plaatst het element onder normale content
- een positieve z-index plaatst het element boven normale content, hoe hoger de index, hoe meer bovenaan
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: 4; /* probeer een ook 20, 1 en -1 */
}
.demobox2 {
z-index: 10;
}
.demobox3 {
z-index: 2;
}
/* absolute positionering */
.demobox1 {
position: absolute;
left: 25px;
top: -15px;
}
.demobox2 {
position: absolute;
left: 65px;
top: 15px;
}
.demobox3 {
left: 45px;
top: 35px;
position: absolute;
}
/* box styles */
.demobox {
border: 2px solid black;
margin-bottom: 10px;
padding: 5px;
width: 160px;
height: 80px;
}
.demowrapper {
background-color: #fafafa;
border: 1px dotted black;
margin: 50px;
max-width: 500px;
padding: 20px;
}
.demobox1 {
background-color: #ddd;
}
.demobox2 {
background-color: #888;
}
.demobox3 {
background-color: #333;
}
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.
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 sticky of fixed voor "back to top links", sticky notes e.d.
- gebruik absolute positionering voor game programming om layers te maken, zie b.v. deze uitgebreide demo
Gebruik positionering zeker niet voor:
- gebruik geen relatieve positionering om foutjes in de layout te corrigeren
- gebruik geen absolute positionering om elementen binnen een parent te positioneren; dat doen we met flexbox en margins/paddings
- gebruik geen positionering technieken voor pagina layout; dat doen we met flexbox en margins/paddings
De vuistregel is: als het anders kan (b.v. met flexbox), gebruik dan geen positionering
Layout case study
We bekijken een samenvattend voorbeeld, in twee versies. Resultaat:
Versie met hoofdzakelijk Flexbox
In deze versie is enkel Grid gebruikt voor de twee kolommen van de main, de rest is met Flexbox.
<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: flex;
flex-direction: column; /* plaats header, nav, main, footer onder elkaar */
margin: 0 auto; /* centreer body in <html> */
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; /* vaste breedte */
}
.header_search {
align-self: flex-end; /* zet zichzelf beneden */
flex: 0 0 220px; /* vaste breedte */
}
/* main */
main {
flex: 1 1 0; /* zal resterende hoogte vullen */
}
/* nav layout */
nav ul {
display: flex;
gap: 10px; /* ruimte tussen items */
justify-content: center; /* items in het midden */
}
/* main layout */
main {
display: flex;
}
#content {
flex: 1 1 0; /* zal resterende breedte vullen */
}
aside {
flex: 0 0 200px; /* 200px vast */
}
/* footer layout */
footer {
text-align: center;
}
/* algemene stijlen */
* {
box-sizing: border-box;
}
body {
border-left: 2px solid #ccc;
border-right: 2px solid #ccc;
padding: 0;
}
header, nav, footer, #content, aside {
padding: 10px 20px;
}
nav {
background-color: #eee;
}
nav ul {
list-style: none;
margin: 0;
}
header, footer {
background-color: #ddd;
padding: 10px 20px;
}
aside {
background-color: #bcd;
}
Je herkent volgende technieken:
-
body
- verticale layout met
display: flex; flex-direction: column
- de
<main>
vult resterende verticale ruimte metflex: 1 1 0
- de
<header>
,<nav>
en<footer>
nemen niet meer ruimte in dan nodig (standaardwaarde isflex: 0 1 auto
) - horizontaal gecentreerd in de pagina met
max-width: 1000px; margin: 0 auto;
- verticaal over de browser viewport uitgerokken met
min-height: 100vh
- verticale layout met
-
header
- horizontale layout met
display: flex
- items verticaal gecentreerd met
align-items: center
- items zo ver mogelijk uit elkaar met
justify-content: space-between
- logo vaste breedte met
flex: 0 0 100px
- zoekformulier vaste breedte met
flex: 0 0 220px
- zoekformulier onderaan geplaatst met
align-self: flex-end
- horizontale layout met
-
nav
- horizontale layout met
display: flex
- items gecentreerd met
justify-content: center
- ruimte tussen items met
gap: 10px
- horizontale layout met
-
main
- grid layout met
display: grid
- twee kolommen met
grid-template-columns: 1fr 100px
- grid layout met
-
footer
- tekst gecentreerd met
text-align: center
- tekst gecentreerd met
Versie met hoofdzakelijk Grid
De HTML code is gelijk, maar we geven het voor de duidelijkheid nog eens weer, samen met de CSS code:
<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 in <html< */
max-width: 1000px; /* maximaal 1000px breed */
min-height: 100vh; /* bedek minstens hele viewport */
}
/* header layout */
header {
align-items: center; /* items verticaal centreren */
display: grid; /* maak grid */
grid-template-columns: auto 1fr auto; /* drie kolommen */
justify-items: center;
min-height: 150px;
}
.header_search {
align-self: end; /* zet zichzelf beneden */
}
/* 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;
}
/* main layout */
main {
display: flex;
}
#content {
flex: 1 1 auto;
}
aside {
flex: 0 0 200px;
}
/* footer layout */
footer {
text-align: center;
}
/* algemene stijlen */
* {
box-sizing: border-box;
}
body {
border-left: 2px solid #ccc;
border-right: 2px solid #ccc;
padding: 0;
}
header, nav, footer, #content, aside {
padding: 10px 20px;
}
nav {
background-color: #eee;
}
nav ul {
list-style: none;
margin: 0;
}
header, footer {
background-color: #ddd;
padding: 10px 20px;
}
aside {
background-color: #bcd;
}
Je herkent volgende technieken:
-
body
- vier rijen met
display: grid; grid-template-rows: auto auto 1fr auto;
- horizontaal gecentreerd in de pagina met
max-width: 1000px; margin: 0 auto;
- verticaal over de browser viewport uitgerokken met
min-height: 100vh
- vier rijen met
-
header
- horizontale layout met
display: grid; grid-template-columns: auto 1fr auto
- items verticaal gecentreerd met
align-items: center
- items horizontaal gecentreerd met
justify-content: center
- zoekformulier onderaan geplaatst met
align-self: end
- horizontale layout met
-
nav
- horizontale layout met
display: flex
- items gecentreerd met
justify-content: center
- ruimte tussen items met
gap: 10px
- horizontale layout met
-
main
- grid layout met
display: grid
- twee kolommen met
grid-template-columns: 1fr 100px
- grid layout met
-
footer
- tekst gecentreerd met
text-align: center
- tekst gecentreerd met