Apa, tepatnya, yang dibutuhkan untuk "margin: 0 auto;" bekerja?

206

Saya tahu bahwa pengaturan margin: 0 auto;pada elemen digunakan untuk memusatkannya (kiri-kanan). Namun, saya tahu bahwa elemen dan induknya harus memenuhi kriteria tertentu agar margin otomatis berfungsi, dan sepertinya saya tidak pernah bisa mendapatkan keajaiban dengan benar.

Jadi pertanyaan saya sederhana: properti CSS apa yang harus ditetapkan pada suatu elemen dan orang tuanya agar margin: 0 auto;dapat memusatkan kiri-kanan anak?

Chowlett
sumber
ini sepertinya tidak pernah berfungsi dengan baik untuk saya di IE ... jadi saya ingin tahu tentang ini juga.
buka
5
@ Mark: IE akan menangani margin: 0 auto;dengan benar hanya dalam mode standar sehingga Anda memerlukan DOCTYPE (seolah-olah tidak diperlukan sebelumnya).
BoltClock

Jawaban:

292

Dari atas kepala saya:

  1. Elemen harus berupa blok-level, misalnya display: blockataudisplay: table
  2. Elemen tidak boleh mengambang
  3. Elemen tidak boleh memiliki posisi tetap atau absolut 1

Di atas kepala orang lain:

  1. Elemen harus memiliki widthyang bukan auto2

Perhatikan bahwa semua kondisi ini harus benar dari elemen yang dipusatkan agar berfungsi.


1 Ada satu pengecualian untuk ini: jika Anda tetap atau elemen benar-benar diposisikan memiliki left: 0; right: 0, itu akan pusat dengan margin auto .

2 Secara teknis, margin: 0 automemang bekerja dengan lebar otomatis, tetapi lebar otomatis lebih diutamakan daripada margin otomatis, dan margin otomatis menjadi nol, sehingga seolah-olah "tidak berfungsi".

BoltClock
sumber
7
Dua jawaban 'Di luar kepala saya': o
Russell Dias
4
tambahkan lebar tetap dan Anda mendapatkan jawaban yang sempurna
meo
1
Sial! Semua orang menjawab saat saya menulis kode! Dari atas kepala saya juga ...: O
Kyle
Saya kehilangan ol startatribut (dan tidak mungkin melakukan penurunan harga) :(
BoltClock
1
@Triynko: Baik pertanyaan maupun jawaban saya tidak pernah mengatakan apa pun tentang atribut presentasi HTML (pertanyaan itu bahkan tidak ditandai [html]!), Jadi saya tidak yakin apa sebenarnya yang Anda panggil. Lagi pula, sementara setiap elemen yang dapat ditargetkan dengan CSS dapat memiliki properti lebar dan tinggi CSS, tidak semua elemen HTML dapat memiliki atribut presentasi yang sesuai, dan alasannya adalah karena tidak masuk akal untuk memilikinya pada tertentu Elemen HTML.
BoltClock
19

Dari atas kepala saya, perlu a width. Anda harus menentukan lebar wadah yang Anda tuju (bukan lebar induk).

Russell Dias
sumber
16
Semuanya keluar dari kepala kita!
BoltClock
8

Aturan lengkap untuk CSS:

  1. ( display: blockDAN widthbukan otomatis) ATAUdisplay: table
  2. float: none
  3. position: relative
Luca C.
sumber
3

Dari atas kepala saya, jika elemen tersebut bukan elemen blok - buatlah begitu.

dan kemudian berikan lebar.

Barrie Reader
sumber
2

Ini juga akan berfungsi dengan display: table - properti display yang berguna dalam hal ini karena tidak memerlukan lebar untuk diatur. (Saya tahu posting ini berusia 5 tahun, tetapi masih relevan untuk orang yang lewat;)

j1mm1nycr1cket
sumber
2

Dari atas kepala kucing saya, pastikan divAnda mencoba untuk pusat tidak diatur ke width: 100%.

Jika ya, maka aturan yang ditetapkan pada div anak adalah yang penting.

Sam Malayek
sumber
1

Silakan buka contoh cepat ini yang saya buat jsFiddle . Semoga mudah dimengerti. Anda dapat menggunakan wrapperdiv dengan lebar situs untuk meluruskan pusat. Alasan Anda harus meletakkannya widthadalah agar browser tahu Anda tidak akan menggunakan tata letak cair.

Dagu
sumber
1

Ini saran saya:

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;
Bhui Anirban
sumber
0

Mungkin menarik bahwa Anda tidak harus menentukan lebar untuk <button>elemen agar bisa berfungsi - pastikan saja memiliki display:block: http://jsfiddle.net/muhuyttr/

qbolec
sumber
-1

Bagi siapa pun sekarang memukul pertanyaan ini, dan tidak mampu memperbaiki margin: 0 auto, di sini ini sesuatu yang saya menemukan Anda mungkin menemukan berguna: a tableelemen tanpa lebar tertentu harus memiliki display: tabledan tidak display: block dalam rangka untuk margin: automelakukan pekerjaan. Ini mungkin jelas bagi sebagian orang, karena kombinasi dari display: blockdan nilai default widthakan memberikan tabel yang diperluas untuk mengisi wadahnya, tetapi jika Anda ingin tabel mengambil lebar "alami" dan dipusatkan, Anda perludisplay: table

samson
sumber
Itu tidak benar. (Meskipun jika Anda hanya memberikannya display: blockmaka tidak akan memenuhi syarat 4 dari jawaban yang diterima)
Quentin
@ Quentin, terima kasih atas bantuannya. Dalam kasus saya, saya tidak ingin tabel mengisi ruang horisontal (yang tampaknya akan meniadakan seluruh diskusi tentang margin: 0 auto) dan saya juga tidak dapat menentukan lebar tabel, karena isinya dapat memiliki lebar yang berbeda. Dalam hal ini, satu-satunya solusi yang berfungsi (yaitu merender tabel dengan cara normal tetapi memusatkannya) adalah tanpa aturan lebar, display: tabledanmargin: 0 auto
samson