Ce qui est exactement nécessaire pour "margin: 0 auto;" travailler?

206

Je sais que le réglage margin: 0 auto;d'un élément est utilisé pour le centrer (gauche-droite). Cependant, je sais que l'élément et son parent doivent répondre à certains critères pour que la marge automatique fonctionne, et je n'arrive jamais à faire le bon choix.

Ma question est donc simple: quelles propriétés CSS doivent être définies sur un élément et son parent pour margin: 0 auto;centrer l'enfant de gauche à droite?

Chowlett
la source
cela ne semble jamais fonctionner correctement pour moi dans IE ... donc je suis curieux à ce sujet aussi.
mpen
5
@Mark: IE ne gérera margin: 0 auto;correctement qu'en mode standard, vous avez donc besoin d'un doctype (comme si vous n'en aviez pas besoin auparavant).
BoltClock

Réponses:

292

Du haut de ma tête:

  1. L'élément doit être de niveau bloc, par exemple display: blockoudisplay: table
  2. L'élément ne doit pas flotter
  3. L'élément ne doit pas avoir de position fixe ou absolue 1

Du haut de la tête des autres:

  1. L'élément doit avoir un widthqui n'est pas auto2

Notez que toutes ces conditions doivent être vraies pour que l'élément soit centré pour qu'il fonctionne.


1 Il y a une exception à cela: si votre élément fixe ou absolument positionné a left: 0; right: 0, il sera centré avec des marges automatiques .

2 Techniquement, margin: 0 autofonctionne avec une largeur automatique, mais la largeur automatique a priorité sur les marges automatiques, et les marges automatiques sont mises à zéro en conséquence, donnant l'impression qu'elles "ne fonctionnent pas".

BoltClock
la source
7
Deux réponses «du haut de ma tête»: o
Russell Dias
4
ajoutez la largeur fixe et vous avez la réponse parfaite
meo
1
Zut! Tout le monde a répondu pendant que je codais! Du haut de ma tête aussi ...: O
Kyle
L' ol startattribut me manque (et il n'est pas possible de retirer dans Markdown) :(
BoltClock
1
@Triynko: Ni la question ni ma réponse n'ont jamais dit quoi que ce soit sur les attributs de présentation HTML (la question n'est même pas balisée [html]!), Donc je ne sais pas exactement sur quoi vous appelez bull. Quoi qu'il en soit, alors que chaque élément qui peut être ciblé avec CSS peut avoir les propriétés CSS width et height, tous les éléments HTML ne peuvent pas avoir les attributs de présentation correspondants, et la raison en est simplement que cela n'a pas de sens de les avoir sur certains Éléments HTML.
BoltClock
19

Du haut de ma tête, il a besoin d'un width. Vous devez spécifier la largeur du conteneur que vous centrez (pas la largeur parent).

Russell Dias
la source
16
Tout vient du haut de nos têtes!
BoltClock
8

Règle complète pour CSS:

  1. ( display: blockET widthpas automatique) OUdisplay: table
  2. float: none
  3. position: relative
Luca C.
la source
3

Du haut de ma tête, si l'élément n'est pas un élément de bloc - faites-le.

puis donnez-lui une largeur.

Barrie Reader
la source
2

Cela fonctionnera également avec display: table - une propriété d'affichage utile dans ce cas car elle ne nécessite pas de largeur. (Je sais que ce message a 5 ans, mais il est toujours pertinent pour les passants;)

j1mm1nycr1cket
la source
2

Du haut de la tête de mon chat, assurez- divvous que celui que vous essayez de centrer n'est pas réglé sur width: 100%.

Si c'est le cas, alors les règles établies sur les divs enfants seront ce qui importera.

Sam Malayek
la source
1

Veuillez consulter cet exemple rapide que j'ai créé jsFiddle . Espérons que c'est facile à comprendre. Vous pouvez utiliser un wrapperdiv avec la largeur du site pour centrer l'alignement. La raison que vous devez mettre widthest que le navigateur sait que vous n'allez pas pour une mise en page liquide.

Menton
la source
1

Voici ma suggestion:

First: 
      1. Add display: block or table
      2. Add position: relative
      3. Add width:(percentage also works fine)
Second: 
      if above trick not works then you have to add float:none;
Anirban Bhui
la source
0

Il est peut-être intéressant que vous n'ayez pas à spécifier la largeur d'un <button>élément pour le faire fonctionner - assurez-vous simplement qu'il a display:block: http://jsfiddle.net/muhuyttr/

qbolec
la source
-1

Pour quiconque vient de frapper cette question et ne peut pas résoudre margin: 0 auto, voici quelque chose que j'ai découvert que vous pourriez trouver utile: un tableélément sans largeur spécifiée doit avoir display: tableet pas display: block pour margin: autofaire du travail. Cela peut être évident pour certains, car la combinaison de display: blocket la widthvaleur par défaut donnera une table qui se développe pour remplir son conteneur, mais si vous voulez que la table prenne sa largeur "naturelle" et soit centrée, vous avez besoindisplay: table

Samson
la source
Ce n'est pas vrai. (Bien que si vous le donnez simplement, il display: blockne remplira pas la condition 4 de la réponse acceptée)
Quentin
@Quentin merci pour l'avertissement. Dans mon cas, je ne voulais pas que le tableau remplisse l'espace horizontal (ce qui semblerait éviter toute la discussion margin: 0 auto) et je ne pouvais pas non plus spécifier la largeur du tableau, car son contenu pouvait avoir des largeurs différentes. Dans ce cas, la seule solution qui fonctionne (c.-à-d. Rend la table normale mais la centre) n'est pas une règle de largeur, display: tableetmargin: 0 auto
samson