IBM Pure Systems
Canais iMasters

CSS

Centralizar imagem na horizontal e vertical com CSS

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 deixá-la centralizada, mas isso não é possível quando estamos utilizando a tag <img>.

Você poderia simplesmente fazer o seguinte:

  • Aplicar display:block  à 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, porque 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>) é adicionado 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.

*

Saiba mais sobre CSS no iMasters Shop


Comente também

5 Comentários

Pedro Garcia
Pedro Garcia

hummmm uma solução boa,

tenho outra solução

.middlecenter
{
top: 50%;
left: 50%;
position: absolute;
}

funciona não somente com imagens mas com divs

#conteiner
{
width:500px;
heigth:500px;
top:-250px;
left:-250px;
position: absolute;
}
o segredo está passar a metade o objeto para o negativo, que nem o plano cartesiano

a classe middle center funciona como o plano 0,0, e objeto acompanha, a solução é pegar a metade o objeto e jogar para negativoX e negativoY, isso faz com que o obejto fique no meio da classe e a classe que já está centralizada.

no corpo fica assim

<div id="teste" class="middlecenter">
<div id="conteiner" class="middlecenter"></div>
</div>

qualquer divuda, criticas, ou elogios fica ai meu contato

pedro.garcia09@hotmail.com

Pedro Rogério de Assis Lemes
Pedro Rogério de Assis Lemes

Pedro,

A técnica que mostrei você não percisa declarar o tamanho da imagem, essa é a vantagem.

Rick Serrat
Rick Serrat

Isso mesmo Pedro, a vantagem está ai, não ter q declarar o tamanho da img, afinal se vc souber o tamanho da img, temos "n" maneiras de centralizar ela.

Eu estava fazendo isso usando javascript, tava atras de algo assim faz tempo, obrigado por compartilhar.

Vládia Queiroz
Vládia Queiroz

não consegui, acho que errei algo. sou nova nisso. será que pode me ajudar?
Está assim no Dreamweaver:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Pagina em Construcao Site Vladia Queiroz</title>
<style type="text/css">
body {
background-color: #000;
}
<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]-->
</head>
<body>
<div class="box">
<span></span>
<img src="file:///C|/Users/Vládia Queiroz/Pictures/Sites/Vládia Queiroz/pag.construcao4 (800x623).jpg" width="800" height="623" longdesc="http://vladiaqueiroz.com" alt="Pagina em construcao" title="Pagina em construcao" />
</div>
</body>
</html>

Lucas  Barbosa Lacerda
Lucas Barbosa Lacerda

Seu código ta cagado... tem um <style> sem fechar:

<style type="text/css">
body {
background-color: #000;
}
<style type="text/css">


WTF??? kkkk

Qual a sua opinião?

Comentários considerados ofensivos serão moderados.

Parceiros

IBM
PagSeguro
Internet Innovation
Dialhost
HostNet
Tecla
KingHost
DotStore
Dinamize