htmlcssimageresizeautoresize

Scale image to fit a bounding box


Is there a css-only solution to scale an image into a bounding box (keeping aspect-ratio)? This works if the image is bigger than the container:

img {
  max-width: 100%;
  max-height: 100%;
}

Example:

But I want to scale up the image until a dimension is 100% of the container.


Solution

  • Note: Even though this is the accepted answer, this other answer is more accurate and is currently supported in all browsers if you have the option of using a background image.

    Edit 2: In the modern age, using object-fit might be an even better solution: https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit

    No, there is no CSS only way to do this in both directions. You could add

    .fillwidth {
        min-width: 100%;
        height: auto;
    }
    

    To the an element to always have it 100% width and automatically scale the height to the aspect ratio, or the inverse:

    .fillheight {
        min-height: 100%; 
        width: auto;
    }
    

    to always scale to max height and relative width. To do both, you will need to determine if the aspect ratio is higher or lower than it's container, and CSS can't do this.

    The reason is that CSS does not know what the page looks like. It sets rules beforehand, but only after that it is that the elements get rendered and you know exactly what sizes and ratios you're dealing with. The only way to detect that is with JavaScript.


    Although you're not looking for a JS solution I'll add one anyway if someone might need it. The easiest way to handle this with JavaScript is to add a class based on the difference in ratio. If the width-to-height ratio of the box is greater than that of the image, add the class "fillwidth", else add the class "fillheight".

    $('div').each(function() {
      var fillClass = ($(this).height() > $(this).width()) 
        ? 'fillheight'
        : 'fillwidth';
      $(this).find('img').addClass(fillClass);
    });
    .fillwidth { 
      width: 100%; 
      height: auto; 
    }
    .fillheight { 
      height: 100%; 
      width: auto; 
    }
    
    div {
      border: 1px solid black;
      overflow: hidden;
    }
    
    .tower {
      width: 100px;
      height: 200px;
    }
    
    .trailer {
      width: 200px;
      height: 100px;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class="tower">
      <img src="http://placekitten.com/150/150" />
    </div>
    <div class="trailer">
      <img src="http://placekitten.com/150/150" />
    </div>