performance & responsive web design

65
November 8, 2013 Performance & Responsive Web Design (RWD) NebraskaJS via @zachleat Thursday, November 8, 12

Upload: zach-leatherman

Post on 15-May-2015

490 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Performance & Responsive Web Design

November 8, 2013

Performance &Responsive Web Design(RWD)NebraskaJS via @zachleat

Thursday, November 8, 12

Page 2: Performance & Responsive Web Design

About Me

✤ @zachleat on

✤ zachleat.com [email protected]

✤ Zach Leatherman

Thursday, November 8, 12

Page 3: Performance & Responsive Web Design

My Projects

✤ BigText ✤ parseIntimate.com

Thursday, November 8, 12

Page 4: Performance & Responsive Web Design

My Projects

✤ ALARMd.com ✤ f2em.com

Thursday, November 8, 12

Page 5: Performance & Responsive Web Design

Housekeeping

✤ We need one or more volunteers to speak at January’s NebraskaJS.

✤ Tweet @nebraskajs with Topic Ideas even if you don’t want to speak.

Thursday, November 8, 12

Page 6: Performance & Responsive Web Design

Goals

✤ Primer

✤ RWD !== Media Queries

✤ 99 Problems

✤ Buzzkills

✤ RWD Showcase Showdown

✤ Be kind, RWD.

Thursday, November 8, 12

Page 7: Performance & Responsive Web Design

Primer

Thursday, November 8, 12

Page 8: Performance & Responsive Web Design

RWD is

✤ A Flexible Grid (Fluid: % + Min Widths)

✤ Flexible Media (Images, Video)

✤ (Not Just) Media Queries

http://unstoppablerobotninja.com/entry/on-being-responsive

Thursday, November 8, 12

Page 9: Performance & Responsive Web Design

http://www.w3.org/History/19921103-hypertext/hypertext/WWW/TheProject.htmlThursday, November 8, 12

Page 10: Performance & Responsive Web Design

http://www.w3.org/History/19921103-hypertext/hypertext/WWW/TheProject.htmlThursday, November 8, 12

Page 11: Performance & Responsive Web Design

http://www.w3.org/History/19921103-hypertext/hypertext/WWW/TheProject.htmlThursday, November 8, 12

Page 12: Performance & Responsive Web Design

RWD & performance

✤ Two alternatives to RWD:

✤ Do nothing

✤ Use a separate m.dot site

✤ Redirects are slow.

✤ Maintenance of UA-Parsing Server Side Redirects (WURFL updates ~monthly)

✤ Content Strategy (Desktop Mode link)

http://en.m.wikipedia.org/?useformat=mobile#_

Thursday, November 8, 12

Page 13: Performance & Responsive Web Design

Google recommends RWD

✤ “It keeps your desktop and mobile content on a single URL, which is easier for your users to interact with, share, and link to and for Google’s algorithms to assign the indexing properties to your content.”

✤ “Google can discover your content more efficiently as we wouldn't need to crawl a page with the different Googlebot user agents to retrieve and index all the content.”

http://googlewebmastercentral.blogspot.com/2012/06/recommendations-for-building-smartphone.htmlThursday, November 8, 12

Page 14: Performance & Responsive Web Design

Content Strategy

“Mobile users want to see our menu, hours, and delivery number. Desktop users definitely want this 1mb png of someone smiling at a salad.”

https://twitter.com/wilto/status/63284673723375616

Thursday, November 8, 12

Page 15: Performance & Responsive Web Design

Thursday, November 8, 12

Page 16: Performance & Responsive Web Design

99 Problems

✤ Browsers Download and Block Rendering on Unnecessary CSS

✤ Browsers Sometimes Download Unnecessary Images

✤ Big Images are Wasted on Small Screens

✤ Related: Retina Images are Wasted on <snob>Blurry</snob> Screens

Thursday, November 8, 12

Page 17: Performance & Responsive Web Design

The “Average” Web Page

http://httparchive.org/interesting.php#bytesperpage

Thursday, November 8, 12

Page 18: Performance & Responsive Web Design

JavaScript Can Block

✤ “With scripts, progressive rendering is blocked for all content below the script.”

http://developer.yahoo.com/blogs/ydn/posts/2007/07/high_performanc_5/

Thursday, November 8, 12

Page 19: Performance & Responsive Web Design

JavaScript that Doesn’t Block

<script  src></script></body>

http://developer.yahoo.com/blogs/ydn/posts/2007/07/high_performanc_5/

Thursday, November 8, 12

Page 20: Performance & Responsive Web Design

JavaScript that Doesn’t Block

<head><!-­‐-­‐  Downloads  right  away  -­‐-­‐><script  src  async></script><!-­‐-­‐  Waits  to  download  -­‐-­‐><script  src  defer></script>

http://calendar.perfplanet.com/2010/the-truth-about-non-blocking-javascript/

Thursday, November 8, 12

Page 21: Performance & Responsive Web Design

JavaScript that Doesn’t Block

var  script  =  document.createElement("script");script.type  =  "text/javascript";script.src  =  "foo.js";

document.getElementsByTagName("head")[0].appendChild(script);

http://calendar.perfplanet.com/2010/the-truth-about-non-blocking-javascript/

Thursday, November 8, 12

Page 22: Performance & Responsive Web Design

Stylesheets Block

✤ “Browsers (except Opera) block rendering until all screen CSS arrives. With the worst possible experience: white page.”

✤ “Browsers download CSS they don't need, e.g. print, tv, device-ratio... And most browsers (except Opera and Webkit) block rendering because of these too”

✤ http://www.phpied.com/files/css-loading/mq.php?mq=all

http://www.phpied.com/css-and-the-critical-path/

Thursday, November 8, 12

Page 23: Performance & Responsive Web Design

WebKit

<!-­‐-­‐  blocking  stylesheet,  nothing  renders  until  it  is  downloaded  and  parsed  -­‐-­‐>  

<link  href="main.css"  rel="stylesheet">

<!-­‐-­‐  non-­‐blocking,  low  download  priority  because  of  the  evaluated  media  query  -­‐-­‐><link  href="i-­‐want-­‐a-­‐monitor-­‐of-­‐this-­‐size.css"  rel="stylesheet"  media="(min-­‐width:  4000px)">

<!-­‐-­‐  print  stylesheet  is  non-­‐blocking  -­‐-­‐><link  href="noop.css"  rel="stylesheet"  media="print">

http://www.igvita.com/2012/06/14/debunking-responsive-css-performance-myths/

Thursday, November 8, 12

Page 24: Performance & Responsive Web Design

Everything Else*

<!-­‐-­‐  blocking  stylesheet,  nothing  renders  until  it  is  downloaded  and  parsed  (timeouts  may  vary)  -­‐-­‐>  <link  href="main.css"  rel="stylesheet"><link  href="i-­‐want-­‐a-­‐monitor-­‐of-­‐this-­‐size.css"  rel="stylesheet"  media="(min-­‐width:  4000px)"><link  href="noop.css"  rel="stylesheet"  media="print">

Thursday, November 8, 12

Page 25: Performance & Responsive Web Design

Downloading CSS

http://scottjehl.github.com/CSS-Download-Tests/

Thursday, November 8, 12

Page 26: Performance & Responsive Web Design

Downloading CSS

Firefox 16

Safari 6 Chrome 22

Opera 12

Thursday, November 8, 12

Page 27: Performance & Responsive Web Design

Solutions

✤ CSS is sacred. Choose minimal when possible.

✤ Separate <link> elements for each Media Query

✤ Doesn’t scale if you have a lot of breakpoints.

✤ Good for WebKit, what about everything else?

✤ eCSSential

Thursday, November 8, 12

Page 28: Performance & Responsive Web Design

eCSSential

✤ “Making responsive CSS load the way it should.”

✤ Downloads Blocking CSS that matches media queries

✤ Downloads other CSS async, non-blocking✤ https://github.com/filamentgroup/eCSSential

Thursday, November 8, 12

Page 29: Performance & Responsive Web Design

matchMedia

if  (window.matchMedia("(min-­‐width:  400px)").matches)  {    /*  the  view  port  is  at  least  400  pixels  wide  */}  else  {    /*  the  view  port  is  less  than  400  pixels  wide  */}

https://developer.mozilla.org/en-US/docs/DOM/window.matchMedia

Thursday, November 8, 12

Page 30: Performance & Responsive Web Design

matchMedia

Polyfill: https://github.com/paulirish/matchMedia.js/Careful with IE8-, the polyfill requires Media Query support

http://caniuse.com/#feat=matchmedia

Thursday, November 8, 12

Page 31: Performance & Responsive Web Design

eCSSential

<head>        <script>        <!-­‐-­‐  Inline  eCSSential.min.js  -­‐-­‐>

       eCSSential({                "all":  "css/all.css",                "(min-­‐width:  20em)":  "css/min-­‐20em.css",                "(min-­‐width:  37.5em)":  "css/min-­‐37.5em.css",                "(min-­‐width:  50em)":  "css/min-­‐50em.css",                "(min-­‐width:  62.5em)":  "css/min-­‐62.5em.css"        });        </script></head>

Thursday, November 8, 12

Page 32: Performance & Responsive Web Design

eCSSential Demo

✤ http://filamentgroup.github.com/eCSSential/examples/concat/

Thursday, November 8, 12

Page 33: Performance & Responsive Web Design

Images Don’t Block

✤ Doesn’t mean they get a free pass.

Thursday, November 8, 12

Page 34: Performance & Responsive Web Design

Images Don’t Block

✤ Doesn’t mean they get a free pass.

753KBThursday, November 8, 12

Page 35: Performance & Responsive Web Design

Downloading Images (CSS)

<div  id="test1">        <img  src="images/test1.png"  alt=""  /></div>@media  all  and  (max-­‐width:  600px)  {        #test1  {  display:none;  }}

http://timkadlec.com/2012/04/media-query-asset-downloading-results/

Thursday, November 8, 12

Page 36: Performance & Responsive Web Design

Downloading Images (CSS)

<div  id="test1">        <img  src="images/test1.png"  alt=""  /></div>@media  all  and  (max-­‐width:  600px)  {        #test1  {  display:none;  }}

http://timkadlec.com/2012/04/media-query-asset-downloading-results/

NOPEThursday, November 8, 12

Page 37: Performance & Responsive Web Design

Downloading Images (CSS)

<div  id="test2"></div>#test2  {        background-­‐image:url('images/test2.png');        width:200px;        height:75px;}@media  all  and  (max-­‐width:  600px)  {        #test2  {display:none;}}

http://timkadlec.com/2012/04/media-query-asset-downloading-results/

Thursday, November 8, 12

Page 38: Performance & Responsive Web Design

Downloading Images (CSS)

<div  id="test2"></div>#test2  {        background-­‐image:url('images/test2.png');        width:200px;        height:75px;}@media  all  and  (max-­‐width:  600px)  {        #test2  {display:none;}}

http://timkadlec.com/2012/04/media-query-asset-downloading-results/

NOPEThursday, November 8, 12

Page 39: Performance & Responsive Web Design

Downloading Images (CSS)

<div  id="test3">        <div></div></div>#test3  div  {        background-­‐image:url('images/test3.png');        width:200px;        height:75px;}@media  all  and  (max-­‐width:  600px)  {        #test3  {                display:none;        }}

http://timkadlec.com/2012/04/media-query-asset-downloading-results/

Thursday, November 8, 12

Page 40: Performance & Responsive Web Design

Downloading Images (CSS)

<div  id="test3">        <div></div></div>#test3  div  {        background-­‐image:url('images/test3.png');        width:200px;        height:75px;}@media  all  and  (max-­‐width:  600px)  {        #test3  {                display:none;        }}

http://timkadlec.com/2012/04/media-query-asset-downloading-results/

OKThursday, November 8, 12

Page 41: Performance & Responsive Web Design

Downloading Images (CSS)

<div  id="test4"></div>

#test4  {

       background-­‐image:url('images/test4-­‐desktop.png');

       width:200px;

       height:75px;

}

@media  all  and  (max-­‐width:  600px)  {

       #test4  {

               background-­‐image:url('images/test4-­‐mobile.png');

       }

}

http://timkadlec.com/2012/04/media-query-asset-downloading-results/

Thursday, November 8, 12

Page 42: Performance & Responsive Web Design

Downloading Images (CSS)

<div  id="test4"></div>

#test4  {

       background-­‐image:url('images/test4-­‐desktop.png');

       width:200px;

       height:75px;

}

@media  all  and  (max-­‐width:  600px)  {

       #test4  {

               background-­‐image:url('images/test4-­‐mobile.png');

       }

}

http://timkadlec.com/2012/04/media-query-asset-downloading-results/

~OKThursday, November 8, 12

Page 43: Performance & Responsive Web Design

Downloading Images (CSS)

<div  id="test7"></div>

#test7  {

       background-­‐image:url('images/test7-­‐lowres.png');

       width:200px;

       height:75px;

}

@media  only  screen  and  (-­‐webkit-­‐min-­‐device-­‐pixel-­‐ratio:  1.5),

only  screen  and  (min-­‐-­‐moz-­‐device-­‐pixel-­‐ratio:  1.5),

only  screen  and  (-­‐o-­‐min-­‐device-­‐pixel-­‐ratio:  3/2),

only  screen  and  (min-­‐device-­‐pixel-­‐ratio:  1.5)  {

       #test7  {

               background-­‐image:url('images/test7-­‐highres.png');

               width:200px;

               height:75px;

               /*  Editors  note:  this  should  use  background-­‐size  */

       }

}

http://timkadlec.com/2012/04/media-query-asset-downloading-results/

Thursday, November 8, 12

Page 44: Performance & Responsive Web Design

Downloading Images (CSS)

<div  id="test7"></div>

#test7  {

       background-­‐image:url('images/test7-­‐lowres.png');

       width:200px;

       height:75px;

}

@media  only  screen  and  (-­‐webkit-­‐min-­‐device-­‐pixel-­‐ratio:  1.5),

only  screen  and  (min-­‐-­‐moz-­‐device-­‐pixel-­‐ratio:  1.5),

only  screen  and  (-­‐o-­‐min-­‐device-­‐pixel-­‐ratio:  3/2),

only  screen  and  (min-­‐device-­‐pixel-­‐ratio:  1.5)  {

       #test7  {

               background-­‐image:url('images/test7-­‐highres.png');

               width:200px;

               height:75px;

               /*  Editors  note:  this  should  use  background-­‐size  */

       }

}

http://timkadlec.com/2012/04/media-query-asset-downloading-results/

OKThursday, November 8, 12

Page 46: Performance & Responsive Web Design

Downloading <img>

✤ RESPONSIVE IMAGES

✤ Whatever solution you pick, make sure it doesn’t make duplicate requests.

Thursday, November 8, 12

Page 47: Performance & Responsive Web Design

Downloading <img>

✤ If possible, use Vectors (SVG) over Bitmaps (PNG). It’ll look great on HDPI screens.

✤ Vectors are a shortcut for Responsive Images.

✤ Note: Canvas content is bitmapped, but you can redraw at higher resolutions.

✤ Side Note: Font icons are a great scalable alternative to PNG icons

Thursday, November 8, 12

Page 48: Performance & Responsive Web Design

Picturefill

✤ “A Responsive Images approach that you can use today”

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

Thursday, November 8, 12

Page 49: Performance & Responsive Web Design

Picturefill

<div  data-­‐picture  data-­‐alt="A  giant  stone  face  at  The  Bayon  temple  in  Angkor  Thom,  Cambodia">        <div  data-­‐src="external/imgs/small.jpg"></div>        <div  data-­‐src="external/imgs/medium.jpg"  data-­‐media="(min-­‐width:  400px)"></div>        <div  data-­‐src="external/imgs/large.jpg"  data-­‐media="(min-­‐width:  800px)"></div>        <div  data-­‐src="external/imgs/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="external/imgs/small.jpg"  alt="A  giant  stone  face  at  The  Bayon  temple  in  Angkor  Thom,  Cambodia"></noscript></div>

http://scottjehl.github.com/picturefill/

Thursday, November 8, 12

Page 50: Performance & Responsive Web Design

Picturefill

✤ data-­‐media="(min-­‐width:  400px)"

✤ Uses  matchMedia.

✤ No  duplicate  requests!

Thursday, November 8, 12

Page 51: Performance & Responsive Web Design

Picturefill (HDPI)

<div  data-­‐picture  data-­‐alt="A  giant  stone  face  at  The  Bayon  temple  in  Angkor  Thom,  Cambodia">        <div  data-­‐src="small.jpg"></div>        <div  data-­‐src="small.jpg"                  data-­‐media="(min-­‐device-­‐pixel-­‐ratio:  2.0)"></div>        <div  data-­‐src="medium.jpg"                data-­‐media="(min-­‐width:  400px)"></div>        <div  data-­‐src="medium_x2.jpg"          data-­‐media="(min-­‐width:  400px)  and  (min-­‐device-­‐pixel-­‐ratio:  2.0)"></div>        <div  data-­‐src="large.jpg"                  data-­‐media="(min-­‐width:  800px)"></div>        <div  data-­‐src="large_x2.jpg"            data-­‐media="(min-­‐width:  800px)  and  (min-­‐device-­‐pixel-­‐ratio:  2.0)"></div>            <div  data-­‐src="extralarge.jpg"        data-­‐media="(min-­‐width:  1000px)"></div>        <div  data-­‐src="extralarge_x2.jpg"  data-­‐media="(min-­‐width:  1000px)  and  (min-­‐device-­‐pixel-­‐ratio:  2.0)"></div>  

       ...</div>

http://scottjehl.github.com/picturefill/

Thursday, November 8, 12

Page 52: Performance & Responsive Web Design

Compressive Images

✤ Pump up the size, pump up the JPEG compression

✤ Scale down in the browser

✤ http://filamentgroup.com/lab/rwd_img_compression/

Thursday, November 8, 12

Page 53: Performance & Responsive Web Design

Picturefill Simplifes to (HDPI)

<div  data-­‐picture  data-­‐alt="A  giant  stone  face  at  The  Bayon  temple  in  Angkor  Thom,  Cambodia">        <div  data-­‐src="small_compressive.jpg"></div>        <div  data-­‐src="medium_compressive.jpg"                data-­‐media="(min-­‐width:  400px)"></div>        <div  data-­‐src="large_compressive.jpg"                  data-­‐media="(min-­‐width:  800px)"></div>        <div  data-­‐src="extralarge_compressive.jpg"        data-­‐media="(min-­‐width:  1000px)"></div>

       <!-­‐-­‐  TODO:  adjust  rendered  sizes  -­‐-­‐>        ...</div>

✤ Careful with Memory Consumption!

Thursday, November 8, 12

Page 54: Performance & Responsive Web Design

Buzzkills

Thursday, November 8, 12

Page 55: Performance & Responsive Web Design

Buzzkill #1: Advertising

✤ Pit of despair: full of document.write, iframes, blocking JavaScript (errors galore) and general badness.

✤ Inject advertising iframes using JavaScript (after onload)

✤ document.createElement(‘iframe’);

Thursday, November 8, 12

Page 56: Performance & Responsive Web Design

Buzzkill #2: Social Networking Widgets

Network Requests Size (After GZIP)

ShareThis 19 98.9KB

Facebook 3 41.2KB

Twitter 5 48KB

Google+ 8 30.8KB

Compare to jQuery 1.8.2: 32KB

Thursday, November 8, 12

Page 57: Performance & Responsive Web Design

SocialCount

✤ 4 KB CSS, 7KB JavaScript (unminified, ungzipped)

✤ 2 requests, optional +1 for Counts

✤ Non-Blocking

✤ Sharing still works without JavaScript

✤ Initializes Native Widgets on Hover / Tap for Inline +1 / Like and Tweet.

✤ In use on f2em.com

Thursday, November 8, 12

Page 58: Performance & Responsive Web Design

SocialCount

✤ 4 KB CSS, 7KB JavaScript (unminified, ungzipped)

✤ 2 requests, optional +1 for Counts

✤ Non-Blocking

✤ Sharing still works without JavaScript

Coming Soon✤ Initializes Native Widgets on Hover / Tap

for Inline +1 / Like and Tweet.

✤ In use on f2em.com

Thursday, November 8, 12

Page 59: Performance & Responsive Web Design

Showcase Showdown

Thursday, November 8, 12

Page 60: Performance & Responsive Web Design

Boston Globe

1.31 MBAdvertising, Video Player, Web Fonts, Tracking and Analytics

Thursday, November 8, 12

Page 61: Performance & Responsive Web Design

Disney.com

1.59 MBAdvertising, Web Fonts, Tracking and Analytics

Thursday, November 8, 12

Page 62: Performance & Responsive Web Design

Starbucks

Thursday, November 8, 12

Page 63: Performance & Responsive Web Design

Time.com

Thursday, November 8, 12

Page 64: Performance & Responsive Web Design

Smashing Magazine

1.87 MBAdvertising, Web Fonts, Tracking and Analytics

Thursday, November 8, 12

Page 65: Performance & Responsive Web Design

RWD & Performance

✤ “The fastest web site is the one with nothing on it.”

✤ We’re in the problem solving business.

✤ Solutions often require Code.

✤ jQuery and Cross Browser DOM API Compatibility

✤ Solve more problems than you create.

Thursday, November 8, 12