Responsive Enhancement

Sven Wolfermann | maddesigns

Bullshit Bingo?

Responsive Bingo

Responsive Webdesign Performance Retina Desktop
Mobile first Progressive Enhancement Content Strategy Smartphone
Android Content First iOS Flexible
Tablet Responsive Images Conditional Loading Media Queries

Did you mean
Progressive Enhancement?

PE? Yeah, kind of.

 

M&M Peanut

An escalator can never break – it can only become stairs.
Mitch Hedberg
(a comedian, not a web developer)

Responsive Web Design

RWD Origin

first website

Web native features

Responsive Webdesign

solves many things

resizing browser

moto.oakley.com

Picard Facepalm

moto.oakley.com fail

ok, ok, Oakley does it better now:
JUST 14.2MB, 291 request (more than 70MB less)

with mobile user-agent? 6.7MB, 114 requests :/

RWD

has some issues

Guy Podjarny's RWD performance tests

sites have nearly same weight on mobile as on desktop

go mobile first!

Mobile first == Smartphone first

HTML5 input fields

Android Chrome vs iOS7

test native input styles http://nativeformelements.com/

Performance is our biggest issue

Performance

Cutting the mustard

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!

Modernizr

Client side feature detection

Modernizr is a JavaScript library that detects HTML5 & CSS3 features in the user's browser.

Modernizr

Modernizr adds classes to <html> based on their tests

<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?
}

Modernizr

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

Conditional loading could become an important part of the content-first responsive design approach
Jeremy Keith (2011)

Conditional loading

Conditional loading

Conditional loading – Ajax-include pattern

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();

Conditional loading – Modernizr.load

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

Conditional Loading in Foundation Framework

Map Example

<div data-interchange="[partials/static_map.html, (default)],
                       [views/interactive_map.html, (large)]">
Loading map...
</div>

RequireJS

RequiredJS Logo

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 meets server

Modernizr Server

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

RESS
Responsive Web Design + Server Side Components

RESS

Browser-Sniffing

Device Detection

Device Detection Problems

screenshot device detection failed

RESS in the wild? -> Adaptive Images

Adaptive Images

Responsive Images
a topic for itself…

Responsive Images Art Direction

Rendeer