This post is part of the series ‘Making ubuntu.com responsive‘.
Deciding how you’re going to handle responsive images is a big part of most responsive projects — also, one that usually causes many headaches!
We had really interesting discussions within the team to try to find out which options were out there, being used by other people, and whether those solutions could be useful (and possible) for us.
There is a range of solutions and opinions on this matter, but ultimately it’s all down to the content and types of images your website actually has to handle, and the technical and resource limitations of your team.
We tried to keep an open mind as to what would be possible to achieve within a very small timeframe: we wanted to find a solution that would work for our content, that would be achievable within our deadlines, and obviously, that would improve the experience of the visitors to our site.
Making an image inventory
Before discussing any potential solutions, it’s important to understand exactly what type of images are used on your site, how they are created, who creates them, how they are added to the site and in which locations, how the images play with the content and whether there are different levels of importance (UI icons, purely decorative images, infographics, editorial images, etc.).
You might realise you only use UI icons and vector illustrations, or that all your images are decorative and secondary, or even that all your images are photos commissioned to professional photographers and photojournalists that add great value to your content and designs. It’s only after doing this inventory that you’ll have sufficient information to decide what to do next and what your site needs.
On ubuntu.com there are five different types of image assets:
- Pictograms: from an existing set of pre-approved pictograms, created in various formats, in a small subset of colours
- Illustrations: usually created using two or more pictograms, or in a similar style, in vector format
- Photography: these can be product shots of devices, screengrabs of our operating system and applications, and sometimes other types of photographic images
- Logos: not only Ubuntu and Canonical’s own logos, but several partner logos
- Backgrounds: these can be anything from dot patterns to textured backgrounds
Pictograms, illustrations, photography, logos and backgrounds are part of the image arsenal of ubuntu.com.
The pictograms and illustrations are always created in vector format and can easily be exported to an SVG. Similarly, many of the logos we use on the site can be sourced in an SVG format, but many times this isn’t possible. The photography and backgrounds used on the site, however, are usually provided to us in bitmap format, that lose definition when scaled up.
With this inventory in mind, we knew we’d have to come up with different solutions for the different types of assets rather than a single solution for all images.
Scalable vectors: pictograms, illustrations and logos
We investigated the possibility of creating a font for our icons and even started this process, but quickly decided that the lack of consistent browser support wasn’t acceptable.
The decision to move from GIF and PNG icons to SVG was relatively straightforward for us, as all our icons and pictograms are created in vector format from the outset. This would allow us to have crisp, scalable icons in most browsers, whether the device has a retina screen or not.
It was at this point that we thought it would be a good idea to finally introduce Modernizr into our toolset. With Modernizr we could target browsers that don’t support SVG and serve them with a PNG image replacement.
We did run into some browser support issues, mainly with Opera Mini which doesn’t support
.opera-mini to the
body of the document. He will be covering this in more detail in a following post in this series.
Opera Mini’s SVG rendering issues.
We have explored the possibility of dynamically changing the colours of our SVG pictograms, but haven’t yet found a solution that is compatible across browsers — we’re open to suggestions!
Bitmap formats: photography and backgrounds
This is where things usually get trickier: how do you create a balance between serving users the best quality image they can get and saving their bandwidth?
Ideally, we’d have had the time to add the ability of images to be called on the fly in the size needed, so that the user didn’t have to download a size that was not intended for his or her screen size. This is something that we still want to work on, but just couldn’t justify to be added to the scope of this first iteration of the responsive transition.
Eventually we decided to use Imager.js — made by the BBC News developers — for responsive imaging in the markup. We chose this solution as it has simple syntax and is being used in production on high traffic websites, so it was proven to work. It seemed like a simple solution that fit our needs. In simple terms, the script runs through the page, looking up placeholder elements and replacing them with the closest available image size based on the width of the container.
CSS helper classes
We’ve created three CSS classes that can be used to hide/show images and other elements according to the size of the viewport:
.for-small: only shows in the smallest media query viewport
.for-medium: only shows in the small and medium media query viewports
.not-for-small: doesn’t show in the smallest media query viewport
These classes give us enough flexibility to decide which images should be visible based on our breakpoints in cases where we need more control. This means if we change the breakpoints, the classes will inherit the change.
Initially we were planning on creating several versions of the images on the site, for small, medium and large screen sizes, but we found out that some of the current images on the site had a much larger file size than they needed to — for example, some transparent PNGs were being used when transparency was not a requirement.
With the limited time available, we opted for focusing on reducing file sizes as much as possible for existing images as a priority. This way, we’d make our pages smaller but small higher density screens would still see crisp images, since at smaller sizes they’d be reduced to about half their original size.
You can see a comparison of the file size per section of the site before and after this process.
||Size before Ubuntu 14.04 LTS release (KB)
||Size after Ubuntu 14.04 LTS release (KB)
We obtained these sizes using a combination of YSlow and PhantomJS.
Some of the sections were expanded for the Ubuntu 14.04 LTS release in April, which justifies some of the increases. The desktop, phone and tablet sections, however — the worst offenders — saw a significant reduction in file size, mainly from switching to the most appropriate file format instead of all PNGs.
Another way to create more consistency and file size savings across the site was the introduction of a pictogram and logo package. Instead of creating pictograms ad-hoc as needed, we now have a defined set of pictograms in a central location that can be reused across the site, in all its different colour variations. Because the pictograms and many of the logos are provided in an SVG format, they can be scaled to the size that is needed.
Ideas for the future
Despite the visible improvements, there are plenty of things we’d still like to explore in the way we handle images in a responsive world.
We are currently working on an asset server that will allow us to dynamically request different sizes and formats of assets (for example, SVG to PNG), which we can offset, crop, etc., right from the
src property, also being far more cacheable with long expiry times. It will also make it easier to share assets, as they will be located at a permanent URL and will become findable through a database and metadata, which should encourage reuse.
These were the solutions we came up with and worked best with your timescales and resources. We’d love to hear how you’ve handled images in your responsive projects too, so let us know in the comments!
Read the next post in this series: “Making ubuntu.com responsive: updating font sizes and increasing readability”