responsive & responsible: implementing responsive design at scale

111
Responsible Responsive & filament group Scott Jehl

Upload: scottjehl

Post on 18-Nov-2014

1.765 views

Category:

Technology


4 download

DESCRIPTION

Presentation given at Breaking Development Conference, September 2011.

TRANSCRIPT

Page 1: Responsive & Responsible: Implementing Responsive Design at Scale

Responsible

Responsive&

filament groupScott Jehl

Page 2: Responsive & Responsible: Implementing Responsive Design at Scale

filament groupWe design engaging sites and

applications that are simple to

use and accessible to all.

Page 3: Responsive & Responsible: Implementing Responsive Design at Scale

Mitch Hedberg

“An escalator can never break: it can only become stairs. ”

Page 4: Responsive & Responsible: Implementing Responsive Design at Scale

A natural subset of Progressive Enhancement.

Responsive Design

Page 5: Responsive & Responsible: Implementing Responsive Design at Scale

Delightful and inclusive.

Responsible

Page 6: Responsive & Responsible: Implementing Responsive Design at Scale

Inclusive Delightful

It works in my browser.

It feels intuitive.

It allows me to complete my task

It’s fun to use!

It’s damned fast!

Page 7: Responsive & Responsible: Implementing Responsive Design at Scale

...and work especially well in newer browsers!

Make it workeverywhere.

Page 8: Responsive & Responsible: Implementing Responsive Design at Scale

to skin an app.

There are, in fact,

Many ways

Page 9: Responsive & Responsible: Implementing Responsive Design at Scale

“it depends.”- Every speaker at this conference.

Page 10: Responsive & Responsible: Implementing Responsive Design at Scale

Should it be responsive?

• Commonality across experiences

• Developer Skillset

• Time up-front vs. maintenance

• Interest in a challenge

Page 11: Responsive & Responsible: Implementing Responsive Design at Scale

Make no mistake!

PE, done right, is hard.

Page 12: Responsive & Responsible: Implementing Responsive Design at Scale

can be rich, without being exclusive.

A proposition:

A layered approach

Page 13: Responsive & Responsible: Implementing Responsive Design at Scale

Talk = cheap.

Page 14: Responsive & Responsible: Implementing Responsive Design at Scale

Let’s tear it apart, shall we?

We built something.

Page 15: Responsive & Responsible: Implementing Responsive Design at Scale

A One-Web Case Study

Page 16: Responsive & Responsible: Implementing Responsive Design at Scale
Page 17: Responsive & Responsible: Implementing Responsive Design at Scale

Design-velopment Team

@beep

@upstatement

@filamentgroup

@mirandamulligan

Page 18: Responsive & Responsible: Implementing Responsive Design at Scale
Page 19: Responsive & Responsible: Implementing Responsive Design at Scale
Page 20: Responsive & Responsible: Implementing Responsive Design at Scale

But is it responsible?

Responsive.

Page 21: Responsive & Responsible: Implementing Responsive Design at Scale

Areas of Responsibility

Accessibility Performance

Usability Sustainability

Page 22: Responsive & Responsible: Implementing Responsive Design at Scale

Responsive... ble baseline

• “Content” first

• Mobile-first images

• Mobile-friendly layout

Page 23: Responsive & Responsible: Implementing Responsive Design at Scale

Asset Baseline

• Basic CSS file

• Basic JS file

• Qualified Enhanced CSS file

Page 24: Responsive & Responsible: Implementing Responsive Design at Scale

Defensive Development = Qualified Upgrades

Experience Divisions

Page 25: Responsive & Responsible: Implementing Responsive Design at Scale

Basic CSS

Page 26: Responsive & Responsible: Implementing Responsive Design at Scale

“Basic” = safe defaults

• Tweaks to browser typography

• Horizontal rules

• Text alignment

• Display: Inline / Block

• No complex layout or positioning

Page 27: Responsive & Responsible: Implementing Responsive Design at Scale

“Basic”

Page 28: Responsive & Responsible: Implementing Responsive Design at Scale
Page 29: Responsive & Responsible: Implementing Responsive Design at Scale

Enhanced Experience

Page 30: Responsive & Responsible: Implementing Responsive Design at Scale

The @media qualifier

Page 31: Responsive & Responsible: Implementing Responsive Design at Scale

Ethan Marcotte

“If you’re awesome, or you’re Internet Explorer,you get enhanced.”

Page 32: Responsive & Responsible: Implementing Responsive Design at Scale

@media-fortified design.

<link href="enhanced.css" media="only all">

Page 33: Responsive & Responsible: Implementing Responsive Design at Scale

<link rel=...” href=”basic.css” id=”basic”>

<!--[if gte IE 6]><link href="enhanced.css" rel="stylesheet"><![endif]-->

<!--[if !IE]><!--><link href="enhanced.css" media="only all"><!--<![endif]-->

<script src=”basic.js”></script>

All in your <head>

Page 34: Responsive & Responsible: Implementing Responsive Design at Scale

The Concatenator

Page 35: Responsive & Responsible: Implementing Responsive Design at Scale

Server-side Concatenation

<link href=”css/file1.css,file2.css,file3.css” ..>

Minify + Gzip

Page 36: Responsive & Responsible: Implementing Responsive Design at Scale

Enhanced CSS

/* styles for everyone go here.. */

@media all and (min-width: 500px){ .. }

@media all and (min-width: 620px){ .. }

@media all and (min-width: 950px){ .. }

Page 37: Responsive & Responsible: Implementing Responsive Design at Scale

Inheritance Prevention

@media all and (min-width: 500px)

and (max-width: 700px){

/* styles constrained to 500-700px */

}

Page 38: Responsive & Responsible: Implementing Responsive Design at Scale

Left

Right

Left

Page 39: Responsive & Responsible: Implementing Responsive Design at Scale

Display: table + table-cell

Page 40: Responsive & Responsible: Implementing Responsive Design at Scale

Ems all the way down.

Ems allow for components to adapt differently in different containers

Page 41: Responsive & Responsible: Implementing Responsive Design at Scale

• ResponsiveImages.js

• Respond.js

• Modernizr / extensions / HTML5 Shim

• The Boston Globe JS Framework

Basic.js: “just enough”

Page 42: Responsive & Responsible: Implementing Responsive Design at Scale
Page 43: Responsive & Responsible: Implementing Responsive Design at Scale

Also.

Page 44: Responsive & Responsible: Implementing Responsive Design at Scale

Responsive Images

<img

src=”foo.r.jpg”

data-fullsrc=”foo.lrg.jpg”

/>

Page 45: Responsive & Responsible: Implementing Responsive Design at Scale

Edge Cases

Page 46: Responsive & Responsible: Implementing Responsive Design at Scale

Edge Cases

Page 47: Responsive & Responsible: Implementing Responsive Design at Scale

Respond.js

https://github.com/scottjehl/Respond

Now available as part of

Page 49: Responsive & Responsible: Implementing Responsive Design at Scale
Page 50: Responsive & Responsible: Implementing Responsive Design at Scale

Globe JS Framework

Page 51: Responsive & Responsible: Implementing Responsive Design at Scale

The globe, um... global.

globe = {};

Page 52: Responsive & Responsible: Implementing Responsive Design at Scale

Feature flags from Modernizr

globe.support.touch

globe.support.applicationcache

respond.mediaQueriesSupported

Page 53: Responsive & Responsible: Implementing Responsive Design at Scale

Internet Explorer Flags

<!--[if lt IE 7 ]> <html lang="en" class="ie ie6"> <![endif]-->

globe.browser.ie6 = document.documentElement .className.indexOf( “ie6” ) >= 0;

Page 54: Responsive & Responsible: Implementing Responsive Design at Scale

Again, with the @media

globe.enhanced =

respond.mediaQueriesSupported

|| globe.browser.ie6

|| globe.browser.ie7

|| globe.browser.ie8;

Conditional-comment driven

Page 55: Responsive & Responsible: Implementing Responsive Design at Scale

JS Experience Divideif( !globe.enhanced ){

//last stop for old browsers!

return;

}

else{

//remove Basic CSS

//bring on the enhancements

}

Page 56: Responsive & Responsible: Implementing Responsive Design at Scale

great browser, too slow.

And one caveat...

No Enhanced JS for BB5

Page 57: Responsive & Responsible: Implementing Responsive Design at Scale

No JS? That’s okay.

Page 58: Responsive & Responsible: Implementing Responsive Design at Scale

On removing Basic.css...

head.removeChild( basicCSS );

• Convenient when basic.css does not easily cascade.

• A convenience that can’t be guaranteed.

Page 59: Responsive & Responsible: Implementing Responsive Design at Scale

Enhancing Further

Page 60: Responsive & Responsible: Implementing Responsive Design at Scale

Loading Assets

Page 61: Responsive & Responsible: Implementing Responsive Design at Scale

Different for every browser. Highly optimized.

Enhanced page weight

Page 62: Responsive & Responsible: Implementing Responsive Design at Scale

~ hand-crafted delivery ~

The assets you receive depend on

width, section, features

Page 63: Responsive & Responsible: Implementing Responsive Design at Scale

Defining Assets to Load

//Arrays of JS and CSS files

globe.jsToLoad = [ “jquery.js” ];

globe.cssToLoad = [];

jQuery is dynamically-loaded too!

Page 64: Responsive & Responsible: Implementing Responsive Design at Scale

Feature-based Loading

if( globe.support.touch ){

jsToLoad.push( “touchEvents.js” );

}

Page 65: Responsive & Responsible: Implementing Responsive Design at Scale

Section-specific Loading

if( globe.hasClass( “gallery”, body ) ){

jsToLoad.push( “galleries.js” );

}

Page 66: Responsive & Responsible: Implementing Responsive Design at Scale

Device Size Decisions

if( window.screen.width > 500 ){

cssToLoad.push( “fonts.css” );

}screen, not window

Page 67: Responsive & Responsible: Implementing Responsive Design at Scale

Our width usage rule of thumb:

screen for assetswindow for design

Page 68: Responsive & Responsible: Implementing Responsive Design at Scale

Why Screen, not viewport?

• Fixed per device

• Assets delivered to device’s potential, not just current state.

• Orientation-change makes resize relevant again.

Page 69: Responsive & Responsible: Implementing Responsive Design at Scale

Pack & Load

globe.load.script(

jsToLoad.join(",")

);

globe.load.style(

cssToLoad.join(",")

);

Page 70: Responsive & Responsible: Implementing Responsive Design at Scale

Again, concat.

“js/file1.js,file2.js,file3.js”

Minify + Gzip

Page 71: Responsive & Responsible: Implementing Responsive Design at Scale

Responsive Behavior

Page 72: Responsive & Responsible: Implementing Responsive Design at Scale

Collapsible Sections

Page 73: Responsive & Responsible: Implementing Responsive Design at Scale

We value all input...

Page 75: Responsive & Responsible: Implementing Responsive Design at Scale

...and on the device

Touch & Mouse Events

Mouse Events

Page 76: Responsive & Responsible: Implementing Responsive Design at Scale

Normalized Events

• vclick

• vmousedown

• vmouseover

• vmouseup

• vmousecancel

Page 77: Responsive & Responsible: Implementing Responsive Design at Scale

Click - or - Gesture

Page 78: Responsive & Responsible: Implementing Responsive Design at Scale

http://filamentgroup.com/lab/jquery_mobile_pagination_plugin/

Drag pagination

Page 79: Responsive & Responsible: Implementing Responsive Design at Scale

#!hashbang

Page 80: Responsive & Responsible: Implementing Responsive Design at Scale

Less JS execution, faster page loads

Single-Page Apps

Page 81: Responsive & Responsible: Implementing Responsive Design at Scale

Degrees of #!%$hashbang

<a href=”#foo.html”>Foo</a> <a href=”foo.html”>Foo</a>

http://example.com/#!foo.html

Not great: Less... not great:

Page 82: Responsive & Responsible: Implementing Responsive Design at Scale

Great:history.replaceState

http://example.com/#!foo.html

http://example.com/foo.html

Page 83: Responsive & Responsible: Implementing Responsive Design at Scale

...in code.

window.addEventListener( “hashchange”, function(){

history.replaceState( {}, document.title, location.hash.replace("#!","" ) );

}, false );

Page 84: Responsive & Responsible: Implementing Responsive Design at Scale

Many ways to “Save”

Page 85: Responsive & Responsible: Implementing Responsive Design at Scale

Hidden Touch Interface

Page 86: Responsive & Responsible: Implementing Responsive Design at Scale

Even save without JS

Simple Form

Page 87: Responsive & Responsible: Implementing Responsive Design at Scale

Extends the ability for a site to meet you where you are

PE + offline is possible!

Page 88: Responsive & Responsible: Implementing Responsive Design at Scale

Accessibilityenhancements

Page 89: Responsive & Responsible: Implementing Responsive Design at Scale

Keep it accessible

Page 90: Responsive & Responsible: Implementing Responsive Design at Scale

Keys + WAI ARIA

Page 91: Responsive & Responsible: Implementing Responsive Design at Scale

pairs with mobile, resolution-independent

audible interface

Page 92: Responsive & Responsible: Implementing Responsive Design at Scale

One-Web Challenges

Page 93: Responsive & Responsible: Implementing Responsive Design at Scale

Content Negotiation

Page 94: Responsive & Responsible: Implementing Responsive Design at Scale

What if we treat them like navigation?

Landing pages are heavy

Page 95: Responsive & Responsible: Implementing Responsive Design at Scale

Anchor-Include Pattern

<a href=”path/to/weather.html”data-after=”path/to/weather-fragment.html”>T</a>

https://gist.github.com/983328

Page 96: Responsive & Responsible: Implementing Responsive Design at Scale

Ideal Delivery

In page source

Delivered via Ajax

Page 97: Responsive & Responsible: Implementing Responsive Design at Scale

Ads.

Page 98: Responsive & Responsible: Implementing Responsive Design at Scale
Page 99: Responsive & Responsible: Implementing Responsive Design at Scale

Ads are not awesome.

• Third-party, potential for conflicts

• They block content loading

• Potentially overtake page

• Pixel dimensions, contractually

• Filled with document.write

Page 100: Responsive & Responsible: Implementing Responsive Design at Scale

Best. Line. Ever.

document.write( “...<noscript>..” );

Page 101: Responsive & Responsible: Implementing Responsive Design at Scale

Dynamically injected, naturally.

How we “solve” ads:

<iframe>

Page 102: Responsive & Responsible: Implementing Responsive Design at Scale

Resize + Hide + Append

Page 103: Responsive & Responsible: Implementing Responsive Design at Scale

Where to append?CSS:

@media all and (min-width: 500px){ .a .ad { display: none; }}

JavaScript:

//on window resize:if( !$( “.ad” ).is( “:visible” ) ){ $( “.ad” ).appendTo( “.b” );}

Page 104: Responsive & Responsible: Implementing Responsive Design at Scale

Not an edge-case.

Edge Caching

Page 105: Responsive & Responsible: Implementing Responsive Design at Scale
Page 106: Responsive & Responsible: Implementing Responsive Design at Scale

In conclusion...

to build sites that are rich without being exclusive.

We have the tools

Page 107: Responsive & Responsible: Implementing Responsive Design at Scale
Page 108: Responsive & Responsible: Implementing Responsive Design at Scale

What about “apps?”

Page 110: Responsive & Responsible: Implementing Responsive Design at Scale
Page 111: Responsive & Responsible: Implementing Responsive Design at Scale

@scottjehl

thanks everyone.