Practical Responsive Web Design - Northeast PHP 2013

Preview:

DESCRIPTION

I gave this talk at Northeast PHP 2013 in Boston, MA. Slides and links available at http://jkle.in/rwd

Citation preview

Practical Responsive Web Design

Northeast PHP 2013Jonathan Klein, Performance Engineer@jonathanklein

Sunday, August 18, 13

Slides, Linksjkle.in/rwd

Sunday, August 18, 13

Some Etsy Stats

Sunday, August 18, 13

Some Etsy Stats• Handmade marketplace

Sunday, August 18, 13

Some Etsy Stats• Handmade marketplace• 1.5 billion page views/month

Sunday, August 18, 13

Some Etsy Stats• Handmade marketplace• 1.5 billion page views/month• Almost $1B in sales last year

Sunday, August 18, 13

Some Etsy Stats• Handmade marketplace• 1.5 billion page views/month• Almost $1B in sales last year• ~1M lines of PHP

Sunday, August 18, 13

Why Responsive Web Design?

Sunday, August 18, 13

Main Advantages

Sunday, August 18, 13

Main Advantages

• Maintainability

Sunday, August 18, 13

Main Advantages

• Maintainability• SEO

Sunday, August 18, 13

Main Advantages

• Maintainability• SEO• User Experience

Sunday, August 18, 13

Main Advantages

• Maintainability• SEO• User Experience• Performance

Sunday, August 18, 13

1.6 seconds

Sunday, August 18, 13

Two Assertions

Sunday, August 18, 13

1. RWD isn’t that hard

Sunday, August 18, 13

2. RWD can be fast

Sunday, August 18, 13

The Basics

Sunday, August 18, 13

Building blocks of RWD/* Greater than 900px wide */

@media screen and (min-width: 56.25em) {...}

/* Retina Display */@media screen and (min-device-pixel-ratio: 2) {...}

/* You can chain these */@media screen and (min-width: 56.25em) and (min-device-pixel-ratio: 2) {...}

Sunday, August 18, 13

Building blocks of RWD/* Greater than 900px wide */

@media screen and (min-width: 56.25em) {...}

/* Retina Display */@media screen and (min-device-pixel-ratio: 2) {...}

/* You can chain these */@media screen and (min-width: 56.25em) and (min-device-pixel-ratio: 2) {...}

Sunday, August 18, 13

Sunday, August 18, 13

Breakpoints

Sunday, August 18, 13

Sunday, August 18, 13

What Breakpoints to Use?

Sunday, August 18, 13

What Breakpoints to Use?

• Don’t think about devices

Sunday, August 18, 13

What Breakpoints to Use?

• Don’t think about devices• “Make it look good”

Sunday, August 18, 13

What Breakpoints to Use?

• Don’t think about devices• “Make it look good”• Something like 600px, 900px, max

Sunday, August 18, 13

What Breakpoints to Use?

• Don’t think about devices• “Make it look good”• Something like 600px, 900px, max• Divide by 16 to get em’s

Sunday, August 18, 13

Retina Images

Sunday, August 18, 13

Start With the Normal Version

/* Small version of the logo */.logo { background-image: url(logo_sm.png); background-repeat: no-repeat; background-position: center; background-size: 230px 50px;}

Sunday, August 18, 13

Start With the Normal Version

/* Small version of the logo */.logo { background-image: url(logo_sm.png); background-repeat: no-repeat; background-position: center; background-size: 230px 50px;}

Sunday, August 18, 13

High Res Screens

/* Provide a hi-res logo for retina screens */@media screen and (-webkit-min-device-pixel-ratio: 2) { .logo { background-image: url(logo_lg.png); }}

Sunday, August 18, 13

High Res Screens

/* Provide a hi-res logo for retina screens */@media screen and (-webkit-min-device-pixel-ratio: 2) { .logo { background-image: url(logo_lg.png); }}

Sunday, August 18, 13

RWD In Action

Sunday, August 18, 13

Sunday, August 18, 13

Sunday, August 18, 13

Clean up some CSS.article {

width: 31%; min-width:250px; }

#content .wrapper { width:auto; }

#page { background:none; }

Sunday, August 18, 13

Make it Responsive /* Two articles across */@media screen and (max-width: 850px) {

.article { width: 46%; } }

/* One article across */ @media screen and (max-width: 530px) { .article { width: 90%; } }

Sunday, August 18, 13

Sunday, August 18, 13

Demo

Sunday, August 18, 13

Performance

Sunday, August 18, 13

A Few Considerations

Sunday, August 18, 13

A Few Considerations

• Extra CSS (minimal)

Sunday, August 18, 13

A Few Considerations

• Extra CSS (minimal)• Retina Images (ouch)

Sunday, August 18, 13

A Few Considerations

• Extra CSS (minimal)• Retina Images (ouch)• Larger images than needed

Sunday, August 18, 13

A Few Considerations

• Extra CSS (minimal)• Retina Images (ouch)• Larger images than needed• Extra Image Requests

Sunday, August 18, 13

A Few Considerations

• Extra CSS (minimal)• Retina Images (ouch)• Larger images than needed• Extra Image Requests

Sunday, August 18, 13

Responsive Images

Sunday, August 18, 13

Three Performance Goals:

Sunday, August 18, 13

Three Performance Goals:

1. Start with a small image

Sunday, August 18, 13

Three Performance Goals:

1. Start with a small image

2. Upgrade to larger size without downloading both

Sunday, August 18, 13

Three Performance Goals:

1. Start with a small image

2. Upgrade to larger size without downloading both

3. Unique image URLs (caching)

Sunday, August 18, 13

Automate

Sunday, August 18, 13

Resize on the fly

Sunday, August 18, 13

Resize on the fly

• Based on browser resolution, make the right image

Sunday, August 18, 13

Resize on the fly

• Based on browser resolution, make the right image

• Round a bit

Sunday, August 18, 13

Resize on the fly

• Based on browser resolution, make the right image

• Round a bit• http://adaptive-images.com

Sunday, August 18, 13

Lossless Compression

Sunday, August 18, 13

Lossless Compression

Sunday, August 18, 13

140 KB

Lossless Compression

Sunday, August 18, 13

140 KB 85 KB

Lossless Compression

Sunday, August 18, 13

140 KB 85 KB

Lossless Compression

• http://www.smushit.com/ysmush.it/

• https://developers.google.com/speed/pagespeed/

Sunday, August 18, 13

• Automate HTML output• Plan for the future

More Automation

Sunday, August 18, 13

HTML Output (picturefill)

Sunday, August 18, 13

HTML Output (picturefill)

• https://github.com/scottjehl/picturefill

Sunday, August 18, 13

HTML Output (picturefill)

• https://github.com/scottjehl/picturefill

• Mimics proposed <picture> element

Sunday, August 18, 13

HTML Output (picturefill)

• https://github.com/scottjehl/picturefill

• Mimics proposed <picture> element

• < 0.5K JS file

Sunday, August 18, 13

HTML Output (picturefill)

• https://github.com/scottjehl/picturefill

• Mimics proposed <picture> element

• < 0.5K JS file• Supports all media queries

Sunday, August 18, 13

HTML Output (picturefill)

• https://github.com/scottjehl/picturefill

• Mimics proposed <picture> element

• < 0.5K JS file• Supports all media queries• Works across all browsers

Sunday, August 18, 13

<div data-picture data-alt="Interesting Image Alt Text"> <div data-src="small.jpg"></div> <div data-src="medium.jpg" data-media="(min-width: 400px)"></div> <div data-src="large.jpg" data-media="(min-width: 800px)"></div> <div data-src="extralarge.jpg" data-media="(min-width: 1000px)"></div>

<!-- Fallback content for non-JS browsers. Same img src as the initial, unqualified source element. --> <noscript> <img src="small.jpg" alt="Interesting Image Alt Text"> </noscript></div>

Sunday, August 18, 13

<div data-picture data-alt="Interesting Image Alt Text"> <div data-src="small.jpg"></div> <div data-src="medium.jpg" data-media="(min-width: 400px)"></div> <div data-src="large.jpg" data-media="(min-width: 800px)"></div> <div data-src="extralarge.jpg" data-media="(min-width: 1000px)"></div>

<!-- Fallback content for non-JS browsers. Same img src as the initial, unqualified source element. --> <noscript> <img src="small.jpg" alt="Interesting Image Alt Text"> </noscript></div>

IE 6, 7, 8 get this

Sunday, August 18, 13

How does it do?

Sunday, August 18, 13

How does it do?

✓ Unique image URLs

Sunday, August 18, 13

How does it do?

✓ Unique image URLs

✓ Start with smallest image

Sunday, August 18, 13

How does it do?

✓ Unique image URLs

✓ Start with smallest image

✓ Only one image download

Sunday, August 18, 13

How does it do?

✓ Unique image URLs

✓ Start with smallest image

✓ Only one image download

✓ Fallback for old IE

Sunday, August 18, 13

But that markup...

Sunday, August 18, 13

Plan to Replace Whatever You Build

Sunday, August 18, 13

Don’t type, click:jkle.in/rwd

Sunday, August 18, 13

Clown Car Technique

Sunday, August 18, 13

Basics

Sunday, August 18, 13

Basics

• <object> tag

Sunday, August 18, 13

Basics

• <object> tag• References SVG file

Sunday, August 18, 13

Basics

• <object> tag• References SVG file• ...as a DataURI

Sunday, August 18, 13

Basics

• <object> tag• References SVG file• ...as a DataURI• ...URL encoded

Sunday, August 18, 13

Basics

• <object> tag• References SVG file• ...as a DataURI• ...URL encoded• Wrapping conditional comment

Sunday, August 18, 13

Clowns and Cars<object data="data:image/svg+xml,%3Csvg%20viewBox='0%200%20300%20329'%20preserveAspectRatio='xMidYMid%20meet'%20xmlns='http://www.w3.org/2000/svg'%3E%3Ctitle%3EClown%20Car%20Technique%3C/title%3E%3Cstyle%3Esvg%7Bbackground-size:100%25%20100%25;background-repeat:no-repeat;%7D@media%20screen%20and%20(max-width:400px)%7Bsvg%7Bbackground-image:url(images/small.png);%7D%7D@media%20screen%20and%20(min-width:401px)%7Bsvg%7Bbackground-image:url(images/medium.png);%7D%7D@media%20screen%20and%20(min-width:701px)%7Bsvg%7Bbackground-image:url(images/big.png);%7D%7D@media%20screen%20and%20(min-width:1001px)%7Bsvg%7Bbackground-image:url(images/huge.png);%7D%7D%3C/style%3E%3C/svg%3E"

type="image/svg+xml"> <!--[if lte IE 8]> <img src="images/medium.png" alt="Fallback for IE"> <![endif]--></object>

Sunday, August 18, 13

Benefits

Sunday, August 18, 13

Benefits

• All logic in an SVG file

Sunday, August 18, 13

Benefits

• All logic in an SVG file• One HTTP request

Sunday, August 18, 13

Benefits

• All logic in an SVG file• One HTTP request• Management is easy

Sunday, August 18, 13

Benefits

• All logic in an SVG file• One HTTP request• Management is easy• Adapts to browser size automatically

Sunday, August 18, 13

Drawbacks

Sunday, August 18, 13

Drawbacks

• Accessibility

Sunday, August 18, 13

Drawbacks

• Accessibility• No right-click

Sunday, August 18, 13

Drawbacks

• Accessibility• No right-click• Doesn’t work on Android <= 2.3

Sunday, August 18, 13

We Need Something Better

Sunday, August 18, 13

display:none

Sunday, August 18, 13

<img src="foo.png" style="display:none" />

Sunday, August 18, 13

<img src="foo.png" style="display:none" />

Image is Downloaded

Sunday, August 18, 13

<div style="display:none;"> <img src="foo.png" style="display:none" /></div>

Sunday, August 18, 13

<div style="display:none;"> <img src="foo.png" style="display:none" /></div>

Image is Downloaded

Sunday, August 18, 13

<style> .bg { background-image: url(foo.png); width:100px; height: 100px; display: none; }</style>

<div class="bg"></div>

Sunday, August 18, 13

<style> .bg { background-image: url(foo.png); width:100px; height: 100px; display: none; }</style>

<div class="bg"></div>

Image is Downloaded

Sunday, August 18, 13

<style> .bg { background-image: url(foo.png); width:100px; height: 100px; display: none; }</style>

<div style="display:none;"> <div class="bg"></div></div>

Sunday, August 18, 13

<style> .bg { background-image: url(foo.png); width:100px; height: 100px; display: none; }</style>

<div style="display:none;"> <div class="bg"></div></div>

Image is NOT Downloaded

Sunday, August 18, 13

<img> with display:none Downloaded

<img> with parent display:none

Downloaded

background image with display:none

Downloaded

background image with parent display:none

Not Downloaded

Sunday, August 18, 13

Workarounds

Sunday, August 18, 13

Handling display:none

Sunday, August 18, 13

Handling display:none

• Start with an empty src, use JS

Sunday, August 18, 13

Handling display:none

• Start with an empty src, use JS• Server side detection

Sunday, August 18, 13

Media Query Browser Support

Sunday, August 18, 13

Sunday, August 18, 13

Fail

Sunday, August 18, 13

The Future: Client Hints

Sunday, August 18, 13

Proposal by Ilya Grigorik

Sunday, August 18, 13

Proposal by Ilya Grigorik

• Client (browser) sends an additional HTTP Header

Sunday, August 18, 13

Proposal by Ilya Grigorik

• Client (browser) sends an additional HTTP Header

• CH: dh=598, dw=384, dpr=2.0, t

Sunday, August 18, 13

Proposal by Ilya Grigorik

• Client (browser) sends an additional HTTP Header

• CH: dh=598, dw=384, dpr=2.0, t• https://github.com/igrigorik/http-client-hints/

Sunday, August 18, 13

Homework

Sunday, August 18, 13

Sunday, August 18, 13

Find your favorite non-responsive site

Sunday, August 18, 13

Find your favorite non-responsive site

Sunday, August 18, 13

Find your favorite non-responsive site

Save the HTML locally

Sunday, August 18, 13

Find your favorite non-responsive site

Save the HTML locally

Sunday, August 18, 13

Find your favorite non-responsive site

Save the HTML locally

Add some media queries and a breakpoint

Sunday, August 18, 13

Find your favorite non-responsive site

Save the HTML locally

Add some media queries and a breakpoint

Sunday, August 18, 13

Find your favorite non-responsive site

Save the HTML locally

Add some media queries and a breakpoint

Make one retina image and use it

Sunday, August 18, 13

Find your favorite non-responsive site

Save the HTML locally

Add some media queries and a breakpoint

Make one retina image and use it

Sunday, August 18, 13

Congratulations!

Sunday, August 18, 13

• Resize browser window, use console when you want a breakpoint • document.body.offsetWidth

• If you must start w/ desktop, use:• @media screen and (max-width: 900px) {

Some Hints

Sunday, August 18, 13

Sunday, August 18, 13

Synthetic Testing

Sunday, August 18, 13

WebPagetest

• Use Chrome• Script: • setviewportsize 400 600

• navigate bostonglobe.com

Sunday, August 18, 13

Sunday, August 18, 13

Recap

Sunday, August 18, 13

Takeaways

Sunday, August 18, 13

Takeaways

• Start with small sizes on new sites

Sunday, August 18, 13

Takeaways

• Start with small sizes on new sites• Use em’s and %’s

Sunday, August 18, 13

Takeaways

• Start with small sizes on new sites• Use em’s and %’s• ~3-4 device independent breakpoints

Sunday, August 18, 13

Takeaways

• Start with small sizes on new sites• Use em’s and %’s• ~3-4 device independent breakpoints• Use Responsive Images

Sunday, August 18, 13

Takeaways

• Start with small sizes on new sites• Use em’s and %’s• ~3-4 device independent breakpoints• Use Responsive Images• Have a fallback plan for IE

Sunday, August 18, 13

Get in Touch

www.etsy.com/careers

jonathan@etsy.com

@jonathanklein

Sunday, August 18, 13

Recommended