Was genau wird für "margin: 0 auto;" benötigt? arbeiten?

205

Ich weiß, dass die Einstellung margin: 0 auto;eines Elements verwendet wird, um es zu zentrieren (links-rechts). Ich weiß jedoch, dass das Element und sein übergeordnetes Element bestimmte Kriterien erfüllen müssen, damit der automatische Rand funktioniert, und ich kann nie scheinen, die Magie richtig zu machen.

Meine Frage ist also einfach: Welche CSS-Eigenschaften müssen für ein Element und sein übergeordnetes Element festgelegt werden, damit das untergeordnete Element margin: 0 auto;von links nach rechts zentriert werden kann?

Chowlett
quelle
Das scheint für mich im IE nie richtig zu funktionieren ... also bin ich auch neugierig darauf.
Mpen
5
@Mark: IE wird margin: 0 auto;nur im Standardmodus korrekt verarbeitet , sodass Sie einen Doctype benötigen (als ob einer vorher nicht benötigt worden wäre).
BoltClock

Antworten:

292

Aus dem Kopf:

  1. Das Element muss auf Blockebene sein, z. B. display: blockoderdisplay: table
  2. Das Element darf nicht schweben
  3. Das Element darf keine feste oder absolute Position 1 haben

Aus den Köpfen anderer Leute:

  1. Das Element muss eine haben width, die nicht auto2 ist

Beachten Sie, dass alle diese Bedingungen für das zentrierte Element gelten müssen, damit es funktioniert.


1 Es gibt eine Ausnahme: wenn Ihre festen oder absolut positionierten Element left: 0; right: 0, es wird mit Auto - Margen Zentrum .

2 Funktioniert technisch gesehen margin: 0 automit einer automatischen Breite, aber die automatische Breite hat Vorrang vor den automatischen Rändern, und die automatischen Ränder werden als Ergebnis auf Null gesetzt, sodass es so aussieht, als ob sie "nicht funktionieren".

BoltClock
quelle
7
Zwei Antworten auf den ersten Blick: o
Russell Dias
4
Wenn Sie die feste Breite hinzufügen, erhalten Sie die perfekte Antwort
meo
1
Verdammt! Alle anderen antworteten, während ich wegcodierte! Aus dem Kopf auch ...: O
Kyle
Ich vermisse das ol startAttribut (und es ist nicht möglich, in Markdown durchzuziehen) :(
BoltClock
1
@Triynko: Weder die Frage noch meine Antwort sagten jemals etwas über HTML-Präsentationsattribute aus (die Frage ist nicht einmal mit [html] markiert!), Daher bin ich mir nicht sicher, worauf Sie genau Bull anrufen. Während jedes Element, auf das mit CSS abgezielt werden kann, die CSS-Eigenschaften width und height haben kann, können nicht alle HTML-Elemente die entsprechenden Präsentationsattribute haben, und der Grund dafür ist einfach, dass es nicht sinnvoll ist, sie auf bestimmten zu haben HTML-Elemente.
BoltClock
19

Auf den ersten Blick braucht es eine width. Sie müssen die Breite des zu zentrierenden Containers angeben (nicht die übergeordnete Breite).

Russell Dias
quelle
16
Alles kommt von unseren Köpfen!
BoltClock
8

Vollständige Regel für CSS:

  1. ( display: blockUND widthnicht automatisch) ODERdisplay: table
  2. float: none
  3. position: relative
Luca C.
quelle
3

Wenn das Element kein Blockelement ist, machen Sie es so.

und geben Sie ihm dann eine Breite.

Barrie Reader
quelle
2

Es funktioniert auch mit display: table - eine nützliche Anzeigeeigenschaft in diesem Fall, da keine Breite festgelegt werden muss. (Ich weiß, dass dieser Beitrag 5 Jahre alt ist, aber für Passanten immer noch relevant ist;)

j1mm1nycr1cket
quelle
2

Stellen divSie sicher, dass das, was Sie zentrieren möchten, nicht auf den Kopf meiner Katze eingestellt ist width: 100%.

Wenn dies der Fall ist, sind die Regeln für die untergeordneten Divs von Bedeutung.

Sam Malayek
quelle
1

Bitte gehen Sie zu diesem kurzen Beispiel, das ich mit jsFiddle erstellt habe . Hoffentlich ist es leicht zu verstehen. Sie können ein wrapperDiv mit der Breite der Site verwenden, um die Ausrichtung zu zentrieren. Der Grund, den Sie angeben müssen, widthist, dass der Browser weiß, dass Sie sich nicht für ein flüssiges Layout entscheiden.

Kinn
quelle
1

Hier ist mein Vorschlag:

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
quelle
0

Es ist vielleicht interessant, dass Sie keine Breite für ein <button>Element angeben müssen , damit es funktioniert - stellen Sie nur sicher, dass es Folgendes hat display:block: http://jsfiddle.net/muhuyttr/

qbolec
quelle
-1

Für jeden, der gerade diese Frage beantwortet und nicht in der Lage ist, sie zu beheben margin: 0 auto, ist Folgendes , das ich entdeckt habe, möglicherweise nützlich: Ein tableElement ohne angegebene Breite muss vorhanden sein display: tableund nicht display: block , margin: autodamit es funktioniert. Dies mag für einige offensichtlich sein, da die Kombination aus display: blockund dem Standardwert widtheine Tabelle ergibt, die erweitert wird, um ihren Container zu füllen. Wenn Sie jedoch möchten, dass die Tabelle ihre "natürliche" Breite annimmt und zentriert ist, müssen Siedisplay: table

Samson
quelle
Das stimmt nicht (Obwohl, wenn Sie es nur geben, es display: blockBedingung 4 der akzeptierten Antwort nicht erfüllt)
Quentin
@ Quentin danke für das Heads Up. In meinem Fall wollte ich nicht, dass die Tabelle den horizontalen Raum ausfüllt (was die gesamte Diskussion zu vermeiden scheint margin: 0 auto), und ich konnte auch die Breite der Tabelle nicht angeben, da ihr Inhalt unterschiedliche Breiten haben könnte. In diesem Fall ist die einzige Lösung, die funktioniert (dh die Tabelle wird normal display: tablemargin: 0 auto
gerendert