Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make image fill div completely without stretching

Tags:

I have large images of varying dimensions that need to completely fill 240px by 300px containers in both dimensions. Here is what I got right now, which only works for one dimension:

http://jsfiddle.net/HsE6H/

HTML

<div class="container">     <img src="http://placehold.it/300x1500"> </div> <div class="container">     <img src="http://placehold.it/1500x300"> </div 

CSS

.container { height: 300px; width: 240px; background-color: red; float: left; overflow: hidden; margin: 20px; }  img { max-width: 100%; height: auto; } 

The proportions should stay the same. Essentially, wide images should be cut off in width, while high images need to be cut off in height. So just zooming in as much as is needed to fill the container.

Not sure why I can't get it to work, do I need JavaScript for this?

Edit: To be clear. I need everything red on the fiddle gone. The images coming in are dynamic, therefore I can't use background-images. I'm open to using JavaScript. Thanks! :)

like image 683
Lennart Avatar asked May 24 '13 16:05

Lennart


1 Answers

Auto-sizing Images to Fit a Div - Making the CSS Work

Here is one way of doing it, start with the following HTML:

<div class="container portrait">     <h4>Portrait Style</h4>     <img src="http://placekitten.com/150/300"> </div> 

and the CSS:

.container {     height: 300px;     width: 240px;     background-color: red;     float: left;     overflow: hidden;     margin: 20px; } .container img {     display: block; }  .portrait img {     width: 100%; } .landscape img {     height: 100%; } 

and the demo fiddle: http://jsfiddle.net/audetwebdesign/QEpJH/

When you have an image oriented as a portrait, you need to scale the width to 100%. Conversely, when the image is landscape oriented, you need to scale the height.

Unfortunately, there is no combination of selectors in CSS that targets the aspect ratio of the image, so you can't use CSS to pick out the correct scaling.

In addition, you have no easy way of centering the image since the top left corner of the image is pinned to the top left corner of the containing block.

jQuery Helper

You can use the following jQuery action to determine which class to set based on the aspect ratio of the image.

$(".container").each(function(){     // Uncomment the following if you need to make this dynamic     //var refH = $(this).height();     //var refW = $(this).width();     //var refRatio = refW/refH;      // Hard coded value...     var refRatio = 240/300;      var imgH = $(this).children("img").height();     var imgW = $(this).children("img").width();      if ( (imgW/imgH) < refRatio ) {          $(this).addClass("portrait");     } else {         $(this).addClass("landscape");     } }) 

For each image in .container, get the height and width, test if width<height and then set the appropriate class.

Also, I added a check to take into account the aspect ratio of the containing block. Before, I had implicitly assumed a square view panel.

like image 184
Marc Audet Avatar answered Nov 14 '22 04:11

Marc Audet