Categories: CSStodas

A propriedade CSS vertical-align

A propriedade CSS vertical-align foi introduzida com as CSS-1 (ampliada nas CSS-2 com a introdução do valor <medida CSS>) e admite os seguintes valores:

baseline | sub | super | top | text-top | middle | bottom | text-bottom | inherit |
<percentagem> | <medida CSS>
  

É uma propriedade que tende a frustar os iniciantes em CSS, que esperam dela um comportamento semelhante ao atributo HTML vertical-align que estão acostumados a usar.

Seguindo o raciocínio da dita semelhança, tentam posicionar um texto dentro de um elemento DIV com essa propriedade. E, surpresa! Não dá certo. Tentam com todos os valores acima mostrados e nada!

Exemplo ilustrando o valor middle:

CSS:

div#falhou {
 font:12px Arial, Sans-serif;
 width: 200px;
 height: 150px;
 border: 1px solid #c30;
 background: #ffe;
 vertical-align: middle;
 }

HTML:

<div id="falhou">
Texto no meio da DIV
</div> 

Que resulta em fracasso (o texto não ‘vai’ para o meio) conforme mostrado a seguir:

Texto no meio da DIV

Na maioria dos casos este é o primeiro contato que o iniciante tem com esta propriedade e a partir daí esquece e não se preocupa mais com ela pois ‘descobre’ que pode controlar o alinhamento vertical do texto, usando a propriedade line-height assim:

CSS:

div#sucesso { 
 font:12px Arial, Sans-serif;
 width: 200px;
 height: 150px;
 border: 1px solid #c30;
 background: #ffe;
 line-height:150px;
 }

HTML:

<div id="sucesso">
Texto no meio da DIV
</div> 

Que resulta em sucesso (o texto ‘vai’ para o meio) conforme mostrado a seguir:

Texto no meio da DIV

Afinal para que serve esta propriedade?

As Recomendações do W3C dizem que a propriedade vertical-align destina-se a alinhar textos verticalmente que estejam dentro de uma linha ou em uma célula de tabela.
Ops! então se eu declarar para o div#fracasso acima display:table-cell; vai funcionar, pois o DIV terá um comportamento de célula de tabela certo? Sei lá! Vamos experimentar e ver no que dá.

CSS:

div#seila {
 width: 200px;
 height: 150px;
 border: 1px solid #c30;
 background: #ffe;
 vertical-align: middle;
 display: table-cell;
 }

HTML:

<div id="seila">
Texto no meio da DIV
</div> 

Viva! funcionou (o texto ‘foi’ para o meio) conforme mostrado a seguir:

Texto no meio da DIV

Putz! o IE outra vez! Funcionou para quem tem FireFox, Mozilla, Opera, Netscape e navegadores complacentes com as standards. Se você está com o IE6 ou mais antigo o texto ficou lá em cima. Alguém com a versão beta do IE7 aí? Se sim, pergunto: Funcionou?

Atualização em 19/12/2012: Esse código de centralização não funciona no IE7, mas funciona no IE8+. Se você deseja servir o IE7 terá que usar marcação adicional e regras CSS específicas, como mostrado a seguir:

CSS:

#container {
 width: 200px; 
 height: 150px; 
 border: 1px solid #c30;
 background: #ffe;
 position: relative;
 display:table; 
 }
#container p {
 *position: absolute; 
 top: 50%; 
 display: table-cell; 
 vertical-align: middle;
 }
#container span {
 display:block; 
 *position: relative; 
 top: -50%;
 }

HTML:

<div id="container">

Texto no meio da DIV

</div>

Oba! Agora funciona no IE7

Texto no meio da DIV

A propriedade finalmente funcionando

Vamos alinhar textos verticalmente que estejam dentro de uma linha (em uma célula de tabela fica por conta do leitor praticar), como diz a norma.

Tomaremos como base para os exemplos o seguinte texto:

Texto com uma palavra diferente dentro dele

Onde iremos controlar o alinhamento vertical de: palavra diferente dentro do texto

Exemplo 1 – Definindo um valor positivo de 30 pixel

CSS:

span.diferente {
vertical-align: 30px;
}

HTML:

<p>
Texto com uma 
<span class="diferente">
palavra diferente<span> 
dentro dele
</p>

Resultado:

Texto com uma palavra diferente dentro dele

Exemplo 2 – Definindo um valor negativo de 30 pixel
Igual ao anterior com -30px

Resultado:

Texto com uma palavra diferente dentro dele

Exemplo 3 – Definindo um valor em percentagem, igual a 40%
A percentagem refere-se ao valor de line-height do elemento. Se line-height não for definido vale o valor default para cada elemento.

Resultado:

Texto com uma palavra diferente dentro dele

Exemplo 4 – Definindo o valor super

Resultado:

Texto com uma palavra diferente dentro dele

Exemplo 5 – Definindo o valor sub

Resultado:

Texto com uma palavra diferente dentro dele

Exemplo 6 – Definindo o valor middle

Resultado:

Texto com uma palavra diferente dentro dele

Exemplo 7 – Definindo o valor text-top
O alinhamento dos textos é pela linha mais alta dos textos. Mudei o tamanho de fonte para destacar visualmente o alinhamento.

Resultado:

Texto com uma palavra diferente dentro dele

Exemplo 8 – Definindo o valor text-bottom
O alinhamento dos textos é pela linha mais baixa dos textos. Mudei o tamanho de fonte para destacar visualmente o alinhamento.

Resultado:

Texto com uma palavra diferente dentro dele

Imagens e tabelas

Faça suas experiências com imagens e com tabelas.

Maujor

Exerci o magistério paralelamente a minha carreira profissional por toda uma vida e ao longo destes trinta anos aprendi tanto quanto ensinei. Sou um apaixonado por Web Standards e desenvolvo o site de tutoriais CSS para Web Design.

View Comments

  • O Internet Explorer só serve para uma coisa: atrasar o avanço da internet.
    Eu voto por todos os desenvolvedores simplesmente barrarem este navegador, informando que deve entrar com qualquer outro navegador exceto aquele.

    Sim é chato...sim nem sempre poderemos fazer isto, mas nos nossos sistemas (todos eles) nós barramos o IE.

    Chegou a hora de dar um basta no IE, sempre que possível.

  • @Luiz Carlos
    Muito obrigado pelo seu generoso depoimento.
    Votos de sucesso.

  • Precisei disto agora em 2016, e usei, pois cai aqui também como citou um colega em 2007.
    Também consegui resolver o meu problema e como as informações oriundas do Maujor são precisas e claras.
    Vejam que esta dúvida está sendo resolvida lá se vão 10 anos.
    Tive a curiosidade de ver os inúmeros comentários e um especial me chamou a atenção devido a realidade que o colega Anderson colocou mais ou menos assim em 2007 (Lá se vão 9 anos).:
    "...cerca de 70% das minhas dúvidas com css caem sempre aqui no Maujor..."
    É simples e fácil de entender. Competência para ensinar.
    Como não tenho muitos anos de experiência na área Web, comecei em 2012, o caminho mais simples que encontrei foi as consultas no google e depois que conheci um livro do Maujor, fui comprando conforme as necessidades surgiam e creio que na minha estante faltem apenas 2 que logo comprarei para completar.
    Por isto quero dizer publicamente: Muito obrigado Maujor por dividir com todos nos o seu conhecimento com a melhor qualidade. Parabéns!

  • Fiz desta forma e tentei com mais várias formas alternando as possibilidades com e sem *, e no Internet explorer, sempre dá algum problema. No meu site, é uma cadeia de DIV, uma dentro da outra, todas formando a estrutura, até que chega na DIV que é colocado o conteúdo (dinâmico, o ASP manipula o texto). O DIV do conteúdo, é text-align:justify;overflow:auto;
    O mais comum é tentar deste jeito do tutorial, mas assim que eu defino algo como "position:relative;", o navegador (apenas o IE) fica com o conteudo no lugar certo, mas assim que meche a scroll, ele mantém preso o DIV relative, e o conteudo passa por trás do div.

    Como não achei solução para o IE, coloquei uma table com id e configurei ela no css para ficar sem borda, margem e padding nas camadas table, tr, td. e no html usei o valign="bottom" dentro da celula td. (pois meu objetivo é colocar lá em baixo. )
    Se achar uma solução que movimente dentro do scroll de dentro, favor mandar o exemplo, pois ainda não achei.

  • O chato mesmo é que se utilizar display: table-cell e estiver utilizando um height em porcentagem não funciona. :(

Share
Published by
Maujor

Recent Posts

Teste seu conhecimento #20

Em 2006 comecei a publicar nesse blog uma série de desafios CSS que consistiam em…

7 anos ago

Teste seu conhecimento #19

Há muito tempo que eu não publico um "Teste seu conhecimento". Esta semana, revendo algumas…

9 anos ago

JavaScript bubbling e capturing

Introdução Elementos da marcação HTML podem ser aninhados uns dentro de outros, criando-se uma cadeia…

10 anos ago

HTML5 – W3C versus WHATWG

HTML5? Web universal? É comum eu me deparar com dúvidas sobre a HTML5 não só…

10 anos ago

Seria esse o futuro das imagens responsivas?

Quem é Tab Atkins Jr? Tab Atkins Jr, um desenvolvedor americano, trabalhou durante muitos anos…

10 anos ago

BrazilJS Conf 2013

Pessoal, a BrazilJS Conf 2013 disponibilizou para o Maujor cupons de desconto para serem oferecidos…

11 anos ago