Co dokładnie jest potrzebne do „margin: 0 auto;” pracować?

205

Wiem, że ustawienie margin: 0 auto;elementu służy do jego wyśrodkowania (lewy-prawy). Wiem jednak, że element i jego rodzic muszą spełniać określone kryteria, aby automatyczny margines działał, i nigdy nie wydaje mi się, aby magia była właściwa.

Moje pytanie jest więc proste: jakie właściwości CSS należy ustawić na elemencie i jego elemencie macierzystym, margin: 0 auto;aby wyśrodkować dziecko w lewo-prawo?

Chowlett
źródło
to wydaje się nigdy nie działać poprawnie dla mnie w IE ... więc jestem też ciekawa tego.
mpen
5
@Mark: IE będzie działał margin: 0 auto;poprawnie tylko w trybie standardów, więc potrzebujesz doctype (tak jakby nie był wcześniej potrzebny).
BoltClock

Odpowiedzi:

292

Z czubka mojej głowy:

  1. Element musi być na poziomie bloku, np. display: blockLubdisplay: table
  2. Element nie może się unosić
  3. Element nie może mieć stałej ani absolutnej pozycji 1

Z głów innych ludzi:

  1. Element musi mieć wartość inną widthniż auto2

Zauważ, że wszystkie te warunki muszą być spełnione, aby element był wyśrodkowany, aby działał.


1 Jest jeden wyjątek: jeśli twój nieruchomy lub absolutnie pozycjonowany element ma left: 0; right: 0, to będzie centrum z marginesami samochodowych .

2 Technicznie margin: 0 autodziała z automatyczną szerokością, ale automatyczna szerokość ma pierwszeństwo przed automatycznymi marginesami, w wyniku czego automatyczne marginesy są zerowane, co sprawia, że ​​wydaje się, że „nie działa”.

BoltClock
źródło
7
Dwie odpowiedzi „z góry mojej głowy”: o
Russell Dias,
4
dodaj stałą szerokość, a otrzymasz idealną odpowiedź
meo,
1
Cholera! Wszyscy inni odpowiedzieli, kiedy ja kodowałem! Poza czubkiem głowy też ...: O
Kyle
Tęsknię za ol startatrybutem (i nie da się tego zrobić w Markdown) :(
BoltClock
1
@Triynko: Ani pytanie, ani moja odpowiedź nigdy nie mówiły nic o atrybutach prezentacji HTML (pytanie nie jest nawet oznaczone [html]!), Więc nie jestem pewien, na co dokładnie nazywasz byka. W każdym razie, chociaż każdy element, na który można kierować CSS, może mieć właściwości szerokości i wysokości CSS, nie wszystkie elementy HTML mogą mieć odpowiednie atrybuty prezentacji, a powodem tego jest po prostu to, że nie ma sensu mieć ich na określonych Elementy HTML.
BoltClock
19

Z czubka mojej głowy potrzebuje width. Musisz określić szerokość centrowanego kontenera (nie szerokość nadrzędną).

Russell Dias
źródło
16
Wszystko wychodzi nam z głowy!
BoltClock
8

Pełna reguła dla CSS:

  1. ( display: blockI widthnie auto) LUBdisplay: table
  2. float: none
  3. position: relative
Luca C.
źródło
3

Z czubka mojej głowy, jeśli element nie jest elementem blokowym - zrób to.

a następnie nadaj jej szerokość.

Barrie Reader
źródło
2

Będzie także działał z display: table - użyteczną właściwością display w tym przypadku, ponieważ nie wymaga ustawienia szerokości. (Wiem, że ten post ma 5 lat, ale nadal jest odpowiedni dla przechodniów;)

j1mm1nycr1cket
źródło
2

Z czubka głowy mojego kota upewnij się, że ustawienie div, którego próbujesz wyśrodkować, nie jest ustawionewidth: 100% .

Jeśli tak, to ważne będą reguły określone dla div div dziecka.

Sam Malayek
źródło
1

Przejdź do tego szybkiego przykładu, który stworzyłem jsFiddle . Hopefull jest łatwy do zrozumienia. Możesz użyć wrapperdiv z szerokością strony, aby wyśrodkować. Powodem widthjest to, że przeglądarka wie, że nie wybierasz płynnego układu.

Broda
źródło
1

Oto moja sugestia:

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
źródło
0

Być może interesujące jest to, że nie trzeba określać szerokości <button>elementu, aby działał - po prostu upewnij się, że ma on display:block: http://jsfiddle.net/muhuyttr/

qbolec
źródło
-1

Dla każdego, kto właśnie trafia w to pytanie i nie jest w stanie go naprawić margin: 0 auto, oto coś, co odkryłem, że może ci się przydać: tableelement bez określonej szerokości musi mieć, display: tablea nie display: block w celu margin: autowykonania pracy. Dla niektórych może to być oczywiste, ponieważ połączenie display: blocki widthwartość domyślna da tabelę, która rozszerzy się, aby wypełnić swój pojemnik, ale jeśli chcesz, aby tabela miała „naturalną” szerokość i była wyśrodkowana, potrzebujeszdisplay: table

samson
źródło
To nie jest prawda. (Chociaż, jeśli tylko dać go display: blockto nie spotka stan 4 zaakceptowanej odpowiedzi)
Quentin
@Quentin dzięki za heads up. W moim przypadku nie chciałem, aby stół wypełniał przestrzeń poziomą (co wydawałoby się, że mogłoby to uniemożliwić całą dyskusję margin: 0 auto), a także nie mogłem określić szerokości stołu, ponieważ jego zawartość może mieć różne szerokości. W tym przypadku jedynym rozwiązaniem, które działa (tzn. Renderuje tabelę w normalny sposób, ale wyśrodkowuje ją), nie jest reguła szerokości, display: tableamargin: 0 auto
samson