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:
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:
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:
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
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
Faça suas experiências com imagens e com tabelas.
Em 2006 comecei a publicar nesse blog uma série de desafios CSS que consistiam em…
Há muito tempo que eu não publico um "Teste seu conhecimento". Esta semana, revendo algumas…
Introdução Elementos da marcação HTML podem ser aninhados uns dentro de outros, criando-se uma cadeia…
HTML5? Web universal? É comum eu me deparar com dúvidas sobre a HTML5 não só…
Quem é Tab Atkins Jr? Tab Atkins Jr, um desenvolvedor americano, trabalhou durante muitos anos…
Pessoal, a BrazilJS Conf 2013 disponibilizou para o Maujor cupons de desconto para serem oferecidos…
View Comments
Muito Bom. Ajudou bastante. Obrigado!
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!
Obrigado cara
ajudou mto! :)
O problema é quando tem quebra de linha né.
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. :(
Muito bom mesmo este artigo e muito útil esta dica. Parabéns!
Vlw! Fazia tempo que não conseguia!
Armou ;D