Centralizar imagem na horizontal e vertical com CSS

Postado por: Pedro Rogério em

Imagine 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.

Posts Relacionados

Confira também outros artigos interessantes postados aqui no blog.

Sobre Pedro Rogério

Pedro Rogério é desenvolvedor web por paixão, não saberia fazer melhor outra coisa. Além de escrever para o CSS no Lanche também escreve para o Pinceladas da Web, blog com assuntos gerais sobre desenvolvimento web.

Central Server

4 Responses to “Centralizar imagem na horizontal e vertical com CSS”

  1. Ficou muito bom o layout!
    O Link do twitter na sidebar ta com problema aqui no meu Opera 10.5

    Abraço

  2. Guilherme Schvarcz Franco disse:

    Um dia a gente se livra desse IE……

  3. [...] 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 [...]

  4. Montanha disse:

    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.

Leave a Reply