How to Use CSS background-size and background-position

Ralph Mason
Share

There’s a lot we can do with the CSS background properties. In this article, we’ll explore how to use the background-size property to set the size of a background image, and we’ll also explore options for positioning that background image with background-position.

Table of Contents
  1. Setting Up
  2. Setting Background Dimensions with background-size
  3. Setting the Position of Background Images with background-position

Setting Up

For our background image demos, we’ll use the following image (of Oia on Santorini, Greece). Its natural dimensions are 400px by 600px.

Portrait image of a village by the sea

Here’s our base CodePen demo, with a <div> centered in the middle of an <article>. (You can read more about centering elements with CSS Grid here.) The div measures 300px by 200px.

See the Pen
CSS background-size: Template
by SitePoint (@SitePoint)
on CodePen.

The div has a yellow background, and the background image will sit above this yellow background (as background colors always sit beneath any background image).

If we simply add the image as a background now, we’ll notice that only part of it is visible. That’s because the image is wider and taller than the div.

See the Pen
CSS background-size: Template with background image
by SitePoint (@SitePoint)
on CodePen.

The image below gives a sense of the parts of the background image that aren’t seen outside the div.

The background image is shown in relation to the container, which can't hold all of it by default

This obviously isn’t a very satisfying result, so let’s see how the background-size property can help us out.

Setting Background Dimensions with background-size

Over the years, new properties have become available for manipulating background images in CSS, including background-size. It lets us set the size of a background image, just as we’ve always been able to do with inline images.

The background-size property offers a choice of two keyword values — cover and contain — and it can also take numerical values with units such as px, em, and %, along with auto. Let’s look at examples of each.

background-size: contain

The contain value forces the entire image to fit within its container, even though its natural dimensions are larger than the container.

See the Pen
CSS background-size: Contain
by SitePoint (@SitePoint)
on CodePen.

In this example, we’ve added the following CSS:

div {
  background-size: contain;
  background-repeat: no-repeat;
}

By default, a background image will repeat as many times as needed to fill the container, so background-repeat: no-repeat; stops this behavior. (Try removing it to see the image repeating.)

background-size: cover

The cover value forces the image to completely cover the area of container, showing as much of the image as possible but without distorting it. Because the image is quite tall, we see its full width but not its full height.

See the Pen
CSS background-size: Cover
by SitePoint (@SitePoint)
on CodePen.

By default, the top left corner of the background image is placed in the top left corner of the div, so it’s the bottom part of the image that we can’t see, as represented in the image below.

The cover value ensures that the narrower part of the image fully fills the container

When we look at the background-position property, we’ll learn how to specify which part of the image is visible.

background-size with other values

Let’s see what other values we can use with the background-size property.

If we add a single percentage value of 50%, this is what happens:

See the Pen
CSS background-size with a single % value
by SitePoint (@SitePoint)
on CodePen.

The background image is now 50% of the width of the div, but is still taller than the div, so the bottom part of the image is hidden. So one percentage value applies to the x-axis. The y-axis defaults to auto, meaning that the image retains its natural aspect ratio.

Here’s what happens if we add two percentage values (50% 50%):

See the Pen
CSS background-size with two % values
by SitePoint (@SitePoint)
on CodePen.

Whoah! Now the image covers 50% of the width of the div, and 50% of the height — which means that its aspect ratio is significantly distorted.

We’ll get similar results if we swap out % for px or other unit values. We could, for example, do something like background-size: 50px 50px, or background-size: 200px 3em and so on. We can experiment with these values in the Pen above … although this approach will rarely be of much use, because it will distort the background image unless we carefully pick values that preserve its aspect ratio.

Of far more use for refining our background image settings is the background-position property, so let’s look at that next.

Setting the Position of Background Images with background-position

We’ve seen above that, by default, the top left corner of our background image is placed in the top left corner of its container. That is, the default background-position setting looks like this:

div {
  background-position: left top; /* or 0 0 etc.*/
}

The background-position property gives us a lot of control over where our background image is placed, and it works really nicely in conjunction with background-size: cover, so we’ll use them together in the next couple of examples.

Using background-position with keywords

Our example image has a lot of blue sky at the top left, so let’s instead position it from the bottom right:

div {
  background-size: cover;
  background-position: right bottom;
}

See the Pen
CSS background-size with length values
by SitePoint (@SitePoint)
on CodePen.

In addition to the various combinations of top, bottom, left and right, there’s also center, which nicely centers the image. (Try replacing background-position: right bottom; with background-position: center; in the Pen above.)

Using background-position with length values

We can position our background image with length values such as pixels and ems. This allows us to push and pull the image away from the edges of the container. For example:

div {
  background-size: cover;
  background-position: 20px 2em;
}

See the Pen
CSS background-position with length values
by SitePoint (@SitePoint)
on CodePen.

Here, the image is set to cover the container, but it’s then pushed 20px from the left of the container and 2em from the top.

Length values can be combined with keyword values. For example, bottom 20px right 2em moves the image 20px from the bottom and 2em from the right.

We can also use negative values to further nudge and pull our background image into the desired position.

Using background-position with percentage values

Using the background-position percentage values gives us a lot of control over our image positioning, but it can be a little hard to understand. For this demonstration, we’ll remove background size and just work with the natural dimensions of the image:

div {
  background-position: 50% 50%;
}

See the Pen
CSS background-position with percentage values
by SitePoint (@SitePoint)
on CodePen.

So what does 50% mean? 50% of what? It means that the 50% mark of the image matches the 50% mark of the container. That is, if we draw vertical and horizontal lines through the center of the image and the center of the container, those lines will match up, as pictured below.

Center lines of the image match the center lines of the container

If we set the background-position to 20% 40%, it means that a vertical line 20% from the left of the image matches a vertical line 20% from the left of the container box, and a horizontal line 40% from the top of the image matches a vertical line 40% from the top of the container box, as illustrated below.

Horizontal and vertical lines at 20% and 40% of the image and container in alignment

Conclusion

The background-size property is a really useful addition to CSS, and often comes in handy — especially when containers change size across responsive layouts. The background-position property adds further power by allowing us to choose how backgrounds images are positioned within a container.

There’s a lot more to learn about these two properties, although what we’ve covered here will probably serve the most common use cases.

To learn more, check out the MDN pages for these properties:

They cover some other options we haven’t covered here, such as how to work with multiple background images.

Finally, it’s worth comparing the background-size and background-position properties for background images with the object-fit and object-position properties for inline images — another super useful addition to our CSS toolbox. Check out How to Use CSS object-fit and object-position to get up to speed with them.