Lo que se necesita exactamente para "margen: 0 automático;" ¿trabajar?

206

Sé que la configuración margin: 0 auto;de un elemento se usa para centrarlo (izquierda-derecha). Sin embargo, sé que el elemento y su elemento primario deben cumplir ciertos criterios para que funcione el margen automático, y parece que nunca puedo obtener la magia correcta.

Entonces, mi pregunta es simple: ¿qué propiedades CSS deben establecerse en un elemento y su elemento primario para margin: 0 auto;poder centrar de izquierda a derecha al elemento secundario?

Chowlett
fuente
Esto nunca parece funcionar correctamente para mí en IE ... así que tengo curiosidad por esto también.
mpen
55
@ Mark: IE manejará margin: 0 auto;correctamente solo en modo estándar, por lo que necesita un doctype (como si antes no fuera necesario).
BoltClock

Respuestas:

292

La parte superior de mi cabeza:

  1. El elemento debe estar a nivel de bloque, por ejemplo display: blockodisplay: table
  2. El elemento no debe flotar.
  3. El elemento no debe tener una posición fija o absoluta 1

Fuera de la cabeza de otras personas:

  1. El elemento debe tener un widthque no sea auto2

Tenga en cuenta que todas estas condiciones deben ser ciertas para que el elemento esté centrado para que funcione.


1 Hay una excepción a esto: si su fijo o elemento con posición absoluta tiene left: 0; right: 0, que se centrará en los márgenes de automóviles .

2 Técnicamente, margin: 0 autofunciona con un ancho automático, pero el ancho automático tiene prioridad sobre los márgenes automáticos y, como resultado, los márgenes automáticos se ponen a cero, por lo que parece que "no funcionan".

BoltClock
fuente
77
Dos respuestas "fuera de mi cabeza": o
Russell Dias
44
agregue el ancho fijo y obtendrá la respuesta perfecta
meo
1
¡Maldición! ¡Todos los demás respondieron mientras yo estaba codificando! Fuera de mi cabeza también ...: O
Kyle
Echo de menos el ol startatributo (y no es posible lograrlo en Markdown) :(
BoltClock
1
@Triynko: Ni la pregunta ni mi respuesta dijeron nada acerca de los atributos de presentación HTML (¡la pregunta ni siquiera está etiquetada [html]!), Por lo que no estoy seguro de qué es exactamente lo que estás diciendo. De todos modos, si bien cada elemento que puede ser dirigido con CSS puede tener las propiedades de ancho y alto de CSS, no todos los elementos HTML pueden tener los atributos de presentación correspondientes, y la razón de esto es simplemente que no tiene sentido tenerlos en ciertos Elementos HTML
BoltClock
19

Fuera de mi cabeza, necesita un width. Debe especificar el ancho del contenedor que está centrando (no el ancho principal).

Russell Dias
fuente
16
¡Todo se nos viene a la cabeza!
BoltClock
8

Regla completa para CSS:

  1. ( display: blockY widthno automático) Odisplay: table
  2. float: none
  3. position: relative
Luca C.
fuente
3

Fuera de mi cabeza, si el elemento no es un elemento de bloque, hazlo así.

y luego darle un ancho.

Barrie Reader
fuente
2

También funcionará con display: table: una propiedad de visualización útil en este caso porque no requiere que se establezca un ancho. (Sé que esta publicación tiene 5 años, pero aún es relevante para los transeúntes;)

j1mm1nycr1cket
fuente
2

Desde la parte superior de la cabeza de mi gato, asegúrese de que el divque está tratando de centrar no esté configurado width: 100%.

Si es así, las reglas establecidas en los divs secundarios son lo que importará.

Sam Malayek
fuente
1

Vaya a este ejemplo rápido que he creado jsFiddle . Espero que sea fácil de entender. Puede usar un wrapperdiv con el ancho del sitio para centrar la alineación. La razón por la que debe indicarlo widthes que el navegador sabe que no va por un diseño líquido.

Barbilla
fuente
1

Aquí está mi sugerencia:

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

Quizás sea interesante que no tenga que especificar el ancho de un <button>elemento para que funcione, solo asegúrese de que tenga display:block: http://jsfiddle.net/muhuyttr/

qbolec
fuente
-1

Para cualquiera que acabe de responder esta pregunta y no pueda solucionarlo margin: 0 auto, he aquí algo que descubrí que puede encontrar útil: un tableelemento sin ancho especificado debe tener display: tabley no display: block paramargin: auto poder trabajar. Esto puede ser obvio para algunos, ya que la combinación de display: blocky el widthvalor predeterminado dará una tabla que se expande para llenar su contenedor, pero si desea que la tabla tome su ancho "natural" y esté centrada, necesitadisplay: table

Sansón
fuente
Eso no es verdad. (Aunque si solo lo das display: block, no cumplirá la condición 4 de la respuesta aceptada)
Quentin
@Quentin gracias por el aviso. En mi caso, no quería que la tabla llene el espacio horizontal (lo que parecería obviar toda la discusión margin: 0 auto) y tampoco pude especificar el ancho de la tabla, ya que su contenido podría tener diferentes anchos. En este caso, la única solución que funciona (es decir, renderiza la tabla de la manera normal pero la centra) no es una regla de ancho, display: tableymargin: 0 auto
samson