39

Necesito centrar horizontalmente el div interno dentro del externo tomando como base este código HTML y CSS:

<div class="externo">
    <div class="interno">
    </div>
</div>
.interno {
    background-color: green;
    height: 20px;
    width: 50%;
}

.externo {
    background-color: red;
    width: 200px;
    padding: 20px;
}

JSFiddle: https://jsfiddle.net/fpvkcrkg/

Mosty Mostacho
  • 1,536
  • 2
  • 13
  • 15

12 Answers12

36

Usa márgenes laterales automáticos.

.externo {
  border: 1px solid blue;
}
.interno {
  border: 1px dashed goldenrod;
  margin: auto;
}
<div class="externo">
  <div class="interno">
    Hola
  </div>
</div>

Realmente solo debes de ponerlos en sus valores margin-left y margin-right, pero en tu caso al no requerir margen superior y/o inferior, te valdría de esa forma, ya que según la documentación si se espefica de esa forma sería igual que hacer:

.interno {
  margin: 0 auto;
}

Es decir, el superior e inferior es igual a cero.

Ruslan López
  • 10,060
  • 11
  • 35
  • 68
pzin
  • 864
  • 8
  • 17
  • 3
    Recordando sin embargo que mediante márgenes automáticos a derecha e izquierda es necesario definir el ancho del elemento mediante la propiedad `width`. – Felipe Calvo Dec 01 '15 at 22:29
  • 1
    Lo que es una obviedad, porque en caso de no indicar ancho, el valor es igual a `auto`, lo que en un elemento de bloque, como es el caso de OP (¿PO? ¿AO?), cubriría todo el ancho disponible y ya no habría que centrar nada. – pzin Dec 02 '15 at 13:54
19

Existen muchas formas de centrar elementos con CSS, sin embargo una de las que mayor fuerza han tomado en el último año es el uso de Flexbox.

Usando Flexbox el contenedor no necesita tener ninguna propiedad especifica para ubicarse en el espacio, sin embargo usando las propiedades de Flexbox para los hijos se puede hacer cosas impensables con el CSS tradicional.

.externo {
  border: 1px solid blue;
  align-items: center;
  display: flex;
  justify-content: center;
}
.interno {
  border: 1px dashed goldenrod;
}
<div class="externo">
  <div class="interno">
    Hola
  </div>
</div>

Para conocer más acerca de Flexbox te recomiendo visitar los siguientes enlaces:


Si buscas una solución que no incluya Flexbox entonces te recomiendo visitar Centering in CSS: A Complete Guide. Esta es la guía absoluta de como centrar elementos utilizando CSS sin importar el navegador que necesites soportar.

Ruslan López
  • 10,060
  • 11
  • 35
  • 68
Dave Gomez
  • 372
  • 1
  • 6
  • creo que pondria el display: flex antes de el align-items. (De hecho, pondria el display antes de casi cualquier cosa) – Fabián Heredia Montiel Dec 01 '15 at 19:19
  • 2
    Los recursos vinculados deberian estar en español, no? – Fabián Heredia Montiel Dec 01 '15 at 19:19
  • Ojalá hubiera recursos en español tan buenos, además creo que el idioma del sitio no debería excluir las buenas fuentes de información que ya existen, sería limitarnos sin necesidad. Por otro lado, las propiedades están ordenadas en orden alfabético, es solo cuestión de estilo y buenas prácticas. – Dave Gomez Dec 01 '15 at 19:21
  • Estoy de acuerdo, pero por ejemplo en mi respuesta use la inteo de MDN en español; el cual es suficiente para esta pregunta/respuesta? https://developer.mozilla.org/es/docs/Web/CSS/CSS_Flexible_Box_Layout/Usando_las_cajas_flexibles_CSS – Fabián Heredia Montiel Dec 01 '15 at 19:22
  • 4
    Sigue sin ser tan buena y detallada como las tres que enlazo... Insisto, por qué limitarnos? StackOverflow en Español no debe ser una excusas para evitar aprender un idioma que nos va a ayudar enormemente en impulsar nuestras carreras como desarrolladores. No ganamos nada con la exclusión. – Dave Gomez Dec 01 '15 at 19:24
  • 4
    Estoy de acuerdo... limitarnos a vínculos en Español sería extremadamente limitado (y bastante triste) – Jcl Dec 01 '15 at 19:27
  • 1
    @FabiánHerediaMontiel no necesariamente, los recursos adicionales no son parte de la respuesta, son una fuente de información adicional para el que quiera/pueda leerlos. Lo que si es importante es que si el link contiene la respuesta, ese texto se debe incluir acá en la respuesta y explicado en español – Carlos Muñoz Dec 01 '15 at 19:35
  • @DaveGomez, Estoy de acuerdo, el español es un idioma menos tècnico pero tiene un publico grande que justifica su soporte en SO. – Perdomoff Dec 01 '15 at 22:32
  • Recuerden que se puede usar el un poco rústico Google translate. – Rafael Dec 02 '15 at 19:43
  • align-items: center; está de más. – agujex Dec 13 '15 at 23:12
13

Agrega un margin:0 auto; a la clase interno en el CSS para lograr centrarlo horizontalmente dentro del div externo

.interno {
  background-color: green;
  height: 20px;
  width: 50%;
  margin: 0 auto;/*esto fue lo que se agregó*/
}
.externo {
  background-color: red;
  width: 200px;
  padding: 20px;
  text-align:center;
}
<div class="externo">
  <div class="interno">
    Hola
  </div>
</div>
Emilio Gort
  • 290
  • 1
  • 12
6

Puedes aplicar este CSS al div interno:

.interno {
  width: 50%;
  margin: 0 auto;
  border: 1px dashed goldenrod;
}
.externo {
  border: 1px solid blue;
}
<div class="externo">
  <div class="interno">
    Hola
  </div>
</div>

Por supuesto, no tienes que establecer el ancho al 50%. Cualquier ancho inferior al del div padre funcionará. El margin: 0 auto es lo que hace el centrado en sí.

Si quieres incluir IE8+, puede que sea mejor usar esto en su lugar:

.interno {
  display: table;
  margin: 0 auto;
  border: 1px dashed goldenrod;
}
.externo {
  border: 1px solid blue;
}
<div class="externo">
  <div class="interno">
    Hola
  </div>
</div>

Hará que el elemento interno se centre horizontalmente, y funciona sin especificar un ancho concreto.

Fuente

JSFiddle

Hewbot
  • 1,457
  • 2
  • 11
  • 16
5

Puedes usar un flexbox en el div externo.

.externo {
  display: flex;
  justify-content: center;
  border: 1px solid blue;
}
.interno {
  border: 1px dashed goldenrod;
}
<div class="externo">
  <div class="interno">
    Hola
  </div>
</div>
Ruslan López
  • 10,060
  • 11
  • 35
  • 68
4

.interno {
  background-color: green;
  height: 20px;
  width: 50%;
  margin: 0 auto;
}
.externo {
  border: 1px solid blue;
}
<div class="externo">
  <div class="interno">
    Hola
  </div>
</div>

Simplemente añadiendo la última línea, se centra con respecto a su padre.

Ruslan López
  • 10,060
  • 11
  • 35
  • 68
eugenio
  • 550
  • 2
  • 8
4

Otra forma es usar transform: translateX

Establecer en el div externo una posición relative, absolute o fixed y debe tener dimensiones definidas.

En el div interno position: absolute y left: 50%, luego aplicar transform: translateX(-50%).

.externo {
  position: relative;
  width: 200px;
  height: 100px;
  background: gray;
}

.interno {
  position: absolute;
  left: 50%;
  width: 50%;
  height: 50%;
  transform: translateX(-50%);
  background: red;
}
<div class="externo">
  <div class="interno">
    
  </div>
</div>

Probado en:

  • Opera 24.0 (desde v12.1)
  • Safari 5.1.7 (desde v4 con prefijo -webkit-)
  • Firefox 31.0 (desde v3.6 con prefijo -moz-, desde v16 sin prefijo)
  • Chrome 46 (desde v11 con prefijo -webkit-, desde v36 sin prefijo)
  • IE 9, 11, 10 (desde v9 con prefijo -ms-, desde v10 sin prefijo)
  • Edge (todos)
  • Mas navegadores Compatibles en: Can I Use?

Nota: Combinado con translateY produce un centrado en ambos ejes. Hay que agregar al div interno top: 50%.

.externo {
  position: relative;
  width: 200px;
  height: 100px;
  background: gray;
}

.interno {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 50%;
  height: 50%;
  transform: translate(-50%, -50%);
  background: red;
}
<div class="externo">
  <div class="interno">
    
  </div>
</div>
pzin
  • 864
  • 8
  • 17
rnrneverdies
  • 16,491
  • 3
  • 49
  • 79
0

Simplemente añade display: inline-block al <div> interior y lo centras añadiendo text-align: center al <div> exterior.

Quedaría así:

  .interno {
    height: 20px;
    width: 50%;
    background-color: green;
    display: inline-block;
  }
  .externo {
    background-color: red;
    width: 200px;
    padding: 20px;
    text-align: center;
  }
<div class="externo">
  <div class="interno">
    Hola
  </div>
</div>
Ruslan López
  • 10,060
  • 11
  • 35
  • 68
0

Lo Mas Rápido Es Incluir la Etiqueta dentro de la Parte esa de código, sin CSS Ni Flex-Bos Ni Na De Na...Eso se Hace así de sencillo:

<center>
  <div class="externo">
      <div class="interno">
      </div>
  </div>
</center>
.interno {
    background-color: green;
    height: 20px;
    width: 50%;
}

.externo {
    background-color: red;
    width: 200px;
    padding: 20px;
}
0

Lo Mas Rápido Es Incluir la Etiqueta dentro de la Parte esa de código, sin CSS Ni Flex-Bos Ni Na De Na...Eso se Hace así de sencillo:

HTML CODE:

<center>
  <div class="externo">
      <div class="interno">
      </div>
  </div>
</center>

CSS CODE:
.interno {
    background-color: green;
    height: 20px;
    width: 50%;
}

.externo {
    background-color: red;
    width: 200px;
    padding: 20px;
}
-2

Simplemente tienes que utilizar impresion 3D que es, el famozo z-index permite posicionar elementos debajo o encima de, de acuerdo al valor asigbado a cada objeto.

z-index: 1 z-index: 2

El elemento uno va a estar debajo del elemento 2.

  • 2
    ¿Cómo es que `z-index` se puede usar para centrar un elemento? Esta propiedad solo maneja el nivel de visibilidad de elementos en stacking. – gugadev Feb 26 '17 at 07:12
-2

La forma más simple es con la etiqueta html "center", también puedes hacerlo con flexbox, position absolute, margen automático, etc.

Algunos ejemplos:

.interno {
  width: 20%;
  height: 50px;
  text-align: center;
  line-height: 50px;
  color: #fff;
}

.externo {
  width: 50%;
  height: 50px;
  position: relative;
  background-color: #ccc;
}

#ejemplo1 .interno {
  background-color: blue;
}

#ejemplo2 .interno {
  position: absolute;
  left: calc(50% - 10%);
  background-color: green;
}

#ejemplo3 .interno {
  margin: 0 auto;
  background-color: red;
}

#ejemplo4.externo {
  display: flex;
  justify-content: center;
}

#ejemplo4 .interno {
  background-color: salmon;
}
<div class="externo" id="ejemplo1">
  <!--etiqueta center (no recomendable)-->
  <center>
    <div class="interno">
      hola mundo
    </div>
  </center>
</div>

<hr>

<div class="externo" id="ejemplo2">
  <!--posición abosluta calculada-->
  <div class="interno">
    hola mundo
  </div>
</div>

<hr>

<div class="externo" id="ejemplo3">
  <!--margen automático (recomendable)-->
  <div class="interno">
    hola mundo
  </div>
</div>

<hr>

<div class="externo" id="ejemplo4">
  <!--flexbox (recomendable)-->
  <div class="interno">
    hola mundo
  </div>
</div>
  • 1
    Hola @Pablo Por favor deja en el post ejemplos de código. Tu respuesta debe ser útil incluso si el vínculo hoy día se rompe. – JuanK Dec 14 '15 at 20:44
  • 2
    No es recomendable el uso del elemento `
    `, este es un elemento obsoleto (*deprecated*) y perderá soporte en el futuro. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/center
    – Diego Dec 14 '15 at 21:22