Alinhar a imagem no centro e no meio dentro de div


302

Eu tenho o seguinte div

<div id="over" style="position:absolute; width:100%; height:100%>
 <img src="img.png">
</div>

Como alinhar a imagem para ficar no meio e no centro de div?


12
Duplicado perguntou há 2 minutos: CSS: image middle
Pekka


Considere selecionar uma resposta como correta.
McSonk

Respostas:


406

body {
  margin: 0;
}

#over img {
  margin-left: auto;
  margin-right: auto;
  display: block;
}
<div id="over" style="position:absolute; width:100%; height:100%">
  <img src="http://www.garcard.com/images/garcard_symbol.png">
</div>

JSFiddle


4
display: block;foi minha armadilha. TnX
Ujjwal Singh

2
Seguir não funciona. Qual é o erro que estou cometendo. <html> <head> <style> #over img {display: block; margem esquerda: auto; margem direita: auto; } </style> </head> <body> <div id = "over" style = "position: absolute; width: 100%; height: 100%"> <img src = " img8a.flixcart.com/image/ tablet / f / k / t /… "> </div> </body> </html>
nizam.sp

1
Se não usarmos, display: blocko padrão é de display: inlineacordo com w3schools.com/cssref/pr_class_display.asp . Por que precisamos usar o bloco? Eu trabalhei para mim, mas não sei por que o bloco centralizará o img e o inline não.
precisa saber é o seguinte

porque inline não se move na linha, é, de fato, na linha. portanto, margem automática é ineficaz.
Netalex

12
Isso não alinhar verticalmente
alpadev

170
<div style="display:table-cell; vertical-align:middle; text-align:center">
<img src="img.png">
</div>

6
resposta superior, muito útil!
Ilian Andreev

1
Solução muito curta e fácil, mas parece estar funcionando apenas com largura e altura fixas, sem porcentagem. Ele funciona com carros alegóricos, portanto, +1 para isso. # Jsfiddle.net/2s2nY/2
magnetronnie

1
mas isso está apenas fazendo o alinhamento vertical, mas não o horizontal, certo?
V-SHY

1
Não funcionará se a largura da imagem for maior que a largura da div.
Davuz 26/05

5
Se removermos display: table-cell; funciona perfeitamente.
Ahesanali Suthar

103

Isso também pode ser feito usando o layout do Flexbox:

TAMANHO ESTÁTICO

.parent {
    display: flex;
    height: 300px; /* Or whatever */
    background-color: #000;
}

.child {
    width: 100px;  /* Or whatever */
    height: 100px; /* Or whatever */
    margin: auto;  /* Magic! */
}
<div class="parent">
    <img class="child" src="https://i.vimeocdn.com/portrait/58832_300x300"/>
</div>

TAMANHO DINÂMICO

html, body {
  width: 100%;
  height: 100%;
  display: flex;
  background-color: #999;
}

* {
  margin: 0;
  padding: 0;
}

.parent {
  margin: auto;
  background-color: #000;
  display: flex;
  height: 80%;
  width: 80%;
}

.child {
  margin: auto;  /* Magic! */
  max-width: 100%;
  max-height: 100%;
}
<div class="parent">
  <img class="child" src="https://i.vimeocdn.com/portrait/58832_300x300"/>
</div>

Encontrei o exemplo neste artigo , que faz um ótimo trabalho explicando como usar o layout.


No tamanho estático, não há necessidade de largura e altura para a criança (pelo menos na minha versão do Firefox).
Rodrigo

91

Parece-me que você também queria que a imagem fosse verticalmente centralizada no contêiner. (Não vi nenhuma resposta que fornecesse isso)

Violino de trabalho:

  1. Solução CSS pura
  2. Não interromper o fluxo de documentos (sem flutuações ou posicionamento absoluto)
  3. Compatibilidade entre navegadores (mesmo IE6)
  4. Completamente responsivo.

HTML

<div id="over">
    <span class="Centerer"></span>
    <img class="Centered" src="http://th07.deviantart.net/fs71/200H/f/2013/236/d/b/bw_avlonas_a5_beach_isles_wallpaper_image_by_lemnosexplorer-d6jh3i7.jpg" />
</div>

CSS

*
{
    padding: 0;
    margin: 0;
}
#over
{
    position:absolute;
    width:100%;
    height:100%;
    text-align: center; /*handles the horizontal centering*/
}
/*handles the vertical centering*/
.Centerer
{
    display: inline-block;
    height: 100%;
    vertical-align: middle;
}
.Centered
{
    display: inline-block;
    vertical-align: middle;
}

Nota: esta solução é boa para alinhar qualquer elemento dentro de qualquer elemento. para o IE7, ao aplicar a .Centeredclasse em elementos de bloco, você precisará usar outro truque para obter o inline-blocktrabalho. (isso porque o IE6 / IE7 não funciona bem com o bloco embutido nos elementos do bloco)


Em vez de ter adicional span, você poderia usar o pseudo-elemento :before: jsfiddle.net/xaliber/cj6zhtp0
Deathlock

@ Deadlock é bem conhecido. mas eu estava alvejando navegadores antigos do IE (que não suportavam pseudo elementos).
Avrahamcool

1
Não é, mas o HTML deve ser usado apenas para estrutura, não para apresentação. Esse trabalho é deixado para CSS, daí o pseudo-elemento.
Deathlock

1
O que você quer dizer com "Não interromper o fluxo do documento (sem flutuações ou posicionamento absoluto)"? Qual é o #over { position:absolute; width:100%; height:100%;?
Rodrigo

1
@ Rodrigo, de fato, se você não precisar segmentar navegadores mais antigos, este flexbox é a abordagem recomendada.
Avrahamcool


32

Você pode fazer isso facilmente usando a propriedade display: flex css

#over {
  height: 100%;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}

É esse que trabalha para mim. Imagem profundamente aninhada no PUG / SCSS. Obrigado.
Mogens TrasherDK

29
#over {position:relative; text-align:center; 
       width:100%; height:100%; background:#CCC;}

#over img{
    position: absolute;
    margin: auto;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
}

Esta é a resposta certa, que na verdade é centralizada tanto na vertical quanto na horizontal.
Alexander Kim

Melhor resposta até agora.
puppala kiran

13

Eu ainda tinha alguns problemas com outra solução apresentada aqui. Finalmente, isso funcionou melhor para mim:

<div class="parent">
    <img class="child" src="image.png"/>
</div>

css3:

.child {
 display: block;
 position: absolute;
 top: 50%;
 left: 50%;
 transform: translate(-50%, -50%);
 -webkit-transform: translate(-50%, -50%); /* Safari and Chrome */
 -moz-transform: translate(-50%, -50%); /* Firefox */
 -ms-transform: translate(-50%, -50%); /* IE 9 */
 -o-transform: translate(-50%, -50%); /* Opera */
 // I suppose you may like those too:
 // max-width: 80%;
 // max-height: 80%;
}

Você pode ler mais sobre essa abordagem nesta página .


Eu também tive que adicionar CSS pai, mas seu código funcionou perfeitamente! posição: relativa; largura: 100%; flutuar: esquerda; estouro: oculto; altura mínima: 189px;
usar o seguinte comando

10

Basicamente, definir a margem direita e esquerda como automática fará com que a imagem fique alinhada ao centro.

<div id="over" style="position:absolute; width:100%; height:100%>
<img src="img.png" style="display: block; margin: 0 auto;">
</div>

8

Esta seria uma abordagem mais simples

#over > img{
    display: block;
    margin:0 auto; 
}

7

A resposta de Daaawx funciona, mas acho que seria mais limpo se eliminássemos o CSS embutido.

body {
	margin: 0;
}

#over img {
	margin-left: auto;
	margin-right: auto;
	display: block;
}
div.example {
  position: absolute;
  width: 100%;
  height: 100%;
}
<div class="example" id="over">
	<img src="http://www.garcard.com/images/garcard_symbol.png">
</div>


6

configurando o img para display: inline-block enquanto tiver definido a div superior como text-align: center também fará o trabalho

EDIT: para aquelas pessoas que estão brincando com display: inline-block >>> não esqueça que, por exemplo, duas divs como

<div>Div1 content</div>NOSPACEHERE<div>Div2 content</div>

realmente não há espaços entre eles (como visto aqui).

Apenas básico para evitar essas lacunas (inerentes ao bloco embutido) entre elas. Essas lacunas podem ser vistas entre cada duas palavras que estou escrevendo agora! :-) Então .. espero que isso ajude alguns de vocês.


6

SIMPLES. 2018. FlexBox. Para verificar o suporte ao navegador - Posso usar a

solução mínima:

div#over { 
   display: flex; 
   justify-content: center; 
   align-items: center; 
}


Para obter o suporte mais amplo possível ao navegador:

div#over { 
   display: -webkit-flex;
   display: -ms-flex; 
   display: flex; 
   justify-content: center; 
   -ms-align-items: center; 
   align-items: center; 
}

5

Eu tentei muitas abordagens, mas somente essa funciona para vários elementos embutidos dentro de uma div de contêiner. Aqui está o código para alinhar tudo em div no meio.

CSS

.divContainer
{
    vertical-align: middle;
    text-align: center; <!-- If you want horizontal center alignment -->
}
.divContainer > *
{
    vertical-align: middle;
}

HTML

<div class="divContainer">
    <span>Middle Text</span>
    <img src="test.png"/>
</div>

O código de amostra está aqui: https://jsfiddle.net/yogendrasinh/2vq0c68m/



3

Experimente este código mínimo:

<div class="outer">
    <img src="image.png"/>
</div>

E CSS:

.outer{
  text-align: center;
}
.outer img{
  display: inline-block;
}

3

Bem, estamos em 2016 ... por que não usar o flexbox? Também é responsivo. Aproveitar.

#over{
display:flex;
align-items:center;
justify-content:center;
}
<div id="over">
	<img src="http://www.garcard.com/images/garcard_symbol.png">
</div>


1
Amor css3! Obrigado. No entanto, é bom observar que isso só funcionará em navegadores modernos (exceto no IE). Todos os outros navegadores não terão efeito.
Neel

2

Muitas respostas sugerem o uso, margin:0 automas isso funciona apenas quando o elemento que você está tentando centralizar não está flutuando à esquerda ou à direita, ou seja, o floatatributo css não está definido. Para fazer isso, aplique o displayatributo table-celle, em seguida, aplique a margem esquerda e direita ao automático, para que seu estilo pareçastyle="display:table-cell;margin:0 auto;"


2
    <div>
    <p style="text-align:center; margin-top:0px; margin-bottom:0px; padding:0px;">
    <img src="image.jpg" alt="image"/>
    </p>    
    </div>

2

HTML:

<div id="over">
    <img src="img.png">
</div>

CSS:

#over {
  text-align: center;
}

#over img {
  vertical-align: middle;
}

É melhor se você adicionar algum comentário e não apenas lançar o código por aí.
Parkash Kumar 26/10/2015

2

Para centralizar horizontalmente Basta colocar

#over img {
    display: block;
    margin: 0 auto;
    clear:both;
}

Outro método:

#over img {
    display: inline-block;
    text-align: center;
}

Para o centro verticalmente Basta colocar:

   #over img {

           vertical-align: middle;
        }

2

Isso funcionou para mim:

#image-id {
    position: absolute;
    top: 0; left: 0; right: 0; bottom: 0;
    width: auto;
    margin: 0 auto;
}

2

isso fez o truque para mim.

<div class="CenterImage">
         <asp:Image ID="BrandImage" runat="server" />
</div>

'Observação: neste caso, não há uma classe css associada a' BrandImage '

CSS:

.CenterImage {
    position:absolute; 
    width:100%; 
    height:100%
}

.CenterImage img {
    margin: 0 auto;
    display: block;
}

2

Isso funcionou para mim quando você precisa centralizar a imagem de alinhamento e sua div principal com a imagem cobre a tela inteira. ou seja, altura: 100% e largura: 100%

#img{
    position:absolute;
    top:50%;
    left:50%;
    transform:translate(-50%,-50%);
}

1

Use posicionamento. O seguinte funcionou para mim ...

Com o zoom no centro da imagem (a imagem preenche a div):

div{
    display:block;
    overflow:hidden;
    width: 70px; 
    height: 70px;  
    position: relative;
}
div img{
    min-width: 70px; 
    min-height: 70px;
    max-width: 250%; 
    max-height: 250%;    
    top: -50%;
    left: -50%;
    bottom: -50%;
    right: -50%;
    position: absolute;
}

Sem zoom para o centro da imagem (a imagem não preenche a div):

   div{
        display:block;
        overflow:hidden;
        width: 100px; 
        height: 100px;  
        position: relative;
    }
    div img{
        width: 70px; 
        height: 70px; 
        top: 50%;
        left: 50%;
        bottom: 50%;
        right: 50%;
        position: absolute;
    }

1

A resposta marcada para isso não alinhará verticalmente a imagem. Uma solução adequada para navegadores modernos é o flexbox. Um contêiner flexível pode ser configurado para alinhar seus itens horizontalmente e verticalmente.

<div id="over" style="position:absolute; width:100%; height:100%; display: flex; align-items: center; justify-content: center;">
    <img src="img.png">
</div>

Esta solução responde à pergunta e funciona, ao contrário da resposta marcada. Talvez o eleitor em baixa possa detalhar sua decisão de votar em baixa?
WDuffy # 30/19

6
Da fila de revisão : Posso solicitar que você adicione algum contexto ao seu código-fonte. As respostas somente de código são difíceis de entender. Isso ajudará os solicitantes e futuros leitores, se você puder adicionar mais informações em sua postagem.
RBT

1
Isso não justifica o voto negativo. A resposta é tecnicamente correta e ajudaria futuros leitores. Atualizei o corpo da resposta para respeitar as regras da empresa, mas talvez uma solução mais direta deva ser implementada pela equipe principal, pois identificar respostas apenas com código é uma tarefa trivial.
WDuffy #

0

Você pode dar uma olhada nesta solução:

Centralizando horizontal e verticalmente uma imagem em uma caixa

<style type="text/css">
.wraptocenter {
    display: table-cell;
    text-align: center;
    vertical-align: middle;
    width: ...;
    height: ...;
}
.wraptocenter * {
    vertical-align: middle;
}
.wraptocenter {
    display: block;
}
.wraptocenter span {
    display: inline-block;
    height: 100%;
    width: 1px;
}
</style>
<!--[if lt IE 8]-->
<style>
.wraptocenter span {
    display: inline-block;
    height: 100%;
}
</style>
<!--[endif]-->

<div class="wraptocenter"><span></span><img src="..." alt="..."></div>

0

Uma maneira simples seria criar estilos separados para a div e a imagem e depois posicioná-los independentemente. Digamos que se eu quiser definir a posição da minha imagem para 50%, então eu teria um código parecido com o seguinte ....

#over{
  position:absolute;
  width:100%;
  height:100%;
}
#img{
  position:absolute;
  left:50%;
  right:50%;
}
<div id="over">
 <img src="img.png" id="img">
</div>


Apenas me diga se ele funciona com todos os tipos de navegadores, mesmo que isso é uma coisa básica que cada navegador deve suportar (caso contrário não chamá-lo de um navegador)
KSJ10

0
#over {
    display: table-cell; 
    vertical-align: middle; 
    text-align: center;
    height: 100px;
}

Modifique o valor da altura para sua necessidade.


0

Isso deve funcionar.

IMPORTANTE PARA O TESTE: Para executar o snippet de código, clique no botão esquerdo EXECUTE o snippet de código e , em seguida, no link direito Página inteira

#fader{
position:fixed;z-index: 10;
top:0;right:0;bottom:0;left:0;
opacity: 0.8;background: black;
width:100%;height:100%;
text-align: center;
}
.faders{display:inline-block;height:100%;vertical-align:middle;}
.faderi{display:inline-block;vertical-align:middle;}
<div id="fader">
<span class="faders"></span>
<img class="faderi" src="https://i.stack.imgur.com/qHF2K.png" />
</div>

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.