0HTML5 LogoResponsive background images for websites

I’ve recently been updat­ing my web­sites and web serv­er and adding a new site (LoveCrete.org). I wanted to have a back­ground image on LoveCrete and real­ised that of course 1 size does­n’t fit all screens. Here is a sum­mary of what my think­ing was and what I did to cater for the numer­ous screen sizes and orientations.

Which orientation

I star­ted by mak­ing myself a little table of all the com­mon res­ol­u­tions used on PCs and tab­lets (in hori­zont­al ori­ent­a­tion). I decided to focus on this because most images are avail­able in land­scape so this is a sens­ible place to start.

I decided that I would place images cent­rally on the page and let the edges be lost off the edge of the screen in some instances. When a phone is used in por­trait ori­ent­a­tion it will load the image based on height (not width) and will lose a lot from both edge of the image. Doing it any oth­er way would mean need­ing images cropped to a totally dif­fer­ent shape or hav­ing a land­scape image “tile” on a tall screen, which is not desirable.

The ratios of the max­im­um size image to make in each group were all around 1.6 with a few a bit high­er. To keep things sim­pler I decided to use a ratio of 16:10 for all images and came up with sizes to make accordingly.

This means in most cases the image will not be a per­fect fit to the screen size, but all screens will get some­thing very close and no screen will end up with some­thing too small. It also means a source image can be cropped to 16:10 once and then mul­tiple sizes eas­ily created

Common landscape resolution groups

HeightWidthImage to makeCom­ments
4:316:1016:9
2160288038402400×38404k UHD
1600
1536
1440
-
2048
1920
2560
-
-
-
-
2560
1600×2560
1200
1080
1050
1600
1440
1400
1920
-
1680
-
1920
-
1200×1920Full HD 1080p
960
900
1280
1200
1536
1440
-
1600
1000×1600
800
768
720
-
1024
960
1280
-
-
-
-
1280
800×1280720p
600
576
800
768
960
-
-
1024
640×1024
480640768480×768

As you can see I have grouped quite a few res­ol­u­tions and will then make 1 image that will cov­er all heights up to the largest height in that group. I will make sure the image is also wide enough for the max­im­um width such a height might be paired with on a nor­mal screen. I haven’t taken account of unusu­al con­fig­ur­a­tions like 21:9 mon­it­ors or mul­tiple screens — there has to be a lim­it somewhere!

Because CSS uses the view­port or browser size and not the screen size land­scape screens need to use width rather than height — as on most sys­tems the top and bot­tom lose space to title bars etc whilst the width is usu­ally max­im­ised. How­ever, for por­trait dis­plays it is bet­ter to use the height prop­erty. This can be done as CSS can identi­fy the screen orientation

The CSS used then looks as follows

body{background-repeat: no-repeat; background-attachment: fixed; background-position: center center; background-size: cover;}

@media (max-width: 768px) {body { background-image: url(bg480.jpg); }}
@media (min-width:769px) and (max-width: 1024px) {body { background-image: url(bg640.jpg); }}
@media (min-width:1025px) and (max-width: 1280px) {body { background-image: url(bg800.jpg); }}
@media (min-width:1281px) and (max-width: 1600px) {body { background-image: url(bg1000.jpg); }}
@media (min-width:1601px) and (max-width: 1920px) {body { background-image: url(bg1200.jpg); }}
@media (min-width:1921px) and (max-width: 2560px) {body { background-image: url(bg1600.jpg); }}
@media (min-width:2561px) {body { background-image: url(../images/bg2400.jpg); }}

@media (orientation: portrait){
@media (max-height: 480px) {body { background-image: url(bg480.jpg); }}
@media (min-height:481px) and (max-height: 640px) {body { background-image: url(bg640.jpg); }}
@media (min-height:641px) and (max-height: 800px) {body { background-image: url(bg800.jpg); }}
@media (min-height:801px) and (max-height: 1000px) {body { background-image: url(bg1000.jpg); }}
@media (min-height:1001px) and (max-height: 1200px) {body { background-image: url(bg1200.jpg); }}
@media (min-height:1201px) and (max-height: 1600px) {body { background-image: url(bg1600.jpg); }}
@media (min-height:1601px) {body { background-image: url(bg2400.jpg); }}
}

Leave a Reply