Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Before the @mq

Before the @mq

Three case studies focusing on images and how to improve performance and download size. Provides examples of both client-side and server-side solutions.

Presented at High Ed Web MI regional conference (http://mi.highedweb.org/), May 22, 2014.

Erik Runyon

May 22, 2014
Tweet

More Decks by Erik Runyon

Other Decks in Technology

Transcript

  1. What We’ll Cover I. Why We Optimize II. Images BBC

    News III. Carousels WVU IV. In Depth Notre Dame
  2. Mobile Traffic 2010 2.6% 3.6% 7.2% 2011 4.4% 8.8% 26.1%

    2012 13.3% 17.7% 44.9% ND.edu Admissions Game Day 2013 15.5% 27.4% 50.9%
  3. http://www.webperformancetoday.com/2013/11/26/web-page-growth-151-percent/ The average top 1,000 web page is 1575 KB.

    ! Last spring, the average page was 1246 KB. This represents a 26% increase in total page size in just six months, and a 151% increase in three years.
  4. 1-1.9 MB = 50 Sites used to generate these stats:

    http://bit.ly/highered-rwd averages for #highered RWD sites 128 sites sample 2-2.9 MB = 15 3-3.9 MB = 11 > 4 MB = 6
  5. js css images Sites used to generate these stats: http://bit.ly/highered-rwd

    averages for #highered RWD sites 128 sites sampled with iPhone UA and narrow screen (to simulate mobile) 12 files / 227 KB 7 files / 99 KB 32 files / 1 MB 73% of page size
  6. …build a BBC News website that fits the needs of

    the maximum of users 3 years in the future. At the moment we have a mobile only responsive website. But eventually it will take over the desktop site. @tmaslen
  7. requests size css js images www.bbc.co.uk/news Launched 1997 m.bbc.co.uk/news Launched

    2012 196 1.4 MB 10 files / 64.4 KB 71 files / 419 KB 114 files / 823 KB DESKTOP requests size css js images 8 34 KB 3 files / 16.4 KB — 4 files / 4.9 KB BASIC only one content image requests size css js images 59 224 KB 5 files / 37.6 KB 8 files / 70.2 KB 41 files / 84.1 KB SMARTPHONE
  8. HTML5 browsers IE9+ Firefox 3.5+ Opera 9+ and probably further

    back Safari 4+ Chrome 1+ (I think) iPhone and iPad iOS1+ Android phone and tablets 2.1+ Blackberry OS6+ Windows 7.5+ new Mango version Mobile Firefox all the versions we tested Opera Mobile all the versions we tested HTML4 browsers IE8- Blackberry OS5- Nokia S60 v6- Nokia S40 all versions All other Symbian variants Windows 7 phone pre-Mango ! …and many more that are too numerous to mention. http://responsivenews.co.uk/post/18948466399/cutting-the-mustard
  9. if('querySelector' in document && 'localStorage' in window && 'addEventListener' in

    window) { // bootstrap the application } “Cutting the Mustard” http://responsivenews.co.uk/post/18948466399/cutting-the-mustard
  10. A large part of any JS library is its DOM

    selector. If the browser has native CSS selecting then it removes the need for a DOM selector. QuerySelector has been available in Firefox since 3.5 at least and has been working in webkit for ages. It also works in IE9. document.querySelector http://responsivenews.co.uk/post/18948466399/cutting-the-mustard
  11. Although we are not using it yet, we are planning

    on making considerable use of it. Imagine that if you first came to the mobile site we downloaded all the stories straight away and stored them in localStorage. They’d then be available to use while you are going through an areas of sketchy bandwidth. window.localStorage http://responsivenews.co.uk/post/18948466399/cutting-the-mustard
  12. Another large part of any JS library is event support.

    Every browser made in the last 6 years (except IE8) supports DOM level 2 events. If the browser supports this then we know it has better standards support than IE8. window.addEventListener http://responsivenews.co.uk/post/18948466399/cutting-the-mustard
  13. <!-- Original Article --> <div class="unit unit--regular unit--has-media"> <div class="unit__media">

    <div class="delayed-image-load" data-src="http://ichef.bbci.co.uk/news/200/media/images/68302000/jpg/_68302997_gerturkmerkelafp.jpg" data- width="640" data-height="360"></div> </div> <div class="unit__body"> <div class="unit__header"> <h3 class="unit__title"> <a href="/news/world-europe-23000319" class="unit__link-wrapper"><span class="cta">Germany-Turkey diplomatic row erupts</span></a> </h3> <div class="unit__meta"> <div class="date" data-seconds="1371819374" data-datetime="21 June 2013"> 21 June 2013 </div> </div> </div> <div class="unit__summary"> <p class="summary">Germany summons the Turkish ambassador in a row over Turkey's bid for membership of the European Union.</p> </div> </div> </div> ! <!-- Enhanced Article --> <div class="unit unit--regular unit--has-media"> <a href="/news/world-europe-23000319" class="unit__link-wrapper"> <div class="unit__media"> <img src="http://ichef.bbci.co.uk/news/96/media/images/68302000/jpg/_68302997_gerturkmerkelafp.jpg" datasrc="http://ichef.bbci.co.uk/news/200/ media/images/68302000/jpg/_68302997_gerturkmerkelafp.jpg" class="image-replace" alt="" width="640" height="360"> </div> <div class="unit__body"> <div class="unit__header"> <h3 class="unit__title"><span class="cta"> Germany-Turkey diplomatic row erupts </span> </h3> <div class="unit__meta"> <div class="date relative-time" data-seconds="1371819374" data-datetime="21 June 2013" data-timestamp-inserted="true"> 2 hours ago </div> </div> </div> <div class="unit__summary"> <p class="summary">Germany summons the Turkish ambassador in a row over Turkey's bid for membership of the European Union.</p> </div> </div> </a> </div>
  14. <!-- Initial markup --> <div class="unit__media"> <div  class="delayed-image-load" 

    data-src="http://path/to/image.jpg"  data-width="640" data-height="360"> </div> </div> ! <!-- Post mustard cutting --> <div class="unit__media"> <img  src="http://path/to/image.jpg"  datasrc="http://original/path/to/image.jpg"  class="image-replace" alt="" width="640" height="360"> </div>
  15. widths = [96, 130, 165, 200, 235, 270, 304, 340,

    375, 410, 445, 485, 520, 555, 590, 625, 660, 695, 736] http://responsivenews.co.uk/post/50092458307/images “We made an arbitary decision to add a breakpoint every 30px from 96px up to 736px… informed more by the image sizes that fit into the old grid system available in BBC’s GEL layout guide.”
  16. 96px 96px = 2 KB 200px = 5 KB 235px

    200px = 3 KB 235px = 4 KB 590px = 29 KB x27 Viewport ~ 240px wide
  17. “At the moment making the choice based on element size

    is the best fit for us, as element widths do not correlate to viewport widths. We use images in many different contexts, stretched across columns, left aligned, etc, so we have to use element width.” http://responsivenews.co.uk/post/50092458307/images
  18. The site records around 40 million unique users a week

    https://en.wikipedia.org/wiki/BBC_News_Online http://www.digitalspy.com/media/news/a437075/us-election-brings-bbc-news-website-traffic-high.html Coverage of the (2012 U.S.) election… brought 16.4 million unique browsers across the BBC website and mobile services on November 7.
  19. "…keeping the designer focused on achievable solutions at specific screen

    sizes by not trying to optimize one code base for everything and leveraging server-side solutions rather than force templating logic onto the front-end." @dmolsen
  20. GIF

  21. http://xkcd.com/1174/ “If I click 'no', I've probably given up on

    everything, so don't bother taking me to the page I was trying to go to. Just drop me on the homepage. Thanks.”
  22. "The basic premise being that 90% of the mark-up and

    styles are the same on all browsers but some get just a little tweak here and there based on their browser's UA and supported properties. The primary images that we tweak are the carousel images. They're by far our biggest resource hog. By looking for mobile UAs we serve much smaller width/height imagery." @dmolsen
  23. CSS Mobile ! <link rel="stylesheet" href="base.css"> <link rel="stylesheet" href="layout.css"> <link

    rel="stylesheet" href="option-3.css"> <link rel="stylesheet" href="bootstrap.css"> <link rel="stylesheet" href=“mobile-advanced.css"> <link rel="stylesheet" href="flexslider.css" media="screen"> ! Desktop ! <link rel="stylesheet" href="base.css"> <link rel="stylesheet" href="layout.css"> <link rel="stylesheet" href=“option-3.css"> <link rel="stylesheet" href="supersized.css" media="screen"> <link rel="stylesheet" href="supersized.shutter.css" media="screen">
  24. CSS Mobile ! <link rel="stylesheet" href="base.css"> <link rel="stylesheet" href="layout.css"> <link

    rel="stylesheet" href=“option-3.css"> <link rel="stylesheet" href="bootstrap.css"> <link rel="stylesheet" href=“mobile-advanced.css"> <link rel="stylesheet" href="flexslider.css" media="screen"> ! Desktop ! <link rel="stylesheet" href="base.css"> <link rel="stylesheet" href="layout.css"> <link rel="stylesheet" href=“option-3.css"> <link rel="stylesheet" href="supersized.css" media="screen"> <link rel="stylesheet" href="supersized.shutter.css" media="screen">
  25. JS Mobile ! <script src="modernizr.custom.js"></script> <script src="navigation-option-6.js"></script> <script src="jquery.flexslider-min.js"></script> <script

    src=“bootstrap.min.js"></script> ! Desktop ! <script src="modernizr.custom.js"></script> <script src="navigation-option-6.js"></script> <script src="jquery.easing.min.js"></script> <script src="supersized.3.2.6.js"></script> <script src=“supersized.shutter.js"></script>
  26. JS Mobile ! <script src="modernizr.custom.js"></script> <script src="navigation-option-6.js"></script> <script src="jquery.flexslider-min.js"></script> <script

    src=“bootstrap.min.js"></script> ! Desktop ! <script src="modernizr.custom.js"></script> <script src="navigation-option-6.js"></script> <script src="jquery.easing.min.js"></script> <script src="supersized.3.2.6.js"></script> <script src=“supersized.shutter.js"></script>
  27. requests transferred css js images 25 400 KB 1 files

    / 21 KB 5 files / 63.4 KB 18 files / 309 KB requests transferred css js images 37 994 KB 1 files / 14 KB 5 files / 68 KB 30 files / 903 KB MOBILE DESKTOP
  28. <li> <!--<a href="/the-link/"><img src="the-image.jpg" alt="Alt Text"></a>--> <noscript><img src="the-image.jpg" alt="Alt Text"></noscript>

    <div class="flex-caption"> <h3>The Title of the Slide</h3> <p>The reason why you should totally click on the slide.</p> <p><a href=“/the-link/" class="more">Read More</a></p> </div> </li>
  29. One size does not fit all widths = [400, 800,

    1200, 1600] <img data-src="fpo-1600.jpg" alt="Alt Text" src="fpo-1600.jpg"> <img data-src="fpo-1600.jpg" alt="Alt Text" src="fpo-800.jpg"> <img data-src="fpo-1600.jpg" alt="Alt Text" src="fpo-400.jpg">
  30. “I wanted to share my opinion of the new ND

    web site with you - in a word, it's awful. Quite frankly, I am unable to find anything about the site that is positive. It is not clear why the change was made but the individual that came up with the idea should be fired along with the individual(s) that approved the change. Contrary to the old site - I make every effort to avoid using the new site.”
  31. Approach #1: 1x1 gif Doesn’t scale proportionally without javascript If

    width/height is set to “auto” in CSS, reverts to 1x1 http://codepen.io/erunyon/pen/uqypx http://www.456bereastreet.com/archive/201306/how_to_proportionally_scale_images_that_have_dimension_attributes/
  32. Our Solution Replace as many images as possible with solid

    PNG’s and load actual image when necessary.
  33. <img class="img-replace" src="data:image/png;base64,LongStringOfDataWithTheSameDimensionsAsTheImage" width="112" height="112" alt="Description of the image" title="Description

    of the image" data-image="/path/to/the/image.jpg" data-width="112" data-height="112"> ! <noscript> <img class="img-noscript" src="/path/to/the/image.jpg" width="112" height="112" alt="Description of the image" title="Description of the image"> </noscript>
  34. The Result 38 requests * 495-639 KB * (down from

    130 requests and 2.4 MB) * Varies by day, browser and feature image