Menu

Cómo centrar un div en CSS: todos los métodos, medidos

Todas las formas de centrar un div en horizontal, en vertical o en ambos ejes: flexbox, grid, margin auto, posición absoluta con transform, inset con margin auto y align-content. Cada una se ejecuta en vivo y mide su propio centrado, con una tabla de cuándo usar cada una.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

La respuesta corta

Para centrar un div en horizontal y en vertical dentro de su padre, convierte al padre en un grid y centra su contenido:

.parent {
  display: grid;
  place-items: center;
  min-height: 200px; /* the parent needs room to center in */
}

Funciona con un hijo de cualquier tamaño y no necesita nada en el propio hijo. Abajo hay seis métodos lado a lado. Cada caja se mide a sí misma después de renderizarse e indica a qué distancia está su centro del centro del padre:

Los seis indican 0px en los dos ejes (el borde de 1px del escenario es igual en todos los lados, así que no desplaza el centro). Cambia el ancho o el texto de una caja y vuelve a ejecutarlo: los métodos que no dependen de un tamaño fijo se quedan en 0.

Qué método usar

MétodoCentra¿El hijo necesita un tamaño fijo?Ideal para
Grid place-items: centerLos dos ejesNoLa opción por defecto: un hijo en una caja
Flexbox justify-content + align-itemsLos dos ejesNoUna fila o columna de elementos, centrados como grupo
margin: auto en un padre flex o gridLos dos ejesNoCentrar un elemento mientras sus hermanos se colocan de otra forma
margin: 0 autoSolo horizontalUn width o max-widthContenedores de página, artículos, formularios en el flujo normal
Absolute + translate(-50%, -50%)Los dos ejesNoCapas, etiquetas y modales encima de otro contenido
Absolute + inset: 0; margin: autoLos dos ejesSí, ancho y altoDiálogos de tamaño fijo
align-content: center en un bloqueVerticalNoCentrar en vertical sin cambiar el display del padre

Método 1: flexbox

Flexbox centra en dos ejes con dos propiedades. justify-content se encarga del eje principal (horizontal en una fila) y align-items del eje transversal:

Con varios hijos, flexbox los centra como grupo y los mantiene en fila. Ahí es donde le gana a grid, que apilaría los tres elementos en una columna centrada. La página de justify-content explica todos los valores de alineación.

Método 2: grid

place-items: center es la abreviatura de align-items: center más justify-items: center. En un contenedor grid con un solo hijo, centra ese hijo en las dos direcciones:

min-height en lugar de height permite que el padre crezca si la tarjeta pasa de 180px de alto, en vez de que la tarjeta se desborde.

Método 3: margin: 0 auto (horizontal)

Un elemento de bloque con un ancho menor que su contenedor se puede centrar en horizontal con márgenes laterales automáticos. El navegador reparte el espacio libre a partes iguales entre los dos lados:

La segunda caja ocupa todo el ancho, así que no hay espacio libre y nada se mueve. Esa es la razón habitual de que margin: 0 auto "no funcione". Además, en el flujo normal solo centra en horizontal; ahí los márgenes auto verticales valen 0. Sin embargo, dentro de un padre flex o grid, margin: auto centra en las dos direcciones, que es la tercera caja de la comparación de arriba.

Método 4: posición absoluta y transform

Cuando el elemento debe quedar encima de otro contenido (una etiqueta sobre una foto, un modal sobre la página), posiciónalo de forma absoluta al 50% y retrocédelo la mitad de su propio tamaño:

top: 50%; left: 50% pone la esquina superior izquierda del elemento en el centro. Los porcentajes de translate() se refieren al tamaño del propio elemento, así que -50% lo retrocede la mitad de su ancho y de su alto, sean cuales sean. El padre debe estar posicionado (position: relative), o el elemento se centra en la página. El posicionamiento se explica en la página de position.

Una variante para elementos de tamaño conocido: position: absolute; inset: 0; margin: auto; más un width y un height. Los márgenes auto reparten el espacio en los cuatro lados.

Método 5: align-content en un bloque normal

align-content: center ahora también funciona en contenedores de bloque normales, no solo en los flex y grid. Centra el contenido en vertical sin cambiar cómo se colocan los hijos:

.parent {
  min-height: 200px;
  align-content: center;   /* vertical centering, still display: block */
}
.child {
  max-width: 300px;
  margin-inline: auto;     /* horizontal centering */
}

Es compatible con las versiones actuales de Chrome, Firefox y Safari. Los navegadores más antiguos lo ignoran, así que usa grid si tienes que darles soporte.

Centrar en toda la pantalla

Para centrar un diálogo en el viewport sin importar el desplazamiento, combina una capa fija de pantalla completa con grid:

.overlay {
  position: fixed;
  inset: 0;                     /* covers the viewport */
  display: grid;
  place-items: center;
  background: rgb(0 0 0 / 50%);
}

Para centrar en vertical el contenido de toda una página, usa min-height: 100dvh en el padre en lugar de 100vh: en los teléfonos, 100vh incluye la zona detrás de las barras del navegador, así que el "centro" queda demasiado abajo.

Centrar texto es otro trabajo

Todo lo anterior centra una caja. Para centrar el texto dentro de una caja, usa text-align: center en ella, como se muestra en la página de centrar texto en HTML. A menudo necesitas las dos cosas: grid para centrar la tarjeta y text-align para centrar las líneas dentro de ella.

Errores comunes

  • Un padre sin altura. Centrar en vertical necesita espacio libre; un padre que se ajusta a su contenido no tiene.
  • margin: 0 auto en un bloque de ancho completo. Dale primero un width o un max-width.
  • margin: auto para centrar en vertical en el flujo normal. Ahí los márgenes auto verticales valen 0; usa flex o grid.
  • Centrado absoluto sin un padre posicionado. El elemento se centra en la página, no en la caja.
  • align-items: center en el hijo. Las propiedades de alineación van en el padre (el contenedor flex o grid), salvo margin: auto y align-self.
  • text-align: center para centrar un bloque. Centra el contenido inline (texto, imágenes, hijos inline-block), no un hijo de bloque.

Preguntas frecuentes

¿Cómo centro un div en horizontal y en vertical?

Convierte al padre en un grid y centra su contenido: .parent { display: grid; place-items: center; }. La versión con flexbox es display: flex; justify-content: center; align-items: center;. En los dos casos el padre necesita una altura mayor que la del div.

¿Cómo centro un div solo en horizontal?

Dale un ancho y márgenes laterales automáticos: .box { width: 300px; margin: 0 auto; } (o max-width para un bloque responsive). margin-inline: auto es lo mismo con propiedades lógicas.

¿Por qué margin: 0 auto no centra mi div?

El div no tiene un ancho menor que su contenedor, así que no hay espacio libre que repartir (un bloque ocupa todo el ancho por defecto). Define width o max-width. Tampoco hace nada en elementos inline y nunca centra en vertical en el flujo normal.

¿Por qué mi div no se centra en vertical?

El padre solo es tan alto como su contenido, así que no hay espacio extra en el que centrar. Dale una altura al padre (o min-height) y usa el centrado de grid o flexbox.

¿Cuál es la forma más fácil de centrar un div?

display: grid; place-items: center; en el padre: dos declaraciones, los dos ejes, un hijo de cualquier tamaño. Usa flexbox cuando el padre además coloca otros elementos en fila.

¿Cómo centro el texto dentro de un div?

Usa text-align: center en el div para el texto y el contenido inline. Centrar el div y centrar el texto que tiene dentro son dos trabajos distintos.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR