Ce qu'est la margin
La margin est l'espace à l'extérieur de la bordure d'un élément. Elle est toujours transparente, et son rôle est d'éloigner les autres éléments. Dans l'exemple, le conteneur gris se voit à travers la margin autour de la boîte bleue :
La bande grise ne fait pas partie de la boîte : le fond de la boîte s'arrête à sa bordure. Pour un espace qui prend le fond de l'élément, utilisez le padding.
Le raccourci margin
margin accepte de une à quatre valeurs, dans le même ordre horaire que padding :
| Déclaration | Haut | Droite | Bas | Gauche |
|---|---|---|---|---|
margin: 10px; | 10 | 10 | 10 | 10 |
margin: 10px 20px; | 10 | 20 | 10 | 20 |
margin: 10px 20px 30px; | 10 | 20 | 30 | 20 |
margin: 10px 20px 30px 40px; | 10 | 20 | 30 | 40 |
Chaque côté a aussi sa propre propriété (margin-top, margin-right, margin-bottom, margin-left) et des versions logiques qui suivent le sens du texte (margin-inline-start, margin-inline-end, margin-block, margin-inline).
Contrairement à padding, margin accepte auto et les valeurs négatives :
| Valeur | Exemple | Remarques |
|---|---|---|
| Longueur | 16px, 1.5rem | La plus courante |
| Pourcentage | 5% | De la largeur du bloc conteneur, pour les quatre côtés |
auto | margin: 0 auto | Le navigateur remplit l'espace restant |
| Négative | margin-top: -10px | Rapproche l'élément ou son voisin, peut créer un chevauchement |
Centrer avec margin: 0 auto
margin: 0 auto est la façon classique de centrer un bloc horizontalement. auto des deux côtés demande au navigateur de partager l'espace restant à parts égales. Il faut une largeur inférieure à celle du conteneur, sinon il ne reste rien à partager :
Les marges auto ne centrent pas verticalement dans le flux normal (les marges auto verticales valent 0) et n'ont aucun effet sur les éléments inline. Pour une vue d'ensemble du centrage, voir comment centrer une div.
La fusion des marges
Quand deux marges verticales se touchent, elles ne s'additionnent pas. Le navigateur ne garde que la plus grande. Ici, la première boîte a margin-bottom: 30px et la seconde margin-top: 20px, et l'écart entre elles est de 30px, pas de 50px :
La fusion est voulue : elle permet aux paragraphes et aux titres de porter chacun leur espacement sans le doubler là où ils se rencontrent. Elle surprend dans un second cas, quand la marge du haut d'un enfant s'échappe de son parent :
Dans le premier parent, la marge de 30px de l'enfant a fusionné à travers le bord supérieur du parent : elle pousse tout le parent vers le bas au lieu de créer un espace gris à l'intérieur. L'une de ces solutions l'empêche :
display: flow-rootsur le parent (contrairement àoverflow: hidden, il ne rogne rien).- Un padding ou une bordure sur le bord supérieur du parent.
- Un parent flex ou grid : les marges des éléments flex et grid ne fusionnent jamais.
Les marges horizontales ne fusionnent jamais, pas plus que les marges des éléments flottants ou positionnés en absolu.
Les marges négatives
Une marge négative tire dans la direction opposée. Du côté du haut ou du début, elle déplace l'élément lui-même ; du côté du bas ou de la fin, elle rapproche l'élément suivant. Les boîtes peuvent se chevaucher :
margin auto en flexbox
Dans un conteneur flex, une marge auto prend tout l'espace libre de son côté. C'est la façon la plus simple de pousser un élément tout au bout d'une ligne, et en flexbox auto fonctionne aussi verticalement :
margin-inline-start: auto place l'espace libre avant « Log in », en fin de ligne, sur les pages de gauche à droite comme de droite à gauche.
Erreurs courantes
margin: 0 autosur un élément sans largeur. Un bloc remplit déjà son conteneur ; définissezwidthoumax-width.margin: autosur un élément inline. Les marges auto d'unspan, d'unaou d'unimgresté inline valent 0. Passez-le endisplay: block.- Additionner deux marges verticales en attendant leur somme. Elles fusionnent et seule la plus grande reste ; utilisez
gapen flex ou grid, ou une seule direction de marge de façon cohérente. - La marge d'un enfant qui pousse son parent. C'est la fusion parent-enfant ; ajoutez
display: flow-rootau parent. - Utiliser la margin pour un espace qui devrait avoir un fond. La margin est transparente ; utilisez le padding.
Questions fréquentes
Qu'est-ce que la margin en CSS ?
La margin est l'espace à l'extérieur de la bordure d'un élément. Elle est transparente et éloigne les éléments voisins. Elle se règle avec margin ou avec les propriétés par côté margin-top, margin-right, margin-bottom et margin-left.
Que fait margin: 0 auto ?
Il met les marges du haut et du bas à 0 et partage à parts égales l'espace horizontal restant entre les marges gauche et droite, ce qui centre horizontalement un élément de type bloc. L'élément doit avoir une largeur inférieure à celle de son conteneur, par exemple max-width: 600px.
Pourquoi margin auto ne centre-t-il pas mon élément ?
Le plus souvent parce que l'élément n'a pas de largeur (un bloc remplit son conteneur, il n'y a donc rien à partager), ou parce qu'il est inline (span, a, img par défaut), et dans ce cas les marges auto valent 0. Donnez-lui une largeur et display: block, ou centrez-le depuis le parent avec flexbox ou grid.
Qu'est-ce que la fusion des marges ?
Quand deux marges verticales se touchent, par exemple la marge du bas d'un paragraphe et la marge du haut du suivant, le navigateur n'utilise que la plus grande au lieu de les additionner. Cela ne concerne que les marges verticales des boîtes de type bloc dans le flux normal, pas les mises en page flex ou grid.
Une margin peut-elle être négative ?
Oui. Une marge négative tire l'élément vers ce côté, ou tire l'élément suivant par-dessus, si bien que les boîtes peuvent se chevaucher. C'est utile pour de petits ajustements d'alignement et pour faire sortir un élément du padding de son conteneur.