Solución receptiva
Aquí hay una buena solución para un diseño receptivo o dimensiones desconocidas en general si no necesita admitir IE8 y versiones inferiores.
.centered-axis-x {
position: absolute;
left: 50%;
transform: translate(-50%, 0);
}
.outer {
position: relative; /* or absolute */
/* unnecessary styling properties */
margin: 5%;
width: 80%;
height: 500px;
border: 1px solid red;
}
.inner {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
/* unnecessary styling properties */
max-width: 50%;
text-align: center;
border: 1px solid blue;
}
<div class="outer">
<div class="inner">I'm always centered<br/>doesn't matter how much text, height or width i have.<br/>The dimensions or my parent are irrelevant as well</div>
</div>
Aquí hay un violín JS
La pista es que left: 50%
es relativa al padre mientras que eltranslate
transformación es relativa al ancho / alto de los elementos.
De esta manera, tiene un elemento perfectamente centrado, con un ancho flexible tanto en el elemento secundario como en el principal. Bonificación: esto funciona incluso si el niño es más grande que el padre.
También puede centrarlo verticalmente con esto (y nuevamente, el ancho y la altura del padre y el niño pueden ser totalmente flexibles (y / o desconocidos)):
.centered-axis-xy {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
}
Tenga en cuenta que es posible que también necesite un transform
prefijo de proveedor. Por ejemplo-webkit-transform: translate(-50%,-50%);