Flexbox, oftewel Flexible Box Layout, biedt een krachtige en flexibele manier om elementen binnen een HTML-container te ordenen. In dit hoofdstuk gaan we dieper in op de basisconcepten van Flexbox.
Flexbox is een layout-model in CSS dat is ontworpen om het bouwen van complexe lay-outs te vereenvoudigen. Dit model biedt uitgebreide controle over uitlijning, ruimteverdeling en de volgorde van elementen binnen een container, onafhankelijk van hun originele grootte.
Omdat Flexbox een module is en niet slechts één CSS-eigenschap omvat, bestaat het uit veel aspecten, waaronder een reeks van CSS-eigenschappen. Sommige van deze eigenschappen zijn bedoeld om te worden toegepast op het bovenliggende element, of de flex-container, terwijl andere bedoeld zijn voor de kind-elementen van deze container, de flex-items.
In traditionele HTML-opmaak wordt de plaatsing van elementen bepaald door de 'document flow', die elementen als 'blok' of 'inline' categoriseert, elk met hun eigen 'flowrichtingen'. In tegenstelling tot deze traditionele aanpak maakt Flexbox gebruik van 'flex-flowrichtingen'. Dit is een flexibele manier om elementen te positioneren en te oriënteren binnen een container. Deze richtingen worden bepaald door de flex-container eigenschappen en hebben invloed op hoe de flex-items (kinderen van de flex-container) worden gerangschikt. De figuur hieronder illustreert de basisprincipes van deze flex-lay-out.
Items worden gerangschikt langs de hoofdas (van Main Start tot Main End) of de kruisas (van Cross Start tot Cross End).
Laten we beginnen met de kernprincipes van Flexbox:
Flex-container: Het ouder-element (parent-element) dat de Flexbox-eigenschappen hanteert, waarop 'display: flex;' wordt toegepast. Dit element fungeert als de container waarin de flex-items worden geplaatst.
.container {
display: flex;
}
Flex-items: De kind-elementen (child elements) binnen de flex-container. Elk direct kind van de flex-container wordt een flex-item. Deze items zijn flexibel qua grootte en positie en kunnen groeien of krimpen om de beschikbare ruimte binnen de container op te vullen, met hun gedrag en uitlijning bepaald door verschillende Flexbox-eigenschappen.
.container {
flex-direction: row;
}
<div class="flex-container">
<div class="flex-item">flex-item 1</div><div class="flex-item">flex-item 2</div>
</div>
Flex-direction: Deze eigenschap bepaalt de hoofdasrichting van de flex-items binnen de container: horizontaal als 'row', verticaal als 'column', of de omgekeerde richtingen 'row-reverse' of 'column-reverse'.
.container {
flex-direction: column;
}
Justify-content: Lijnt items uit langs de hoofdas. Voor een 'row' richting regelt het de horizontale uitlijning, en voor 'column' de verticale uitlijning.
De mogelijke waarden voor justify-content
zijn:
.container-row {
display: flex;
flex-direction: row;
justify-content: center;
}
.container-column {
display: flex;
flex-direction: column;
justify-content: center;
}
Align-items: Beïnvloedt de uitlijning van items langs de dwarsas, die loodrecht staat op de hoofdas. Bij een 'row' richting regelt het de verticale uitlijning, en bij 'column' de horizontale uitlijning.
De mogelijke waarden voor align-items
zijn:
.container-row {
display: flex;
flex-direction: row;
align-items: center;
}
.container-column {
display: flex;
flex-direction: column;
align-items: center;
}
Beschrijving: De "align-content" eigenschap wordt gebruikt om de flex-items samen binnen de flex-container uit te lijnen wanneer er extra ruimte is op de dwarsas. Deze eigenschap bepaalt hoe rijen of kolommen van flex-items zich positioneren langs de dwarsas van de container. Dit is verticaal bij gebruik van 'flex-direction: row' en horizontaal bij 'flex-direction: column'.
Belangrijk: De 'align-content' eigenschap is alleen van invloed wanneer er meerdere rijen of kolommen van flex-items in de container aanwezig zijn. Als er slechts één rij of kolom van flex-items is, heeft deze eigenschap geen effect.
De mogelijke waarden voor "align-content" zijn:
.align-content-example {
display: flex;
flex-wrap: wrap;
align-content: flex-end; /* Lijnt de flex-lijnen uit onderaan de container */
}
.align-content-item {
flex: 1;
height: 100px;
padding: 10px;
margin: 5px;
background-color: lightblue;
}
Flexbox biedt geavanceerde controle over hoe items zich gedragen als de ruimte beperkt is. In dit hoofdstuk gaan we dieper in op flex-wrap
en order
.
Flex-wrap is essentieel om te bepalen hoe items zich gedragen wanneer ze niet allemaal in één rij passen.
.container-nowrap {
display: flex;
flex-wrap: nowrap; /* Alle items blijven op één lijn (standaard) */
}
.container-wrap {
display: flex;
flex-wrap: wrap; /* Items gaan naar een nieuwe regel als er niet genoeg ruimte is */
}
.container-wrap-reverse {
display: flex;
flex-wrap: wrap-reverse; /* Items gaan naar een nieuwe regel en de volgorde wordt omgekeerd */
}
De "gap" eigenschap wordt gebruikt om de ruimte tussen flex-items binnen een flex-container aan te passen. Deze eigenschap wordt vaak gebruikt om marge of ruimte tussen de items toe te voegen, waardoor de lay-out er mooier uitziet.
Eigenschap en Voorbeeld:
.container {
display: flex;
gap: 20px; /* Voegt 20 pixels ruimte toe tussen de flex-items */
}
Met de "gap" eigenschap kunt u de afstand tussen items op zowel de hoofdas als de dwarsas van de flex-container regelen. Het is een handige manier om witruimte toe te voegen en de visuele uitlijning van uw lay-out te verbeteren.
Let op dat de "gap" eigenschap alleen van toepassing is op de afstand tussen items en niet op de ruimte tussen de items en de rand van de flex-container. Als u ruimte aan de randen wilt toevoegen, kunt u padding of marges gebruiken op de flex-items zelf.
De "gap" eigenschap is een handige toevoeging aan Flexbox om uw lay-outs verder aan te passen en te verfijnen.
Met order
kun je de volgorde van flex-items aanpassen, wat erg handig kan zijn voor responsieve lay-outs.
.container {
display: flex;
}
.item {
padding: 10px;
border: 1px solid black;
margin: 15px; /* Verhoogde marge */
}
.item1 {
order: 0; /* Standaard */
}
.item2 {
order: 2; /* Verplaatst naar het einde */
}
.item3 {
order: -1; /* Verplaatst naar het begin */
}
Deze eigenschappen geven ons fijne controle over hoe items groeien en krimpen.
Bepaalt hoeveel een item kan groeien in verhouding tot de rest.
flex-grow: 1;
of flex-grow: 2;
. Dit bepaalt de groeifactor van het flex-item. Hoe hoger het getal, hoe meer dat specifieke item zal groeien ten opzichte van de andere items in de flex-container.flex-grow
wordt gebruikt wanneer er meer ruimte beschikbaar is in de flex-container dan nodig is om alle flex-items op hun basisgrootte te passen. flex-grow
bepaalt hoe deze extra ruimte wordt verdeeld onder de flex-items.
.container {
display: flex;
border: 1px solid black;
padding: 10px;
width: 100%; /* Zorgt ervoor dat de container de volledige breedte inneemt */
}
.item {
border: 1px solid grey;
margin: 5px;
padding: 10px;
min-width: 50px; /* Stelt een minimale breedte in voor elk item */
}
.item1 {
flex-grow: 0; /* Standaard: geen groei */
}
.item2 {
flex-grow: 2; /* Laat het item meer ruimte innemen */
}
Definieert hoe een item kan krimpen als er niet genoeg ruimte is.
flex-shrink
waarde van 0
betekent dat het flex-item niet zal krimpen, zelfs als er niet genoeg ruimte is in de flex-container.flex-shrink: 2;
zal twee keer zoveel krimpen als een item met flex-shrink: 1;
in dezelfde container.
.container {
display: flex;
border: 1px solid black;
padding: 10px;
}
.item {
border: 1px solid grey;
margin: 5px;
padding: 10px;
min-width: 50px;
width: 100px; /* Standaardbreedte */
}
.item-shrink {
flex-shrink: 1; /* Item kan krimpen */
}
.item-no-shrink {
flex-shrink: 0; /* Voorkomt dat het item krimpt */
}
De initiële grootte van een item voordat het groeit of krimpt.
flex-basis: 20em;
of flex-basis: 50%;
. Dit stelt de initiële grootte van het item in op de gespecificeerde waarde.
.container {
display: flex;
border: 1px solid black;
padding: 10px;
}
.item {
border: 1px solid grey;
margin: 5px;
padding: 10px;
}
.item-auto {
flex-basis: auto; /* Grootte gebaseerd op de inhoud */
}
.item-fixed {
flex-basis: 50%; /* Specifieke grootte */
}
De flex
shorthand eigenschap in CSS is een compacte manier om de flex-grow
, flex-shrink
, en flex-basis
eigenschappen in één verklaring te combineren.
De flex
shorthand laat je toe om één, twee, of alle drie waarden te specificeren. Niet gespecificeerde waarden nemen hun standaardwaarde aan.
.container {
display: flex;
border: 1px solid black;
padding: 10px;
}
.item {
border: 1px solid grey;
margin: 5px;
padding: 10px;
}
.item1 {
flex: 1; /* gelijk aan flex: 1 1 0%; */
}
.item2 {
flex: 2 2 50%; /* Groeit en krimpt tweemaal sneller dan item1, met een basis van 50% */
}
Maakt individuele uitlijning mogelijk voor elk flex-item binnen een flex-container.
align-self
stelt je in staat om de positie van een enkel flex-item binnen zijn container te wijzigen. Dit gebeurt langs de dwarsas, los van de algemene uitlijningsregels die met 'align-items' voor de gehele container zijn ingesteld.
.container {
display: flex;
height: 200px;
border: 1px solid black;
}
.flex-item {
width: 50px;
margin: 5px;
background-color: lightblue;
text-align: center;
line-height: 50px;
}
.item1 {
align-self: flex-start;
}
.item2 {
align-self: center;
}
.item3 {
align-self: flex-end;
}
.item4 {
align-self: stretch;
}
Deze eigenschappen worden toegepast op de flex-items (de kinderen van de flex-container).
Download deze poster met een overzicht van alle flexbox-eigenschappen.