Responsive Enhancement
Sven Wolfermann | maddesigns
Sven Wolfermann | maddesigns
Responsive Webdesign | Performance | Retina | Desktop |
Mobile first | Progressive Enhancement | Content Strategy | Smartphone |
Android | Content First | iOS | Flexible |
Tablet | Responsive Images | Conditional Loading | Media Queries |
An escalator can never break – it can only become stairs.
solves many things
ok, ok, Oakley does it better now:
JUST 14.2MB, 291 request (more than 70MB less)
with mobile user-agent? 6.7MB, 114 requests :/
has some issues
sites have nearly same weight on mobile as on desktop
Android Chrome vs iOS7
The BBC test the browser support like this
if('querySelector' in document && 'localStorage' in window && 'addEventListener' in window) { // bootstrap the javascript application }
if browser supports
'querySelector
',
'localStorage
'
and 'addEventListener
'
do hot stuff!
Client side feature detection
Modernizr is a JavaScript library that detects HTML5 & CSS3 features in the user's browser.
<html class="js flexbox canvas canvastext webgl no-touch geolocation
postmessage hashchange history boxshadow cssanimations csscolumns
cssgradients csstransforms csstransforms3d csstransitions fontface
video audio localstorage svg inlinesvg">
Modernizr features test: geolocation
Modernizr.geolocation // true or false
if (Modernizr.geolocation) { navigator.geolocation.getCurrentPosition(show_map); } else { // no native support; maybe try a fallback? }
Another Sample: datepicker
<script src="modernizr.js"></script> <script> Modernizr.load({ test: Modernizr.inputtypes.date, nope: ['jquery.datepicker.js', 'jquery.datepicker.css'], complete: function () { $('input[type=date]').datepicker({ dateFormat: 'yy-mm-dd' }); } }); </script>
load jQuery datepicker library for browsers that don't have native datepickers
Conditional loading could become an important part of the content-first responsive design approach
Replace:
<a href="..." data-replace="/url/path/fragment.html">Latest Articles</a>
Before:
<a href="..." data-before="/url/path/fragment.html">Latest Articles</a>
After:
<a href="..." data-after="/url/path/fragment.html">Latest Articles</a>
init with jQuery:
$("[data-replace],[data-before],[data-after]").ajaxInclude();
Modernizr loads scripts and CSS based on media queries
Modernizr.load([ { test: Modernizr.mq("only screen and (min-width: 1051px)"), yep: '/js/large.js' }, { test: Modernizr.mq("only screen and (min-width: 600px) and (max-width: 1050px)"), yep: '/js/medium.js' }, { test: Modernizr.mq("only screen and (min-width: 320px) and (max-width: 599px)"), yep: '/js/small.js' } ]);
you can use EM in media queries too ;)
Modernizr.load is not part of the "development" version
Modernizr.load won't be part of Modernizr 3.0, falls back to yepnopejs.com
Map Example
<div data-interchange="[partials/static_map.html, (default)], [views/interactive_map.html, (large)]"> Loading map... </div>
simple explained require.js is about three things:
can load modules on click – example: video gallery module (load markup and video asset on click)
Client features for the server
<?php include('modernizr-server.php'); print 'The server knows:'; foreach($modernizr as $feature=>$value) { print "
$feature: "; print_r($value); } ?> The server knows: canvas: 1 geolocation: 1 crosswindowmessaging: 1 indexeddb: 0 hashchange: 1 ...