Você pode usar line-height: 50px;, você não precisará de vertical-align: middle;lá.
Demo
O exemplo acima falhará se você tiver várias linhas, portanto, nesse caso, você pode agrupar seu texto usando spane depois usar display: table-cell;e display: table;junto com vertical-align: middle;, além disso, não se esqueça de usar width: 100%;para#abc
Demo
#abc{
font:Verdana, Geneva, sans-serif;
font-size:18px;
text-align:left;
background-color:#0F0;
height:50px;
display: table;
width: 100%;
}
#abc span {
vertical-align:middle;
display: table-cell;
}
Outra solução que posso pensar aqui é usar a transformpropriedade translateY()onde, Yobviamente, significa Y Axis. É bem simples ... Tudo o que você precisa fazer é definir a posição dos elementos para absolutee depois posicionar 50%a toppartir do eixo e traduzir com o eixo negativo-50%
div {
height: 100px;
width: 100px;
background-color: tomato;
position: relative;
}
p {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
Demo
Observe que isso não será suportado em navegadores mais antigos, por exemplo, o IE8, mas você pode criar o IE9 e outras versões mais antigas do navegador Chrome e Firefox usando -ms, -moze -webkitprefixos, respectivamente.
Para mais informações transform, você pode consultar aqui .