¿Cómo puedo centrar horizontalmente un <div>
dentro de otro <div>
usando CSS?
<div id="outer">
<div id="inner">Foo foo</div>
</div>
¿Cómo puedo centrar horizontalmente un <div>
dentro de otro <div>
usando CSS?
<div id="outer">
<div id="inner">Foo foo</div>
</div>
Respuestas:
Puede aplicar este CSS al interior <div>
:
#inner {
width: 50%;
margin: 0 auto;
}
Por supuesto, usted no tiene que establecer el width
a 50%
. Cualquier ancho menor que el que contenga <div>
funcionará. El margin: 0 auto
es lo que hace el centrado real.
Si está apuntando a Internet Explorer 8 (y posterior), podría ser mejor tener esto en su lugar:
#inner {
display: table;
margin: 0 auto;
}
Hará que el elemento interno se centre horizontalmente y funcione sin establecer un elemento específico width
.
Ejemplo de trabajo aquí:
#inner {
display: table;
margin: 0 auto;
border: 1px solid black;
}
#outer {
border: 1px solid red;
width:100%
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
margin-left: auto; margin-right: auto
creo.
margin:0 auto
: puede ser el margin: <whatever_vertical_margin_you_need> auto
segundo margen horizontal.
Si no desea establecer un ancho fijo en el interior div
, puede hacer algo como esto:
#outer {
width: 100%;
text-align: center;
}
#inner {
display: inline-block;
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
Eso convierte el interior div
en un elemento en línea con el que se puede centrar text-align
.
float: none;
y, probablemente, sólo es necesario porque #interno ha heredado una float
de cualquiera left
o right
de algún otro sitio en el CSS.
text-align
por lo que puede configurar de interiores text-align
a initial
o algún otro valor.
Los mejores enfoques son con CSS 3 .
#outer {
width: 100%;
/* Firefox */
display: -moz-box;
-moz-box-pack: center;
-moz-box-align: center;
/* Safari and Chrome */
display: -webkit-box;
-webkit-box-pack: center;
-webkit-box-align: center;
/* W3C */
display: box;
box-pack: center;
box-align: center;
}
#inner {
width: 50%;
}
<div id="outer">
<div id="inner">Foo foo</div>
</div>
Según su usabilidad, también puede usar las box-orient, box-flex, box-direction
propiedades.
Flex :
#outer {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
align-items: center;
}
Y esto explica por qué el modelo de caja es el mejor enfoque :
-webkit
banderas para FlexBox ( display: -webkit-flex;
y -webkit-align-items: center;
, y -webkit-justify-content: center;
)
Suponga que su div tiene 200 píxeles de ancho:
.centered {
position: absolute;
left: 50%;
margin-left: -100px;
}
Asegúrese de que el elemento padre esté posicionado , es decir, relativo, fijo, absoluto o fijo.
Si no conoce el ancho de su div, puede usarlo en transform:translateX(-50%);
lugar del margen negativo.
https://jsfiddle.net/gjvfxxdj/
Con CSS calc () , el código puede ser aún más simple:
.centered {
width: 200px;
position: absolute;
left: calc(50% - 100px);
}
El principio sigue siendo el mismo; coloque el artículo en el medio y compense el ancho.
He creado este ejemplo para mostrar cómo hacerlo vertical y horizontalmente align
.
El código es básicamente esto:
#outer {
position: relative;
}
y...
#inner {
margin: auto;
position: absolute;
left:0;
right: 0;
top: 0;
bottom: 0;
}
Y se mantendrá center
incluso cuando cambie el tamaño de su pantalla.
Algunos carteles han mencionado la forma de centrar CSS 3 usando display:box
.
Esta sintaxis está desactualizada y ya no debería usarse. [Ver también esta publicación] .
Entonces, para completar, aquí está la última forma de centrarse en CSS 3 usando el Módulo de diseño de caja flexible .
Entonces, si tiene un marcado simple como:
<div class="box">
<div class="item1">A</div>
<div class="item2">B</div>
<div class="item3">C</div>
</div>
... y desea centrar sus elementos dentro del cuadro, esto es lo que necesita en el elemento primario (.box):
.box {
display: flex;
flex-wrap: wrap; /* Optional. only if you want the items to wrap */
justify-content: center; /* For horizontal alignment */
align-items: center; /* For vertical alignment */
}
Si necesita admitir navegadores más antiguos que usan una sintaxis más antigua para flexbox, este es un buen lugar para buscar.
flex-direction
valor. Si es 'fila' (el valor predeterminado), entonces justify-content: center;
es para la alineación horizontal (como mencioné en la respuesta) Si es 'columna', entonces justify-content: center;
es para la alineación vertical.
Si no desea establecer un ancho fijo y no desea el margen adicional, agregue display: inline-block
a su elemento.
Puedes usar:
#element {
display: table;
margin: 0 auto;
}
display: table;
antes. ¿Qué hace?
Horizontal y verticalmente. Funciona con navegadores razonablemente modernos (Firefox, Safari / WebKit, Chrome, Internet Explorer 10, Opera, etc.)
.content {
position: absolute;
left: 50%;
top: 50%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
}
<div class="content">This works with any content</div>
Propiedad de alineación de caja de CSS 3
#outer {
width: 100%;
height: 100%;
display: box;
box-orient: horizontal;
box-pack: center;
box-align: center;
}
Recientemente tuve que centrar un div "oculto" (es decir, display:none;
) que tenía una forma de tabla dentro que debía centrarse en la página. Escribí el siguiente código jQuery para mostrar el div oculto y luego actualizar el contenido CSS al ancho generado automáticamente de la tabla y cambiar el margen para centrarlo. (La alternancia de visualización se activa al hacer clic en un enlace, pero este código no era necesario para mostrar).
NOTA: Estoy compartiendo este código, porque Google me trajo a esta solución de desbordamiento de pila y todo habría funcionado, excepto que los elementos ocultos no tienen ningún ancho y no pueden redimensionarse / centrarse hasta que se muestran.
$(function(){
$('#inner').show().width($('#innerTable').width()).css('margin','0 auto');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="inner" style="display:none;">
<form action="">
<table id="innerTable">
<tr><td>Name:</td><td><input type="text"></td></tr>
<tr><td>Email:</td><td><input type="text"></td></tr>
<tr><td>Email:</td><td><input type="submit"></td></tr>
</table>
</form>
</div>
La forma en que generalmente lo hago es usando la posición absoluta:
#inner{
left: 0;
right: 0;
margin-left: auto;
margin-right: auto;
position: absolute;
}
El div externo no necesita ninguna propiedad adicional para que esto funcione.
Para Firefox y Chrome:
<div style="width:100%;">
<div style="width: 50%; margin: 0px auto;">Text</div>
</div>
Para Internet Explorer, Firefox y Chrome:
<div style="width:100%; text-align:center;">
<div style="width: 50%; margin: 0px auto; text-align:left;">Text</div>
</div>
La text-align:
propiedad es opcional para los navegadores modernos, pero es necesaria en el modo Quirks de Internet Explorer para la compatibilidad con navegadores heredados.
Utilizar:
#outerDiv {
width: 500px;
}
#innerDiv {
width: 200px;
margin: 0 auto;
}
<div id="outerDiv">
<div id="innerDiv">Inner Content</div>
</div>
Otra solución para esto sin tener que establecer un ancho para uno de los elementos es usar el transform
atributo CSS 3 .
#outer {
position: relative;
}
#inner {
position: absolute;
left: 50%;
transform: translateX(-50%);
}
El truco es que translateX(-50%)
establece el #inner
elemento 50 por ciento a la izquierda de su propio ancho. Puedes usar el mismo truco para la alineación vertical.
Aquí hay un violín que muestra la alineación horizontal y vertical.
Más información está en Mozilla Developer Network .
-webkit-transform: translate(-50%,0); -moz-transform: translate(-50%,0); -ms-transform: translate(-50%,0); -khtml-transform: translate(-50%,0); -o-transform: translate(-50%,0);
Chris Coyier, quien escribió una excelente publicación sobre 'Centrarse en lo desconocido' en su blog. Es un resumen de múltiples soluciones. Publiqué uno que no está publicado en esta pregunta. Tiene más soporte para el navegador que la solución Flexbox , y no está utilizando lo display: table;
que podría romper otras cosas.
/* This parent can be any width and height */
.outer {
text-align: center;
}
/* The ghost, nudged to maintain perfect centering */
.outer:before {
content: '.';
display: inline-block;
height: 100%;
vertical-align: middle;
width: 0;
overflow: hidden;
}
/* The element to be centered, can
also be of any width and height */
.inner {
display: inline-block;
vertical-align: middle;
width: 300px;
}
Recientemente encontré un enfoque:
#outer {
position: absolute;
left: 50%;
}
#inner {
position: relative;
left: -50%;
}
Ambos elementos deben tener el mismo ancho para funcionar correctamente.
#inner
solamente: #inner { position:relative; left:50%; transform:translateX(-50%); }
. Esto funciona para cualquier ancho.
Por ejemplo, vea este enlace y el fragmento a continuación:
div#outer {
height: 120px;
background-color: red;
}
div#inner {
width: 50%;
height: 100%;
background-color: green;
margin: 0 auto;
text-align: center; /* For text alignment to center horizontally. */
line-height: 120px; /* For text alignment to center vertically. */
}
<div id="outer" style="width:100%;">
<div id="inner">Foo foo</div>
</div>
Si tiene muchos hijos con un padre, entonces su contenido CSS debe ser como este ejemplo en Fiddle .
El contenido HTML se ve así:
<div id="outer" style="width:100%;">
<div class="inner"> Foo Text </div>
<div class="inner"> Foo Text </div>
<div class="inner"> Foo Text </div>
<div class="inner"> </div>
<div class="inner"> </div>
<div class="inner"> </div>
<div class="inner"> </div>
<div class="inner"> </div>
<div class="inner"> Foo Text </div>
</div>
Luego vea este ejemplo en violín .
En mi experiencia, la mejor manera de centrar un cuadro horizontalmente es aplicar las siguientes propiedades:
text-align: center;
display: inline-block;
.container {
width: 100%;
height: 120px;
background: #CCC;
text-align: center;
}
.centered-content {
display: inline-block;
background: #FFF;
padding: 20px;
border: 1px solid #000;
}
<div class="container">
<div class="centered-content">
Center this!
</div>
</div>
Ver también este violín !
En mi experiencia, la mejor manera de centrar una caja tanto vertical como horizontalmente es usar un contenedor adicional y aplicar las siguientes propiedades:
display: table;
display: table-cell;
vertical-align: middle;
text-align: center;
display: inline-block;
.outer-container {
display: table;
width: 100%;
height: 120px;
background: #CCC;
}
.inner-container {
display: table-cell;
vertical-align: middle;
text-align: center;
}
.centered-content {
display: inline-block;
background: #FFF;
padding: 20px;
border: 1px solid #000;
}
<div class="outer-container">
<div class="inner-container">
<div class="centered-content">
Center this!
</div>
</div>
</div>
Ver también este violín !
La forma más fácil:
#outer {
width: 100%;
text-align: center;
}
#inner {
margin: auto;
width: 200px;
}
<div id="outer">
<div id="inner">Blabla</div>
</div>
#outer
no necesita ninguno, width:100%;
ya que <div>
por defecto siempre lo ha hecho width:100%
. y text-align:center
tampoco es necesario en absoluto.
Si se desconoce el ancho del contenido, puede utilizar el siguiente método . Supongamos que tenemos estos dos elementos:
.outer
- ancho completo.inner
- no se establece el ancho (pero se puede especificar un ancho máximo)Suponga que el ancho calculado de los elementos es de 1000 píxeles y 300 píxeles respectivamente. Proceder de la siguiente:
.inner
adentro.center-helper
.center-helper
un bloque en línea; tiene el mismo tamaño .inner
que 300 píxeles de ancho..center-helper
50% a la derecha en relación con su padre; Esto coloca su izquierda en 500 píxeles wrt. exterior..inner
50% restante en relación con su padre; Esto coloca su izquierda en -150 píxeles wrt. centro de ayuda, lo que significa que su izquierda está en 500 - 150 = 350 píxeles wrt. exterior..outer
oculto para evitar la barra de desplazamiento horizontal.Manifestación:
body {
font: medium sans-serif;
}
.outer {
overflow: hidden;
background-color: papayawhip;
}
.center-helper {
display: inline-block;
position: relative;
left: 50%;
background-color: burlywood;
}
.inner {
display: inline-block;
position: relative;
left: -50%;
background-color: wheat;
}
<div class="outer">
<div class="center-helper">
<div class="inner">
<h1>A div with no defined width</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br>
Duis condimentum sem non turpis consectetur blandit.<br>
Donec dictum risus id orci ornare tempor.<br>
Proin pharetra augue a lorem elementum molestie.<br>
Nunc nec justo sit amet nisi tempor viverra sit amet a ipsum.</p>
</div>
</div>
</div>
Puedes hacer algo como esto
#container {
display: table;
width: <width of your container>;
height: <height of your container>;
}
#inner {
width: <width of your center div>;
display: table-cell;
margin: 0 auto;
text-align: center;
vertical-align: middle;
}
Esto también alineará #inner
verticalmente. Si no quiere, elimine las propiedades display
y vertical-align
;
Esto es lo que quieres de la manera más corta.
#outer {
margin - top: 100 px;
height: 500 px; /* you can set whatever you want */
border: 1 px solid# ccc;
}
#inner {
border: 1 px solid# f00;
position: relative;
top: 50 % ;
transform: translateY(-50 % );
}
La aplicación text-align: center
del contenido en línea se centra en el cuadro de línea. Sin embargo, dado que el div interno tiene por defecto width: 100%
, debe establecer un ancho específico o utilizar uno de los siguientes:
Usar margin: 0 auto
es otra opción y es más adecuado para la compatibilidad de navegadores antiguos. Funciona junto con display: table
.
display: flex
se comporta como un elemento de bloque y presenta su contenido de acuerdo con el modelo flexbox. Funciona con justify-content: center
.
Tenga en cuenta: Flexbox es compatible con la mayoría de los navegadores, pero no con todos. Consulte aquí para obtener una lista completa y actualizada de compatibilidad de navegadores.
transform: translate
le permite modificar el espacio de coordenadas del modelo de formato visual CSS. Al usarlo, los elementos se pueden traducir, rotar, escalar y sesgar. Para centrar horizontalmente requiere position: absolute
y left: 50%
.
<center>
(Obsoleto)La etiqueta <center>
es la alternativa HTML a text-align: center
. Funciona en navegadores antiguos y en la mayoría de los nuevos, pero no se considera una buena práctica ya que esta característica es obsoleta y se ha eliminado de los estándares web.
Puede usarlo display: flex
para su div externo y para centrar horizontalmente debe agregarjustify-content: center
#outer{
display: flex;
justify-content: center;
}
o puede visitar w3schools - CSS flex Property para obtener más ideas.
Flex tiene más del 97% de cobertura de soporte del navegador y podría ser la mejor manera de resolver este tipo de problemas en pocas líneas:
#outer {
display: flex;
justify-content: center;
}
Bueno, logré encontrar una solución que tal vez se ajuste a todas las situaciones, pero usa JavaScript:
Aquí está la estructura:
<div class="container">
<div class="content">Your content goes here!</div>
<div class="content">Your content goes here!</div>
<div class="content">Your content goes here!</div>
</div>
Y aquí está el fragmento de JavaScript:
$(document).ready(function() {
$('.container .content').each( function() {
container = $(this).closest('.container');
content = $(this);
containerHeight = container.height();
contentHeight = content.height();
margin = (containerHeight - contentHeight) / 2;
content.css('margin-top', margin);
})
});
Si desea usarlo con un enfoque receptivo, puede agregar lo siguiente:
$(window).resize(function() {
$('.container .content').each( function() {
container = $(this).closest('.container');
content = $(this);
containerHeight = container.height();
contentHeight = content.height();
margin = (containerHeight - contentHeight) / 2;
content.css('margin-top', margin);
})
});
Este método también funciona bien:
div.container {
display: flex;
justify-content: center; /* For horizontal alignment */
align-items: center; /* For vertical alignment */
}
Para el interior <div>
, la única condición es que es height
y width
no debe ser más grande que las de su contenedor.
Existía una opción que encontré:
Todos dicen usar:
margin: auto 0;
Pero hay otra opción. Establezca esta propiedad para el padre div. Funciona perfectamente en cualquier momento:
text-align: center;
Y mira, niño, ve al centro.
Y finalmente CSS para ti:
#outer{
text-align: center;
display: block; /* Or inline-block - base on your need */
}
#inner
{
position: relative;
margin: 0 auto; /* It is good to be */
}