Solução responsiva
Aqui está uma boa solução para design responsivo ou dimensões desconhecidas em geral, se você não precisar oferecer suporte ao IE8 e inferior.
.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>
Aqui está um JS Fiddle
A pista é que isso left: 50%
é relativo aos pais enquanto otranslate
transformação é relativa aos elementos largura / altura.
Dessa forma, você tem um elemento perfeitamente centralizado, com uma largura flexível no filho e no pai. Bônus: isso funciona mesmo se a criança for maior que o pai.
Você também pode centralizá-lo verticalmente com isso (e, novamente, a largura e a altura do pai e do filho podem ser totalmente flexíveis (e / ou desconhecidas)):
.centered-axis-xy {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
}
Lembre-se de que também pode ser necessário transform
prefixar o fornecedor. Por exemplo-webkit-transform: translate(-50%,-50%);