749

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.
    – Mark Hurd
    Commented Apr 25, 2009 at 0:02
  • 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.
    – Rik Telner
    Commented Apr 8, 2014 at 18:54

18 Answers 18

843

To resize the image proportionally using CSS:

img.resize {
    width:540px; /* you can use % */
    height: auto;
}
10
  • 8
    This works even if the img tag has a height and width attributes. +1 Commented Jun 11, 2012 at 19:48
  • 74
    +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.
    – Phrogz
    Commented Jul 30, 2012 at 17:30
  • 3
    In my case I used, the height is fixed and I set the width to auto :) Thanks!
    – KarenAnne
    Commented Jan 28, 2013 at 8:45
  • 22
    A common use is to set max-width: 100%; height: auto; so large images don't exceed their containers width. Commented Oct 26, 2013 at 22:00
  • 7
    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.
    – GetFree
    Commented May 20, 2014 at 21:04
281

Control size and maintain proportion :

#your-img {
    height: auto; 
    width: auto; 
    max-width: 300px; 
    max-height: 300px;
}
5
  • The thing is that max-width and max-height are not interpreted by all browsers, like IE, right?
    – alexserver
    Commented Apr 9, 2014 at 19:15
  • 1
    @alexserver It works in MSIE >= 7: cssportal.com/css-properties/max-width.php
    – gouessej
    Commented Jun 17, 2015 at 8:31
  • 8
    This answer is way better... You can set max bound for both width and height while keeping the ratio.
    – olivarra1
    Commented Oct 30, 2015 at 10:47
  • 6
    Yep, this is the correct answer to the question as it takes into account image orientation (i.e. landscape vs. portrait). Thanks!
    – katamayros
    Commented Dec 14, 2015 at 12:00
  • 1
    The best answer! Commented Sep 7, 2022 at 19:28
130

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

Example css:

#your-div {
  background: url('image.jpg') no-repeat;
  background-size:contain;
}
4
  • 16
    Or background-size:cover;, which will cover the whole area.
    – Turion
    Commented May 17, 2014 at 13:15
  • 1
    background-size:contain; works for me. Commented Nov 24, 2014 at 22:16
  • Also add the width you want and height=100%
    – Guy Lowe
    Commented Apr 28, 2015 at 13:27
  • @Turion Awesome, thanks, works perfectly and fixes scaling issues caused by max-width: 300px;
    – Underverse
    Commented Sep 14, 2016 at 2:07
93

Try

transform: scale(0.5, 0.5);
-ms-transform: scale(0.5, 0.5);
-webkit-transform: scale(0.5, 0.5);
7
  • 9
    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! Commented Feb 26, 2014 at 11:31
  • @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)?!
    – orome
    Commented Sep 30, 2014 at 12:10
  • 10
    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. – Commented Sep 30, 2014 at 12:25
  • @MārtiņšBriedis: Hmmm. I'll have to try it. It's been a while and it seemed to do what was wanted.
    – orome
    Commented Sep 30, 2014 at 12:30
  • 2
    Here's a jsfiddle for you: jsfiddle.net/oy6t2xgL Commented Sep 30, 2014 at 12:52
79

You can use object-fit property:

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

This will fit image, without changing the proportionally.

3
  • 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 Commented Nov 20, 2016 at 6:47
  • note the browser support: developer.mozilla.org/en-US/docs/Web/CSS/object-fit as of now, no IE and android 4.4.4+.
    – qix
    Commented Feb 6, 2017 at 20:56
  • 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.
    – tschumann
    Commented Nov 19, 2018 at 0:18
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
  • 8
    Um... this doesn't seem to be the case on the desktop at least: jsfiddle.net/nLh1oh5e
    – Campbeln
    Commented Oct 9, 2014 at 3:07
  • 6
    This does not appear to be the case for me either. Commented Nov 24, 2014 at 22:15
  • 1
    Thanks for calling this out. It makes a big difference. (at least, I noticed) Commented Feb 24, 2016 at 3:11
  • 1
    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.
    – Micros
    Commented Jun 9, 2016 at 12:56
  • 1
    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)
    – rinogo
    Commented Feb 27, 2020 at 22:12
53

To scale an image by keeping its aspect ratio

Try this,

img {
  max-width:100%;
  height:auto;
}
0
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">
0
27
<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
  • 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 :)
    – codingbear
    Commented Apr 25, 2009 at 0:09
  • for some reason this is the only option that worked for me.. thanks :)
    – Mano Haran
    Commented Feb 17, 2017 at 10:46
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
  • 2
    This seems to be the best way when targeting HTML5-capable browsers.
    – user149533
    Commented Sep 15, 2010 at 3:27
  • It works in MSIE >= 7: cssportal.com/css-properties/max-width.php
    – gouessej
    Commented Jun 17, 2015 at 8:32
  • I'm so glad that old IE browser stuff is getting irrelevant. Commented Feb 8, 2018 at 12:26
20
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
  • 1
    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.
    – Scott L
    Commented Dec 19, 2019 at 19:52
  • This answer is a better and scalable solution.
    – Sleek Geek
    Commented Mar 16, 2021 at 3:58
  • object-fit: scale-down; is enough, works for me without max-width Commented Jul 27, 2021 at 20:38
18

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
  • 4
    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 Commented Sep 19, 2018 at 16:49
13

Use this easy scaling technique

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

div {
    width:100px;
}

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

0
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%; }
}

2

You always need something like this

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

at the top of your css file

1
  • this is a great answer, why did this get downvoted? is it a bad practice or something? Commented May 6, 2015 at 21:33
2

Try this:

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

/* resize images */
div.container img {
    width: 100%;
    height: auto;
}
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') %>

0

Not the answer you're looking for? Browse other questions tagged or ask your own question.