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
...




