- From: Jeff Sonstein <jeffs@it.rit.edu>
- Date: Thu, 27 Mar 2008 09:13:49 -0400
- To: Mobile Web Best Practices Working Group WG <public-bpwg@w3.org>
5.x.y Provide for Both Graceful Degradation & Progressive Enhancement of CSS 5.x.y.1 What it means CSS may be incompletely supported by some browsers. Pages using positioning and visibility control are not supported by some browsers. Site design to support both desktop/laptop users and mobile device users will require alternate approaches for browsers that do not support positioning and visibility control. You should provide for both graceful degradation (in the case of no or minimal CSS support) and progressive enhancement (in the case of full positioning and visibility control support) of CSS by the client at run-time. 5.x.y.2 How to do it Detect browser capabilities or user preferences and react accordingly. Design targeting purely desktop/laptop audiences (where media="screen") tends to be structured to degrade gracefully: first if ECMAScript/Javascript is not present, and then if CSS is not supported. Design targeting a mixed audience of mobile (where media="handheld") and desktop/laptop users should be structured to also progressively enhance CSS. Advanced CSS capabilities should be separated from basic CSS, and inserted into the DOM by the client as appropriate at run-time. Separate behavior from content and presentation, for graceful degradation and progressive enhancement. Designers targeting a mixed audience of mobile and desktop/laptop users can build Web pages which load (using the <style/> tag in the <head> element) CSS for mobile audiences and (using the <script/> tag in the <head> element) sufficient ECMAScript/Javascript to determine device display and interaction capabilities first. This allows for progressive enhancement, just as good structural design of XHTML allows for graceful degradation. The following example code illustrates a possible request-time payload aimed at a mixed mobile and desktop/laptop audience. In this case, if ECMAScript/ Javascript is present and if the screen-width is determined to exceed a minimum, then the display device is assumed to be a desktop/laptop (where per-download charges are unlikely to apply), an additional stylesheet is requested, and ithe new stylesheet is inserted into the DOM: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="content-type" content="application/vnd.wap.xhtml +xml; charset=utf-8" /> <meta http-equiv="cache-control" content="no-cache" /> <title>Example Payload for Progressive Enhancement</title> <style type="text/css" media="all"> /* <![CDATA[ */ [put initial CSS here] /* ]]> */ </style> <script type="text/javascript" charset="utf-8"> // <![CDATA[ var triggerWidth = 480; function appendStylesheet( uriString, mediaTypeTarget ) { [inject stylesheet into DOM here] } function getViewportWidth() { [determine viewportWidth here] } function adaptToScreen( uriString ) { if ( getViewportWidth() >= triggerWidth ) { appendStylesheet( uriString, 'screen' ); } } // ]]> </script> </head> <body onload="adaptToScreen( './stylesheets/bigScreen.css' );"> [...] In the above case, the base-CSS for mobile users is delivered along with ECMAScript/Javascript to determine client capabilities as a result of the initial request. Subsequent requests for CSS (and possibly other resources) allow for progressive enhancement where determined appropriate by client-side code. Good physical design can take advantage of just-in-time technologies like "server-side includes" to assemble the above payload on demand, resulting in the <style/> and <script/> nodes being inserted at request-time. The following code in an HTML file would cause the server to insert (as above) site-wide <style/> and <script/> nodes at request-time in the payload actually being delivered at response-time: [... replace style and script elements with:] <style type="text/css" media="all"> /* <![CDATA[ */ <!--#include virtual="./stylesheets/content.css" --> <!--#include virtual="./stylesheets/tabNav.css" --> /* ]]> */ </style> <script type="text/javascript" charset="utf-8"> // <![CDATA[ <!--#include virtual="./javascripts/appendStylesheet.js" --> // ]]> </script> [...] Separating logical and physical design like this helps reduce site-wide maintenance costs and site-redesign difficulties as well as supporting graceful degradation and progressive enhancement of CSS.
Received on Thursday, 27 March 2008 13:14:39 UTC