1Le flux normal
Même sans CSS, le navigateur place les éléments selon le flux normal : les éléments block (div, p, h1, section, nav) s’empilent verticalement et occupent la largeur disponible. Les éléments inline (a, span, strong, img) restent sur la même ligne et passent à la suivante si besoin.
2display
La propriété display détermine le type de boîte d’un élément et la façon dont ses enfants sont organisés.
| Valeur | Comportement |
|---|---|
block | Commence à la ligne et occupe la largeur disponible. Largeur, hauteur et espacements s’appliquent. |
inline | Reste dans une ligne de texte. Width et height ne s’appliquent pas à la plupart des éléments inline ; les marges verticales non plus. |
inline-block | Reste sur une ligne, tout en acceptant width, height, margin et padding. |
none | Totalement retiré : invisible, sans espace et non annoncé par les lecteurs d’écran. |
flex | Aligne les enfants en ligne ou colonne, avec un contrôle des espacements (section 6). |
grid | Organise les enfants en lignes et colonnes en même temps (section 7). |
contents | La boîte du parent disparaît ; ses enfants se comportent comme s’ils étaient dans le grand-parent. |
display: none vs visibility: hidden vs opacity: 0
| Prend de la place | Cliquable | À utiliser pour | |
|---|---|---|---|
display:none | Non | Non | Menus, onglets, panneaux cachés |
visibility:hidden | Oui | Non | Masquer sans modifier la mise en page |
opacity:0 | Oui | Oui | Animations de fondu |
3Le modèle de boîte
Chaque élément est une boîte avec quatre couches, de l’intérieur vers l’extérieur : content, padding (espace intérieur), border, puis margin (espace extérieur).
Pensez à box-sizing: border-box
Par défaut, une largeur de 300px et un padding de 20px de chaque côté donnent une boîte de 340px, ce qui provoque souvent des débordements. Avec border-box, les bordures et le padding font partie de la largeur déclarée.
*, *::before, *::after { box-sizing: border-box; }
Raccourcis de margin
margin: 10px; /* all four sides */
margin: 10px 20px; /* vertical | horizontal */
margin: 10px 20px 30px; /* top | horizontal | bottom */
margin: 10px 20px 30px 40px; /* top right bottom left (clockwise) */
margin: 0 auto; /* centers a block that has a width */
margin-left: auto; /* pushes an element to the far right */
4position
La propriété position définit si un élément reste dans le flux normal. Les propriétés top, right, bottom et left servent ensuite à le déplacer ou le fixer.
| Valeur | Dans le flux ? | Décalage mesuré depuis… | Utilisation courante |
|---|---|---|---|
static | Oui | Les décalages sont ignorés (défaut) | Mise en page normale |
relative | Oui (conserve sa place) | Sa position d’origine | Petit décalage ou référence pour ses enfants |
absolute | Non | Parent de positionnement le plus proche | Badges, boutons en coin, menus déroulants |
fixed | Non | La fenêtre du navigateur | Boutons flottants et barres toujours visibles |
sticky | Oui | Le conteneur de défilement, après le seuil | En-têtes, titres de tableaux, menus latéraux |
Essayez
Élément avant
Passez le parent en static : le bloc se positionne par rapport à la page extérieure. Choisissez relative : les éléments voisins restent à leur place. En absolute, ils comblent l’espace laissé libre.
Raccourcis de positionnement
inset: 0; /* top, right, bottom, left all 0: stretch to fill the parent */
position: absolute; top: 0; right: 0; /* pin to top-right corner */
position: absolute; inset: 0; margin: auto; width: 200px; height: 100px; /* centered */
fixed
.chat-button { position: fixed; right: 20px; bottom: 20px; }
L’élément reste visible pendant le défilement. Attention : certaines propriétés d’un parent, comme transform, filter ou perspective, peuvent modifier son repère.
sticky
Un élément sticky a besoin d’un seuil (comme top: 0) et de suffisamment d’espace pour se déplacer. Faites défiler la boîte ci-dessous.
Ligne 1
Ligne 2
Ligne 3
Ligne 4
Ligne 5
Ligne 6
Ligne 7
Ligne 8
header { position: sticky; top: 0; z-index: 10; background: #fff; }
5z-index et superposition
z-index détermine quel élément recouvre les autres. Une valeur supérieure passe devant, mais seulement pour les éléments positionnés ou les enfants de Flexbox/Grid.
/* a simple scale that avoids chaos */
--z-dropdown: 100;
--z-sticky: 200;
--z-modal: 300;
--z-toast: 400;
6Flexbox
Flexbox organise les éléments dans une direction : navigation, groupes de boutons ou cartes côte à côte. Appliquez display: flex au parent pour transformer ses enfants en éléments flexibles.
.row { display: flex; gap: 16px; }
Il existe deux axes : l’axe principal suit la direction des éléments, et l’axe transversal lui est perpendiculaire. justify-content agit sur l’axe principal, align-items sur l’autre. Avec flex-direction: column, ils s’inversent.
Essayez
Propriétés du conteneur
| Propriété | Effet |
|---|---|
flex-direction | row | column | row-reverse | column-reverse |
justify-content | Répartit les éléments sur l’axe principal |
align-items | Aligne les éléments sur l’axe transversal |
flex-wrap | Autorise le retour à la ligne |
gap | Espace entre éléments (préférez-le aux marges) |
align-content | Espace entre lignes après retour |
Propriétés des éléments enfants
| Propriété | Effet |
|---|---|
flex: 1 | L’élément occupe l’espace libre ; deux éléments flex: 1 le partagent. |
flex: 0 0 200px | Ne grandit pas et ne rétrécit pas : largeur de base 200px. |
flex-shrink: 0 | Empêche le rétrécissement (logos et icônes). |
align-self | Change l’alignement d’un seul enfant. |
order | Modifie l’ordre visuel sans changer le HTML. |
margin-left: auto | Prend l’espace libre et pousse l’élément à l’extrémité. |
7Grid
Grid sert aux mises en page qui utilisent lignes et colonnes ensemble : galeries, tableaux de bord et formulaires. Appliquez display: grid au parent et définissez les colonnes.
.grid {
display: grid;
grid-template-columns: 1fr 2fr 1fr; /* three columns, middle twice as wide */
gap: 16px;
}
.wide { grid-column: 1 / 3; } /* from line 1 to line 3 = 2 columns */
Cartes responsive sans media query
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 20px;
}
Chaque carte mesure au moins 240px, et le navigateur en place autant que possible sur chaque ligne.
Mise en page avec zones nommées
.page {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header"
"side main"
"footer footer";
min-height: 100vh;
}
header { grid-area: header; }
aside { grid-area: side; }
main { grid-area: main; }
footer { grid-area: footer; }
8Centrer des éléments
/* 1. Center anything, horizontally and vertically (best default) */
.parent { display: grid; place-items: center; }
/* 2. Same with flex */
.parent { display: flex; justify-content: center; align-items: center; }
/* 3. Center a block horizontally only */
.box { width: 600px; max-width: 100%; margin: 0 auto; }
/* 4. Center text */
.text { text-align: center; }
/* 5. Center an absolutely positioned element */
.box { position: absolute; inset: 0; margin: auto; width: 200px; height: 100px; }
/* 6. Center on the full screen */
.parent { min-height: 100vh; display: grid; place-items: center; }
9Comment faire pour… ?
Logo à gauche et liens à droite (navigation)
Appliquez Flexbox à la navigation, puis utilisez l’espace entre les éléments.
<nav class="nav"><a class="logo">DECT</a><ul class="links">…</ul></nav>
.nav { display: flex; justify-content: space-between; align-items: center; padding: 16px 32px; }
.links { display: flex; gap: 24px; list-style: none; margin: 0; padding: 0; }Logo à gauche, liens au centre et bouton à droite
Utilisez une grille à trois colonnes pour garder le groupe central parfaitement centré.
.nav { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; }
.nav .cta { justify-self: end; }Garder la navigation en haut pendant le défilement
.nav { position: sticky; top: 0; z-index: 100; background: #fff; }Pousser un lien à l’extrême droite
Une marge automatique pousse cet élément vers l’extrémité.
.links { display: flex; gap: 16px; }
.links .login { margin-left: auto; }Bouton dans le coin supérieur droit d’une carte
La carte devient le repère avec relative, et le bouton est fixé avec absolute.
.card { position: relative; padding: 24px; }
.close { position: absolute; top: 12px; right: 12px; }Ajouter un badge de notification sur une icône
.icon { position: relative; display: inline-block; }
.badge { position: absolute; top: -6px; right: -6px; }Fixer un bouton flottant en bas à droite
.fab { position: fixed; right: 20px; bottom: 20px; z-index: 50; }Afficher un menu déroulant sous un lien
Ce CSS montre seulement le positionnement. Un menu déroulant accessible doit gérer le clavier, le toucher, le focus et l’état ouvert.
.item { position: relative; }
.dropdown { position: absolute; top: 100%; left: 0; display: none; min-width: 180px; z-index: 100; }
.item:hover .dropdown { display: block; }Créer une fenêtre modale sur fond assombri
Ceci n’est qu’un exemple de mise en page. Une vraie modale doit gérer le focus, la fermeture et la touche Échap. Pensez à l’élément natif dialog.
.overlay { position: fixed; inset: 0; background: rgba(0,0,0,.5); display: grid; place-items: center; z-index: 300; }
.modal { background: #fff; padding: 24px; width: min(480px, 92vw); border-radius: 8px; }Garder le pied de page en bas d’une page courte
body { min-height: 100vh; display: flex; flex-direction: column; margin: 0; }
main { flex: 1; } /* takes all leftover space, footer is pushed down */Créer une barre latérale et un contenu principal
.layout { display: grid; grid-template-columns: 260px 1fr; gap: 24px; }
.sidebar { position: sticky; top: 16px; align-self: start; }Cartes de même hauteur avec bouton en bas
.cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 20px; }
.card { display: flex; flex-direction: column; }
.card .btn { margin-top: auto; }Placer deux boutons côte à côte et espacés
.actions { display: flex; gap: 12px; }Créer un hero plein écran avec texte centré
.hero { min-height: 100vh; display: grid; place-items: center; text-align: center; }Empiler les colonnes sur mobile, côte à côte sur ordinateur
.row { display: flex; flex-direction: column; gap: 20px; }
@media (min-width: 768px) { .row { flex-direction: row; } .row > * { flex: 1; } }Masquer le menu sur mobile et afficher un bouton hamburger
.burger { display: none; }
@media (max-width: 767px) { .links { display: none; } .burger { display: block; } }Superposer un texte sur une image
.hero { position: relative; }
.hero img { width: 100%; display: block; }
.hero .text { position: absolute; left: 24px; bottom: 24px; color: #fff; }10Problèmes fréquents
| Problème | Cause | Solution |
|---|---|---|
| Un élément absolute part au coin de la page | Aucun parent positionné | position: relative sur le parent |
| Le parent perd sa hauteur | Tous les enfants sont absolute ou flottants | Donnez une hauteur au parent ou gardez un enfant dans le flux |
| z-index ne fonctionne pas | Élément static ou autre contexte de superposition | Add position: relative; augmentez le z-index du parent |
| Une barre de défilement horizontale apparaît | Un élément dépasse l’écran : padding, 100vw ou mot trop long | box-sizing: border-box; use width: 100%; overflow-wrap: anywhere |
| Width et height sans effet | L’élément est inline (span, a) | display: inline-block or block |
| La marge haute d’un enfant déplace le parent | Fusion des marges | Ajoutez du padding au parent ou utilisez display: flow-root |
| Petit espace sous une image | Les images inline suivent la ligne de base du texte | img { display: block; } |
| Sticky ne colle pas | Top absent ou overflow défini sur un parent | Add top: 0; remove overflow from ancestors |
| Un élément flex déborde avec du texte long | L’élément refuse de devenir plus petit que son contenu | min-width: 0 sur l’élément |
| 100vh trop grand sur téléphone | La barre du navigateur est comptée dans 100vh | Use 100dvh |
| Un élément fixed ne reste pas fixe | Un parent possède transform ou filter | Déplacez l’élément ou retirez le transform |
| Le centrage vertical échoue | Le parent n’a pas de hauteur | Ajoutez min-height |
Méthode de débogage
/* 1. Show every box */
* { outline: 1px solid rgba(255,0,0,.4); }
/* 2. In the browser: right-click → Inspect → hover the element
The colors show margin, border, padding and content.
3. Check the "Computed" tab for the real display and position. */
11Unités et dimensions
| Unité | Sens | À utiliser pour |
|---|---|---|
px | Pixels fixes | Bordures, ombres et détails |
% | Pourcentage du parent | Largeurs flexibles |
rem | Multiple de la police racine (souvent 16px) | Polices et espacements |
em | Multiple de la police de l’élément | Padding proportionnel au texte |
vw / vh | 1 % de la largeur / hauteur de l’écran | Sections plein écran |
dvh | Hauteur adaptée aux barres mobiles | Plein écran sur mobile |
fr | Part de l’espace libre dans Grid | Colonnes Grid |
width: min(1100px, 92%); /* never wider than 1100px, never touching the edges */
font-size: clamp(1rem, 2.5vw, 1.5rem); /* min | preferred | max */
.container { max-width: 1100px; margin-inline: auto; padding-inline: 20px; }
img { max-width: 100%; height: auto; } /* images never overflow */
12Aide-mémoire
| Je veux… | Utiliser |
|---|---|
| Ranger en ligne ou colonne | display: flex + gap |
| Créer des lignes et colonnes | display: grid |
| Centrer un élément | display: grid; place-items: center |
| Centrer un bloc horizontalement | margin: 0 auto + a width |
| Espacer les éléments | gap (parent) rather than margins on children |
| Pousser un élément à l’extrémité | margin-left: auto (flex) |
| Fixer dans un coin du parent | parent relative + child absolute |
| Fixer à l’écran | position: fixed |
| Coller pendant le défilement | position: sticky; top: 0 |
| Recouvrir toute une zone | position: absolute; inset: 0 |
| Afficher ou masquer | display: none / block |
| Gérer les superpositions | z-index on a positioned element |
| Inclure le padding dans la largeur | box-sizing: border-box |
Pour aller plus loin
Référence CSS de MDN · Ressources CSS du W3C