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?

Dro1n2
fonte
12
Duplicado perguntou há 2 minutos: CSS: image middle
Pekka
1
Tópico semelhante aqui: stackoverflow.com/questions/18516317/…
Hashem Qolami
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

Gurpreet Singh
fonte
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>
John K.
fonte
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.

aerdman
fonte
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)

avrahamcool
fonte
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
62
img.centered {
   display: block;
   margin: auto auto;
}
Nitin
fonte
1
este é muito semelhante a esta resposta
suhailvs
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;
}
tanveer ahmad dar
fonte
É 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;
}
dhir
fonte
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 .

pawel7318
fonte
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>
Garconis
fonte
8

Esta seria uma abordagem mais simples

#over > img{
    display: block;
    margin:0 auto; 
}
Sujay sreedhar
fonte
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>

LizardKG
fonte
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.

sasha
fonte
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; 
}
Nadav
fonte
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/

Yogee
fonte
5

Arquivo CSS

.over {
    display : block;
    margin : 0px auto;
Sabarish R
fonte
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;
}
luchopintado
fonte
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>

GabMic
fonte
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;"

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

HTML:

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

CSS:

#over {
  text-align: center;
}

#over img {
  vertical-align: middle;
}
Lahori
fonte
É 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;
        }
Sanjib Debnath
fonte
2

Isso funcionou para mim:

#image-id {
    position: absolute;
    top: 0; left: 0; right: 0; bottom: 0;
    width: auto;
    margin: 0 auto;
}
Sileria
fonte
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;
}
julian9876
fonte
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%);
}
Akshay Bande
fonte
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;
    }
ThomasAFink
fonte
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>
WDuffy
fonte
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>
fpauer
fonte
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>

KSJ10
fonte
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.

Terry Lin
fonte
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>

Intacto
fonte