Flexbox
Row or column layout with display: flex
Flexbox is a layout model for arranging items in a single row or column. Add display: flex to a container and its direct children become flex items.
The basics
View code
<style>
.row {
display: flex;
gap: 8px;
background: var(--ds-surface-alt);
padding: 12px;
border-radius: 6px;
}
.item {
background: #7c3aed;
color: #fff;
padding: 10px 18px;
border-radius: 4px;
font-weight: bold;
}
</style>
<div class="row">
<div class="item">A</div>
<div class="item">B</div>
<div class="item">C</div>
</div>flex-direction
Default is row. Set it to column to stack items vertically.
View code
<style>
.flex { display:flex; gap:6px; background:var(--ds-surface); padding:10px; border-radius:6px; margin-bottom:8px; }
.flex.col { flex-direction: column; }
.i { background:#7c3aed; color:#fff; padding:8px 14px; border-radius:4px; font-weight:bold; }
small { color:var(--ds-muted); font-size:.75rem; }
</style>
<small>flex-direction: row (default)</small>
<div class="flex">
<div class="i">A</div><div class="i">B</div><div class="i">C</div>
</div>
<small>flex-direction: column</small>
<div class="flex col">
<div class="i">A</div><div class="i">B</div><div class="i">C</div>
</div>justify-content
Distributes items along the main axis (horizontal in row, vertical in column).
View code
<style>
.f { display:flex; gap:6px; background:var(--ds-surface); padding:8px; border-radius:6px; margin-bottom:6px; }
.i { background:#7c3aed; color:#fff; padding:8px 14px; border-radius:4px; font-weight:bold; }
small { color:var(--ds-muted); font-size:.75rem; display:block; margin-top:4px; }
</style>
<small>flex-start (default)</small>
<div class="f" style="justify-content:flex-start"><div class="i">A</div><div class="i">B</div><div class="i">C</div></div>
<small>center</small>
<div class="f" style="justify-content:center"><div class="i">A</div><div class="i">B</div><div class="i">C</div></div>
<small>flex-end</small>
<div class="f" style="justify-content:flex-end"><div class="i">A</div><div class="i">B</div><div class="i">C</div></div>
<small>space-between</small>
<div class="f" style="justify-content:space-between"><div class="i">A</div><div class="i">B</div><div class="i">C</div></div>
<small>space-around</small>
<div class="f" style="justify-content:space-around"><div class="i">A</div><div class="i">B</div><div class="i">C</div></div>align-items
Aligns items along the cross axis (vertical in row).
View code
<style>
.f { display:flex; gap:6px; background:var(--ds-surface); padding:8px; border-radius:6px; margin-bottom:6px; height:70px; }
.i { background:#7c3aed; color:#fff; padding:8px 14px; border-radius:4px; font-weight:bold; }
.tall { height:50px; display:flex; align-items:center; }
small { color:var(--ds-muted); font-size:.75rem; display:block; }
</style>
<small>flex-start</small>
<div class="f" style="align-items:flex-start"><div class="i">A</div><div class="i tall">B</div><div class="i">C</div></div>
<small>center</small>
<div class="f" style="align-items:center"><div class="i">A</div><div class="i tall">B</div><div class="i">C</div></div>
<small>flex-end</small>
<div class="f" style="align-items:flex-end"><div class="i">A</div><div class="i tall">B</div><div class="i">C</div></div>
<small>stretch (default)</small>
<div class="f" style="align-items:stretch"><div class="i">A</div><div class="i">B</div><div class="i">C</div></div>flex-wrap
By default items don’t wrap. flex-wrap: wrap lets them flow to the next row.
View code
<style>
.wrap { display:flex; flex-wrap:wrap; gap:6px; background:var(--ds-surface); padding:8px; border-radius:6px; max-width:280px; }
.i { background:#7c3aed; color:#fff; padding:8px 14px; border-radius:4px; font-weight:bold; }
</style>
<div class="wrap">
<div class="i">Apple</div>
<div class="i">Banana</div>
<div class="i">Cherry</div>
<div class="i">Date</div>
<div class="i">Elderberry</div>
</div>flex-grow, flex-shrink, flex-basis
Three properties control how items share available space:
flex-grow: 1: the item claims any leftover spaceflex-shrink: 0: the item won’t shrink below its natural sizeflex-basis: 200px: the starting size, before grow/shrink applies
Shorthand: flex: grow shrink basis
View code
<style>
.f { display:flex; gap:6px; background:var(--ds-surface); padding:8px; border-radius:6px; }
.i { background:#7c3aed; color:#fff; padding:8px 12px; border-radius:4px; font-weight:bold; font-size:.85rem; }
</style>
<div class="f">
<div class="i" style="flex:0 0 80px">fixed 80px</div>
<div class="i" style="flex:1">flex:1 (grows)</div>
<div class="i" style="flex:2">flex:2 (grows 2×)</div>
</div>Centering trick
The quickest way to center something in both directions:
.container {
display: flex;
justify-content: center;
align-items: center;
}
View code
<style>
.center-demo {
display: flex;
justify-content: center;
align-items: center;
height: 100px;
background: var(--ds-surface-alt);
border-radius: 8px;
}
.box {
background: #7c3aed;
color: #fff;
padding: 14px 24px;
border-radius: 6px;
font-weight: bold;
}
</style>
<div class="center-demo">
<div class="box">Perfectly centered</div>
</div>