Essas duas soluções requerem apenas dois elementos aninhados.
Primeiro - Posicionamento relativo e absoluto se o conteúdo for estático (centralização manual).
.black {
position:relative;
min-height:500px;
background:rgba(0,0,0,.5);
}
.message {
position:absolute;
margin: 0 auto;
width: 180px;
top: 45%; bottom:45%; left: 0%; right: 0%;
}
https://jsfiddle.net/GlupiJas/5mv3j171/
ou para design fluido - para centro de conteúdo exato, use o exemplo abaixo:
.message {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
https://jsfiddle.net/GlupiJas/w3jnjuv0/
Você precisa definir 'min-height' caso o conteúdo ultrapasse 50% da altura da janela. Você também pode manipular essa altura com consulta de mídia para dispositivos móveis e tablets. Mas apenas se você jogar com design responsivo.
Acho que você poderia ir mais longe e usar um script JavaScript / JQuery simples para manipular a altura mínima ou a altura fixa se houver necessidade por algum motivo.
Segundo - se o conteúdo for fluido, você também pode usar as propriedades css de tabela e célula de tabela com alinhamento vertical e alinhamento de texto centralizado:
/*in a wrapper*/
display:table;
e
/*in the element inside the wrapper*/
display:table-cell;
vertical-align: middle;
text-align: center;
Funciona e escala perfeitamente, muitas vezes usado como solução de web design responsivo com layouts de grade e consulta de mídia que manipulam a largura do objeto.
.black {
display:table;
height:500px;
width:100%;
background:rgba(0,0,0,.5);
}
.message {
display:table-cell;
vertical-align: middle;
text-align: center;
}
https://jsfiddle.net/GlupiJas/4daf2v36/
Eu prefiro a solução de tabela para a centralização exata do conteúdo, mas em alguns casos o posicionamento absoluto relativo fará um trabalho melhor, especialmente se não quisermos manter a proporção exata do alinhamento do conteúdo.