Flexbox
Flexbox er en måte å plassere elementer på en nettside. Det gjør det enkelt å lage layouts der ting står ved siden av hverandre eller under hverandre.
Hvorfor Flexbox?
Før Flexbox var det vanskelig å:
- Plassere ting ved siden av hverandre
- Sentrere elementer
- Fordele plass jevnt mellom elementer
Med Flexbox blir alt dette enkelt!
Grunnleggende konsept
Flexbox handler om to ting:
- Container (flex container) - foreldreelementet som holder på barna
- Items (flex items) - barna som skal plasseres
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
Når du skriver display: flex på et element, blir alle barna automatisk plassert ved siden av hverandre!
Akser
Flexbox har to akser:
Hovedakse (main axis) →
┌─────────────────────────────────┐
│ ┌───┐ ┌───┐ ┌───┐ │ ↑
│ │ 1 │ │ 2 │ │ 3 │ │ │ Kryssakse
│ └───┘ └───┘ └───┘ │ │ (cross axis)
└─────────────────────────────────┘ ↓
- Hovedakse: Retningen elementene plasseres i (standard: vannrett →)
- Kryssakse: Den andre retningen (standard: loddrett ↓)
flex-direction
Bestemmer retningen på hovedaksen.
justify-content
Bestemmer hvordan elementene plasseres langs hovedaksen.
Elementer samles i starten.
Elementer samles i slutten.
Elementer sentreres.
Lik avstand mellom elementer, ingen plass på kantene.
Lik avstand rundt hvert element.
align-items
Bestemmer hvordan elementene plasseres langs kryssaksen.
Elementer strekkes til full høyde.
Elementer øverst.
Elementer nederst.
Sentrere perfekt
For å sentrere noe både vannrett og loddrett:
.container {
display: flex;
justify-content: center; /* vannrett */
align-items: center; /* loddrett */
height: 100vh; /* full skjermhøyde */
}
┌─────────────────────────────────┐
│ │
│ │
│ ┌───────┐ │
│ │ Hei! │ │
│ └───────┘ │
│ │
│ │
└─────────────────────────────────┘
Superenkel sentrering
justify-content: center + align-items: center er den enkleste måten å sentrere noe på en nettside!
gap
Legger til mellomrom mellom elementene.
Du kan også ha forskjellig avstand vannrett og loddrett:
flex-wrap
Som standard prøver Flexbox å presse alle elementer på én linje. Med flex-wrap kan de brytes til flere linjer.
Egenskaper på flex items
Disse egenskapene brukes på barna (items), ikke containeren.
flex-grow
Bestemmer hvor mye et element skal vokse i forhold til andre.
┌─────────────────────────────────┐
│ ┌─────┐ ┌───────────┐ ┌─────┐ │
│ │ 1 │ │ 2 │ │ 3 │ │
│ │ 1x │ │ 2x │ │ 1x │ │
│ └─────┘ └───────────┘ └─────┘ │
└─────────────────────────────────┘
flex-shrink
Bestemmer hvor mye et element skal krympe når det ikke er nok plass.
flex-basis
Startbredden til et element før det vokser eller krymper.
Shorthand: flex
Kombinerer grow, shrink og basis:
Lik bredde
flex: 1 på alle items gir dem lik bredde!
align-self
Overstyr align-items for ett enkelt element.
.container {
display: flex;
align-items: flex-start;
}
.special {
align-self: flex-end; /* Bare denne nederst */
}
┌─────────────────────────────────┐
│ ┌───┐┌───┐ │
│ │ 1 ││ 2 │ │
│ └───┘└───┘ │
│ ┌───┐ │
│ │ 3 │ │ ← align-self: flex-end
│ └───┘ │
└─────────────────────────────────┘
Praktiske eksempler
Navigasjonsmeny
<nav class="navbar">
<div class="logo">MinSide</div>
<ul class="nav-links">
<li><a href="#">Hjem</a></li>
<li><a href="#">Om</a></li>
<li><a href="#">Kontakt</a></li>
</ul>
</nav>
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem;
background: #333;
}
.nav-links {
display: flex;
gap: 2rem;
list-style: none;
}
Kortgalleri
<div class="gallery">
<div class="card">Kort 1</div>
<div class="card">Kort 2</div>
<div class="card">Kort 3</div>
<div class="card">Kort 4</div>
</div>
.gallery {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.card {
flex: 1 1 250px; /* Minst 250px, vokser ellers */
padding: 20px;
background: #f0f0f0;
}
Footer med kolonner
<footer class="footer">
<div class="col">
<h3>Om oss</h3>
<p>Info...</p>
</div>
<div class="col">
<h3>Lenker</h3>
<p>Lenker...</p>
</div>
<div class="col">
<h3>Kontakt</h3>
<p>Kontakt...</p>
</div>
</footer>
.footer {
display: flex;
justify-content: space-around;
padding: 2rem;
background: #333;
color: white;
}
.col {
flex: 1;
max-width: 300px;
}
Oppsummering
| Egenskap | Brukes på | Hva den gjør |
|---|---|---|
display: flex |
Container | Aktiverer Flexbox |
flex-direction |
Container | Retning (row/column) |
justify-content |
Container | Plassering langs hovedakse |
align-items |
Container | Plassering langs kryssakse |
gap |
Container | Mellomrom mellom items |
flex-wrap |
Container | Tillat linjeskift |
flex-grow |
Item | Hvor mye den skal vokse |
flex-shrink |
Item | Hvor mye den skal krympe |
flex-basis |
Item | Startbredde |
align-self |
Item | Overstyr align-items |
Lær mer
Prøv Flexbox Froggy - et morsomt spill for å lære Flexbox!
Se også Responsivt design for hvordan du kombinerer Flexbox med media queries for å lage layouts som tilpasser seg ulike skjermstørrelser.