Empiler des éléments avec un espacement constant
HTML
<div class="stack">
<div>A</div>
<div>B</div>
</div>
CSS
.stack {
display: flex;
flex-direction: column;
gap: 1rem;
}
Layouts, structures et utilitaires réutilisables.
<div class="stack">
<div>A</div>
<div>B</div>
</div>
.stack {
display: flex;
flex-direction: column;
gap: 1rem;
}
.stack-sm {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
Variantes possibles : gap variable.
<div class="cluster">
<button>A</button>
<button>B</button>
</div>
.cluster {
display: flex;
flex-wrap: wrap;
gap: 1rem;
align-items: center;
}
Variantes possibles : align-items, gap.
<div class="split">
<div>A</div>
<div>B</div>
</div>
.split { display: flex; }
.split > * { flex: 1; }
Variantes possibles : ratios personnalisés.
<div class="switcher">
<div>A</div>
<div>B</div>
</div>
.switcher {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}
.switcher > * { flex: 1 1 300px; }
Variantes possibles : largeur minimale.
<div class="cover">
<header>H</header>
<main>C</main>
<footer>F</footer>
</div>
.cover {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.cover > main { flex: 1; }
.cover-center > main {
display: grid;
place-content: center;
}
<div class="reel">
<div>A</div>
<div>B</div>
</div>
.reel {
display: flex;
overflow-x: auto;
gap: 1rem;
scroll-snap-type: x mandatory;
}
.reel > * { scroll-snap-align: start; }
<div class="auto-grid">
<div>A</div>
<div>B</div>
</div>
.auto-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
}
<article class="card">
<h2>Titre</h2>
<p>Texte</p>
</article>
.card {
padding: 1rem;
border: 1px solid #ddd;
border-radius: 8px;
}
.card-soft { background: #fafafa; }
Variantes possibles : border, fond.
<div class="media">
<img src="img.jpg">
<p>Texte</p>
</div>
.media {
display: flex;
gap: 1rem;
align-items: center;
}
.media-top { align-items: flex-start; }
Variantes possibles : align-items.
<div class="input-group">
<input>
<button>OK</button>
</div>
.input-group { display: flex; }
.input-group > * { border-radius: 0; }
.input-group-tight > * { margin-left: -1px; }
Variantes possibles : spacing, border.
<button class="tip" data-tip="Info">?</button>
.tip { position: relative; }
.tip:hover::after {
content: attr(data-tip);
position: absolute;
top: 100%;
left: 0;
background: #111;
color: #fff;
padding: 0.25rem 0.5rem;
font-size: 0.75rem;
}
.tip:hover::after { border-radius: 4px; }
Variantes possibles : position, fond.
<div class="sidebar">
<aside>Menu</aside>
<main>Contenu</main>
</div>
.sidebar {
display: flex;
gap: 1rem;
}
.sidebar > aside { flex: 0 0 200px; }
.sidebar-fluid > aside { flex: 1 0 20%; }
Variantes possibles : largeur fixe ou fluide.
<article class="flow">
<h2>Titre</h2>
<p>Texte</p>
</article>
.flow > * + * { margin-top: 1rem; }
.flow-sm > * + * { margin-top: 0.5rem; }
Variantes possibles : marge variable.
<h1 class="trim">Titre</h1>
.trim {
leading-trim: both;
text-edge: cap;
}
.trim-start { leading-trim: start; }
Variantes possibles : start, end, both.
<div class="center">A</div>
.center {
display: flex;
justify-content: center;
align-items: center;
}
<div class="wrapper">Texte</div>
.wrapper {
max-width: 60ch;
margin-inline: auto;
}
<span class="vh">Texte</span>
.vh {
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
}
.vh-clip { clip-path: inset(50%); }
Variantes possibles : clip, absolute.