757

Is there a way to resize (scale down) images proportionally using ONLY CSS?

I'm doing the JavaScript way, but just trying to see if this is possible with CSS.

3
  • 1
    Ethan Marcotte recently investigated this issue very thoroughly. The short answer is yes, it's possible, but not in all browsers. Commented Apr 25, 2009 at 0:02
  • 1
    If you don't want to burn bandwidth, slimmage.js can help; it reads the resulting max-width value to adjust which size image is requested. Commented Jul 8, 2013 at 16:05
  • You can just set width of image, height is automaticly adjusted. Commented Apr 8, 2014 at 18:54

18 Answers 18

850

To resize the image proportionally using CSS:

img.resize {
    width:540px; /* you can use % */
    height: auto;
}
Sign up to request clarification or add additional context in comments.

10 Comments

This works even if the img tag has a height and width attributes. +1
+1 You can also use max-width instead of width if desired. The key is to use height:auto to override any height="..." attribute already present on the image.
In my case I used, the height is fixed and I set the width to auto :) Thanks!
A common use is to set max-width: 100%; height: auto; so large images don't exceed their containers width.
This doesn't work if you want to make the image bigger. The image lose its aspect ratio. Unless, of course, the container has the same aspect ratio of the image.
|
283

Control size and maintain proportion :

#your-img {
    height: auto; 
    width: auto; 
    max-width: 300px; 
    max-height: 300px;
}

5 Comments

The thing is that max-width and max-height are not interpreted by all browsers, like IE, right?
@alexserver It works in MSIE >= 7: cssportal.com/css-properties/max-width.php
This answer is way better... You can set max bound for both width and height while keeping the ratio.
Yep, this is the correct answer to the question as it takes into account image orientation (i.e. landscape vs. portrait). Thanks!
The best answer!
130

If it's a background image, use background-size:contain.

Example css:

#your-div {
  background: url('image.jpg') no-repeat;
  background-size:contain;
}

5 Comments

Or background-size:cover;, which will cover the whole area.
background-size:contain; works for me.
Also add the width you want and height=100%
@Turion Awesome, thanks, works perfectly and fixes scaling issues caused by max-width: 300px;
I used an exact size of the image I wanted, e.g. background-size: 48px 48px and that worked for me.
94

Try

transform: scale(0.5, 0.5);
-ms-transform: scale(0.5, 0.5);
-webkit-transform: scale(0.5, 0.5);

7 Comments

Actually this works pretty well if you have to scale down each image proportionally to its size. With this code images become 2x smaller. +1 BUT! With this solution the images still take up the space!
@MārtiņšBriedis: Isn't that the point? Is there a way to get images on the server to take up less space "using ONLY CSS" (see OP)?!
Not that kind of space. The images still have the same bounds, width, height in document, only they "look" 2 times smaller. Imagine - an image with size 100x100. Then you apply scale(0.5), and it is the same as image 50x50, but with invisible 25px borders on both sides. The image still would take up the 100x100 space. –
@MārtiņšBriedis: Hmmm. I'll have to try it. It's been a while and it seemed to do what was wanted.
Here's a jsfiddle for you: jsfiddle.net/oy6t2xgL
|
80

You can use object-fit property:

.my-image {
    width: 100px;
    height: 100px;
    object-fit: contain;
}

This will fit image, without changing the proportionally.

3 Comments

I use width 100% and height 100% and also object fit contain. and it works like a charm :). And object fit contain solution is simple
note the browser support: developer.mozilla.org/en-US/docs/Web/CSS/object-fit as of now, no IE and android 4.4.4+.
object-fit works well - just seems to require both height and width or both max-height and max-width to not cause the image to overflow the container in either direction.
54

To scale an image by keeping its aspect ratio

Try this,

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

Comments

54

Notice that width:50% will resize it to 50% of the available space for the image, while max-width:50% will resize the image to 50% of its natural size. This is very important to take into account when using this rules for mobile web design, so for mobile web design max-width should always be used.

UPDATE: This was probably an old Firefox bug, that seems to have been fixed by now.

5 Comments

Um... this doesn't seem to be the case on the desktop at least: jsfiddle.net/nLh1oh5e
This does not appear to be the case for me either.
Thanks for calling this out. It makes a big difference. (at least, I noticed)
True, thanks. But how do you handle the size wrapper of the image? It is still acting like the image is 100% wide instead of 50%, causing an unwanted border. I'd like it to fit tightly around the downscaled image.
The problem with this approach is that max-width has nothing to do with the original dimensions of the image. max-width of 50% means "50% of the width of the containing block". (Docs on width)
31

Revisited in 2015:

<img src="http://imageurl" style="width: auto; height: auto;max-width: 120px;max-height: 100px">

I've revisited it as all common browsers now have working auto suggested by Cherif above, so that works even better as you don't need to know if image is wider than taller.

older version: If you are limited by box of 120x100 for example you can do

<img src="http://image.url" height="100" style="max-width: 120px">

Comments

28
<img style="width: 50%;" src="..." />

worked just fine for me ... Or am I missing something?

Edit: But see Shawn's caveat about accidentally upsizing.

2 Comments

sorry, I like to separate the content and design of a site. I totally know that adding width rule works fine, which I originally had. Thanks :)
for some reason this is the only option that worked for me.. thanks :)
23

The css properties max-width and max-height work great, but aren't supported by IE6 and I believe IE7. You would want to use this over height / width so you don't accidentally scale an image up. You would just want to limit the maximum height/width proportionately.

3 Comments

This seems to be the best way when targeting HTML5-capable browsers.
I'm so glad that old IE browser stuff is getting irrelevant.
21
img{
    max-width:100%;
    object-fit: scale-down;
}

works for me. It scales down larger images to fit in the box, but leaves smaller images their original size.

3 Comments

Interesting solution, though it's important to note the footprint of the image still takes up whatever the height attribute is. For example a 100x100 image can be scaled down to 80x80 but is then centered in the middle of the 100x100 footprint.
This answer is a better and scalable solution.
object-fit: scale-down; is enough, works for me without max-width
19

I believe this is the easiest way to do it, also possible using through the inline style attribute within the <img> tag.

.scaled
{
  transform: scale(0.7); /* Equal to scaleX(0.7) scaleY(0.7) */
}

<img src="flower.png" class="scaled">

or

<img src="flower.png" style="transform: scale(0.7);">

1 Comment

I tested it, but I think it is very inefficient because doing that way, the border-box model remains the same. You probably won't wanna this, but I recognize this can be useful, maybe
13

Use this easy scaling technique

img {
    max-width: 100%;
    height: auto;
}
@media {
  img { 
    width: auto; /* for ie 8 */
  }
}

Comments

4
img {
    max-width:100%;
}

div {
    width:100px;
}

with this snippet you can do it in a more efficient way

Comments

4

We can resize image using CSS in the browser using media queries and the principle of responsive design.

    @media screen and (orientation: portrait) {
img.ri {
    max-width: 80%;
  }
}

@media screen and (orientation: landscape) {
  img.ri { max-height: 80%; }
}

Comments

2

You always need something like this

html
{
    width: 100%;
    height: 100%;
}

at the top of your css file

1 Comment

this is a great answer, why did this get downvoted? is it a bad practice or something?
2

Try this:

div.container {
    max-width: 200px;//real picture size
    max-height: 100px;
}

/* resize images */
div.container img {
    width: 100%;
    height: auto;
}

Comments

1

image_tag("/icons/icon.gif", height: '32', width: '32') I need to set height: '50px', width: '50px' to image tag and this code works from first try note I tried all the above code but no luck so this one works and here is my code from my _nav.html.erb:
<%= image_tag("#{current_user.image}", height: '50px', width: '50px') %>

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.