Structure minimale
HTML
<!DOCTYPE html>
<html lang="fr">
<head></head>
<body></body>
</html>
Breakpoints courants pour adapter les interfaces sur mobile, tablette et desktop en portrait et paysage.
<!DOCTYPE html>
<html lang="fr">
<head></head>
<body></body>
</html>
<header>Titre</header>
<main>Contenu</main>
<footer>Informations legales</footer>
<header>
<h1>Titre du site</h1>
<nav>Liens</nav>
</header>
<main>
<section>
<h2>Section</h2>
<p>Texte</p>
</section>
</main>
<footer>
<p>Mentions légales</p>
</footer>
Variantes possibles : plusieurs sections, articles, aside.
<section>
<h2>Fonctionnalités</h2>
<p>Description du bloc.</p>
</section>
Bon usage : un titre interne obligatoire.
<article>
<h2>Actualité</h2>
<p>Texte indépendant.</p>
</article>
Bon usage : contenu pouvant exister seul (RSS, partage...).
<aside>
<h2>À lire aussi</h2>
<ul>
<li>Lien 1</li>
<li>Lien 2</li>
</ul>
</aside>
Bon usage : contenu secondaire lié au principal.
<nav aria-label="Navigation principale">
<ul>
<li><a href="/">Accueil</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
Bon usage : uniquement pour des liens de navigation.
<figure>
<img src="img.jpg" alt="Description">
<figcaption>Légende de l’image</figcaption>
</figure>
Bon usage : images, graphiques, extraits de code, citations.
<blockquote cite="https://source.com">
<p>Texte cité.</p>
</blockquote>
Bon usage : citation longue, avec source si possible.
<address>
Contact : <a href="mailto:contact@example.com">contact@example.com</a>
</address>
Bon usage : coordonnées d’une personne ou organisation.
<details>
<summary>Voir plus</summary>
<p>Contenu caché.</p>
</details>
Bon usage : FAQ, contenu secondaire.
<img src="img.jpg" alt="Description">
<img src="shape.svg" aria-hidden="true" alt="">
Variantes possibles : alt vide pour décoratif.
<button aria-label="Ouvrir le menu">☰</button>
Bon usage : aria-label quand le texte n’est pas explicite.
<section aria-labelledby="t1">
<h2 id="t1">Titre de section</h2>
<p>Contenu.</p>
</section>
Bon usage : aria-labelledby pour relier un titre.
<label for="email">Email</label>
<input id="email" type="email">
Bon usage : jamais de placeholder seul.
<label for="name">Nom</label>
<input id="name" aria-required="true">
Bon usage : aria-required pour lecteurs d’écran.
<nav aria-label="Navigation principale">
<ul>
<li><a href="/">Accueil</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
Bon usage : aria-label pour préciser le rôle.
<a href="#main" class="skip">Aller au contenu</a>
.skip {
position: absolute;
left: 0;
top: 0;
transform: translateY(-100%);
}
.skip:focus { transform: translateY(0); }
Bon usage : toujours premier, visible uniquement au focus clavier.
<button id="menuBtn" aria-expanded="false" aria-controls="menuPanel">
Menu
</button>
<nav id="menuPanel" hidden>
<ul>
<li><a href="#">Lien 1</a></li>
<li><a href="#">Lien 2</a></li>
</ul>
</nav>
menuBtn.onclick = () => {
const expanded = menuBtn.getAttribute("aria-expanded") === "true";
menuBtn.setAttribute("aria-expanded", !expanded);
menuPanel.hidden = expanded;
};
Bon usage : aria-expanded reflète toujours l’état réel du menu.
<div class="card">
<span class="icon" aria-hidden="true">★</span>
<h3>Titre</h3>
<p>Texte utile.</p>
</div>
.icon {
font-size: 2rem;
color: #ccc;
}
Bon usage : aria-hidden="true" sur les éléments purement visuels.
<table>
<thead>
<tr>
<th scope="col">Nom</th>
<th scope="col">Âge</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Alice</th>
<td>24</td>
</tr>
</tbody>
</table>
Bon usage : scope="col" / scope="row".
<title>Titre de la page</title>
<meta name="description" content="Texte clair adaptée au contenu.">
<link rel="canonical" href="https://example.com/page">
Bon usage : une seule URL canonique par page.
<meta name="robots" content="index, follow">
Variantes possibles : noindex, nofollow, noarchive…
<meta property="og:title" content="Titre de la page">
<meta property="og:description" content="Résumé clair.">
<meta property="og:url" content="https://example.com/page">
<meta property="og:type" content="website">
Bon usage : cohérent avec title + meta description.
<link rel="alternate" href="https://example.com/fr/page" hreflang="fr">
<link rel="alternate" href="https://example.com/en/page" hreflang="en">
Bon usage : une entrée par langue / région.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Nom du site",
"url": "https://example.com"
}
</script>
Bon usage : adapté au type de contenu (Article, Product…).
<link rel="icon" href="./favicon.svg" type="image/svg+xml">
<link rel="icon" href="./favicon.ico" sizes="any">
<link rel="icon" href="../favicon.svg" type="image/svg+xml">
<link rel="icon" href="../favicon.ico" sizes="any">
Safari ne supporte pas WebP comme favicon. SVG + ICO est recommandé.
<link rel="apple-touch-icon" href="./apple-touch-icon.png">
<link rel="apple-touch-icon" href="../apple-touch-icon.png">
iOS ignore SVG et WebP. PNG est obligatoire.
<link rel="icon" href="./favicon.svg" type="image/svg+xml">
<link rel="icon" href="./favicon.ico" sizes="any">
<link rel="icon" href="../favicon.svg" type="image/svg+xml">
<link rel="icon" href="../favicon.ico" sizes="any">
SVG est recommandé. ICO reste le fallback universel.
<link rel="icon" href="./assets/icon.webp" type="image/webp">
<link rel="icon" href="../assets/icon.webp" type="image/webp">
WebP n’est pas supporté par Safari et iOS. À utiliser en complément.
<link rel="manifest" href="./site.webmanifest">
<link rel="manifest" href="../site.webmanifest">
À utiliser uniquement si le site est une PWA.
<div class="stack">
<div>Bloc 1</div>
<div>Bloc 2</div>
<div>Bloc 3</div>
</div>
.stack {
display: flex;
flex-direction: column;
gap: 1rem;
}
<div class="auto-grid">
<div>Bloc 1</div>
<div>Bloc 2</div>
<div>Bloc 3</div>
<div>Bloc 4</div>
</div>
.auto-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
Variantes possibles : minmax personnalisé.
<div class="masonry">
<div class="item">Bloc 1</div>
<div class="item">Bloc 2 plus long</div>
<div class="item">Bloc 3 encore plus long avec plus de texte</div>
<div class="item">Bloc 4</div>
</div>
.masonry {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
grid-template-rows: masonry;
gap: 1rem;
}
Bon usage : chaque bloc a sa propre hauteur, aucun alignement forcé.
<span class="compact">Label important</span>
.compact {
white-space: nowrap; /* empêche tout retour à la ligne */
font-weight: 600; /* poids lisible */
letter-spacing: 0.02em; /* léger tracking */
line-height: 1.2; /* hauteur compacte */
overflow: hidden; /* évite les débordements */
text-overflow: ellipsis; /* ajoute ... si trop long */
display: inline-block; /* permet un contrôle précis */
max-width: 100%; /* évite de casser la mise en page */
}
Bon usage : badges, tags, labels, boutons, éléments courts non cassables.
.txt {
line-height: 1.5;
font-size: clamp(0.8rem, 1.5vw, 0.9rem);
}
Variantes possibles : 1.4 → 1.7.
Bon usage : légendes, labels, infos secondaires.
:root {
--fs-1: clamp(0.85rem, 1.5vw, 1rem);
--fs-2: clamp(1rem, 2vw, 1.25rem);
--fs-3: clamp(1.25rem, 3vw, 1.5rem);
--fs-4: clamp(1.5rem, 4vw, 2rem);
}
Bon usage : cohérence typographique sur tout le site.
<img src="img.webp" alt="Texte">
<img src="img-800.webp" srcset="img-400.webp 400w, img-800.webp 800w" alt="Texte">
Variantes possibles : srcset, sizes.
<link rel="preconnect" href="https://cdn.example.com">
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>
Variantes possibles : preload, preconnect.
<button id="t">Toggle</button>
<div id="box">Texte</div>
t.onclick = () => box.classList.toggle("open");
.open {
display: block;
}
Variantes possibles : toggle class.
.wrapper {
max-width: 60ch;
margin-inline: auto;
}
.center {
display: grid;
place-content: center;
}
Variantes possibles : flex, grid.
.click:active {
background: #eee;
}
.ripple {
position: relative;
overflow: hidden;
}
.ripple:active::after {
content: "";
position: absolute;
inset: 0;
background: rgba(0,0,0,0.1);
}
Variantes possibles : highlight, ripple.