Resize images proportionally while keeping the aspect ratio

Sometimes images are just too big to display on the web page. We don’t need JavaScript to fix this. We can resize images proportionally with HTML image tags or CSS background styles. Let’s look at the different options we have to size images while keeping their aspect ratio in check.

Resizing HTML image tags

Our first choice is to set only one size property, either width or height, the browser will automatically calculate the size of the other edge.

Imagine we have a cat picture with an aspect ratio of 4:3, in other words, it’s dimensions are 4032 × 3024, that’s a lot of cat.

If we want it to show a bit smaller we can set the width to 240, the browser will then automatically calculate the height to be 180.

<img src="cat.jpeg" width="240" />

There’s a caveat. Images aren’t immediately available.

The browser will render the page, wait for the image source to load, and then update the height of the image element. This will most likely cause the browser to render the page twice, because after the height of the image is updated all items below the image are pushed down.

This is bad news for your page performance.

Best to set the intended size so the browser can reserve space.

<img src="cat.jpeg" width="240" height="180" />

But what if we don’t know the aspect ratio of the image and we get a square cat picture? Won’t our cat be squished? Yes, yes it would, poor cat.

But fear not, we can fix this with CSS.

img {
  object-fit: contain;
}

Pass cover instead of contain to tell the browser to fill the entire image tag with cat pixels.

img {
  object-fit: cover;
}

What if our image needs to be limited to the width of a parent element? In that situation we can use CSS max-width or width to fit the image.

Use max-width: 100% to limit the size but allow smaller image sizes, use width: 100% to always scale the image to fit the parent container width.

<div>
  <img src="cat.jpeg" width="240" height="180" />
</div>
div {
  width: 240px;
  border: 1px solid pink;
}

img {
  max-width: 100%;
  object-fit: contain;
}

We can further use CSS to fix the aspect ratio of the image, learn more about presenting images in a specific aspect ratio.

Resizing CSS background images

By default a background-image will be repeated over the background of an element if it’s smaller, if it’s bigger it won’t be scaled but parts of the image won’t be visible. In the example below, the bottom and right part of our cat aren’t rendered.

<div style="width:200px; height:200px;"></div>
div {
  background: url("cat.jpeg") no-repeat;
  border: 1px solid pink;
}

We can fix this by setting the background-size property. To fit the image inside the element we use the contain value. The browser will fit the image inside the element bounds and scale it proportionally.

<div style="width:200px; height:200px;"></div>
div {
  background: url("cat.jpeg") no-repeat;
  background-size: contain; /* scales the image */
  background-position: center; /* centers the image */
  border: 1px solid pink;
}

Similar to object-fit we can also use the cover value to tell the browser to cover the element with cat pixels. As you can see below, this will cause it to scale down just enough to fit the vertical space, now only the right side of our cat is cropped.

<div style="width:200px; height:200px;"></div>
div {
  background: url("cat.jpeg") no-repeat;
  background-size: cover;
  border: 1px solid pink;
}

We can also supply a singular width value to the background-size property. Similar to the img element, the height will be automatically calculated.

<div style="width:200px; height:200px;"></div>
div {
  background: url("cat.jpeg") no-repeat;
  background-size: 200px;
  border: 1px solid pink;
}

That’s it!

I use Twitter to share new webdevelopment tips and tricks, so Follow me there if you found this interesting and want to learn more.

Rik Schennink

Indie Product Developer

to pqina.nl