A resposta rápida: text-align no pai
Um <img> é um elemento inline: ele fica em uma linha de texto como uma palavra. Então você o centraliza do mesmo jeito que centraliza texto, com text-align: center no pai:
O estilo vai na div, não na imagem. Colocar text-align: center no próprio <img> não faz nada, porque a imagem não tem texto dentro para alinhar.
Método 2: display block e margin auto
Se você prefere estilizar a própria imagem, transforme-a em bloco e dê a ela margens laterais automáticas. O espaço livre dos dois lados é dividido por igual:
A imagem cinza tem margin: 0 auto, mas continua no começo da linha: margens auto não fazem nada em um elemento inline. display: block é a peça que falta. max-width: 100% com height: auto impede que a imagem transborde uma tela estreita, preservando as proporções.
Método 3: flexbox ou grid, inclusive na vertical
Para centralizar uma imagem nas duas direções dentro de uma caixa, dê uma altura à caixa e centralize o conteúdo com grid ou flexbox:
O equivalente em flexbox é display: flex; justify-content: center; align-items: center;. Nos dois casos, a caixa precisa de uma altura maior que a da imagem, senão não há espaço para centralizar. Os mesmos métodos centralizam qualquer elemento; a página de como centralizar uma div compara todos eles.
Centralizar uma imagem com legenda
Uma foto com legenda vai em um <figure>. Centralize o conteúdo da figure, e a imagem e a legenda se alinham juntas:
Várias imagens em uma linha centralizada
Uma fileira de logos ou miniaturas é trabalho para o flexbox. justify-content: center centraliza o grupo, gap dá o espaçamento e flex-wrap deixa quebrar linha em telas pequenas, mantendo tudo centralizado:
Qual método usar
| Situação | Use |
|---|---|
| Uma imagem em um parágrafo ou em um bloco simples | text-align: center no pai |
| Você só pode estilizar a imagem | display: block; margin: 0 auto; |
| Centralizar nas duas direções dentro de uma caixa | Grid place-items: center (ou flexbox) na caixa |
| Uma fileira de imagens | Flexbox com justify-content: center |
| Uma imagem com legenda | <figure> com text-align: center |
| Uma imagem de fundo, não conteúdo | background-position: center, veja background-image |
Os jeitos antigos, e por que não usar
Você ainda vai encontrar isto em tutoriais antigos:
<!-- obsolete: do not use -->
<center><img src="logo.png" alt="Logo"></center>
<img src="logo.png" alt="Logo" align="center">
<center> e o atributo align foram removidos do HTML. Os navegadores ainda renderizam <center> por compatibilidade, e align="center" em uma imagem nem sequer a centraliza na horizontal: os navegadores o tratam como um alinhamento vertical dentro da linha. Use um dos métodos CSS acima.
Erros comuns
text-align: centerno<img>. Coloque no pai.margin: 0 autoem uma imagem inline. Acrescentedisplay: block.- Centralizar na vertical sem altura no pai. A caixa encolhe até o tamanho da imagem, sem espaço para centralizar.
float: center. Esse valor não existe. Floats só vão para um lado.- Esquecer o
alt. Uma imagem centralizada continua precisando de texto alternativo; usealt=""só para imagens puramente decorativas. - Uma imagem esticada. Definir
widtheheightno CSS com valores de proporção diferente a distorce. Defina um só e useheight: auto, ou acrescenteobject-fit: cover.
Perguntas frequentes
Como centralizar uma imagem no HTML?
Coloque text-align: center no elemento que a contém, por exemplo <p style="text-align: center;"><img src="logo.png" alt="Logo"></p>. Uma imagem é inline por padrão, então se centraliza como uma palavra do texto.
Como centralizar uma imagem com margin auto?
Transforme a imagem em bloco primeiro: img { display: block; margin: 0 auto; }. Margens auto não centralizam elementos inline, e uma imagem é inline até você mudar isso.
Como centralizar uma imagem na vertical e na horizontal?
Transforme o contêiner em grid (ou flexbox) com uma altura: .box { display: grid; place-items: center; height: 300px; }. A imagem fica então no meio da caixa.
Posso usar a tag <center> ou align="center" para centralizar uma imagem?
Não. <center> e o atributo align em <img> estão obsoletos no HTML5. Os navegadores ainda renderizam <center> em páginas antigas, mas align="center" em uma imagem a alinha na vertical dentro da linha, não na horizontal. Use CSS.
Por que aparece um pequeno espaço embaixo da minha imagem centralizada?
Uma imagem inline fica apoiada na linha de base do texto, deixando espaço embaixo para as letras que descem. Defina display: block na imagem, ou vertical-align: middle, e o espaço some.