Cómo alinear verticalmente una imagen dentro de un div

Resuelto Arnaud Le Blanc asked hace 13 años • 37 respuestas

¿ Cómo se puede alinear una imagen dentro de un contenedor div?

Ejemplo

En mi ejemplo, necesito centrar verticalmente el <img>con <div>" class ="frame:

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

.frameLa altura es fija y la altura de la imagen es desconocida. Puedo agregar nuevos elementos .framesi esa es la única solución. Estoy intentando hacer esto en Internet Explorer 7 y versiones posteriores, WebKit, Gecko.

Vea el jsfiddle aquí .

.frame {
    height: 25px;      /* Equals maximum 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>
Expandir fragmento

Arnaud Le Blanc avatar Sep 01 '11 23:09 Arnaud Le Blanc
Aceptado

La única forma (y la mejor para todos los navegadores), que yo sepa, es utilizar un inline-blockasistente con height: 100%y vertical-align: middlesobre ambos elementos.

Entonces hay una solución: http://jsfiddle.net/kizu/4RPFa/4570/

Mostrar fragmento de código

O, si no desea tener un elemento adicional en los navegadores modernos y no le importa usar expresiones de Internet Explorer, puede usar un pseudoelemento y agregarlo a Internet Explorer usando una expresión conveniente, que se ejecuta solo una vez por elemento. , por lo que no habrá problemas de rendimiento:

La solución con :beforey expression()para Internet Explorer: http://jsfiddle.net/kizu/4RPFa/4571/

Mostrar fragmento de código


Cómo funciona:

  1. Cuando tienes dos inline-blockelementos cerca uno del otro, puedes alinearlos uno al lado del otro, así vertical-align: middleobtendrás algo como esto:

    Dos bloques alineados

  2. Cuando tiene un bloque con altura fija (en pxu emotra unidad absoluta), puede establecer la altura de los bloques internos en %.

  3. Entonces, agregar uno inline-blocken height: 100%un bloque con altura fija alinearía otro inline-blockelemento en él ( <img/>en su caso) verticalmente cerca de él.
kizu avatar Sep 05 '2011 16:09 kizu

Esto podría resultar útil:

div {
    position: relative;
    width: 200px;
    height: 200px;
}
img {
    position: absolute;
    top: 0;
    bottom: 0;
    margin: auto;
}
.image {
    min-height: 50px
}
Tahir Yasin avatar Jul 30 '2012 05:07 Tahir Yasin

La solución de matejkramny es un buen comienzo, pero las imágenes de gran tamaño tienen una proporción incorrecta.

Aquí está mi tenedor:

Demostración: https://jsbin.com/lidebapomi/edit?html,css,output

avance


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;
}
jomo avatar Sep 18 '2013 09:09 jomo

Una solución de tres líneas:

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

Esto se aplica a cualquier cosa.

De aquí .

Jorge Orpinel Pérez avatar Feb 10 '2015 04:02 Jorge Orpinel Pérez