Making Images Responsive photo by Virginia DeBolt
I’ve been attempting to sort out in my own mind exactly what I needed to be teaching students about responsive images. For a while, things have been a bit wobbly in this area and there were no definite best practice ideas. Thanks to the Responsive Images Community Group, I think a consensus on best practice has gelled for now.
Srcset and sizes
I’m sure you’ve heard about the new
picture element. Before you think about using it, you need to know when you can use the familiar
The majority of the time, the
sizes attributes of the
img element will be what front end developers use.
This example shows
img and options for display density.
srcset="image750px.jpg 1.5x, image1000px.jpg 2x"
width="500px" alt="great image">
src attribute is the fallback image. The “1.5x” means 1.5 device pixels per CSS pixel, and is a larger image. The 2x means 2 device pixels per CSS pixel, and again, refers to a larger image. It means you have prepared 3 versions of the same image and uploaded them.
Here’s an example of code using an
img element with
<img srcset="large.jpg 1024w,
sizes="(min-width: 36em) 33.3vw,
alt="A great image">
srcset attribute lets you give a comma separated list of image file paths. The second example used
w to specify width to the browser and
vw to specify viewport width. Instead of display density, the second example uses media queries to designate images from the list. Again, you have prepared 3 images in different sizes and have them on the server.
Whether you’ve prepared your code to work with pixel density or using widths, the result is the browser makes a choice as to which image will work best. The browser decides which image of the listed images fits the situation by evaluating resolution, viewport size, even bandwidth, and chooses the best image for the situation.
You can also add add the
sizes attribute. The
sizes attribute tells the browser how many pixels it needs by describing the final rendered width of the image. To make the image occupy a third of the viewport, the code would be:
sizes, you provide a CSS length that describes the image’s rendered width. CSS lengths can be either absolute (
20em) or relative to the viewport as in
33.3vw. As with fonts or other relative measures, the relative to the viewport value is what offers the responsive rendering. The
100vw measure is the default length and would be used if no other conditions matched.
Value can be in
In the second example above the
sizes attribute uses media query width descriptors with values in ems or vw (viewport width). The first value is a media condition (a media query without the media type) and the second value is a length. Note, the default length is not matched to a media query.
You can use only the
srcset or both
sizes attributes with the
When you need to do more than resize an image
So, when do you use the
Sometimes an image won’t work if it is simply sized differently for different devices. It might need to be cropped or have some other type of what is called art direction work done on it. In this situation, you want to give a list of different images to the browser to use in different situations. Perhaps they’ve been cropped. If the image contain words, perhaps the text has been reworked for different size displays. They are not merely resized versions of a single image, but completely reworked images meant to fit different situations.
picture element with multiple
source elements for this situation.
<source media="(min-width: 40em)"
srcset="big.jpg 1x, big-hd.jpg 2x">
srcset="small.jpg 1x, small-hd.jpg 2x">
<img src="fallback.jpg" alt="">
Embedded in the
picture element are
source elements with images paths, media queries, display density designations – all the things we saw with the
img element, but here the
source elements link to images that have been altered in some way. The last thing nested in the
picture element is a fallback
That’s a lot of new information for someone who grew up on the old style image tags. New length measures, new elements, new attributes. I’m not sure I really have it clearly understood. Writing this was one way to help me work it all out in my mind. If any of you see where I’m foggy or misunderstand something, please offer suggestions.