2012-06-30 8 views
8

Estoy tratando de hacer que una imagen se extienda para caber dentro de un div. Sin embargo, quiero que se desborde para que se llene todo el div. El div cambia de tamaño con la página. Quiero un efecto similar al complemento jQuery bgstretcher (http://www.ajaxblender.com/bgstretcher-2-jquery-stretch-background-plugin-updated.html), pero no puedo usar ese complemento porque ya lo estoy usando para la imagen de fondo en la página, y parece que no funciona cuando intentas activar varias instancias de él .Estirar imagen para llenar div, pero no sesgar

Así que lo que estoy pidiendo es una especie de función jQuery simple que cambia el tamaño de una imagen para llenar por completo un div con desbordamiento oculto, para que no haya lagunas, pero sin sesgar la imagen.

Editar:

http://jsfiddle.net/R7UCZ/

En cierto modo es lo que busco, pero quiero la imagen para llenar todo el div y sin sesgo. Si la imagen sale un poco del div, está bien, pero necesito que cambie el tamaño del div, que cambia de tamaño con la página, tanto en altura como en ancho.

Respuesta

9

primer lugar usted necesita para obtener las propiedades de imagen y ver cuál es mayor, la altura o la anchura, a continuación, cambiar el tamaño de la imagen basándose en el tamaño div después de la ventana cambia de tamaño, así:

//this would load up initially, you will need this data for future processing 


    div = $("div"); 
    imgsrc = div.find('img').attr('src'); 

    var img = new Image() 
    img.onload = function(){ 
     imgw = img.width; 
     imgh = img.height; 

     //after its loaded and you got the size.. 
     //you need to call it the first time of course here and make it visible: 

     resizeMyImg(imgw,imgh); 
     div.find('img').show(); 

     //now you can use your resize function 
     $(window).resize(function(){ resizeMyImg(imgw,imgh) }); 

     } 
    img.src = imgsrc 


    function resizeMyImg(w,h){  
     //the width is larger 
     if (w > h) { 
     //resize the image to the div 
     div.find('img').width(div.innerWidth() + 'px').height('auto'); 
     }   
     else { 
     // the height is larger or the same 
     //resize the image to the div 
     div.find('img').height(div.innerHeight() + 'px').width('auto'); 
     } 

    } 

Usted en realidad puede encontrar una solución completa aquí: http://jsfiddle.net/CDywS/1

+0

¡sí! ¡gracias! – r0tterz

0

Usted puede simplemente hacer como esto:

<img src="your_picture.png" alt="" style="width:100%;height:100%"></img> 

Y cuando el contenedor div cambia el tamaño de la imagen va a estirarse para llenar toda la div.

EDIT:

Si no desea que la imagen para sesgar:

<img src="your_picture.png" alt="" style="width:100%"></img> 

O:

<img src="your_picture.png" alt="" style="height:100%"></img> 

En función de la dimensión que no quiere desbordarse ...

+0

Estoy tratando de obtener toda la imagen para llenar el div ** sin ** sesgar. Entonces, si el borde de la imagen sale un poco del div, está bien, siempre que no se tuerza. – r0tterz

+0

He editado mi respuesta para mostrarle cuán fácilmente puede lograr eso ... –

6

No necesita JavaScript/jQuery en absoluto. Sólo tiene que utilizar los contain o cover valores para background-size:

  1. background-size: contain escala la imagen para que es máxima anchura/altura de modo que toda la imagen es visible preservando al mismo tiempo la relación de aspecto. (sin desbordamiento)

  2. background-size: cover escala la imagen a su ancho máximo para que todo el div se llene con la imagen conservando la relación de aspecto.(Desbordamiento si la imagen no es cuadrada)

Por lo tanto, sólo tiene que escribir el código:

#myDiv { 
    background-size: contain; 
} 

O:

#myDiv { 
    background-size: cover; 
} 

Más información: http://css-tricks.com/perfect-full-page-background-image/

Actualización: Demo

+0

pero no es una imagen de fondo. ¡Eso es maravilloso! No lo sabía, pero es una imagen * dentro * de un div. – r0tterz

+0

tal vez podrías crear una demostración en jsfiddle.net para que tenga una visión más clara de lo que estás tratando de hacer – Alp

+0

, aunque podría convertirlos en div en su lugar ... hm ... – r0tterz

1

La respuesta de Zee Tee está marcada como correcta y funciona, pero solo para imágenes orientadas al paisaje. Las imágenes de retrato no funcionan con él, como puede ver si prueba una imagen de este tipo en el ejemplo jsfiddle.

Sin embargo, puede hacerlo funcionar, dando al div que contiene la imagen una altura. Puede dar un valor fijo para esto o una altura mínima, o bien funcionará.

La razón de esto es que en la función resizeMyImg, en la línea de:

div.find('img').height(div.innerHeight() + 'px').width('auto'); 

div.innerHeight es indefinido a menos que el div tiene un atributo de altura o altura min-CSS asociada a ella.

Cuestiones relacionadas