Static layout

WEB ESSENTIALS

Layout in webdevelopment

Layout

Tot nu toe zagen we enkel hoe block-elementen zich onder elkaar stapelden en inline-elementen naast elkaar. Als je online rondkijkt is de layout van een website vaak veel complexer.

Layout

Layout

Om een design correct na te maken hebben we dus een manier nodig om elementen zowel op de horizontale as als op de verticale as te kunnen uitlijnen

Float

Float

Vanaf 1999 was "floating" dé manier om een layout te bepalen voor webpagina's. Je kan er elementen links of rechts mee laten "drijven". 

img {
  float: right;
}

Float

De CSS-eigenschap float werd oorspronkelijk gemaakt om tekst rond afbeeldingen te laten lopen, zoals in kranten.

.left-column {
  float: left;
  width: 70%;
}

.sidebar {
  float: right;
  width: 30%;
}

Maar developers gebruikten float ook om kolommen te maken, blokken naast elkaar te zetten en hele paginalay-outs te bouwen.

⚠️ Deze code niet gebruiken!

Float

Layouts opbouwen met float gaf veel problemen. Het was "prutswerk" om alles juist te krijgen en je had niet genoeg controle over de layout...

...dus werd ✨💕Flexbox💕✨  in het leven geroepen.

Float gebruiken

Gebruik een max-width (van bv: 40%) voor de afbeeldingen zodat tekst niet abrupt onderbroken wordt op mobiel!

🤓 Tip

Vandaag kunnen we float wel nog steeds gebruiken om tekst rond een afbeelding te laten lopen, zoals in een krant. 

img {
  float: right;
  margin-left: 1rem;
  max-width: 30rem;
  height: 30rem;  
}

Float gebruiken

Flexbox

Flexbox

Met Flexbox (Flexible Box Layout) kan je elementen in css makkelijk uitlijnen en ordenen binnen een container, zowel horizontaal (in een rij) als verticaal (in een kolom).

Flexbox vs. auto layout

Flexbox lijkt sterk op auto layout in Figma

Je kan bepalen hoe het element uitgelijnd moet worden binnen de container & hoeveel ruimte er tussen verschillende elementen moet zijn.

Je kan een richting bepalen (horizontaal of verticaal)

Items & container

Items: De elementen die we willen uitlijnen

Container: Het element rond de items (parent element)

Items & container

<div class="container">
  <div class="item-1">...</div>
  <div class="item-2">...</div>
  <div class="item-3">...</div>
</div>
.container {
  background: purple;
}

.item-1, .item-2, .item-3 {
  background: orange;
  margin: 1rem;
  width: 14rem;
  height: 4rem;
}

Items & container

<ul class="nav-menu">
  <li class="nav-menu__item"><a>Home</a></li>
  <li class="nav-menu__item"><a>About</a></li>
  <li class="nav-menu__item"><a>Blog</a></li>
  <li class="nav-menu__item"><a>Contact</a></li>
</ul>

Welke elementen willen we hier naast elkaar zetten?
Wat is hier de container/parent element?

Flexbox toevoegen

Flexbox voeg je toe op de container/parent element van
de items die je wil uitlijnen

<div class="container">
  <div class="item item-1">...</div>
  <div class="item item-2">...</div>
  <div class="item item-3">...</div>
</div>
.container {
  background: purple;
  display: flex;
}

.item {
  background: orange;
  margin: 1rem;
  width: 100%;
  height: 4rem;
}

Uitlijning

Wanneer flexbox toegevoegd werd, kan je bepalen hoe de items uitgelijnd worden binnen de container. Dat kunnen we zowel horizontaal bepalen als verticaal.

Main axis (horizontaal)

Cross axis (verticaal)

Uitlijning: horizontaal

Horizontale uitlijning stel je in met justify-content

  • justify-content: start (links, default)
  • justify-content: center (midden)
  • justify-content: end (rechts)
.container {
  background: purple;
  display: flex;
  justify-content: start;
}
.container {
  background: purple;
  display: flex;
  justify-content: center;
}
.container {
  background: purple;
  display: flex;
  justify-content: end;
}

start

center

end

Uitlijning: horizontaal

Horizontale uitlijning stel je in met justify-content

  • justify-content: space-between
  • justify-content: space-around
  • justify-content: space-evenly
.container {
  background: purple;
  display: flex;
  justify-content: space-between;
}
.container {
  background: purple;
  display: flex;
  justify-content: space-around;
}
.container {
  background: purple;
  display: flex;
  justify-content: space-evenly;
}

space-between

space-around

space-evenly

Uitlijning: horizontaal

Justify content

Uitlijning: verticaal

Verticale uitlijning stel je in met align-items.

.container {
  background: purple;
  display: flex;
  align-items: stretch
}

stretch

Default staat dit op "stretch", als je de container hoger maakt of een bepaalt item langer maakt, zullen alle items zich stretchen om deze hoogte op te vullen. 

Uitlijning: verticaal

Verticale uitlijning stel je in met align-items.

  • align-items: start
  • align-items: center
  • align-items: end
.container {
  background: purple;
  display: flex;
  align-items: start;
}
.container {
  background: purple;
  display: flex;
  align-items: center;
}
.container {
  background: purple;
  display: flex;
  align-items: end;
}

start

center

end

Uitlijning: verticaal

Verticale uitlijning stel je in met align-items.

  • align-items: baseline
.container {
  background: purple;
  display: flex;
  align-items: baseline;
}

Baseline

Uitlijning: verticaal

Align-items

Flex-direction

Wanneer je flexbox toevoegt, komen de items by default horizontaal te staan. Dit kan je aanpassen met flex-direction.

.container {
  background: purple;
  display: flex;
  flex-direction: row;
}
.container {
  background: purple;
  display: flex;
  flex-direction: column;
}

flex-direction: row (horizontaal)

flex-direction: column (verticaal)

Flex-direction

Je kan de richting van de items ook omdraaien met row-reverse en column-reverse

.container {
  background: purple;
  display: flex;
  flex-direction: row-reverse;
}
.container {
  background: purple;
  display: flex;
  flex-direction: column-reverse;
}

flex-direction: row-reverse

flex-direction: column-reverse

Flex-direction

Flex-direction

Let op! Wanneer flex-direction verandert naar column, worden de assen ook omgedraaid. Je gebruikt nu justify-content om verticaal uit te lijnen en align-items om horizontaal uit te lijnen

.container {
  background: purple;
  display: flex;
  flex-direction: column;
  align-items: end
}

⚠️

Wanneer je row-reverse of column-reverse gebruikt, zullen "start" en "end" ook van plaats verwisselen

🤔

Gap

Gap gebruik je om de ruimte tussen de items in te stellen

.container {
  background: purple;
  display: flex;
  gap: 1rem;
}
.container {
  background: purple;
  display: flex;
  gap: 3rem;
}

1rem

1rem

3rem

3rem

Gap

Flex-wrap

Wanneer je heel veel items binnen een container hebt, zullen deze standaard op één lijn geplaatst worden, zelfs wanneer er te weinig ruimte is. Met flex-wrap kunnen we dit aanpassen.

  • flex-wrap: no-wrap (default, alles op één lijn)
  • flex-wrap: wrap (spring naar de volgende lijn indien nodig)
  • flex-wrap: wrap-reverse (omgekeerde volgorde)
.container {
  background: purple;
  display: flex;
  flex-wrap: wrap;
}

.item {
  width: 15rem
}

Flex-wrap

Order

Met order kan je spelen met de volgorde van de items. Deze property voeg je toe op het item zelf.

.container {
  background: purple;
  display: flex;
  flex-wrap: wrap;
}

.item {
  background: orange;
  margin: 1rem;
  width: 14rem;
  height: 4rem;
}

.item-1 {
  order: 10;
}

zonder order aangepast

order van item 1 werd aangepast

Order

Je kan zowel negatieve als positieve getallen gebruiken

Order

Align-self

Met align-self kan je één specifiek item uitlijnen binnen een flex-container. 

  • Waardes: stretch, center, start, end
.container {
  background: purple;
  display: flex;
  gap: 1rem
}

.item {
  background: orange;
  width: 14rem;
  height: 4rem;
}

.item-3 {
  align-self: end;
}

Flex-grow bepaalt hoeveel een flex-item mag meegroeien in verhouding tot de andere flex-items wanneer er extra ruimte beschikbaar is in de container.

  • Het getal geeft de verhouding weer t.o.v. de andere items
  • Default waarde is 0, enkel positieve getallen zijn mogelijk

Flex-grow

.item-1, .item-3 {
  flex-grow: 1;
}

.item-2 {
  flex-grow: 2;
}

Flex-grow

.item-1, .item-2, .item-3 {
  flex-grow: 0;
  /*default, items groeien niet*/
}
.item-1, .item-2, .item-3 {
  flex-grow: 1;
  /*items groeien gelijk*/
}
.item-1, .item-3 {
  flex-grow: 1;
}

.item-2, {
  flex-grow: 2;
  /*item groeit dubbel zo veel*/
}

Flex-grow

De flex-shrink property bepaalt hoeveel een flex-item mag krimpen als er te weinig ruimte is in de container.

  • Het getal geeft de verhouding weer t.o.v. de andere items
  • Default waarde is 1, enkel positieve getallen zijn mogelijk
  • Bij waarde 0 behoudt het item zijn originele breedte, "niet krimpen"

Flex-shrink

.item-1, .item-3 {
  flex-shrink: 1;
}

.item-2 {
  flex-shrink: 2;
}

Flex-shrink

.item-1, .item-2 .item-3 {
  flex-shrink: 1;
  /* default, items krimpen gelijk*/
}

Startsituatie:

Items binnen container met extra ruimte

Aanpassing:

Container wordt kleiner gemaakt, hoe worden de items geschaald?

.item-2 {
  flex-shrink: 2;
  /* item krimpt dubbel zo veel*/
}
.item-1 {
  flex-shrink: 0;
  /* item behoudt originele breedte*/
}

Flex-shrink

Flex-basis

Flex-basis bepaalt de startbreedte (of hoogte) van een flex-item voordat flex-grow of flex-shrink er iets mee doet.

  • Default waarde: auto (neemt de breedte in van de content of de ingestelde waarde bij width/height)
  • Flex-basis lijkt op width, maar heeft voorrang. Als beide zijn ingesteld, dan gebruikt de browser flex-basis als uitgangspunt.
.item-1, .item-2, .item-3 {
  flex-basis: 20rem;
}

Met flex-basis: 0 negeer je de inhoudsbreedte van een item. Alle ruimte wordt verdeelt volgens  flex-grow.

🤓 Tip

Flex-basis

Flex combineert flex-grow, flex-shrink en flex-basis in 1 property.

Je geeft de waardes mee in de volgende volgorde:
flex-grow, flex-shrink, flex-basis

Flex

.item-1, .item-2, .item-3 {
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 0;
}

.item-1, .item-2, .item-3 {
  flex: 1 1 0;
}

Flex

Grid

Grid

Wanneer flexbox niet volstaat, kan je ook gebruik maken van CSS grid. Hiermee kan je complexe en flexibele layouts samenstellen via een grid dat je zelf instelt.

Grid

CSS grid zien we (nog) niet, maar als je interesse hebt kan er hier wel al eens zelf induiken