Cómo alinear verticalmente una imagen dentro de un div
¿ 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>
.frame
La altura es fija y la altura de la imagen es desconocida. Puedo agregar nuevos elementos .frame
si 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>
La única forma (y la mejor para todos los navegadores), que yo sepa, es utilizar un inline-block
asistente con height: 100%
y vertical-align: middle
sobre 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 :before
y expression()
para Internet Explorer: http://jsfiddle.net/kizu/4RPFa/4571/
Mostrar fragmento de código
Cómo funciona:
Cuando tienes dos
inline-block
elementos cerca uno del otro, puedes alinearlos uno al lado del otro, asívertical-align: middle
obtendrás algo como esto:Cuando tiene un bloque con altura fija (en
px
uem
otra unidad absoluta), puede establecer la altura de los bloques internos en%
.- Entonces, agregar uno
inline-block
enheight: 100%
un bloque con altura fija alinearía otroinline-block
elemento en él (<img/>
en su caso) verticalmente cerca de él.
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
}
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
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;
}
Una solución de tres líneas:
position: relative;
top: 50%;
transform: translateY(-50%);
Esto se aplica a cualquier cosa.
De aquí .