it-swarm.it

Come allineare verticalmente un'immagine all'interno di un div?

Domanda

Come puoi allineare un'immagine all'interno di un div contenente?

Esempio

Nel mio esempio, ho bisogno di centrare verticalmente <img> nel <div> con class ="frame ":

<div class="frame" style="height: 25px;">
    <img src="http://jsfiddle.net/img/logo.png" />
</div>

L'altezza di .frame è fissa e l'altezza dell'immagine è sconosciuta. Posso aggiungere nuovi elementi in .frame se questa è l'unica soluzione. Sto cercando di farlo su IE≥7, Webkit, Gecko.

Guarda il jsfiddle qui

.frame {
    height: 25px;      /* equals max image height */
    line-height: 25px;
    width: 160px;
    border: 1px solid red;
    
    text-align: center; margin: 1em 0;
}
img {
    background: #3A6F9A;
    vertical-align: middle;
    max-height: 25px;
    max-width: 160px;
}
        
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=250 />
</div>
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=25 />
</div>
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=23 />
</div>
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=21 />
</div>
<div class=frame>
   <img src="http://jsfiddle.net/img/logo.png" height=19 />
</div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=17 />
</div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=15 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=13 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=11 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=9 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=7 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=5 />
 </div>
<div class=frame>
    <img src="http://jsfiddle.net/img/logo.png" height=3 />
 </div>

1225
Arnaud Le Blanc

L'unico (e il miglior cross-browser) che conosco è usare un helper inline-block con height: 100% e vertical-align: middle su entrambi gli elementi.

Quindi c'è una soluzione: http://jsfiddle.net/kizu/4RPFa/4570/

.frame {
    height: 25px;      /* equals max image height */
    width: 160px;
    border: 1px solid red;
    white-space: nowrap; /* this is required unless you put the helper span closely near the img */
    
    text-align: center; margin: 1em 0;
}

.helper {
    display: inline-block;
    height: 100%;
    vertical-align: middle;
}

img {
    background: #3A6F9A;
    vertical-align: middle;
    max-height: 25px;
    max-width: 160px;
}
<div class="frame">
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=250px />
</div>
<div class="frame">
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=25px />
</div>
<div class="frame">
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=23px />
</div>
<div class="frame">
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=21px />
</div>
<div class="frame">
    <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=19px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=17px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=15px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=13px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=11px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=9px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=7px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=5px />
</div>
<div class="frame">
    <span class="helper"></span>
    <img src="http://jsfiddle.net/img/logo.png" height=3px />
</div>

Oppure, se non vuoi avere un elemento in più nei browser moderni e non ti dispiace usare le espressioni IE, puoi usare uno pseudo-elemento e aggiungerlo a IE usando una comoda espressione, che viene eseguito solo una volta per elemento, quindi non ci saranno problemi di prestazioni:

La soluzione con :before e expression() per IE: http://jsfiddle.net/kizu/4RPFa/4571/

.frame {
    height: 25px;      /* equals max image height */
    width: 160px;
    border: 1px solid red;
    white-space: nowrap;
    
    text-align: center; margin: 1em 0;
}

.frame:before,
.frame_before {
    content: "";
    display: inline-block;
    height: 100%;
    vertical-align: middle;
}

img {
    background: #3A6F9A;
    vertical-align: middle;
    max-height: 25px;
    max-width: 160px;
}

/* Move this to conditional comments */
.frame {
    list-style:none;
    behavior: expression(
        function(t){
            t.insertAdjacentHTML('afterBegin','<span class="frame_before"></span>');
            t.runtimeStyle.behavior = 'none';
        }(this)
    );
}
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=250px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=25px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=23px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=21px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=19px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=17px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=15px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=13px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=11px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=9px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=7px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=5px /></div>
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=3px /></div>


Come funziona:

  1. Quando ci sono due elementi inline-block uno vicino all'altro, puoi allinearli ognuno al lato dell'altro, quindi con vertical-align: middle otterrai qualcosa di simile a questo:

    Two aligned blocks

  2. Quando hai un blocco con altezza fissa (in px, em o un'altra unità assoluta), puoi impostare l'altezza dei blocchi interni in %.

  3. Quindi, aggiungere uno inline-block con height: 100% in un blocco con altezza fissa allineerebbe un altro elemento inline-block in esso (<img/> nel tuo caso) verticalmente vicino ad esso.
1924
kizu

Questo potrebbe essere utile: 

div {
    position:relative;
    width:200px;
    height:200px;
}
img {
    position:absolute;
    top:0;
    bottom:0;
    margin:auto;
}
.image {
    min-height:50px
}

Riferimento: http://www.student.oulu.fi/~laurirai/www/css/middle/

473
Tahir Yasin

La soluzione di matejkramny è un buon inizio, ma le immagini di grandi dimensioni hanno un rapporto sbagliato.
Ecco la mia forchetta:

demo: https://jsbin.com/lidebapomi/edit?html,css,output

preview


. .__ HTML:

<div class="frame">
  <img src="foo"/>
</div>

CSS:

.frame {  
    height: 160px; /*can be anything*/
    width: 160px; /*can be anything*/
    position: relative;
}
img {  
    max-height: 100%;  
    max-width: 100%; 
    width: auto;
    height: auto;
    position: absolute;  
    top: 0;  
    bottom: 0;  
    left: 0;  
    right: 0;  
    margin: auto;
}
421
jomo

Soluzione a 3 linee:

position: relative;
top: 50%;
transform: translateY(-50%);

Questo vale per qualsiasi cosa.

Da qui .

189
Jorge Orpinel

Una soluzione CSS PUR:

http://jsfiddle.net/3MVPM/

Il CSS: 

.frame {  
    margin: 1em 0;  
    height: 35px;
    width: 160px;
    border: 1px solid red;
    position: relative;
}  
img {  
    max-height: 25px;  
    max-width: 160px;  
    position: absolute;  
    top: 0;  
    bottom: 0;  
    left: 0;  
    right: 0;  
    margin: auto;  
    background: #3A6F9A;  
}

Cose chiave 

// position: relative; - in .frame holds the absolute element within the frame
// top: 0; bottom: 0; left: 0; right: 0; - this is key for centering a component
// margin: auto; - centers the image horizontally & vertically
130
code ninja

Per coloro che sono arrivati ​​a questo post e sono interessati a una soluzione più moderna e che non hanno bisogno di supportare i browser legacy, puoi farlo:

.frame {
    display: flex;
    /*Uncomment below to center horizontally*/
    /*justify-content: center;*/
    align-items: center;
}

img {
    height: auto;
}

/* Styling stuff not needed for demo */
.frame {
    max-width: 900px;
    height: 200px;
    margin: auto;
    background: #222;
}
p {
    max-width: 900px;
    margin: 20px auto 0;
}
img {
    width: 150px;
}
<div class="frame">
    <img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/9988/hand-pointing.png">
</div>

Ecco una penna: http://codepen.io/ricardozea/pen/aa0ee8e6021087b6e2460664a0fa3f3e

108
Ricardo Zea

In questo modo puoi centrare un'immagine in verticale ( demo ):

div{
  height:150px; //IE7fix
  line-height: 150px;
}
img{
  vertical-align: middle;
  margin-bottom:0.25em;
}
97
user669677

Potresti provare a impostare il CSS di PI su display: table-cell; vertical-align: middle;

22
Yeodave

Inoltre, puoi utilizzare Flexbox per ottenere il risultato corretto:

.parent {
  align-items: center; /* for vertical align */
  background: red;
  display: flex;
  height: 250px;
  /* justify-content: center; <- for horizontal align */
  width: 250px;
}
<div class="parent">
  <img class="child" src="https://cdn2.iconfinder.com/data/icons/social-icons-circular-black/512/stackoverflow-128.png" />
</div>

19
tourniquet

C'è una super facile soluzione con flexbox!

.frame {
    display: flex;
    align-items: center;
}
19
BBlackwo

Puoi provare sotto il codice 

.frame{
 display:flex;
 justify-content: center;
 align-items: center;
 width:100%;
} 
<div class="frame" style="height: 25px;">
    <img src="http://jsfiddle.net/img/logo.png" />
</div>

14
Santosh Khalse

Soluzione per immagini di sfondo Ho rimosso l'elemento immagine tutto insieme e lo ho impostato come sfondo del div con una classe di .frame

http://jsfiddle.net/URVKa/2/

questo almeno funziona bene su IE8, FF6 e Chrome13

Ho controllato, questa soluzione non funzionerà per ridurre le immagini più grandi di 25px di altezza. Esiste una proprietà chiamata background-size che imposta la dimensione dell'elemento, ma è CSS3 che sarebbe in conflitto con il requisito IE7.

Vorrei consigliarti di ridimensionare le priorità del tuo browser e progettare i migliori browser disponibili, oppure ottenere un codice server per ridimensionare le immagini se desideri utilizzare questa soluzione

http://jsfiddle.net/MBs64/

.frame {
    height: 35px;      /* equals max image height */
    width: 160px;
    border: 1px solid red;
    text-align: center; 
    margin: 1em 0;
    display: table-cell;
    vertical-align: middle;
}
img {
    background: #3A6F9A;
    display: block;
    max-height: 35px;
    max-width: 160px;
}

La proprietà della chiave è visualizzata: table-cell; per .frame. Div.frame viene visualizzato come in linea con questo, quindi è necessario avvolgerlo in un elemento di blocco.

Funziona in FF, Opera, Chrome, Safari e IE8 +.

AGGIORNARE

Per IE7 è necessario aggiungere un'espressione CSS:

*:first-child+html img {
    position: relative;
    top: expression((this.parentNode.clientHeight-this.clientHeight)/2+"px");
}
11
Webars

Potresti fare questo:

dimostrazione

http://jsfiddle.net/DZ8vW/1

CSS

.frame {
    height: 25px;      /* equals max image height */
    line-height: 25px;
    width: 160px;
    border: 1px solid red;

    text-align: center; margin: 1em 0;
    position: relative; /* Changes here... */
}
img {
    background: #3A6F9A;
    max-height: 25px;
    max-width: 160px;
    top: 50%;           /* here.. */
    left: 50%;           /* here... */
    position: absolute; /* and here */
}    


javascript

$("img").each(function(){
    this.style.marginTop = $(this).height() / -2 + "px";
})
11
Joseph Marikle

Prova questa soluzione con pure css http://jsfiddle.net/sandeep/4RPFa/72/ Potrebbe essere il problema principale con il tuo html. La tua citazione non usare quando definisci class & image height nel tuo html. 

CSS:

.frame {
    height: 25px;      /* equals max image height */
    width: 160px;
    border: 1px solid red;
    position:relative;
    margin: 1em 0;
    top: 50%;
    text-align: center;
    line-height: 24px;
    margin-bottom:20px;
}

img {
    background: #3A6F9A;
    vertical-align: middle;
    line-height:0;
    margin:0 auto;
    max-height:25px;
}

MODIFICARE :

Quando lavoro con il tag img, lascia 3px to 2px spazio da top. Ora diminuisco line-height e il suo lavoro . css:

    .frame {
        height: 25px;      /* equals max image height */
        width: 160px;
        border: 1px solid red;
        margin: 1em 0;
        text-align: center;
        line-height:22px;
        *:first-child+html line-height:24px; /* for IE7 */
    }

    img {
        background: #3A6F9A;
        vertical-align: middle;
        line-height:0;    
        max-height:25px;
        max-width:160px;
    }
@media screen and (-webkit-min-device-pixel-ratio:0) {
    .frame {
        line-height:20px; /* webkit browsers */
    }

la proprietà line-height è render in modo diverso nei vari browser. Così; dobbiamo definire diversi browser di proprietà line-height 

Controlla questo esempio http://jsfiddle.net/sandeep/4be8t/11/

Controlla questo esempio di line-height diverso in diversi browser differenze di altezza dell'input in Firefox e Chrome

7
sandeep

Non sono sicuro di IE, ma con Firefox e Chrome, se hai un img in un contenitore div, il seguente css dovrebbe funzionare. Almeno per me funziona bene:

div.img-container {
    display:table-cell;
    vertical-align: middle;
    height: 450px;
    width: 490px;
}

div.img-container img {
    max-height: 450px;
    max-width: 490px;
}
7
slava

La mia soluzione: http://jsfiddle.net/XNAj6/2/

<div class="container">
    <div class="frame">
        <img src="http://jsfiddle.net/img/logo.png" class="img" alt="" />
    </div>
</div>

.container {
    display: table;
    float: left;
    border: solid black 1px;
    margin: 2px;
    padding: 0;
    background-color: black;
    width: 150px;
    height: 150px;
}
.frame {
    display: table-cell;
    text-align: center;
    vertical-align: middle;
    border-width: 0;
}
.img {
    max-width: 150px;
    max-height: 150px;
    vertical-align: middle;
}
6
Ilya Lysenko

Modo semplice che funziona per me:

img {
    vertical-align: middle;
    display: inline-block;
    position: relative;
}

Funziona molto bene con Google Chrome. Prova questo su un altro browser.

5
DOCTYPE HTML

Funziona per i browser moderni (2016 al momento della modifica) come mostrato in questo demo su codepen

.frame {
    height: 25px;
    line-height: 25px;
    width: 160px;
    border: 1px solid #83A7D3;          
}
.frame img {
    background: #3A6F9A;
    display:inline-block;
    vertical-align: middle;
}

È molto importante che tu dia una classe alle immagini o usi l'ereditarietà per indirizzare le immagini che hai bisogno di centrare. In questo esempio abbiamo usato .frame img {} in modo che vengano prese di mira solo le immagini racchiuse da un div con una classe di .frame.

5
anglimasS

SOLUZIONE UTILIZZANDO TABELLA E CELLA DELLA TABELLA

A volte dovrebbe essere risolto visualizzando come tabella/tabella-cella. Ad esempio una schermata del titolo veloce. È anche un modo consigliato da W3. Vi consiglio di controllare questo link chiamato Centratura delle cose da W3C.org

I suggerimenti usati qui sono:

  • Contenitore di posizionamento assoluto visualizzato come tabella
  • Verticale allineato al contenuto centrale visualizzato come tabella-cella

.container {
position:absolute;
display:table;
width:100%;
height:100%;
}
.content {
display:table-cell;
vertical-align:middle;
}
<div class="container">
  <div class="content">
    <h1 style="text-align:center"> PEACE IN THE WORLD </h1>
 </div>
</div> 

Personalmente in realtà non sono d'accordo sull'uso di aiutanti per questo scopo

5
Sam

Se riesci a vivere con margini di dimensioni in pixel, aggiungi font-size: 1px; al .frame. Ma ricorda che ora su .frame 1em = 1px, che significa, devi anche impostare il margine in pixel.

http://jsfiddle.net/feeela/4RPFa/96/

EDIT: ora non è più centrato in Opera ...

4
feeela

Per centrare un'immagine all'interno di un contenitore (potrebbe essere un logo) oltre ad un testo come questo:

 enter image description here

Fondamentalmente si avvolge l'immagine 

.outer-frame {
  border: 1px solid red;
  min-height: 200px;
  text-align: center; //only for align horizontally
}

.wrapper{
  line-height: 200px;
  border: 2px dashed blue;
  border-radius: 20px;
  margin: 50px
}

img {
//height: auto;
  vertical-align: middle;
}
<div class="outer-frame">
  <div class="wrapper">
    some text
    <img src="http://via.placeholder.com/150x150">
  </div>
</div>

4
juliangonzalez

puoi usare questo:

.loaderimage {
position: absolute;
top: 50%;
left: 50%;
width: 60px;
height: 60px;
margin-top: -30px;/*50% of the height*/
margin-left: -30px;

}

2
Masoume Karvar

Ho avuto lo stesso problema. Questo funziona per me:

<style type="text/css">
div.parent {
     position: relative;
}

img.child {
    bottom: 0;
    left: 0;
    margin: auto;
    position: absolute;
    right: 0;
    top: 0;
}
</style>

<div class="parent">
    <img class="child">
</div>
2
algreat

Utilizzando il metodo table e table-cell fai il lavoro, specialmente perché hai scelto come target anche alcuni vecchi browser, creo per te uno snippet che puoi eseguire e controlla il risultato:

.wrapper {
  position: relative;
  display: table;
  width: 300px;
  height: 200px;
}

.inside {
  vertical-align: middle;
  display: table-cell;
}
<div class="wrapper">
  <div class="inside">
    <p>Centre me please!!!</p>
  </div>
  <div class="inside">
    <img src="https://cdn2.iconfinder.com/data/icons/social-icons-circular-black/512/stackoverflow-128.png" />
  </div>
</div> 

2
Alireza

Questo codice funziona bene per me.

<style>
.listing_container{width:300px; height:300px;font: 0/0 a;}
.listing_container:before { content: ' ';display: inline-block;vertical-align: bottom;height: 100%;}
 .listing_container img{ display: inline-block; vertical-align: middle;font: 16px/1 Arial sans-serif; max-height:100%; max-width:100%;}
<style>

<div class="listing_container">
    <img src="http://www.advancewebsites.com/img/theme1/logo.png">  
 </div>
0
sandeep kumar

Stavo cercando una risposta simile e alcuni dei suggerimenti hanno scattato l'immagine a sinistra o il rapporto verticale è stato inserito nell'immagine, quindi ho trovato questa soluzione ... Centra il contenuto verticalmente e orizzontalmente.

 .div{
    position: relative;
    overflow: hidden;
 }
 .bantop img {
    position: absolute;
    margin: auto;
    width: 103%;
    height: auto;
    top: -50%;
    bottom: -50%;
    left: -50%;
    right: -50%;
  }

Lo uso su diversi progetti e funziona come uno sharm

0
Samuel Ramzan

che ne dici di questo?

position: absolute;
top: calc(50% - 0.5em);
left: calc(50% - 0.5em);
line-height: 1em;

e puoi variare font-size

0
th3pirat3

La migliore soluzione è quella

.block{
    /* decor */
    padding:0 20px;
    background:#666;
    border:2px solid #fff;
    text-align:center;
    /* important */
    min-height:220px;
    width:260px;
    white-space:nowrap;
}
.block:after{
    content:'';
    display:inline-block;
    height:220px; /* the same as min-height */
    width:1px;
    overflow:hidden;
    margin:0 0 0 -5px;
    vertical-align:middle;
}
.block span{
    vertical-align:middle;
    display:inline-block;
    white-space:normal;
}
0
Kumar

Ho giocato con l'uso del padding per l'allineamento del centro. Dovrai definire la dimensione del contenitore esterno di livello superiore, ma il contenitore interno dovrebbe ridimensionare e puoi impostare il riempimento a valori percentuali diversi.

jsfiddle

<div class='container'>
  <img src='image.jpg' />
</div>

.container {
  padding: 20%;
  background-color: blue;
}

img {
  width: 100%;
}
0
steven iseki

Il vecchio collegamento JSFiddle che ho postato qui non funzionava più, questo è probabilmente il motivo del downvote. Solo per il fatto che questa sia una risposta valida, voglio comunque pubblicare nuovamente la soluzione jQuery. Questo funziona per ogni elemento a cui è stata applicata la classe v_align. Sarà centrato verticalmente nel genitore e sul ridimensionamento della finestra verrà ricalcolato.

Collegamento a JSFiddle

$(document).ready(function() {
  // define the class that vertial aligns stuff
  var objects = '.v_align';
  // initial setup
  verticalAlign(objects);

  // register resize event listener
  $(window).resize(function() {
    verticalAlign(objects);
  });
});

function verticalAlign(selector) {
  $(selector).each(function(val) {
    var parent_height = $(this).parent().height();
    var dif = parent_height - $(this).height()
    // should only work if the parent is larger than the element
    var margin_top = dif > 0 ? dif/2 : 0;
    $(this).css("margin-top", margin_top + "px");
  });
}
0
Chris

Vuoi allineare un'immagine che ha dopo un testo/titolo ed entrambi sono all'interno di un div?

Vedi su JSfiddle o Esegui snippet di codice.

Assicurati di avere un ID o una classe in tutti i tuoi elementi (div, img, titolo, ecc.).

Per me funziona questa soluzione su tutti i browser (per i dispositivi mobili è necessario adattare il codice con: @media).

h2.h2red {
color: red; 
font-size: 14px;
}
.mydivclass {
margin-top: 30px;
display: block;
}
img.mydesiredclass {
margin-right: 10px;  
display: block;  
float: left;/*If you want to allign the text with an image on the same row*/  
width: 100px;
heght: 100px;
margin-top: -40px/*Change this value to adapt to your page*/;
}
<div class="mydivclass">
<br />
<img class="mydesiredclass" src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/b3/Wikipedia-logo-v2-en.svg/2000px-Wikipedia-logo-v2-en.svg.png">
<h2 class="h2red">Text alligned after image inside a div by negative manipulate the img postion</h2>
</div>

0
mariusfv