Centralizar imagem na horizontal e vertical com CSS
Postado por: Pedro Rogério emImagine a seguinte situação: Você precisa centralizar uma imagem dentro de um box maior que a imagem e com dimensões atribuídas, caso você insira a imagem via CSS, é fácil daixá-la centralizada, mas isso não é possível quando estamos utilizando a tag <img>
Você poderia simplesmente fazer o seguinte:
- Aplicar display:block a imagem
- Definir as margens esquerda e do topo para a imagem deixando-a centralizada dentro do box.
Mas o grande problema é que você pode ter imagens no formato retrato e paisagem, imagine uma galeria de fotos com fotos de diferentes tamanhos, você teria que definir um CSS para cada imagem para que elas ficassem centralizadas.
A solução
Centralizar imagens na horizontal não é difícil, se a imagem está com seu comportamento padrão de display:inline, então um simples text-align:center já resolveria o problema e funcionaria bem em todos os browsers.
Agora para centralizar imagens na vertical, em browsers modernos, uma simples solução é atribuir display: table-cell; e vertical-align: middle ao elemento container. Só que como nessa vida nem tudo são flores, em browsers como o IE7 e inferiores essa técnica não funciona.
Para o IE7, a solução é criar uma espécie de linha, tendo como altura a altura do container e utilizar novamente vertical-align: middle. A propriedade line-height infelizmente não pode ser usada para conseguir esse efeito uma vez que ela não funciona corretamente no IE7/Win na presença de imagens. Utilizar também uma fonte com algum tamanho grande (sem especificar line-height) é problemático, por que o tamanho da caixa gerada é ligeiramente maior que o tamanho da fonte.
Felizmente o IE7 tem suporte parcial a propriedade display: inline-block. Se um elemento vazio que possua a propriedade inline-block (por exemplo um <span>) é adicinado dentro do elemento container e é atribuído ao mesmo height:100% e vertical-align: middle então ela permite justamente conseguir o que queremos.
A solução utiliza das propriedades display: table-cell e uma tag <span> extra com display: inline-block. Funciona em todos os browsers, inclusive no Internet Explorer.
Código CSS
No exemplo foi utilizado um elemento container com a classe box e o código para o IE será descrito aqui através de comentarios condicionais:
<style type="text/css">
.box {
display: table-cell;
text-align: center;
vertical-align: middle;
width: ...;
height: ...;
}
.box * {
vertical-align: middle;
}
</style>
<!--[if lt IE 8]>
<style type="text/css">
.box span {
display: inline-block;
height: 100%;
}
</style>
<![endif]-->
A marcação HTML é muito simples e é descrita logo abaixo:
<div class="box">
<span></span>
<img src="" alt="" title="" />
</div>
Vejam o exemplo em funciomanento. Essa técnica foi originalmente desenvolvida pelo desenvolvedor Bruno, veja mais informações no post original.














Ficou muito bom o layout!
O Link do twitter na sidebar ta com problema aqui no meu Opera 10.5
Abraço
Um dia a gente se livra desse IE……
[...] post anterior mostrei como é possível centralizar uma imagem na horizontal e vertical com CSS, independente do tamanho da imagem. A solução utilizava algumas propriedades CSS e uma tag [...]
Esse caso só funcionaria com uma galeria de imagens mesmo. Declarar altura fixa é foda, embassado achar uma solução legal pra centralizar horizontalmente sem precisar declarar altura fixa, respeitando a altura de uma div superior.
Cara não funcionou aqui no IE8!
[...] Créditos: CSS no Lanche [...]
olha, estou começando agora, então copiei e colei aqui no editor, mas tá dizendo o seguinte:nenhuma propriedade do CSS se aplica à seleção atual, selecione um elemento com estilo para saber quais propriedades CSS se aplicam. Regra:Nenhuma regra CSS se aplica a tag selecionada. que fiz de errado? Entrei no Dreamweaver, cliquei em HTML, colei o primeiro código antes de e o segundo dentro do corpo e adicionei a imagem. A imagem aparece no visualizador, mas é como se o CSS não funcionasse. Que faço pra corrigir? obrigada
Cara, uso uma solução bem mais simples, que eu mesmo desenvolvi aqui.
Marcação HTML:
No CSS:
.img {width: …px; height: …px; float: left;}
.img a {width: …px; height: …px; line-height: …px; text-align: center; vertical-align: middle; display: table-cell; *display: inline-block;}
Funciona perfeitamente em todos os navegadores.
Até.
muito obrigado,
seu post me ajudou a muito.