<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://www.w3.org/community/webed/wiki/skins/common/feed.css?207"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>Web Education Community Group - User contributions [en]</title>
		<link>http://www.w3.org/community/webed/wiki/Special:Contributions/Cmills</link>
		<description>From Web Education Community Group</description>
		<language>en</language>
		<generator>MediaWiki 1.15.5</generator>
		<lastBuildDate>Fri, 24 May 2013 12:56:15 GMT</lastBuildDate>
		<item>
			<title>User:Cmills</title>
			<link>http://www.w3.org/community/webed/wiki/User:Cmills</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:chrismills.jpg|border|left]]&lt;br /&gt;
&lt;br /&gt;
Chris Mills is a web technologist, open standards evangelist and education agitator, currently splitting his time between working at [http://www.opera.com Opera Software] in the developer relations team, and working on educational resources as part of his duties as a [http://w3.org W3C Fellow].&lt;br /&gt;
&lt;br /&gt;
He spends most of his time writing articles about web standards for [http://dev.opera.com dev.opera.com], [http://docs.webplatform.org/wiki Webplatform.org] and other publications (such as [http://www.netmagazine.com/ .net mag] and [http://www.alistapart.com A List Apart]), giving talks at universities and industry conferences, and lobbying universities to improve their web-related courses.&lt;br /&gt;
&lt;br /&gt;
He has authored two books on web design: [http://peachpit.com/practicalcss3 Practical CSS3: Develop and Design] and [http://www.interactwithwebstandards.com InterACT with web standards: a holistic approach to web design].&lt;br /&gt;
&lt;br /&gt;
Outside work he is a heavy metal drummer, proud father of three and lover of good beer.&lt;/div&gt;</description>
			<pubDate>Mon, 08 Oct 2012 12:53:03 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/User_talk:Cmills</comments>		</item>
		<item>
			<title>User:Cmills</title>
			<link>http://www.w3.org/community/webed/wiki/User:Cmills</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:chrismills.jpg|border|left]]&lt;br /&gt;
&lt;br /&gt;
Chris Mills is a web technologist, open standards evangelist and education agitator, currently splitting his time between working at &amp;lt;a href=&amp;quot;http://www.opera.com&amp;quot;&amp;gt;Opera Software&amp;lt;/a&amp;gt; in the developer relations team, and working on education resources as part of his duties as a &amp;lt;a href=&amp;quot;http://w3.org&amp;quot;&amp;gt;W3C Fellow&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
He spends most of his time writing articles about web standards for [http://dev.opera.com dev.opera.com], [http://docs.webplatform.org/wiki Webplatform.org] and other publications (such as [http://www.netmagazine.com/ .net mag] and [http://www.alistapart.com A List Apart]), giving talks at universities and industry conferences, and lobbying universities to improve their web-related courses.&lt;br /&gt;
&lt;br /&gt;
He has authored two books on web design: &amp;lt;a href=&amp;quot;http://peachpit.com/practicalcss3&amp;quot;&amp;gt;Practical CSS3: Develop and Design&amp;lt;/a&amp;gt; and &amp;lt;a href=&amp;quot;http://www.interactwithwebstandards.com&amp;quot;&amp;gt;InterACT with web standards: a holistic approach to web design&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Outside work he is a heavy metal drummer, proud father of three and lover of good beer.&lt;/div&gt;</description>
			<pubDate>Mon, 08 Oct 2012 12:51:51 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/User_talk:Cmills</comments>		</item>
		<item>
			<title>It/Italian international project</title>
			<link>http://www.w3.org/community/webed/wiki/It/Italian_international_project</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Put an Italian translation of the [http://www.w3.org/community/webed/wiki/Main_Page#Web_Standards_Curriculum_table_of_contents|web standards curriculum table of contents] here.&lt;/div&gt;</description>
			<pubDate>Thu, 30 Aug 2012 20:37:48 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:It/Italian_international_project</comments>		</item>
		<item>
			<title>It/Italian international project</title>
			<link>http://www.w3.org/community/webed/wiki/It/Italian_international_project</link>
			<description>&lt;p&gt;Cmills:&amp;#32;Created page with &amp;quot;test&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;test&lt;/div&gt;</description>
			<pubDate>Thu, 30 Aug 2012 20:37:08 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:It/Italian_international_project</comments>		</item>
		<item>
			<title>Main Page</title>
			<link>http://www.w3.org/community/webed/wiki/Main_Page</link>
			<description>&lt;p&gt;Cmills:&amp;#32;/* Project activities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Web Education Community Group Wiki! This page contains resources to help you teach or learn modern web development:&lt;br /&gt;
&lt;br /&gt;
* The first section — [http://www.w3.org/community/webed/wiki/Main_Page#Web_Standards_Curriculum_table_of_contents The web standards curriculum] — is a series of tutorial articles covering web design and development high level concepts, and essential technologies such as HTML, CSS and JavaScript. This is ideal for beginners wanting to learn the art of web design, or teachers looking for accurate material to use as the basis of teaching material.&lt;br /&gt;
* The second section — [http://www.w3.org/community/webed/wiki/Main_Page#References References] — is designed for looking up HTML and CSS language features.&lt;br /&gt;
* The third section — [http://www.w3.org/community/webed/wiki/Main_Page#Curriculum_structures Curriculum structures] — is a complete set of web design-related curricula for teachers to use to put together courses, which includes sample assignments, example questions, reading lists, assessment criteria, and more.&lt;br /&gt;
&lt;br /&gt;
Note: This is not a finalised site, but a development site for our material — it will be placed on a dedicated publishing platform in coming months, and a lot more material will be added. If you would like to contribute, please join the [http://www.w3.org/community/webed/ Web Education Community Group]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Web Standards Curriculum table of contents =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
What follows is a list of all the articles within the web standards curriculum, which will give you an essential grounding in Hypertext Markup Language (HTML), Cascading Stylesheets (CSS), JavaScript, accessibility, and the other topics you need to be a modern web developer/designer. Reading them in order makes the most sense, but they are written to work individually, so you can dip in and out as it suits you, if you need to hone individual skills.&lt;br /&gt;
&lt;br /&gt;
Note: This material was originally published as part of the Opera Web Standards Curriculum, available as [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur/#toc Introductory material], written by Chris Mills. Like the original, it is published under the [http://creativecommons.org/licenses/by-nc-sa/2.5/ Creative Commons Attribution, Non Commercial - Share Alike 2.5] license.&lt;br /&gt;
&lt;br /&gt;
Note #2: Many of the links below currently point to the [http://dev.opera.com dev.opera] versions, but we'll change these over to the W3C versions as we add more to the site. We are very happy to add these to the W3C pages, for a wider readership and more maintenance help.&lt;br /&gt;
&lt;br /&gt;
== The beginning ==&lt;br /&gt;
&lt;br /&gt;
[[Introduction to the Web Standards Curriculum]]&lt;br /&gt;
* [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-he/ Hebrew translation] | [http://dev.opera.com/articles/view/1-bevezeto-a-webes-szabvanyokba/ Hungarian translation] | [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-it/ Italian translation] | [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/ Catalan translation] | [http://www.w3.org/community/webed/wiki/Es/Introducción_al_currículo_de_estándares_web Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Introduction to the world of web standards ==&lt;br /&gt;
&lt;br /&gt;
# [[The history of the Web|The history of the Internet and the web, and the evolution of web standards]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-he/ Hebrew translation] | [http://dev.opera.com/articles/view/2-az-internet-es-a-web-tortenete/ Hungarian translation] | [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-it/ Italian translation] | [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/m1/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud1/index.html Spanish translation]&lt;br /&gt;
# [[How does the Internet work]]?&lt;br /&gt;
#* [http://dev.opera.com/articles/view/3-hogyan-mukodik-az-internet/ Hungarian translation] | [http://dev.opera.com/articles/view/3-how-does-the-internet-work-ja/ Japanese translation]| [http://mosaic.uoc.edu/ac/le/ca/m1/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud2/index.html Spanish translation]&lt;br /&gt;
# [[The web standards model - HTML CSS and JavaScript]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/4-a-webes-szabvanyok-modellje/ Hungarian translation] | [http://dev.opera.com/articles/view/4-the-web-standards-model-html-css-a-ja/ Japanese translation]| [http://mosaic.uoc.edu/ac/le/ca/m1/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/ca/m1/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud3/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Web Design Concepts ==&lt;br /&gt;
&lt;br /&gt;
This section won't go into any code or markup details, and will act as an introduction to the design process before you start to create any graphics or code, as well as concepts of web design such as IA, navigation, usability etc.&lt;br /&gt;
&lt;br /&gt;
# [[Information_Architecture_-_planning_out_a_web_site|Information Architecture - planning out a web site]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/6-informacios-architektura-egy-website-t/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud1/index.html Spanish translation]&lt;br /&gt;
# [[What_does_a_good_web_page_need|What does a good web page need?]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/7-mi-kell-egy-jo-weblaphoz/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud2/index.html Spanish translation]&lt;br /&gt;
# [[Colour_theory|Colour Theory]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/8-a-szinek-elmelete/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud3/index.html Spanish translation]&lt;br /&gt;
# [[Building up a site wireframe]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/9-egy-site-keretenek-felepitese/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud4/index.html Spanish translation] &lt;br /&gt;
# [[Colour schemes and design mockups]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/10-szinsemak-es-designtervek/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud5/index.html Spanish translation]&lt;br /&gt;
# [[Typography on the Web]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/11-tipografia-a-weben/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud6/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== HTML beginnings ==&lt;br /&gt;
&lt;br /&gt;
# [[The basics of HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/12-a-html-alapjai/ Hungarian translation] | [http://dev.opera.com/articles/view/12-the-basics-of-html-ja/ Japanese translation]&lt;br /&gt;
# [[Doctypes and markup styles]]&lt;br /&gt;
# [[The_HTML_head_element|The HTML &amp;amp;lt;head&amp;amp;gt; element]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/13-a-html-head-eleme/ Hungarian translation] | [http://dev.opera.com/articles/view/13-the-html-head-element-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/m3/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m3/ud1/index.html Spanish translation]&lt;br /&gt;
# [[More_about_the_document_head|More about the document &amp;amp;lt;head&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
== The HTML body ==&lt;br /&gt;
&lt;br /&gt;
# [[Marking up textual content in HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/15-szoveges-reszek-megjelolese/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud1/index.html Spanish translation]&lt;br /&gt;
# [[HTML lists|HTML Lists]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/16-html-listak/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud2/index.html Spanish translation]&lt;br /&gt;
# [[Images in HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/17-kepek-a-htmlben/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud3/index.html Spanish translation]&lt;br /&gt;
# [[HTML_links_-_lets_build_a_web|HTML links — let's build a web!]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/18-html-hivatkozasok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud4/index.html Spanish translation]&lt;br /&gt;
# [[HTML tables]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/19-html-tablazatok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud5/index.html Spanish translation]&lt;br /&gt;
# [[HTML forms - the basics]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/20-html-urlapok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud6/index.html Spanish translation]&lt;br /&gt;
# [[HTML5 form additions]]&lt;br /&gt;
# [[HTML structural elements]]&lt;br /&gt;
# [[Lesser - known semantic elements]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/21-kevesse-ismert/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud7/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud7/index.html Spanish translation]&lt;br /&gt;
# [[Creating multiple pages with navigation menus]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m4/ud9/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud9/index.html Spanish translation]&lt;br /&gt;
# [[Validating your HTML]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m4/ud10/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud10/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Accessibility ==&lt;br /&gt;
&lt;br /&gt;
# [[Accessibility basics]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m5/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m5/ud1/index.html Spanish translation]&lt;br /&gt;
# [[Accessibility testing]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m5/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m5/ud2/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== CSS ==&lt;br /&gt;
&lt;br /&gt;
# [[CSS_basics|CSS basics]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud1/index.html Spanish translation]&lt;br /&gt;
# [[Advanced CSS selectors]]&lt;br /&gt;
# [[Inheritance and cascade]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud2/index.html Spanish translation]&lt;br /&gt;
# [[CSS text styling part 1]]&lt;br /&gt;
# [[The_CSS_layout_model_-_boxes_borders_margins_padding|The CSS layout model - boxes, borders, margins, padding]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud4/index.html Spanish translation]&lt;br /&gt;
# [[CSS background images]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud5/index.html Spanish translation]&lt;br /&gt;
# [[Styling_lists_and_links|Styling lists and links]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud6/index.html Spanish translation]&lt;br /&gt;
# [[Styling tables]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud7/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud7/index.html Spanish translation]&lt;br /&gt;
# [[Styling forms]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud8/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud8/index.html Spanish translation]&lt;br /&gt;
# [[Floats and clearing]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud9/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud9/index.html Spanish translation]&lt;br /&gt;
# [[CSS static and relative positioning]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud10/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud10/index.html Spanish translation]&lt;br /&gt;
# [[CSS absolute and fixed positioning]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud11/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud11/index.html | Spanish translation]&lt;br /&gt;
# [[Debugging CSS]]&lt;br /&gt;
# [[CSS shorthand reference]]&lt;br /&gt;
&lt;br /&gt;
== Advanced CSS study ==&lt;br /&gt;
&lt;br /&gt;
# [[Headers_footers_columns_and_templates|Headers, footers, columns, and templates]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m7/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m7/ud1/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== JavaScript core skills ==&lt;br /&gt;
&lt;br /&gt;
# [[A_Short_History_of_JavaScript]]&lt;br /&gt;
# [[Programming_-_the_real_basics|Programming - the real basics!]]&lt;br /&gt;
# [[What can you do with JavaScript]]&lt;br /&gt;
# [[Your first look at JavaScript]]&lt;br /&gt;
# [[JavaScript best practices]]&lt;br /&gt;
# [[The principles of unobtrusive JavaScript]]&lt;br /&gt;
# [[JavaScript functions]]&lt;br /&gt;
# [[Objects in JavaScript]]&lt;br /&gt;
# [[Traversing the DOM]]&lt;br /&gt;
# [[Creating and modifying HTML]]&lt;br /&gt;
# [[Dynamic style - manipulating CSS with JavaScript]]&lt;br /&gt;
# [[Handling events with JavaScript]]&lt;br /&gt;
# [[JavaScript animation]]&lt;br /&gt;
# [[Graceful degredation versus progressive enhancement]]&lt;br /&gt;
&lt;br /&gt;
== SVG ==&lt;br /&gt;
&lt;br /&gt;
== Mobile web development ==&lt;br /&gt;
&lt;br /&gt;
# [[Introduction_to_mobile_web|Mobile 1: Introduction to mobile web]]&lt;br /&gt;
&lt;br /&gt;
== Supplementary articles ==&lt;br /&gt;
&lt;br /&gt;
* [[Getting your content online]]&lt;br /&gt;
* [[Common HTML entities used for typography]]&lt;br /&gt;
* [[The web standards curriculum glossary]]&lt;br /&gt;
* [[Optimizing content for different browsers: the RIGHT way]]&lt;br /&gt;
&lt;br /&gt;
== Proposed Updates and Additions to Web Standards Curriculum ==&lt;br /&gt;
&lt;br /&gt;
* [[WSC_proposed_updates|Web standards curriculum on W3C Wiki: plan for updates 2011]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:WSC]]&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
&lt;br /&gt;
* [[HTML]]&lt;br /&gt;
* [[CSS]]&lt;br /&gt;
&lt;br /&gt;
= Curriculum structures =&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact_Curriculum Overview of InterACT curriculum articles]&lt;br /&gt;
&lt;br /&gt;
== Basics and &amp;quot;soft&amp;quot; skills ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Internet_Fundamentals Internet Fundamentals]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Digital_Design_Production Digital Design Production]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Writing_for_the_Web Writing for the Web]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Project_Management Project Management]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Professional_Development Professional Development]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Independent_Study Independent Study]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Internship Internship]&lt;br /&gt;
&lt;br /&gt;
== Web design ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Web_Design_1 Web Design 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Web_Design_2 Web Design 2]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Accessibility Accessibility]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Usability_1 Usability 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Findability Findability]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Interaction_Design_1 Interaction Design 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Prototyping Prototyping]&lt;br /&gt;
&lt;br /&gt;
== Web development ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/DOM_Scripting_1 DOM Scripting 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Server-Side_Scripting_1 Server-side Scripting 1]&lt;br /&gt;
&lt;br /&gt;
= Teaching materials =&lt;br /&gt;
&lt;br /&gt;
Each page in this section includes teaching notes, examples, slidedecks and other materials for teachers to use for hands-on teaching of the curriculum structures outlined in the [[#Curriculum_structures|Curriculum structures]] section.&lt;br /&gt;
&lt;br /&gt;
* [[HTML Basics and Web Standards Concepts teaching materials]] (learning competency included in [http://www.w3.org/community/webed/wiki/Interact/Web_Design_1 Web Design 1])&lt;br /&gt;
&lt;br /&gt;
= Project activities =&lt;br /&gt;
&lt;br /&gt;
This section houses a record of all activities being undertaken in past, present or future by the Web Education Community Group, split into projects.&lt;br /&gt;
&lt;br /&gt;
IMPORTANT: Please don't pollute these pages with random stuff - if you just want to doodle or record random thoughts, put it in the [[ Ideas Playground ]].&lt;br /&gt;
&lt;br /&gt;
* [[Learning material]]&lt;br /&gt;
* [[Curriculum]]&lt;br /&gt;
* [[Outreach]]&lt;br /&gt;
* [[Training and certification]]&lt;br /&gt;
* [[Membership and policy]]&lt;br /&gt;
* International projects&lt;br /&gt;
** [[Croatian international project]]&lt;br /&gt;
** [[French international project]]&lt;br /&gt;
** [[it/Italian international project]]&lt;br /&gt;
** [[Japanese international project]]&lt;br /&gt;
** [[fa/|Persian language international project]]&lt;br /&gt;
** [[Es/|Spanish international project]]&lt;br /&gt;
** [[Turkish international project]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other available resources are as follows:&lt;br /&gt;
&lt;br /&gt;
* [[ WEST | Web Education Supplementary Toolkit ]]&lt;br /&gt;
* [[ Web Education community group style guide ]]&lt;br /&gt;
* [[How to write an article]]&lt;br /&gt;
* [[How to review an article]]&lt;/div&gt;</description>
			<pubDate>Thu, 30 Aug 2012 20:36:58 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Main_Page</comments>		</item>
		<item>
			<title>It/</title>
			<link>http://www.w3.org/community/webed/wiki/It/</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here, put an Italian translation of the [http://www.w3.org/community/webed/wiki/Main_Page#Web_Standards_Curriculum_table_of_contents|The web standards curriculum table of contents]&lt;/div&gt;</description>
			<pubDate>Thu, 30 Aug 2012 20:36:14 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:It/</comments>		</item>
		<item>
			<title>It/</title>
			<link>http://www.w3.org/community/webed/wiki/It/</link>
			<description>&lt;p&gt;Cmills:&amp;#32;Created page with &amp;quot;Here, put an Italian translation of [http://www.w3.org/community/webed/wiki/Main_Page#Web_Standards_Curriculum_table_of_contents|The web standards curriculum table of contents]&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here, put an Italian translation of [http://www.w3.org/community/webed/wiki/Main_Page#Web_Standards_Curriculum_table_of_contents|The web standards curriculum table of contents]&lt;/div&gt;</description>
			<pubDate>Thu, 30 Aug 2012 20:35:59 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:It/</comments>		</item>
		<item>
			<title>Main Page</title>
			<link>http://www.w3.org/community/webed/wiki/Main_Page</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Web Education Community Group Wiki! This page contains resources to help you teach or learn modern web development:&lt;br /&gt;
&lt;br /&gt;
* The first section — [http://www.w3.org/community/webed/wiki/Main_Page#Web_Standards_Curriculum_table_of_contents The web standards curriculum] — is a series of tutorial articles covering web design and development high level concepts, and essential technologies such as HTML, CSS and JavaScript. This is ideal for beginners wanting to learn the art of web design, or teachers looking for accurate material to use as the basis of teaching material.&lt;br /&gt;
* The second section — [http://www.w3.org/community/webed/wiki/Main_Page#References References] — is designed for looking up HTML and CSS language features.&lt;br /&gt;
* The third section — [http://www.w3.org/community/webed/wiki/Main_Page#Curriculum_structures Curriculum structures] — is a complete set of web design-related curricula for teachers to use to put together courses, which includes sample assignments, example questions, reading lists, assessment criteria, and more.&lt;br /&gt;
&lt;br /&gt;
Note: This is not a finalised site, but a development site for our material — it will be placed on a dedicated publishing platform in coming months, and a lot more material will be added. If you would like to contribute, please join the [http://www.w3.org/community/webed/ Web Education Community Group]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Web Standards Curriculum table of contents =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
What follows is a list of all the articles within the web standards curriculum, which will give you an essential grounding in Hypertext Markup Language (HTML), Cascading Stylesheets (CSS), JavaScript, accessibility, and the other topics you need to be a modern web developer/designer. Reading them in order makes the most sense, but they are written to work individually, so you can dip in and out as it suits you, if you need to hone individual skills.&lt;br /&gt;
&lt;br /&gt;
Note: This material was originally published as part of the Opera Web Standards Curriculum, available as [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur/#toc Introductory material], written by Chris Mills. Like the original, it is published under the [http://creativecommons.org/licenses/by-nc-sa/2.5/ Creative Commons Attribution, Non Commercial - Share Alike 2.5] license.&lt;br /&gt;
&lt;br /&gt;
Note #2: Many of the links below currently point to the [http://dev.opera.com dev.opera] versions, but we'll change these over to the W3C versions as we add more to the site. We are very happy to add these to the W3C pages, for a wider readership and more maintenance help.&lt;br /&gt;
&lt;br /&gt;
== The beginning ==&lt;br /&gt;
&lt;br /&gt;
[[Introduction to the Web Standards Curriculum]]&lt;br /&gt;
* [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-he/ Hebrew translation] | [http://dev.opera.com/articles/view/1-bevezeto-a-webes-szabvanyokba/ Hungarian translation] | [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-it/ Italian translation] | [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/ Catalan translation] | [http://www.w3.org/community/webed/wiki/Es/Introducción_al_currículo_de_estándares_web Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Introduction to the world of web standards ==&lt;br /&gt;
&lt;br /&gt;
# [[The history of the Web|The history of the Internet and the web, and the evolution of web standards]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-he/ Hebrew translation] | [http://dev.opera.com/articles/view/2-az-internet-es-a-web-tortenete/ Hungarian translation] | [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-it/ Italian translation] | [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/m1/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud1/index.html Spanish translation]&lt;br /&gt;
# [[How does the Internet work]]?&lt;br /&gt;
#* [http://dev.opera.com/articles/view/3-hogyan-mukodik-az-internet/ Hungarian translation] | [http://dev.opera.com/articles/view/3-how-does-the-internet-work-ja/ Japanese translation]| [http://mosaic.uoc.edu/ac/le/ca/m1/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud2/index.html Spanish translation]&lt;br /&gt;
# [[The web standards model - HTML CSS and JavaScript]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/4-a-webes-szabvanyok-modellje/ Hungarian translation] | [http://dev.opera.com/articles/view/4-the-web-standards-model-html-css-a-ja/ Japanese translation]| [http://mosaic.uoc.edu/ac/le/ca/m1/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/ca/m1/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud3/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Web Design Concepts ==&lt;br /&gt;
&lt;br /&gt;
This section won't go into any code or markup details, and will act as an introduction to the design process before you start to create any graphics or code, as well as concepts of web design such as IA, navigation, usability etc.&lt;br /&gt;
&lt;br /&gt;
# [[Information_Architecture_-_planning_out_a_web_site|Information Architecture - planning out a web site]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/6-informacios-architektura-egy-website-t/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud1/index.html Spanish translation]&lt;br /&gt;
# [[What_does_a_good_web_page_need|What does a good web page need?]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/7-mi-kell-egy-jo-weblaphoz/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud2/index.html Spanish translation]&lt;br /&gt;
# [[Colour_theory|Colour Theory]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/8-a-szinek-elmelete/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud3/index.html Spanish translation]&lt;br /&gt;
# [[Building up a site wireframe]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/9-egy-site-keretenek-felepitese/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud4/index.html Spanish translation] &lt;br /&gt;
# [[Colour schemes and design mockups]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/10-szinsemak-es-designtervek/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud5/index.html Spanish translation]&lt;br /&gt;
# [[Typography on the Web]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/11-tipografia-a-weben/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud6/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== HTML beginnings ==&lt;br /&gt;
&lt;br /&gt;
# [[The basics of HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/12-a-html-alapjai/ Hungarian translation] | [http://dev.opera.com/articles/view/12-the-basics-of-html-ja/ Japanese translation]&lt;br /&gt;
# [[Doctypes and markup styles]]&lt;br /&gt;
# [[The_HTML_head_element|The HTML &amp;amp;lt;head&amp;amp;gt; element]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/13-a-html-head-eleme/ Hungarian translation] | [http://dev.opera.com/articles/view/13-the-html-head-element-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/m3/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m3/ud1/index.html Spanish translation]&lt;br /&gt;
# [[More_about_the_document_head|More about the document &amp;amp;lt;head&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
== The HTML body ==&lt;br /&gt;
&lt;br /&gt;
# [[Marking up textual content in HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/15-szoveges-reszek-megjelolese/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud1/index.html Spanish translation]&lt;br /&gt;
# [[HTML lists|HTML Lists]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/16-html-listak/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud2/index.html Spanish translation]&lt;br /&gt;
# [[Images in HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/17-kepek-a-htmlben/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud3/index.html Spanish translation]&lt;br /&gt;
# [[HTML_links_-_lets_build_a_web|HTML links — let's build a web!]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/18-html-hivatkozasok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud4/index.html Spanish translation]&lt;br /&gt;
# [[HTML tables]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/19-html-tablazatok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud5/index.html Spanish translation]&lt;br /&gt;
# [[HTML forms - the basics]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/20-html-urlapok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud6/index.html Spanish translation]&lt;br /&gt;
# [[HTML5 form additions]]&lt;br /&gt;
# [[HTML structural elements]]&lt;br /&gt;
# [[Lesser - known semantic elements]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/21-kevesse-ismert/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud7/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud7/index.html Spanish translation]&lt;br /&gt;
# [[Creating multiple pages with navigation menus]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m4/ud9/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud9/index.html Spanish translation]&lt;br /&gt;
# [[Validating your HTML]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m4/ud10/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud10/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Accessibility ==&lt;br /&gt;
&lt;br /&gt;
# [[Accessibility basics]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m5/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m5/ud1/index.html Spanish translation]&lt;br /&gt;
# [[Accessibility testing]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m5/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m5/ud2/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== CSS ==&lt;br /&gt;
&lt;br /&gt;
# [[CSS_basics|CSS basics]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud1/index.html Spanish translation]&lt;br /&gt;
# [[Advanced CSS selectors]]&lt;br /&gt;
# [[Inheritance and cascade]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud2/index.html Spanish translation]&lt;br /&gt;
# [[CSS text styling part 1]]&lt;br /&gt;
# [[The_CSS_layout_model_-_boxes_borders_margins_padding|The CSS layout model - boxes, borders, margins, padding]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud4/index.html Spanish translation]&lt;br /&gt;
# [[CSS background images]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud5/index.html Spanish translation]&lt;br /&gt;
# [[Styling_lists_and_links|Styling lists and links]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud6/index.html Spanish translation]&lt;br /&gt;
# [[Styling tables]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud7/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud7/index.html Spanish translation]&lt;br /&gt;
# [[Styling forms]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud8/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud8/index.html Spanish translation]&lt;br /&gt;
# [[Floats and clearing]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud9/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud9/index.html Spanish translation]&lt;br /&gt;
# [[CSS static and relative positioning]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud10/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud10/index.html Spanish translation]&lt;br /&gt;
# [[CSS absolute and fixed positioning]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud11/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud11/index.html | Spanish translation]&lt;br /&gt;
# [[Debugging CSS]]&lt;br /&gt;
# [[CSS shorthand reference]]&lt;br /&gt;
&lt;br /&gt;
== Advanced CSS study ==&lt;br /&gt;
&lt;br /&gt;
# [[Headers_footers_columns_and_templates|Headers, footers, columns, and templates]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m7/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m7/ud1/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== JavaScript core skills ==&lt;br /&gt;
&lt;br /&gt;
# [[A_Short_History_of_JavaScript]]&lt;br /&gt;
# [[Programming_-_the_real_basics|Programming - the real basics!]]&lt;br /&gt;
# [[What can you do with JavaScript]]&lt;br /&gt;
# [[Your first look at JavaScript]]&lt;br /&gt;
# [[JavaScript best practices]]&lt;br /&gt;
# [[The principles of unobtrusive JavaScript]]&lt;br /&gt;
# [[JavaScript functions]]&lt;br /&gt;
# [[Objects in JavaScript]]&lt;br /&gt;
# [[Traversing the DOM]]&lt;br /&gt;
# [[Creating and modifying HTML]]&lt;br /&gt;
# [[Dynamic style - manipulating CSS with JavaScript]]&lt;br /&gt;
# [[Handling events with JavaScript]]&lt;br /&gt;
# [[JavaScript animation]]&lt;br /&gt;
# [[Graceful degredation versus progressive enhancement]]&lt;br /&gt;
&lt;br /&gt;
== SVG ==&lt;br /&gt;
&lt;br /&gt;
== Mobile web development ==&lt;br /&gt;
&lt;br /&gt;
# [[Introduction_to_mobile_web|Mobile 1: Introduction to mobile web]]&lt;br /&gt;
&lt;br /&gt;
== Supplementary articles ==&lt;br /&gt;
&lt;br /&gt;
* [[Getting your content online]]&lt;br /&gt;
* [[Common HTML entities used for typography]]&lt;br /&gt;
* [[The web standards curriculum glossary]]&lt;br /&gt;
* [[Optimizing content for different browsers: the RIGHT way]]&lt;br /&gt;
&lt;br /&gt;
== Proposed Updates and Additions to Web Standards Curriculum ==&lt;br /&gt;
&lt;br /&gt;
* [[WSC_proposed_updates|Web standards curriculum on W3C Wiki: plan for updates 2011]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:WSC]]&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
&lt;br /&gt;
* [[HTML]]&lt;br /&gt;
* [[CSS]]&lt;br /&gt;
&lt;br /&gt;
= Curriculum structures =&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact_Curriculum Overview of InterACT curriculum articles]&lt;br /&gt;
&lt;br /&gt;
== Basics and &amp;quot;soft&amp;quot; skills ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Internet_Fundamentals Internet Fundamentals]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Digital_Design_Production Digital Design Production]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Writing_for_the_Web Writing for the Web]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Project_Management Project Management]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Professional_Development Professional Development]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Independent_Study Independent Study]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Internship Internship]&lt;br /&gt;
&lt;br /&gt;
== Web design ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Web_Design_1 Web Design 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Web_Design_2 Web Design 2]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Accessibility Accessibility]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Usability_1 Usability 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Findability Findability]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Interaction_Design_1 Interaction Design 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Prototyping Prototyping]&lt;br /&gt;
&lt;br /&gt;
== Web development ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/DOM_Scripting_1 DOM Scripting 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Server-Side_Scripting_1 Server-side Scripting 1]&lt;br /&gt;
&lt;br /&gt;
= Teaching materials =&lt;br /&gt;
&lt;br /&gt;
Each page in this section includes teaching notes, examples, slidedecks and other materials for teachers to use for hands-on teaching of the curriculum structures outlined in the [[#Curriculum_structures|Curriculum structures]] section.&lt;br /&gt;
&lt;br /&gt;
* [[HTML Basics and Web Standards Concepts teaching materials]] (learning competency included in [http://www.w3.org/community/webed/wiki/Interact/Web_Design_1 Web Design 1])&lt;br /&gt;
&lt;br /&gt;
= Project activities =&lt;br /&gt;
&lt;br /&gt;
This section houses a record of all activities being undertaken in past, present or future by the Web Education Community Group, split into projects.&lt;br /&gt;
&lt;br /&gt;
IMPORTANT: Please don't pollute these pages with random stuff - if you just want to doodle or record random thoughts, put it in the [[ Ideas Playground ]].&lt;br /&gt;
&lt;br /&gt;
* [[Learning material]]&lt;br /&gt;
* [[Curriculum]]&lt;br /&gt;
* [[Outreach]]&lt;br /&gt;
* [[Training and certification]]&lt;br /&gt;
* [[Membership and policy]]&lt;br /&gt;
* International projects&lt;br /&gt;
** [[Croatian international project]]&lt;br /&gt;
** [[French international project]]&lt;br /&gt;
** [[it/|Italian international project]]&lt;br /&gt;
** [[Japanese international project]]&lt;br /&gt;
** [[fa/|Persian language international project]]&lt;br /&gt;
** [[Es/|Spanish international project]]&lt;br /&gt;
** [[Turkish international project]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other available resources are as follows:&lt;br /&gt;
&lt;br /&gt;
* [[ WEST | Web Education Supplementary Toolkit ]]&lt;br /&gt;
* [[ Web Education community group style guide ]]&lt;br /&gt;
* [[How to write an article]]&lt;br /&gt;
* [[How to review an article]]&lt;/div&gt;</description>
			<pubDate>Thu, 30 Aug 2012 20:34:51 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Main_Page</comments>		</item>
		<item>
			<title>A Short History of JavaScript</title>
			<link>http://www.w3.org/community/webed/wiki/A_Short_History_of_JavaScript</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;JavaScript, not to be confused with [http://en.wikipedia.org/wiki/Java_(programming_language) Java], was created in 10 days in May 1995 by [http://en.wikipedia.org/wiki/Brendan_Eich Brendan Eich], then working at [http://en.wikipedia.org/wiki/Netscape Netscape] and now of [http://www.mozilla.com Mozilla]. JavaScript was not always known as JavaScript: the original name was Mocha, a name chosen by [http://en.wikipedia.org/wiki/Marc_Andreessen Marc Andreessen], founder of Netscape. In September of 1995 the name was changed to LiveScript, then in December of the same year, upon receiving a trademark license from Sun, the name JavaScript was adopted. This was somewhat of a marketing move at the time, with Java being very popular around then. &lt;br /&gt;
&lt;br /&gt;
In 1996 - 1997 JavaScript was taken to [http://en.wikipedia.org/wiki/Ecma_International ECMA] to carve out a standard specification, which other browser vendors could then implement based on the work done at Netscape. The work done over this period of time eventually led to the official release of ECMA-262 Ed.1: ECMAScript is the name of the official standard, with JavaScript being the most well known of the implementations. ActionScript 3 is another well-known implementation of ECMAScript.&lt;br /&gt;
&lt;br /&gt;
The standards process continued in cycles, with releases of ECMAScript 2 in 1998 and  ECMAScript 3 in 1999, which is the baseline for modern day JavaScript. The &amp;quot;JS2&amp;quot; or &amp;quot;original ES4&amp;quot; work led by Waldemar Horwat (then of Netscape, now at Google) started in 2000 and at first, Microsoft seemed to participate and even implemented some of the proposals in their JScript.net language.&lt;br /&gt;
&lt;br /&gt;
Over time it was clear though that Microsoft had no intention of cooperating or implementing proper JS in IE, even though they had no competing proposal and they had a partial (and diverged at this point) implementation on the .NET server side. So by 2003 the JS2/original-ES4 work was mothballed.&lt;br /&gt;
&lt;br /&gt;
The next major event was in 2005, with two major happenings in JavaScript’s history. First, Brendan Eich and Mozilla rejoined ECMA as a not-for-profit member and work started on E4X, ECMA-357, which came from ex-Microsoft employees at BEA (originally acquired as Crossgain). This led to work being done with Macromedia, who were working on ActionScript 3 — a fork of Waldemar's JS2/original-ES4 work.&lt;br /&gt;
&lt;br /&gt;
So, along with Macromedia (later acquired by Adobe), work restarted on ECMAScript 4 with the goal of standardizing what was in AS3 and implementing it in SpiderMonkey. To this end, Adobe released the &amp;quot;AVM2&amp;quot;, code named Tamarin, as an open source project. But Tamarin and AS3 were too different from web JavaScript to converge, as was realized by the parties in 2007 and 2008.&lt;br /&gt;
&lt;br /&gt;
Alas, there was still turmoil between the various players; Doug Crockford — then at Yahoo! — joined forces with Microsoft in 2007 to oppose ECMAScript 4, which led to the ECMAScript 3.1 effort.&lt;br /&gt;
&lt;br /&gt;
While all of this was happening the open source and developer communities set to work to revolutionize what could be done with JavaScript. This community effort was sparked in 2005 when [http://en.wikipedia.org/wiki/Jesse_James_Garrett Jesse James Garrett] released a white paper in which he coined the term Ajax, and described a set of technologies, of which JavaScript was the backbone, used to create web applications where data can be loaded in the background, avoiding the need for full page reloads and resulting in more dynamic applications. This resulted in a renaissance period of JavaScript usage spearheaded by open source libraries and the communities that formed around them, with libraries such as [http://www.prototypejs.org/ Prototype], [http://jquery.com/ jQuery], [http://www.dojofoundation.org/projects/dojo Dojo] and [http://mootools.net/ Mootools] and others being released.&lt;br /&gt;
&lt;br /&gt;
In July of 2008 the disparate parties on either side came together in Oslo. This led to the eventual agreement in early 2009 to rename ECMAScript 3.1 to ECMAScript 5 and drive the language forward using an agenda that is known as [http://wiki.ecmascript.org/doku.php?id=harmony:harmony Harmony].&lt;br /&gt;
&lt;br /&gt;
All of this then brings us to today, with JavaScript entering a completely new and exciting cycle of evolution, innovation and standardisation, with new developments such as the [http://nodejs.org/ Nodejs] platform, allowing us to use JavaScript on the server-side, and HTML5 APIs to control user media, open up web sockets for always-on communication, get data on geographical location and device features such as accelerometer, and more. It is an exciting time to learn JavaScript.&lt;/div&gt;</description>
			<pubDate>Wed, 27 Jun 2012 15:40:12 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:A_Short_History_of_JavaScript</comments>		</item>
		<item>
			<title>Main Page</title>
			<link>http://www.w3.org/community/webed/wiki/Main_Page</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Web Education Community Group Wiki! This page contains resources to help you teach or learn modern web development:&lt;br /&gt;
&lt;br /&gt;
* The first section — [http://www.w3.org/community/webed/wiki/Main_Page#Web_Standards_Curriculum_table_of_contents The web standards curriculum] — is a series of tutorial articles covering web design and development high level concepts, and essential technologies such as HTML, CSS and JavaScript. This is ideal for beginners wanting to learn the art of web design, or teachers looking for accurate material to use as the basis of teaching material.&lt;br /&gt;
* The second section — [http://www.w3.org/community/webed/wiki/Main_Page#References References] — is designed for looking up HTML and CSS language features.&lt;br /&gt;
* The third section — [http://www.w3.org/community/webed/wiki/Main_Page#Curriculum_structures Curriculum structures] — is a complete set of web design-related curricula for teachers to use to put together courses, which includes sample assignments, example questions, reading lists, assessment criteria, and more.&lt;br /&gt;
&lt;br /&gt;
Note: This is not a finalised site, but a development site for our material — it will be placed on a dedicated publishing platform in coming months, and a lot more material will be added. If you would like to contribute, please join the [http://www.w3.org/community/webed/ Web Education Community Group]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Web Standards Curriculum table of contents =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
What follows is a list of all the articles within the web standards curriculum, which will give you an essential grounding in Hypertext Markup Language (HTML), Cascading Stylesheets (CSS), JavaScript, accessibility, and the other topics you need to be a modern web developer/designer. Reading them in order makes the most sense, but they are written to work individually, so you can dip in and out as it suits you, if you need to hone individual skills.&lt;br /&gt;
&lt;br /&gt;
Note: This material was originally published as part of the Opera Web Standards Curriculum, available as [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur/#toc Introductory material], written by Chris Mills. Like the original, it is published under the [http://creativecommons.org/licenses/by-nc-sa/2.5/ Creative Commons Attribution, Non Commercial - Share Alike 2.5] license.&lt;br /&gt;
&lt;br /&gt;
Note #2: Many of the links below currently point to the [http://dev.opera.com dev.opera] versions, but we'll change these over to the W3C versions as we add more to the site. We are very happy to add these to the W3C pages, for a wider readership and more maintenance help.&lt;br /&gt;
&lt;br /&gt;
== The beginning ==&lt;br /&gt;
&lt;br /&gt;
[[Introduction to the Web Standards Curriculum]]&lt;br /&gt;
* [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-he/ Hebrew translation] | [http://dev.opera.com/articles/view/1-bevezeto-a-webes-szabvanyokba/ Hungarian translation] | [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-it/ Italian translation] | [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/ Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/ Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Introduction to the world of web standards ==&lt;br /&gt;
&lt;br /&gt;
# [[The history of the Web|The history of the Internet and the web, and the evolution of web standards]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-he/ Hebrew translation] | [http://dev.opera.com/articles/view/2-az-internet-es-a-web-tortenete/ Hungarian translation] | [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-it/ Italian translation] | [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/m1/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud1/index.html Spanish translation]&lt;br /&gt;
# [[How does the Internet work]]?&lt;br /&gt;
#* [http://dev.opera.com/articles/view/3-hogyan-mukodik-az-internet/ Hungarian translation] | [http://dev.opera.com/articles/view/3-how-does-the-internet-work-ja/ Japanese translation]| [http://mosaic.uoc.edu/ac/le/ca/m1/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud2/index.html Spanish translation]&lt;br /&gt;
# [[The web standards model - HTML CSS and JavaScript]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/4-a-webes-szabvanyok-modellje/ Hungarian translation] | [http://dev.opera.com/articles/view/4-the-web-standards-model-html-css-a-ja/ Japanese translation]| [http://mosaic.uoc.edu/ac/le/ca/m1/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/ca/m1/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud3/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Web Design Concepts ==&lt;br /&gt;
&lt;br /&gt;
This section won't go into any code or markup details, and will act as an introduction to the design process before you start to create any graphics or code, as well as concepts of web design such as IA, navigation, usability etc.&lt;br /&gt;
&lt;br /&gt;
# [[Information_Architecture_-_planning_out_a_web_site|Information Architecture - planning out a web site]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/6-informacios-architektura-egy-website-t/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud1/index.html Spanish translation]&lt;br /&gt;
# [[What_does_a_good_web_page_need|What does a good web page need?]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/7-mi-kell-egy-jo-weblaphoz/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud2/index.html Spanish translation]&lt;br /&gt;
# [[Colour_theory|Colour Theory]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/8-a-szinek-elmelete/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud3/index.html Spanish translation]&lt;br /&gt;
# [[Building up a site wireframe]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/9-egy-site-keretenek-felepitese/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud4/index.html Spanish translation] &lt;br /&gt;
# [[Colour schemes and design mockups]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/10-szinsemak-es-designtervek/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud5/index.html Spanish translation]&lt;br /&gt;
# [[Typography on the Web]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/11-tipografia-a-weben/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud6/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== HTML beginnings ==&lt;br /&gt;
&lt;br /&gt;
# [[The basics of HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/12-a-html-alapjai/ Hungarian translation] | [http://dev.opera.com/articles/view/12-the-basics-of-html-ja/ Japanese translation]&lt;br /&gt;
# [[Doctypes and markup styles]]&lt;br /&gt;
# [[The_HTML_head_element|The HTML &amp;amp;lt;head&amp;amp;gt; element]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/13-a-html-head-eleme/ Hungarian translation] | [http://dev.opera.com/articles/view/13-the-html-head-element-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/m3/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m3/ud1/index.html Spanish translation]&lt;br /&gt;
# [[More_about_the_document_head|More about the document &amp;amp;lt;head&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
== The HTML body ==&lt;br /&gt;
&lt;br /&gt;
# [[Marking up textual content in HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/15-szoveges-reszek-megjelolese/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud1/index.html Spanish translation]&lt;br /&gt;
# [[HTML lists|HTML Lists]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/16-html-listak/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud2/index.html Spanish translation]&lt;br /&gt;
# [[Images in HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/17-kepek-a-htmlben/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud3/index.html Spanish translation]&lt;br /&gt;
# [[HTML_links_-_lets_build_a_web|HTML links — let's build a web!]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/18-html-hivatkozasok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud4/index.html Spanish translation]&lt;br /&gt;
# [[HTML tables]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/19-html-tablazatok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud5/index.html Spanish translation]&lt;br /&gt;
# [[HTML forms - the basics]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/20-html-urlapok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud6/index.html Spanish translation]&lt;br /&gt;
# [[HTML5 form additions]]&lt;br /&gt;
# [[HTML structural elements]]&lt;br /&gt;
# [[Lesser - known semantic elements]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/21-kevesse-ismert/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud7/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud7/index.html Spanish translation]&lt;br /&gt;
# [[Creating multiple pages with navigation menus]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m4/ud9/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud9/index.html Spanish translation]&lt;br /&gt;
# [[Validating your HTML]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m4/ud10/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud10/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Accessibility ==&lt;br /&gt;
&lt;br /&gt;
# [[Accessibility basics]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m5/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m5/ud1/index.html Spanish translation]&lt;br /&gt;
# [[Accessibility testing]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m5/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m5/ud2/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== CSS ==&lt;br /&gt;
&lt;br /&gt;
# [[CSS_basics|CSS basics]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud1/index.html Spanish translation]&lt;br /&gt;
# [[Advanced CSS selectors]]&lt;br /&gt;
# [[Inheritance and cascade]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud2/index.html Spanish translation]&lt;br /&gt;
# [[CSS text styling part 1]]&lt;br /&gt;
# [[The_CSS_layout_model_-_boxes_borders_margins_padding|The CSS layout model - boxes, borders, margins, padding]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud4/index.html Spanish translation]&lt;br /&gt;
# [[CSS background images]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud5/index.html Spanish translation]&lt;br /&gt;
# [[Styling_lists_and_links|Styling lists and links]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud6/index.html Spanish translation]&lt;br /&gt;
# [[Styling tables]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud7/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud7/index.html Spanish translation]&lt;br /&gt;
# [[Styling forms]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud8/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud8/index.html Spanish translation]&lt;br /&gt;
# [[Floats and clearing]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud9/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud9/index.html Spanish translation]&lt;br /&gt;
# [[CSS static and relative positioning]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud10/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud10/index.html Spanish translation]&lt;br /&gt;
# [[CSS absolute and fixed positioning]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud11/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud11/index.html | Spanish translation]&lt;br /&gt;
# [[Debugging CSS]]&lt;br /&gt;
# [[CSS shorthand reference]]&lt;br /&gt;
&lt;br /&gt;
== Advanced CSS study ==&lt;br /&gt;
&lt;br /&gt;
# [[Headers_footers_columns_and_templates|Headers, footers, columns, and templates]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m7/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m7/ud1/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== JavaScript core skills ==&lt;br /&gt;
&lt;br /&gt;
# [[A_Short_History_of_JavaScript]]&lt;br /&gt;
# [[Programming_-_the_real_basics|Programming - the real basics!]]&lt;br /&gt;
# [[What can you do with JavaScript]]&lt;br /&gt;
# [[Your first look at JavaScript]]&lt;br /&gt;
# [[JavaScript best practices]]&lt;br /&gt;
# [[The principles of unobtrusive JavaScript]]&lt;br /&gt;
# [[JavaScript functions]]&lt;br /&gt;
# [[Objects in JavaScript]]&lt;br /&gt;
# [[Traversing the DOM]]&lt;br /&gt;
# [[Creating and modifying HTML]]&lt;br /&gt;
# [[Dynamic style - manipulating CSS with JavaScript]]&lt;br /&gt;
# [[Handling events with JavaScript]]&lt;br /&gt;
# [[JavaScript animation]]&lt;br /&gt;
# [[Graceful degredation versus progressive enhancement]]&lt;br /&gt;
&lt;br /&gt;
== SVG ==&lt;br /&gt;
&lt;br /&gt;
== Mobile web development ==&lt;br /&gt;
&lt;br /&gt;
# [[Introduction_to_mobile_web|Mobile 1: Introduction to mobile web]]&lt;br /&gt;
&lt;br /&gt;
== Supplementary articles ==&lt;br /&gt;
&lt;br /&gt;
* [[Getting your content online]]&lt;br /&gt;
* [[Common HTML entities used for typography]]&lt;br /&gt;
* [[The web standards curriculum glossary]]&lt;br /&gt;
* [[Optimizing content for different browsers: the RIGHT way]]&lt;br /&gt;
&lt;br /&gt;
== Proposed Updates and Additions to Web Standards Curriculum ==&lt;br /&gt;
&lt;br /&gt;
* [[WSC_proposed_updates|Web standards curriculum on W3C Wiki: plan for updates 2011]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:WSC]]&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
&lt;br /&gt;
* [[HTML]]&lt;br /&gt;
* [[CSS]]&lt;br /&gt;
&lt;br /&gt;
= Curriculum structures =&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact_Curriculum Overview of InterACT curriculum articles]&lt;br /&gt;
&lt;br /&gt;
== Basics and &amp;quot;soft&amp;quot; skills ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Internet_Fundamentals Internet Fundamentals]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Digital_Design_Production Digital Design Production]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Writing_for_the_Web Writing for the Web]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Project_Management Project Management]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Professional_Development Professional Development]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Independent_Study Independent Study]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Internship Internship]&lt;br /&gt;
&lt;br /&gt;
== Web design ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Web_Design_1 Web Design 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Web_Design_2 Web Design 2]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Accessibility Accessibility]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Usability_1 Usability 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Findability Findability]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Interaction_Design_1 Interaction Design 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Prototyping Prototyping]&lt;br /&gt;
&lt;br /&gt;
== Web development ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/DOM_Scripting_1 DOM Scripting 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Server-Side_Scripting_1 Server-side Scripting 1]&lt;br /&gt;
&lt;br /&gt;
= Teaching materials =&lt;br /&gt;
&lt;br /&gt;
Each page in this section includes teaching notes, examples, slidedecks and other materials for teachers to use for hands-on teaching of the curriculum structures outlined in the [[#Curriculum_structures|Curriculum structures]] section.&lt;br /&gt;
&lt;br /&gt;
* [[HTML Basics and Web Standards Concepts teaching materials]] (learning competency included in [http://www.w3.org/community/webed/wiki/Interact/Web_Design_1 Web Design 1])&lt;br /&gt;
&lt;br /&gt;
= Project activities =&lt;br /&gt;
&lt;br /&gt;
This section houses a record of all activities being undertaken in past, present or future by the Web Education Community Group, split into projects.&lt;br /&gt;
&lt;br /&gt;
IMPORTANT: Please don't pollute these pages with random stuff - if you just want to doodle or record random thoughts, put it in the [[ Ideas Playground ]].&lt;br /&gt;
&lt;br /&gt;
* [[Learning material]]&lt;br /&gt;
* [[Curriculum]]&lt;br /&gt;
* [[Outreach]]&lt;br /&gt;
* [[Training and certification]]&lt;br /&gt;
* [[Membership and policy]]&lt;br /&gt;
* International projects&lt;br /&gt;
** [[Croatian international project]]&lt;br /&gt;
** [[French international project]]&lt;br /&gt;
** [[Japanese international project]]&lt;br /&gt;
** [[fa/|Persian language international project]]&lt;br /&gt;
** [[Es/|Spanish international project]]&lt;br /&gt;
** [[Turkish international project]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other available resources are as follows:&lt;br /&gt;
&lt;br /&gt;
* [[ WEST | Web Education Supplementary Toolkit ]]&lt;br /&gt;
* [[ Web Education community group style guide ]]&lt;br /&gt;
* [[How to write an article]]&lt;br /&gt;
* [[How to review an article]]&lt;/div&gt;</description>
			<pubDate>Wed, 27 Jun 2012 13:55:17 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Main_Page</comments>		</item>
		<item>
			<title>WSC proposed updates</title>
			<link>http://www.w3.org/community/webed/wiki/WSC_proposed_updates</link>
			<description>&lt;p&gt;Cmills:&amp;#32;/* JavaScript */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;      &lt;br /&gt;
= Web standards curriculum on W3C Wiki: plan for updates 2011 =&lt;br /&gt;
&lt;br /&gt;
== The beginning ==&lt;br /&gt;
&lt;br /&gt;
[[Introduction to the Web Standards Curriculum]] by Chris Mills. '''{ -- JUST NEEDS A GENERAL READ, AND A LITTLE BIT OF TWEAKING}'''&lt;br /&gt;
&lt;br /&gt;
== Introduction to the world of web standards ==&lt;br /&gt;
&lt;br /&gt;
# [[The history of the Web|The history of the Internet and the web, and the evolution of web standards]], by Mark Norman Francis. { -- NEEDS A GENERAL READ, PLUS I THINK IT COULD BENEFIT FROM A BIT MORE HISTORY BEING ADDED ABOUT THE EVOLUTION OF HTML5 AND CSS3}&lt;br /&gt;
# [[How does the Internet work]]? by Jonathan Lane. {-- NO TWEAKING NEEDED; JUST SPIT AND POLISH}&lt;br /&gt;
# [[The web standards model - HTML CSS and JavaScript]] by Jonathan Lane. { -- A FEW TWEAKS NEEDED - THE HTML SECTION COULD DO WITH AN OVERHAUL TO CCOUNT FOR HTML5, AND DEAL WITH XHTML A BIT BETTER}&lt;br /&gt;
# [[Beautiful dream, but what's the reality]]? by Jonathan Lane. { -- I THINK THIS ARTICLE COULD JUST BE REMOVED, AND A SMALL SECTION ADDED TO THE PREVIOUS ARTICLE TO COVER &amp;quot;THE REALITY OF IT ALL&amp;quot;. AS IT STANDS, THIS ARTICLE IS A BIT OF A RANT, AND NOT REALLY THAT USEFUL TO EDUCATION}&lt;br /&gt;
&lt;br /&gt;
== Web Design Concepts ==&lt;br /&gt;
&lt;br /&gt;
This section won't go into any code or markup details, and will act as an introduction to the design process before you start to create any graphics or code, as well as concepts of web design such as IA, navigation, usability etc.&lt;br /&gt;
&lt;br /&gt;
# [http://www.w3.org/wiki/Information_Architecture_-_planning_out_a_web_site Information Architecture - planning out a web site], by Jonathan Lane.&lt;br /&gt;
# [http://www.w3.org/wiki/What_does_a_good_web_page_need What does a good web page need?], by Mark Norman Francis.&lt;br /&gt;
# [http://www.w3.org/wiki/Colour_theory Colour Theory], by Linda Goin.&lt;br /&gt;
# [http://www.w3.org/wiki/Building_up_a_site_wireframe Building up a site wireframe], by Linda Goin.&lt;br /&gt;
# [http://www.w3.org/wiki/Colour_schemes_and_design_mockups Colour schemes and design mockups], by Linda Goin. &lt;br /&gt;
# [http://www.w3.org/wiki/Typography_on_the_Web Typography on the web], by Paul Haine.&lt;br /&gt;
&lt;br /&gt;
{ -- I THINK THIS WHOLE SECTION NEEDS AN OVERHAUL, AS CURRENTLY IT IS NOT VERY EFFECTIVE. THE TYPOGRAPHY AND IA SECTIONS ARE FINE, BUT I'M NOT SURE ABOUT THE OTHER STUFF. I THINK THE SECTION SHOULD BE RETITLED &amp;quot;PLANNING A WEB SITE&amp;quot;, AND HAVE A STRUCTURE SOMETHING LIKE THE FOLLOWING: &lt;br /&gt;
&lt;br /&gt;
=== Planned New section to replace &amp;quot;Web Design Concepts&amp;quot; - to be called &amp;quot;Planning a web site&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
# [[Introduction to planning a web site]]&lt;br /&gt;
# Scoping and user research&lt;br /&gt;
# [[Information_Architecture_-_planning_out_a_web_site|Information Architecture - planning out a web site]]. [http://dev.opera.com/articles/view/6-informacios-architektura-egy-website-t/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud1/index.html Spanish translation]&lt;br /&gt;
# [[What_does_a_good_web_page_need|What does a good web page need?]] [http://dev.opera.com/articles/view/7-mi-kell-egy-jo-weblaphoz/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud2/index.html Spanish translation]&lt;br /&gt;
# [[Typography on the Web]]. [http://dev.opera.com/articles/view/11-tipografia-a-weben/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud6/index.html Spanish translation]&lt;br /&gt;
# Colour schemes and design theory&lt;br /&gt;
# Mockups and prototypes&lt;br /&gt;
# User interface Design&lt;br /&gt;
# The Art and Science of CSS-Layouts&lt;br /&gt;
# User experience design - INCLUDE MOBILE/ALTERNATIVE DEVICE USER EXPERIENCE. HOW DOES IT DIFFER?&lt;br /&gt;
# Optimization For Websites&lt;br /&gt;
&lt;br /&gt;
== HTML basics ==&lt;br /&gt;
&lt;br /&gt;
# [http://www.w3.org/wiki/The_basics_of_HTML The basics of HTML], by Mark Norman Francis. { -- THIS LOOKS OK, ALTHOUGH I THINK IT NEEDS A BIT OF UPDATING TO ACCOUNT FOR HTML5, THE HISTORY SECTION, ETC. THE EXAMPLES SHOULD ALSO BE UPDATED TO HTML5 SEMANTICS, WHERE APPROPRIATE, EG NO MORE DIVS FOR PAGE SECTIONS}&lt;br /&gt;
# [http://www.w3.org/wiki/The_HTML_head_element The HTML &amp;amp;lt;head&amp;amp;gt; element], by Christian Heilmann. { -- NEEDS UPDATING, AND HTML5 FEATURES ADDING, SUCH AS META CHARSET} &lt;br /&gt;
# [http://www.w3.org/wiki/Choosing_the_right_doctype_for_your_HTML_documents Choosing the right doctype for your HTML documents], by Roger Johansson. { -- I THINK THAT THIS NEEDS TO BE REWRITTEN TO FOCUS LESS ON DOCTYPES, AND MORE ON HTML/XHTML RULES, HOW THEY DIFFER, WHAT DOCTYPES REALLY ACHIEVED, WHAT ONES YOU MIGHT ENCOUNTER IN THE WILD, WHY WE WILL BE USING HTML5 DOCTYPE IN THIS COURSE, WHAT IT ACHIEVES, ETC.}&lt;br /&gt;
&lt;br /&gt;
== The HTML body ==&lt;br /&gt;
&lt;br /&gt;
{ -- OVERALL THIS IS A REASONABLE SECTION, BUT QUITE A LOT NEEDS ADDING TO BRING IT UP TO DATE WITH HTML5, ETC. I WILL CLEARLY MARK NEW ARTICLES}&lt;br /&gt;
&lt;br /&gt;
# NEW ARTICLE - structural elements, section, article, etc. also including div and span&lt;br /&gt;
# [http://www.w3.org/wiki/Marking_up_textual_content_in_HTML Marking up textual content in HTML], by Mark Norman Francis. { -- NEEDS UPDATING, AS SOME OF THESE ELEMENTS WILL HAVE CHANGED FUNCTION IN HTML5, AND DEPRECATED ELEMENTS HAVE BEEN REPURPOSED}&lt;br /&gt;
# [http://www.w3.org/wiki/HTML_lists HTML Lists], by Ben Buchanan. { -- DOESN'T NEED MANY UPDATES}&lt;br /&gt;
# [http://www.w3.org/wiki/Images_in_HTML Images in HTML], by Christian Heilmann. { -- NEEDS A BIT OF SPIT AND POLISH, AND NEEDS FIGURE AND FIGCAPTION ADDING}&lt;br /&gt;
# [http://www.w3.org/wiki/HTML_links_-_lets_build_a_web HTML links — let's build a web!] by Christian Heilmann. { -- NEEDS SPIT AND POLISH, AND NEEDS THE CONCEPT OF BLOCK LEVEL LINKS ADDING}&lt;br /&gt;
# NEW ARTICLE - HTML5 video and audio&lt;br /&gt;
# [http://www.w3.org/wiki/HTML_tables HTML Tables], by Jen Hanen. { -- NOT MANY UPDATES NEEDED}&lt;br /&gt;
# [http://www.w3.org/wiki/HTML_forms_-_the_basics HTML Forms — the basics], by Jen Hanen. { -- THERE IS A LOT OF NEW HTML5 FORM STUFF TO ADD, OBVIOUSLY - I THINK THAT IN THIS CIRCUMSTANCE, BECAUSE SUPPORT FOR HTML5 FORM STUFF IS PATCHY ACROSS BROWSERS RIGHT NOW, WE SHOULD DO SMALL UPDATES ON THE EXISTING ARTICLE, THEN ADD ONE OR MORE SEPARATE ARTICLES TO COVER THE NEW HTML5 FORM ELEMENTS AND NEW ATTRIBUTES, AND THEN PERHAPS SEPARATE COVERAGE OF VALIDATION}&lt;br /&gt;
# [http://www.w3.org/wiki/Lesser_-_known_semantic_elements Lesser-known semantic elements], by Mark Norman Francis. {THIS WILL NEED UPDATING, AS A NUMBER OF THESE ELEMENTS HAVE BEEN REDEFINED}&lt;br /&gt;
# [http://www.w3.org/wiki/Generic_containers_-_the_div_and_span_elements Generic containers — the div and span elements], by Mark Norman Francis. { -- REMOVE THIS ONE - THIS WILL BE COVERED IN THE STRUCTURAL ELEMENTS ARTICLE}&lt;br /&gt;
# [http://www.w3.org/wiki/Creating_multiple_pages_with_navigation_menus Creating multiple pages with navigation menus], by Christian Heilmann.&lt;br /&gt;
# [http://www.w3.org/wiki/Validating_your_HTML Validating your HTML], by Mark Norman Francis. { -- I THINK THIS COULD BE REWRITTEN AND IMPROVED, AND RELOCATED TO A SECTION ABOUT DEBUGGING WEB PAGES? A MORE COMPLETE TREATMENT WOULD BE NICE}&lt;br /&gt;
&lt;br /&gt;
== Accessibility specifics ==&lt;br /&gt;
&lt;br /&gt;
# [http://www.w3.org/wiki/Accessibility_basics Accessibility basics], by Tom Hughes-Croucher.&lt;br /&gt;
# [http://www.w3.org/wiki/Accessibility_testing Accessibility testing], by Benjamin Hawkes-Lewis.&lt;br /&gt;
&lt;br /&gt;
I THINK THIS NEEDS TO BE EXPANDED OUT TO SEVERAL ARTICLES, TO COVER DIFFERENT ASPECTS, SOMETHING LIKE:&lt;br /&gt;
&lt;br /&gt;
# WRITING A PLAN FOR A11Y TESTING, INCLUDING USE OF REAL USER TESTING, CONFORMANCE CRITERIA, AUTOMATED TOOLS, AND GOOD OLD COMMON SENSE&lt;br /&gt;
# THE LEGAL SIDE OF THINGS, EXPLAINED IN DETAIL&lt;br /&gt;
# DECIPHERING WCAG, AND OTHER CONFORMANCE CRITERIA SUCH AS SECTION 508&lt;br /&gt;
# ACCESSIBILITY TOOLS, WHAT TO USE AND WHAT TO AVOID. HOW FAR WILL THESE GET YOU?&lt;br /&gt;
# REAL A11Y TESTING WITH REAL PEOPLE, HOW TO PUT TOGETHER FOCUS GROUPS, WHAT TO LOOK FOR HERE&lt;br /&gt;
# COMMON SENSE - SOLUTIONS FOR COMMON ACCESSIBILITY ISSUES - A ROADMAP FOR FIXING ISSUES. START WITH SEMANTIC HTML, THEN GO TO VIDEO AND AUDIO CONTENT, JAVASCRIPT, AJAX, ALTERNATIVES. }&lt;br /&gt;
&lt;br /&gt;
== CSS ==&lt;br /&gt;
&lt;br /&gt;
# [http://dev.opera.com/articles/view/27-css-basics/ CSS basics], by Christian Heilmann. { -- NEEDS A BIT OF SPRUCING UP, TO TALK ABOUT NEW STUFF, PLUS WE NEED TO ADD SOME STUFF ABOUT ALL THE NEW CSS SELECTORS. OF DO WE? MAYBE WE COULD JUST COVER THE BASIC SELECTORS HERE, AND THEN COVER SOME OF THE MORE ADVANCED ONES IN APPROPRIATE PLACES, EG FORM RELATED ONES, AND OTHER ADVANCED ONES IN AN ARTICLE OF THEIR OWN - SEE NEXT ARTICLE}&lt;br /&gt;
# NEW ARTICLE - ADVANCED SELECTORS - cover all the advanced selectors that we didn't cover in the previous chapter - last nth of type, valid, invalid, nth child, etc. &lt;br /&gt;
# NEW CHAPTER - CSS3 SHADOWS&lt;br /&gt;
# [http://www.w3.org/wiki/Inheritance_and_cascade Inheritance and Cascade], by Tommy Olsson. { -- NOT MUCH TO UPDATE HERE}&lt;br /&gt;
# [http://www.w3.org/wiki/Text_styling_with_CSS Text styling with CSS], by Ben Henick. { -- THIS IS A VERY WEIGHTY CHAPTER, AND COULD DO WITH SLIMMING DOWN A BIT, AND MAKING MORE GRANULAR, PERHAPS EVEN SPLITTING IT. ALSO ADD WEB FONTS, AND TALK ABOUT SOME OF THE MORE OBSCURE TEXT STYLING STUFF, LIKE TEXT-OVERFLOW, GENERATED CONTENT FOR QUOTES, WORD WRAP, ETC.}&lt;br /&gt;
# [http://www.w3.org/wiki/The_CSS_layout_model_-_boxes_borders_margins_padding The CSS layout model - boxes, borders, margins, padding], by Ben Henick. { -- AGAIN, MIGHT NEED SPLITTING, NEED TO COVER DIFFERENT LAYOUT MODELS, BORDER-RADIUS ETC.}&lt;br /&gt;
# [http://www.w3.org/wiki/CSS_background_images CSS background images], by Nicole Sullivan. { -- NEED TO UPDATE TO COVER MULTIPLE BACKGROUND IMAGES, BORDER-IMAGE, LINEAR GRADIENTS, RADIAL GRADIENTS MIGHT NEED MULTIPLE CHAPTERS}&lt;br /&gt;
# [http://www.w3.org/wiki/Styling_lists_and_links Styling lists and links], by Ben Buchanan. { -- DOESN'T NEED THAT MUCH }&lt;br /&gt;
# [http://www.w3.org/wiki/Styling_tables Styling tables], by Ben Buchanan. { -- DOESN'T NEED THAT MUCH }&lt;br /&gt;
# [http://www.w3.org/wiki/Styling_forms Styling forms], by Ben Henick. { -- NEED TO ADD CSS3 FORM-RELATED PSEUDO CLASSES, AND DISCUSSION OF STYLING ERRORS AND STUFF}&lt;br /&gt;
# [http://www.w3.org/wiki/Floats_and_clearing Floats and clearing], by Tommy Olsson. { - NOT THAT MUCH NEEDED, ALTHOUGH I NEED TO BE CAREFUL TO SEPARATE OUT MULTIPLE COLUMN LAYOUTS, AND COVER MULTI-COL THERE}&lt;br /&gt;
# [http://www.w3.org/wiki/CSS_static_and_relative_positioning CSS static and relative positioning], by Tommy Olsson.&lt;br /&gt;
# [http://www.w3.org/wiki/CSS_absolute_and_fixed_positioning CSS absolute and fixed positioning], by Tommy Olsson. { -- THE POSITIONING CHAPTERS NEED SOME WORK, BUT NOT THAT MUCH}&lt;br /&gt;
# [http://www.w3.org/wiki/CSS3_2D_Transforms CSS3 2D Transforms], by Alexander Futekov { -- NEW CHAPTER}&lt;br /&gt;
# NEW CHAPTER - CSS3 3D TRANSFORMS&lt;br /&gt;
# NEW CHAPTER - CSS3 TRANSITIONS&lt;br /&gt;
# NEW CHAPTER - CSS3 ANIMATIONS&lt;br /&gt;
# NEW CHAPTER - MEDIA QUERIES&lt;br /&gt;
# NEW CHAPTER - VIEWPORT&lt;br /&gt;
# NEW CHAPTER - CREATING AN ADAPTIVE DESIGN, USING MEDIA QUERIES, VIEWPORT, MULTI-COL, ETC.&lt;br /&gt;
# NEW CHAPTER - OBJECT FIT/OBJECT POSITION&lt;br /&gt;
# NEW CHAPTER - OPTIMIZING CSS (INCLUDE IDEAS FOR OPTIMIZING FOR MOBILE  ETC.)&lt;br /&gt;
&lt;br /&gt;
== Advanced CSS study ==&lt;br /&gt;
&lt;br /&gt;
# [http://www.w3.org/wiki/Headers_footers_columns_and_templates Headers, footers, columns, and templates], by Ben Henick { -- NOT SURE HOW USEFUL THIS IS, MAYBE DISSECT IT, PUT THE USEFUL STUFF IN OTHER CHAPTERS. A BIT TOO LONG WINDED. }&lt;br /&gt;
&lt;br /&gt;
== JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Proposed topics, there is still much that can be added here. Wanted to get the initial posted and will continue to add/update.&lt;br /&gt;
&lt;br /&gt;
# [[A_Short_History_of_JavaScript]]&lt;br /&gt;
# Variables&lt;br /&gt;
## Defining variables&lt;br /&gt;
## Variable scope&lt;br /&gt;
## Don’t pollute the global object&lt;br /&gt;
## The single var ‘pattern’&lt;br /&gt;
# Basic operations&lt;br /&gt;
## JavaScript data types&lt;br /&gt;
### Floats and Integers&lt;br /&gt;
### Booleans&lt;br /&gt;
### Strings&lt;br /&gt;
### Arrays&lt;br /&gt;
### Objects&lt;br /&gt;
## Operators&lt;br /&gt;
## Conditions&lt;br /&gt;
## Loops&lt;br /&gt;
# Functions&lt;br /&gt;
## Declaring functions&lt;br /&gt;
## Functions as Objects&lt;br /&gt;
## Anonymous functions&lt;br /&gt;
## Recursion&lt;br /&gt;
## Context&lt;br /&gt;
## The callback pattern&lt;br /&gt;
# Animation&lt;br /&gt;
## Animation loops with setInterval&lt;br /&gt;
## Other...&lt;br /&gt;
## could use some of [http://www.w3.org/wiki/JavaScript_animation JavaScript animation], by Stuart Langridge&lt;br /&gt;
# [http://www.w3.org/wiki/Objects_in_JavaScript Objects in JavaScript], by Mike West&lt;br /&gt;
# [http://www.w3.org/wiki/Traversing_the_DOM Traversing the DOM], by Mike West&lt;br /&gt;
# [http://www.w3.org/wiki/Creating_and_modifying_HTML Creating and modifying HTML], by Stuart Langridge&lt;br /&gt;
# [http://www.w3.org/wiki/Dynamic_style_-_manipulating_CSS_with_JavaScript Dynamic style - manipulating CSS with JavaScript], by Greg Schechter&lt;br /&gt;
# [http://www.w3.org/wiki/Handling_events_with_JavaScript Handling events with JavaScript], by Robert Nyman&lt;br /&gt;
## Probably needs expanding&lt;br /&gt;
# User interaction&lt;br /&gt;
## Clicking buttons&lt;br /&gt;
## Interacting with mouse movements&lt;br /&gt;
## Keyboard controls&lt;br /&gt;
## touch events/gestures&lt;br /&gt;
# Tool Chest&lt;br /&gt;
## Testing and Debugging&lt;br /&gt;
### Tools for testing and debugging&lt;br /&gt;
### Unit testing with QUnit&lt;br /&gt;
### Cross browser JavaScript (Ouch ;))&lt;br /&gt;
## Code Quality&lt;br /&gt;
### JSLint and JSHint&lt;br /&gt;
## Production ready&lt;br /&gt;
### Google Closure Compiler&lt;br /&gt;
# Closures&lt;br /&gt;
# JavaScript Libraries&lt;br /&gt;
## jQuery&lt;br /&gt;
## jQuery UI&lt;br /&gt;
## Modernizr&lt;br /&gt;
## Yepnope&lt;br /&gt;
# JavaScript Polyfils&lt;br /&gt;
## When to use and when not to&lt;br /&gt;
# JavaScript on the Server&lt;br /&gt;
## Nodejs - There is a lot to discuss here, we can break this down as we progress&lt;br /&gt;
# JavaScript for Mobile&lt;br /&gt;
## The frameworks&lt;br /&gt;
## Considerations for mobile JavaScript (This can have many ‘subdivisions’)&lt;br /&gt;
## Best practices when writing for mobile&lt;br /&gt;
# JavaScript Gotcha’s&lt;br /&gt;
## Why eval() is evil&lt;br /&gt;
## Use === not ==&lt;br /&gt;
## Don’t forget the ;&lt;br /&gt;
## The problem with using typeof for testing for null&lt;br /&gt;
## Avoid built in Object wrappers for primitives (This of course is for the most part)&lt;br /&gt;
# APIs&lt;br /&gt;
## The basics of using an API&lt;br /&gt;
##HTML5 APIs&lt;br /&gt;
### MEDIA API&lt;br /&gt;
### GEOLOCATION (YEAH, NOT HTML5, BUT HEY)&lt;br /&gt;
### WEB WORKERS&lt;br /&gt;
### WEB SOCKETS&lt;br /&gt;
### APPCACHE&lt;br /&gt;
### WEBSQL/INDEXEDDB&lt;br /&gt;
### WEB STORAGE&lt;br /&gt;
### CANVAS (SHOULD PROBABLY HAVE ITS OWN SECTION ENTIRELY)&lt;br /&gt;
### HTML5 HISTORY API&lt;br /&gt;
### DATASETS&lt;br /&gt;
## Popular 3rd party APIs&lt;br /&gt;
### Google Maps&lt;br /&gt;
### Twitter&lt;br /&gt;
### Flickr&lt;br /&gt;
# ECMAScript 5&lt;br /&gt;
## Browser support&lt;br /&gt;
## Cover additions...&lt;br /&gt;
&lt;br /&gt;
What we have so far:&lt;br /&gt;
&lt;br /&gt;
# [http://www.w3.org/wiki/Programming_-_the_real_basics Programming - the real basics!], by Christian Heilmann&lt;br /&gt;
# [http://www.w3.org/wiki/What_can_you_do_with_JavaScript What can you do with JavaScript?], by Christian Heilmann&lt;br /&gt;
# [http://www.w3.org/wiki/Your_first_look_at_JavaScript Your first look at JavaScript], by Christian Heilmann&lt;br /&gt;
# [http://www.w3.org/wiki/JavaScript_best_practices JavaScript best practices], by Christian Heilmann&lt;br /&gt;
# [http://www.w3.org/wiki/The_principles_of_unobtrusive_JavaScript The principles of unobtrusive JavaScript], by PPK&lt;br /&gt;
# [http://www.w3.org/wiki/JavaScript_functions JavaScript functions], by Mike West&lt;br /&gt;
# [http://www.w3.org/wiki/Objects_in_JavaScript Objects in JavaScript], by Mike West&lt;br /&gt;
# [http://www.w3.org/wiki/Traversing_the_DOM Traversing the DOM], by Mike West&lt;br /&gt;
# [http://www.w3.org/wiki/Creating_and_modifying_HTML Creating and modifying HTML], by Stuart Langridge&lt;br /&gt;
# [http://www.w3.org/wiki/Dynamic_style_-_manipulating_CSS_with_JavaScript Dynamic style - manipulating CSS with JavaScript], by Greg Schechter&lt;br /&gt;
# [http://www.w3.org/wiki/Handling_events_with_JavaScript Handling events with JavaScript], by Robert Nyman&lt;br /&gt;
# [http://www.w3.org/wiki/JavaScript_animation JavaScript animation], by Stuart Langridge&lt;br /&gt;
# [http://www.w3.org/wiki/Graceful_degredation_versus_progressive_enhancement Graceful degredation versus progressive enhancement], by Christian Heilmann&lt;br /&gt;
# NEW CHAPTER - OPTIMIZING JAVASCRIPT (INCLUDE IDEAS FOR OPTIMIZING FOR MOBILE  ETC.)&lt;br /&gt;
# NEW CHAPTER - TOUCH EVENTS. THESE DEFINITELY NEED COVERAGE, AS THEY ARE GETTING VERY BIG THESE DAYS. TOUCH DEVICES ARE IMPORTANT.&lt;br /&gt;
&lt;br /&gt;
== OTHER THINGS TO COVER ==&lt;br /&gt;
&lt;br /&gt;
# SVG (REALLY NEEDS ITS OWN COURSE, See the following proposal)&lt;br /&gt;
# WAI-ARIA&lt;br /&gt;
&lt;br /&gt;
=== SVG ===&lt;br /&gt;
&lt;br /&gt;
Source of inspiration :&lt;br /&gt;
&lt;br /&gt;
* http://www.w3.org/Graphics/SVG/IG/resources/svgprimer.html&lt;br /&gt;
* https://developer.mozilla.org/en/SVG/Tutorial&lt;br /&gt;
&lt;br /&gt;
==== SVG BASICS ====&lt;br /&gt;
&lt;br /&gt;
# ''History and usage'' : As for HTML, it could be good to start by giving some context: What is it, Where does it come, What is it made for, How is it different than HTML?&lt;br /&gt;
# ''Syntax and deployment'' : This part would introduce the basic syntax, the concept of viewport and absolute positioning and finally how to embed an SVG document inside other language (basically HTML and CSS)&lt;br /&gt;
# ''Basic shapes'' : This part will be dedicated to the basic shapes available in SVG&lt;br /&gt;
# ''Position and transformation'' : To go deeper inside the viewport thing and to explain the role of the transformations.&lt;br /&gt;
# ''Using text in SVG''&lt;br /&gt;
# ''Styling SVG'' : This is where we would detailed how to use presentation attributes and their CSS counterpart.&lt;br /&gt;
# ''Scripting SVG'' : Where we could introduce the SVG DOM API.&lt;br /&gt;
&lt;br /&gt;
==== Part 2 : SVG ADVANCED ====&lt;br /&gt;
&lt;br /&gt;
# ''How to build Pathes'' : To dig into the syntax of the d attribute on path elements&lt;br /&gt;
# ''Animating the web with SVG Animations'' : How to use SVG Animations&lt;br /&gt;
# ''SVG Filters'' : This would be an introduction to filters but each filters could have it's own article (Filters a really hard things)&lt;br /&gt;
# ''Clipping and Masking''&lt;br /&gt;
# ''Patterns''&lt;br /&gt;
# ''Gradients''&lt;br /&gt;
# ''Dealing with the external'' : This part would be dedicated to the foreignObject element but also to links and images elements.&lt;br /&gt;
&lt;br /&gt;
=== SVG article drafts we could use ===&lt;br /&gt;
&lt;br /&gt;
# [http://www.w3.org/wiki/SVG_Primer SVG Primer] (written by David Storey, but unused)&lt;br /&gt;
# [http://www.w3.org/wiki/SVG_Links SVG Links] (written by David Storey, but unused)&lt;br /&gt;
&lt;br /&gt;
== Adaptive design and development for Mobile and other alternative browsing devices  ==&lt;br /&gt;
&lt;br /&gt;
PROPOSED STRUCTURE&lt;br /&gt;
&lt;br /&gt;
# [[Mobile beginnings: An introduction to the mobile web]] (include history of mobiles, how mobile networks work, what the hardware looks like, what the software looks like)&lt;br /&gt;
# [[What do the devices look like?]] (a fairly detailed reference showing the types of devices you are likely to need to support when building cross device adaptive apps. Include data such as screen resolution, espect ratio and dpi of the different devices. This kid of reference material will be very useful to developers.)&lt;br /&gt;
# [[Mobile constraints and advantages]] (what are the specific constraints you need to work around for mobile and alternative browsing devices? What are the advantages, eg the context specific technologies you can take advantage of?)&lt;br /&gt;
# [[Mobile friendly: web design and development Overview]] (start with a basis of semantic HTML, accessibility best practices are Making an app or site mobile friendly - do you create a different site, or do you adapt your existing site for mobile? A brief introduction to Adaptive design - graceful degradation, progressive enhancement, using media queries and viewport to adapt layout, using feature detection to server appropriate content and services, geolocation, multimedia, offline apps, don't use browser sniffing!) A lot of this will be covered elsewhere.&lt;br /&gt;
# Feature detection, polyfilling, graceful degredation, etc. An article on this would be good, maybe something which showed how to detect for all different features. Kind of like Mark Pilgrims' No bullshit guide to detecting everything. Before he took it all down.&lt;br /&gt;
# MOBILE/DEVICE TESTING&lt;br /&gt;
&lt;br /&gt;
OTHER THINGS TO ADD ELSEWHERE IN THE MATERIAL&lt;br /&gt;
&lt;br /&gt;
# WE SHOULD WRITE AN ARTICLE TITLED &amp;quot;ONE WEB, MANY DEVICES&amp;quot;, PLACED INSIDE http://www.w3.org/wiki/Web_Standards_Curriculum#Introduction_to_the_world_of_web_standards&lt;br /&gt;
# WE SHOULD ALSO SAY SOMETHING ABOUT SEMANTICS AND DIVERSE DEVICES IN http://www.w3.org/wiki/The_web_standards_model_-_HTML_CSS_and_JavaScript&lt;br /&gt;
&lt;br /&gt;
== Supplementary articles ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/wiki/Getting_your_content_online Getting your content online], by Craig Grannell. { -- DOESN'T NEED CHANGES }&lt;br /&gt;
* [http://www.w3.org/wiki/More_about_the_document_head More about the document &amp;amp;lt;head&amp;amp;gt;], by Chris Heilmann. { -- PROBABLY DOESN'T NEED CHANGES, ALTHOUGH IT WOULD BE NICE TO MOVE IT INTO THE MAIN HTML SECTION, AS IT GETS LOST OUT HERE }&lt;br /&gt;
* [http://www.w3.org/wiki/Common_HTML_entities_used_for_typography Common HTML entities used for typography], by Ben Henick. { -- DOESN'T NEED MANY CHANGES }&lt;br /&gt;
* [http://www.w3.org/wiki/The_web_standards_curriculum_glossary The Opera Web Standards Curriculum glossary], by various authors. This is incomplete, and will be added to as time goes by. { -- NEEDS A LOT OF TERMS ADDING, IF IT IS TO BE USEFUL }&lt;br /&gt;
&lt;br /&gt;
== Deprecated articles: removed from original WSC ==&lt;br /&gt;
&lt;br /&gt;
* [[Choosing the right doctype for your HTML documents]]. [http://dev.opera.com/articles/view/14-megfelelo-doctype-valasztasa/ Hungarian translation] | [http://dev.opera.com/articles/view/14-choosing-the-right-doctype-for-your-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/m3/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m3/ud3/index.html Spanish translation]&lt;br /&gt;
* [[Generic containers - the div and span elements]]. [http://dev.opera.com/articles/view/22-altalanos-tarolok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud8/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud8/index.html Spanish translation]&lt;br /&gt;
* [[Text styling with CSS]]. [http://mosaic.uoc.edu/ac/le/ca/m6/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud3/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:WSC]]&lt;/div&gt;</description>
			<pubDate>Tue, 26 Jun 2012 10:08:30 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:WSC_proposed_updates</comments>		</item>
		<item>
			<title>Main Page</title>
			<link>http://www.w3.org/community/webed/wiki/Main_Page</link>
			<description>&lt;p&gt;Cmills:&amp;#32;/* JavaScript core skills */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Web Education Community Group Wiki! This page contains resources to help you teach or learn modern web development:&lt;br /&gt;
&lt;br /&gt;
* The first section — [http://www.w3.org/community/webed/wiki/Main_Page#Web_Standards_Curriculum_table_of_contents The web standards curriculum] — is a series of tutorial articles covering web design and development high level concepts, and essential technologies such as HTML, CSS and JavaScript. This is ideal for beginners wanting to learn the art of web design, or teachers looking for accurate material to use as the basis of teaching material.&lt;br /&gt;
* The second section — [http://www.w3.org/community/webed/wiki/Main_Page#References References] — is designed for looking up HTML and CSS language features.&lt;br /&gt;
* The third section — [http://www.w3.org/community/webed/wiki/Main_Page#Curriculum_structures Curriculum structures] — is a complete set of web design-related curricula for teachers to use to put together courses, which includes sample assignments, example questions, reading lists, assessment criteria, and more.&lt;br /&gt;
&lt;br /&gt;
Note: This is not a finalised site, but a development site for our material — it will be placed on a dedicated publishing platform in coming months, and a lot more material will be added. If you would like to contribute, please join the [http://www.w3.org/community/webed/ Web Education Community Group]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Web Standards Curriculum table of contents =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
What follows is a list of all the articles within the web standards curriculum, which will give you an essential grounding in Hypertext Markup Language (HTML), Cascading Stylesheets (CSS), JavaScript, accessibility, and the other topics you need to be a modern web developer/designer. Reading them in order makes the most sense, but they are written to work individually, so you can dip in and out as it suits you, if you need to hone individual skills.&lt;br /&gt;
&lt;br /&gt;
Note: This material was originally published as part of the Opera Web Standards Curriculum, available as [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur/#toc Introductory material], written by Chris Mills. Like the original, it is published under the [http://creativecommons.org/licenses/by-nc-sa/2.5/ Creative Commons Attribution, Non Commercial - Share Alike 2.5] license.&lt;br /&gt;
&lt;br /&gt;
Note #2: Many of the links below currently point to the [http://dev.opera.com dev.opera] versions, but we'll change these over to the W3C versions as we add more to the site. We are very happy to add these to the W3C pages, for a wider readership and more maintenance help.&lt;br /&gt;
&lt;br /&gt;
== The beginning ==&lt;br /&gt;
&lt;br /&gt;
[[Introduction to the Web Standards Curriculum]]&lt;br /&gt;
* [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-he/ Hebrew translation] | [http://dev.opera.com/articles/view/1-bevezeto-a-webes-szabvanyokba/ Hungarian translation] | [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-it/ Italian translation] | [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/ Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/ Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Introduction to the world of web standards ==&lt;br /&gt;
&lt;br /&gt;
# [[The history of the Web|The history of the Internet and the web, and the evolution of web standards]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-he/ Hebrew translation] | [http://dev.opera.com/articles/view/2-az-internet-es-a-web-tortenete/ Hungarian translation] | [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-it/ Italian translation] | [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/m1/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud1/index.html Spanish translation]&lt;br /&gt;
# [[How does the Internet work]]?&lt;br /&gt;
#* [http://dev.opera.com/articles/view/3-hogyan-mukodik-az-internet/ Hungarian translation] | [http://dev.opera.com/articles/view/3-how-does-the-internet-work-ja/ Japanese translation]| [http://mosaic.uoc.edu/ac/le/ca/m1/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud2/index.html Spanish translation]&lt;br /&gt;
# [[The web standards model - HTML CSS and JavaScript]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/4-a-webes-szabvanyok-modellje/ Hungarian translation] | [http://dev.opera.com/articles/view/4-the-web-standards-model-html-css-a-ja/ Japanese translation]| [http://mosaic.uoc.edu/ac/le/ca/m1/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/ca/m1/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud3/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Web Design Concepts ==&lt;br /&gt;
&lt;br /&gt;
This section won't go into any code or markup details, and will act as an introduction to the design process before you start to create any graphics or code, as well as concepts of web design such as IA, navigation, usability etc.&lt;br /&gt;
&lt;br /&gt;
# [[Information_Architecture_-_planning_out_a_web_site|Information Architecture - planning out a web site]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/6-informacios-architektura-egy-website-t/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud1/index.html Spanish translation]&lt;br /&gt;
# [[What_does_a_good_web_page_need|What does a good web page need?]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/7-mi-kell-egy-jo-weblaphoz/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud2/index.html Spanish translation]&lt;br /&gt;
# [[Colour_theory|Colour Theory]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/8-a-szinek-elmelete/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud3/index.html Spanish translation]&lt;br /&gt;
# [[Building up a site wireframe]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/9-egy-site-keretenek-felepitese/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud4/index.html Spanish translation] &lt;br /&gt;
# [[Colour schemes and design mockups]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/10-szinsemak-es-designtervek/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud5/index.html Spanish translation]&lt;br /&gt;
# [[Typography on the Web]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/11-tipografia-a-weben/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud6/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== HTML beginnings ==&lt;br /&gt;
&lt;br /&gt;
# [[The basics of HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/12-a-html-alapjai/ Hungarian translation] | [http://dev.opera.com/articles/view/12-the-basics-of-html-ja/ Japanese translation]&lt;br /&gt;
# [[Doctypes and markup styles]]&lt;br /&gt;
# [[The_HTML_head_element|The HTML &amp;amp;lt;head&amp;amp;gt; element]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/13-a-html-head-eleme/ Hungarian translation] | [http://dev.opera.com/articles/view/13-the-html-head-element-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/m3/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m3/ud1/index.html Spanish translation]&lt;br /&gt;
# [[More_about_the_document_head|More about the document &amp;amp;lt;head&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
== The HTML body ==&lt;br /&gt;
&lt;br /&gt;
# [[Marking up textual content in HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/15-szoveges-reszek-megjelolese/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud1/index.html Spanish translation]&lt;br /&gt;
# [[HTML lists|HTML Lists]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/16-html-listak/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud2/index.html Spanish translation]&lt;br /&gt;
# [[Images in HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/17-kepek-a-htmlben/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud3/index.html Spanish translation]&lt;br /&gt;
# [[HTML_links_-_lets_build_a_web|HTML links — let's build a web!]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/18-html-hivatkozasok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud4/index.html Spanish translation]&lt;br /&gt;
# [[HTML tables]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/19-html-tablazatok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud5/index.html Spanish translation]&lt;br /&gt;
# [[HTML forms - the basics]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/20-html-urlapok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud6/index.html Spanish translation]&lt;br /&gt;
# [[HTML5 form additions]]&lt;br /&gt;
# [[HTML structural elements]]&lt;br /&gt;
# [[Lesser - known semantic elements]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/21-kevesse-ismert/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud7/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud7/index.html Spanish translation]&lt;br /&gt;
# [[Creating multiple pages with navigation menus]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m4/ud9/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud9/index.html Spanish translation]&lt;br /&gt;
# [[Validating your HTML]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m4/ud10/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud10/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Accessibility ==&lt;br /&gt;
&lt;br /&gt;
# [[Accessibility basics]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m5/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m5/ud1/index.html Spanish translation]&lt;br /&gt;
# [[Accessibility testing]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m5/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m5/ud2/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== CSS ==&lt;br /&gt;
&lt;br /&gt;
# [[CSS_basics|CSS basics]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud1/index.html Spanish translation]&lt;br /&gt;
# [[Advanced CSS selectors]]&lt;br /&gt;
# [[Inheritance and cascade]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud2/index.html Spanish translation]&lt;br /&gt;
# [[CSS text styling part 1]]&lt;br /&gt;
# [[The_CSS_layout_model_-_boxes_borders_margins_padding|The CSS layout model - boxes, borders, margins, padding]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud4/index.html Spanish translation]&lt;br /&gt;
# [[CSS background images]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud5/index.html Spanish translation]&lt;br /&gt;
# [[Styling_lists_and_links|Styling lists and links]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud6/index.html Spanish translation]&lt;br /&gt;
# [[Styling tables]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud7/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud7/index.html Spanish translation]&lt;br /&gt;
# [[Styling forms]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud8/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud8/index.html Spanish translation]&lt;br /&gt;
# [[Floats and clearing]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud9/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud9/index.html Spanish translation]&lt;br /&gt;
# [[CSS static and relative positioning]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud10/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud10/index.html Spanish translation]&lt;br /&gt;
# [[CSS absolute and fixed positioning]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud11/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud11/index.html | Spanish translation]&lt;br /&gt;
# [[Debugging CSS]]&lt;br /&gt;
# [[CSS shorthand reference]]&lt;br /&gt;
&lt;br /&gt;
== Advanced CSS study ==&lt;br /&gt;
&lt;br /&gt;
# [[Headers_footers_columns_and_templates|Headers, footers, columns, and templates]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m7/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m7/ud1/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== JavaScript core skills ==&lt;br /&gt;
&lt;br /&gt;
# [[A_Short_History_of_JavaScript]]&lt;br /&gt;
# [[Programming_-_the_real_basics|Programming - the real basics!]]&lt;br /&gt;
# [[What can you do with JavaScript]]&lt;br /&gt;
# [[Your first look at JavaScript]]&lt;br /&gt;
# [[JavaScript best practices]]&lt;br /&gt;
# [[The principles of unobtrusive JavaScript]]&lt;br /&gt;
# [[JavaScript functions]]&lt;br /&gt;
# [[Objects in JavaScript]]&lt;br /&gt;
# [[Traversing the DOM]]&lt;br /&gt;
# [[Creating and modifying HTML]]&lt;br /&gt;
# [[Dynamic style - manipulating CSS with JavaScript]]&lt;br /&gt;
# [[Handling events with JavaScript]]&lt;br /&gt;
# [[JavaScript animation]]&lt;br /&gt;
# [[Graceful degredation versus progressive enhancement]]&lt;br /&gt;
&lt;br /&gt;
== Mobile web development ==&lt;br /&gt;
&lt;br /&gt;
# [[Introduction_to_mobile_web|Mobile 1: Introduction to mobile web]]&lt;br /&gt;
&lt;br /&gt;
== Supplementary articles ==&lt;br /&gt;
&lt;br /&gt;
* [[Getting your content online]]&lt;br /&gt;
* [[Common HTML entities used for typography]]&lt;br /&gt;
* [[The web standards curriculum glossary]]&lt;br /&gt;
* [[Optimizing content for different browsers: the RIGHT way]]&lt;br /&gt;
&lt;br /&gt;
== Proposed Updates and Additions to Web Standards Curriculum ==&lt;br /&gt;
&lt;br /&gt;
* [[WSC_proposed_updates|Web standards curriculum on W3C Wiki: plan for updates 2011]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:WSC]]&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
&lt;br /&gt;
* [[HTML]]&lt;br /&gt;
* [[CSS]]&lt;br /&gt;
&lt;br /&gt;
= Curriculum structures =&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact_Curriculum Overview of InterACT curriculum articles]&lt;br /&gt;
&lt;br /&gt;
== Basics and &amp;quot;soft&amp;quot; skills ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Internet_Fundamentals Internet Fundamentals]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Digital_Design_Production Digital Design Production]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Writing_for_the_Web Writing for the Web]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Project_Management Project Management]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Professional_Development Professional Development]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Independent_Study Independent Study]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Internship Internship]&lt;br /&gt;
&lt;br /&gt;
== Web design ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Web_Design_1 Web Design 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Web_Design_2 Web Design 2]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Accessibility Accessibility]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Usability_1 Usability 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Findability Findability]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Interaction_Design_1 Interaction Design 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Prototyping Prototyping]&lt;br /&gt;
&lt;br /&gt;
== Web development ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/DOM_Scripting_1 DOM Scripting 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Server-Side_Scripting_1 Server-side Scripting 1]&lt;br /&gt;
&lt;br /&gt;
= Teaching materials =&lt;br /&gt;
&lt;br /&gt;
Each page in this section includes teaching notes, examples, slidedecks and other materials for teachers to use for hands-on teaching of the curriculum structures outlined in the [[#Curriculum_structures|Curriculum structures]] section.&lt;br /&gt;
&lt;br /&gt;
* [[HTML Basics and Web Standards Concepts teaching materials]] (learning competency included in [http://www.w3.org/community/webed/wiki/Interact/Web_Design_1 Web Design 1])&lt;br /&gt;
&lt;br /&gt;
= Project activities =&lt;br /&gt;
&lt;br /&gt;
This section houses a record of all activities being undertaken in past, present or future by the Web Education Community Group, split into projects.&lt;br /&gt;
&lt;br /&gt;
IMPORTANT: Please don't pollute these pages with random stuff - if you just want to doodle or record random thoughts, put it in the [[ Ideas Playground ]].&lt;br /&gt;
&lt;br /&gt;
* [[Learning material]]&lt;br /&gt;
* [[Curriculum]]&lt;br /&gt;
* [[Outreach]]&lt;br /&gt;
* [[Training and certification]]&lt;br /&gt;
* [[Membership and policy]]&lt;br /&gt;
* International projects&lt;br /&gt;
** [[Croatian international project]]&lt;br /&gt;
** [[French international project]]&lt;br /&gt;
** [[Japanese international project]]&lt;br /&gt;
** [[fa/|Persian language international project]]&lt;br /&gt;
** [[Es/|Spanish international project]]&lt;br /&gt;
** [[Turkish international project]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other available resources are as follows:&lt;br /&gt;
&lt;br /&gt;
* [[ WEST | Web Education Supplementary Toolkit ]]&lt;br /&gt;
* [[ Web Education community group style guide ]]&lt;br /&gt;
* [[How to write an article]]&lt;br /&gt;
* [[How to review an article]]&lt;/div&gt;</description>
			<pubDate>Tue, 26 Jun 2012 10:07:48 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Main_Page</comments>		</item>
		<item>
			<title>A Short History of JavaScript</title>
			<link>http://www.w3.org/community/webed/wiki/A_Short_History_of_JavaScript</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;JavaScript, not to be confused with [http://en.wikipedia.org/wiki/Java_(programming_language) Java], was created in 10 days in May 1995, by [http://en.wikipedia.org/wiki/Brendan_Eich Brendan Eich], then working at [http://en.wikipedia.org/wiki/Netscape Netscape], now of [http://www.mozilla.com Mozilla]. JavaScript was not always known as JavaScript though: the original name was Mocha, a name chosen by [http://en.wikipedia.org/wiki/Marc_Andreessen Marc Andreessen], founder of Netscape. In September of 1995, however, the name was changed to LiveScript but, then in December of the same year, upon receiving a trademark license from Sun, the name JavaScript was adopted. This was somewhat of a marketing move at the time, with Java being very popular around then. &lt;br /&gt;
&lt;br /&gt;
In 1996 - 1997 JavaScript was taken to [http://en.wikipedia.org/wiki/Ecma_International ECMA] to carve out a standard specification, which other browser vendors could then implement based on the work done at Netscape. The work done over this period of time eventually led to the official release of ECMA-262 Ed.1: ECMAScript is the name of the official standard, with JavaScript being the most well known of the implementations. ActionScript 3 is another well-known implementation of ECMAScript.&lt;br /&gt;
&lt;br /&gt;
The standards process continued in cycles, with releases of ECMAScript 2 in 1998 and  ECMAScript 3 in 1999, which is the baseline for modern day JavaScript. At this point however things stalled and went into limbo. The various parties involved split into two separate groups, much in the same fashion as what happened at the [http://en.wikipedia.org/wiki/W3C W3C] around HTML and the formation of the [http://en.wikipedia.org/wiki/WHAT-WG WHATWG]. (CHRIS - I THINK THIS BIT NEEDS EXPANDING ON. SAY WHO THE SEPARATE GROUPS WERE. WHY DID THEY DISAGREE? WHAT DID EACH SIDE WANT? I ALSO THINK IT IS WORTH DELETING THE REFERENCE TO THE HTML5/WHATWG SPLIT. IT ISN'T REALLY VERY HELPFUL, UNLESS YOU KNOW THE STORY THERE.)&lt;br /&gt;
&lt;br /&gt;
The next major event was in 2005, when [http://en.wikipedia.org/wiki/Jesse_James_Garrett Jesse James Garrett] coined the term Ajax, used to describe technologies used to create web applications where data can be loaded in the background, avoiding the need for full page reloads, and resulting in more dynamic applications. This resulted in a renaissance period of JavaScript usage, an evolution not so much being spearheaded by ECMA but much more so by open source libraries and the communities that formed around them. This period saw the release of JavaScript libraries such as [http://www.prototypejs.org/ Prototype], [http://jquery.com/ jQuery], [http://www.dojofoundation.org/projects/dojo Dojo] and [http://mootools.net/ Mootools] among others.&lt;br /&gt;
&lt;br /&gt;
In 2008 the disparate parties on either side of the split came together in Oslo in an effort to take up the standards process again and drive the language forward using an agenda that is known as [http://wiki.ecmascript.org/doku.php?id=harmony:harmony Harmony].&lt;br /&gt;
&lt;br /&gt;
All of this then brings us to today, with JavaScript entering a completely new and exciting cycle of evolution, innovation and standardisation, with new developments such as the [http://nodejs.org/ Nodejs] platform, allowing us to use JavaScript on the server-side; HTML5 APIs to control user media, open up web sockets for always-on communication, get data on geographical location and device features such as accelerometer, and more. It is an exciting time to learn JavaScript.&lt;/div&gt;</description>
			<pubDate>Tue, 26 Jun 2012 09:35:30 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:A_Short_History_of_JavaScript</comments>		</item>
		<item>
			<title>A Short History of JavaScript</title>
			<link>http://www.w3.org/community/webed/wiki/A_Short_History_of_JavaScript</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;JavaScript, not to be confused with [http://en.wikipedia.org/wiki/Java_(programming_language) Java], was created in 10 days in May of 1995 by [http://en.wikipedia.org/wiki/Brendan_Eich Brendan Eich] at [http://en.wikipedia.org/wiki/Netscape Netscape]. JavaScript was not always known as JavaScript though, and was initially known as Mocha, a name chosen by [http://en.wikipedia.org/wiki/Marc_Andreessen Marc Andreessen], founder of Netscape.&lt;br /&gt;
&lt;br /&gt;
In September of 1995 the name was changed to LiveScript but, in December of the same year, upon receiving a trademark license from Sun, the name JavaScript was adopted and stayed.&lt;br /&gt;
&lt;br /&gt;
In 1996 - 1997 JavaScript was taken to [http://en.wikipedia.org/wiki/Ecma_International ECMA] to carve out a standard which other browser vendors could then implement based on the work done at Netscape. The work done over this period of time eventually led to the official release of ECMA-262 Ed.1. The name of the official standard of the language is called ECMAScript with JavaScript being the most well known of the implementations.&lt;br /&gt;
&lt;br /&gt;
The standards process continued in cycles with releases of ECMAScript 2 and in 1999  ECMAScript 3, which is then the baseline for modern day JavaScript, however, it is at this point that things stalled and went into limbo.&lt;br /&gt;
&lt;br /&gt;
It was also at this point where the various parties involved split into two separate groups, much in the same fashion as what happened at the [http://en.wikipedia.org/wiki/W3C W3C] around HTML and the formation of the [http://en.wikipedia.org/wiki/WHAT-WG WHATWG].&lt;br /&gt;
&lt;br /&gt;
Even with the split and the seeming stalled evolution of the ECMAScript standard, we did experience a major revolution in 2005 when [http://en.wikipedia.org/wiki/Jesse_James_Garrett Jesse James Garrett] coined the phrase and presented the technique we now know as Ajax.&lt;br /&gt;
&lt;br /&gt;
The above caused a real explosion across the web with the language evolution not so much being spearheaded by ECMA but much more so by open source libraries and the communities that formed around them. This period saw the release of JavaScript libraries such as [http://www.prototypejs.org/ Prototype], [http://jquery.com/ jQuery], [http://www.dojofoundation.org/projects/dojo Dojo] and [http://mootools.net/ Mootools] among others.&lt;br /&gt;
&lt;br /&gt;
In 2008 the split parties came together in Oslo in an effort to take up the standards process again and drive the language forward using an agenda that is known as [http://wiki.ecmascript.org/doku.php?id=harmony:harmony Harmony].&lt;br /&gt;
&lt;br /&gt;
All of this then brings us to today, with JavaScript entering a completely new and exciting cycle of evolution, innovation and standardisation, moving beyond the browser to the server with the [http://nodejs.org/ Nodejs] platform.&lt;/div&gt;</description>
			<pubDate>Tue, 26 Jun 2012 09:21:22 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:A_Short_History_of_JavaScript</comments>		</item>
		<item>
			<title>A Short History of JavaScript</title>
			<link>http://www.w3.org/community/webed/wiki/A_Short_History_of_JavaScript</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;JavaScript, not to be confused with [http://en.wikipedia.org/wiki/Java_(programming_language) Java], was created in 10 days in May of 1995 by Brendan Eich[[http://en.wikipedia.org/wiki/Brendan_Eich 2]] at Netscape[[http://en.wikipedia.org/wiki/Netscape 3]]. JavaScript was not always known as JavaScript though, and was initially known as Mocha, a name chosen by Marc Andreessen[[http://en.wikipedia.org/wiki/Marc_Andreessen 4]], founder of Netscape.&lt;br /&gt;
&lt;br /&gt;
In September of 1995 the name was changed to LiveScript but, in December of the same year, upon receiving a trademark license from Sun, the name JavaScript was adopted and stayed.&lt;br /&gt;
&lt;br /&gt;
In 1996 - 1997 JavaScript was taken to ECMA[[http://en.wikipedia.org/wiki/Ecma_International 5]] to carve out a standard which other browser vendors could then implement based on the work done at Netscape. The work done over this period of time eventually led to the official release of ECMA-262 Ed.1. The name of the official standard of the language is called ECMAScript with JavaScript being the most well known of the implementations.&lt;br /&gt;
&lt;br /&gt;
The standards process continued in cycles with releases of ECMAScript 2 and in 1999  ECMAScript 3, which is then the baseline for modern day JavaScript, however, it is at this point that things stalled and went into limbo.&lt;br /&gt;
&lt;br /&gt;
It was also at this point where the various parties involved split into two separate groups, much in the same fashion as what happened at the W3C[[http://en.wikipedia.org/wiki/W3C 6]] around HTML and the formation of the WHATWG[[http://en.wikipedia.org/wiki/WHAT-WG 7]].&lt;br /&gt;
&lt;br /&gt;
Even with the split and the seeming stalled evolution of the ECMAScript standard, we did experience a major revolution in 2005 when Jesse James Garrett[[http://en.wikipedia.org/wiki/Jesse_James_Garrett 8]] coined the phrase and presented the technique we now know as Ajax.&lt;br /&gt;
&lt;br /&gt;
The above caused a real explosion across the web with the language evolution not so much being spearheaded by ECMA but much more so by open source libraries and the communities that formed around them. This period saw the release of JavaScript libraries such as Prototype[[http://www.prototypejs.org/ 9]], jQuery[[http://jquery.com/ 10]], Dojo[[http://www.dojofoundation.org/projects/dojo 11]] and Mootools[[http://mootools.net/ 12]] among others.&lt;br /&gt;
&lt;br /&gt;
In 2008 the split parties came together in Oslo in an effort to take up the standards process again and drive the language forward using an agenda that is known as Harmony[[http://wiki.ecmascript.org/doku.php?id=harmony:harmony 13]].&lt;br /&gt;
&lt;br /&gt;
All of this then brings us to today, with JavaScript entering a completely new and exciting cycle of evolution, innovation and standardisation, moving beyond the browser to the server with the Nodejs[[http://nodejs.org/ 14]] platform.&lt;br /&gt;
&lt;br /&gt;
* [1] &lt;br /&gt;
* [2] http://en.wikipedia.org/wiki/Brendan_Eich&lt;br /&gt;
* [3] http://en.wikipedia.org/wiki/Netscape&lt;br /&gt;
* [4] http://en.wikipedia.org/wiki/Marc_Andreessen&lt;br /&gt;
* [5] http://en.wikipedia.org/wiki/Ecma_International&lt;br /&gt;
* [6] http://en.wikipedia.org/wiki/W3C&lt;br /&gt;
* [7] http://en.wikipedia.org/wiki/WHAT-WG&lt;br /&gt;
* [8] http://en.wikipedia.org/wiki/Jesse_James_Garrett&lt;br /&gt;
* [9] http://www.prototypejs.org/&lt;br /&gt;
* [10] http://jquery.com/&lt;br /&gt;
* [11] http://www.dojofoundation.org/projects/dojo&lt;br /&gt;
* [12] http://mootools.net/&lt;br /&gt;
* [13] http://wiki.ecmascript.org/doku.php?id=harmony:harmony&lt;br /&gt;
* [14] http://nodejs.org/&lt;/div&gt;</description>
			<pubDate>Tue, 26 Jun 2012 09:18:58 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:A_Short_History_of_JavaScript</comments>		</item>
		<item>
			<title>A Short History of JavaScript</title>
			<link>http://www.w3.org/community/webed/wiki/A_Short_History_of_JavaScript</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;JavaScript, not to be confused with [Java http://en.wikipedia.org/wiki/Java_(programming_language)], was created in 10 days in May of 1995 by Brendan Eich[[http://en.wikipedia.org/wiki/Brendan_Eich 2]] at Netscape[[http://en.wikipedia.org/wiki/Netscape 3]]. JavaScript was not always known as JavaScript though, and was initially known as Mocha, a name chosen by Marc Andreessen[[http://en.wikipedia.org/wiki/Marc_Andreessen 4]], founder of Netscape.&lt;br /&gt;
&lt;br /&gt;
In September of 1995 the name was changed to LiveScript but, in December of the same year, upon receiving a trademark license from Sun, the name JavaScript was adopted and stayed.&lt;br /&gt;
&lt;br /&gt;
In 1996 - 1997 JavaScript was taken to ECMA[[http://en.wikipedia.org/wiki/Ecma_International 5]] to carve out a standard which other browser vendors could then implement based on the work done at Netscape. The work done over this period of time eventually led to the official release of ECMA-262 Ed.1. The name of the official standard of the language is called ECMAScript with JavaScript being the most well known of the implementations.&lt;br /&gt;
&lt;br /&gt;
The standards process continued in cycles with releases of ECMAScript 2 and in 1999  ECMAScript 3, which is then the baseline for modern day JavaScript, however, it is at this point that things stalled and went into limbo.&lt;br /&gt;
&lt;br /&gt;
It was also at this point where the various parties involved split into two separate groups, much in the same fashion as what happened at the W3C[[http://en.wikipedia.org/wiki/W3C 6]] around HTML and the formation of the WHATWG[[http://en.wikipedia.org/wiki/WHAT-WG 7]].&lt;br /&gt;
&lt;br /&gt;
Even with the split and the seeming stalled evolution of the ECMAScript standard, we did experience a major revolution in 2005 when Jesse James Garrett[[http://en.wikipedia.org/wiki/Jesse_James_Garrett 8]] coined the phrase and presented the technique we now know as Ajax.&lt;br /&gt;
&lt;br /&gt;
The above caused a real explosion across the web with the language evolution not so much being spearheaded by ECMA but much more so by open source libraries and the communities that formed around them. This period saw the release of JavaScript libraries such as Prototype[[http://www.prototypejs.org/ 9]], jQuery[[http://jquery.com/ 10]], Dojo[[http://www.dojofoundation.org/projects/dojo 11]] and Mootools[[http://mootools.net/ 12]] among others.&lt;br /&gt;
&lt;br /&gt;
In 2008 the split parties came together in Oslo in an effort to take up the standards process again and drive the language forward using an agenda that is known as Harmony[[http://wiki.ecmascript.org/doku.php?id=harmony:harmony 13]].&lt;br /&gt;
&lt;br /&gt;
All of this then brings us to today, with JavaScript entering a completely new and exciting cycle of evolution, innovation and standardisation, moving beyond the browser to the server with the Nodejs[[http://nodejs.org/ 14]] platform.&lt;br /&gt;
&lt;br /&gt;
* [1] &lt;br /&gt;
* [2] http://en.wikipedia.org/wiki/Brendan_Eich&lt;br /&gt;
* [3] http://en.wikipedia.org/wiki/Netscape&lt;br /&gt;
* [4] http://en.wikipedia.org/wiki/Marc_Andreessen&lt;br /&gt;
* [5] http://en.wikipedia.org/wiki/Ecma_International&lt;br /&gt;
* [6] http://en.wikipedia.org/wiki/W3C&lt;br /&gt;
* [7] http://en.wikipedia.org/wiki/WHAT-WG&lt;br /&gt;
* [8] http://en.wikipedia.org/wiki/Jesse_James_Garrett&lt;br /&gt;
* [9] http://www.prototypejs.org/&lt;br /&gt;
* [10] http://jquery.com/&lt;br /&gt;
* [11] http://www.dojofoundation.org/projects/dojo&lt;br /&gt;
* [12] http://mootools.net/&lt;br /&gt;
* [13] http://wiki.ecmascript.org/doku.php?id=harmony:harmony&lt;br /&gt;
* [14] http://nodejs.org/&lt;/div&gt;</description>
			<pubDate>Tue, 26 Jun 2012 09:18:41 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:A_Short_History_of_JavaScript</comments>		</item>
		<item>
			<title>A Short History of JavaScript</title>
			<link>http://www.w3.org/community/webed/wiki/A_Short_History_of_JavaScript</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;JavaScript, not to be confused with Java[[http://en.wikipedia.org/wiki/Java_(programming_language) 1]], was created in 10 days in May of 1995 by Brendan Eich[[http://en.wikipedia.org/wiki/Brendan_Eich 2]] at Netscape[[http://en.wikipedia.org/wiki/Netscape 3]]. JavaScript was not always known as JavaScript though, and was initially known as Mocha, a name chosen by Marc Andreessen[[http://en.wikipedia.org/wiki/Marc_Andreessen 4]], founder of Netscape.&lt;br /&gt;
&lt;br /&gt;
In September of 1995 the name was changed to LiveScript but, in December of the same year, upon receiving a trademark license from Sun, the name JavaScript was adopted and stayed.&lt;br /&gt;
&lt;br /&gt;
In 1996 - 1997 JavaScript was taken to ECMA[[http://en.wikipedia.org/wiki/Ecma_International 5]] to carve out a standard which other browser vendors could then implement based on the work done at Netscape. The work done over this period of time eventually led to the official release of ECMA-262 Ed.1. The name of the official standard of the language is called ECMAScript with JavaScript being the most well known of the implementations.&lt;br /&gt;
&lt;br /&gt;
The standards process continued in cycles with releases of ECMAScript 2 and in 1999  ECMAScript 3, which is then the baseline for modern day JavaScript, however, it is at this point that things stalled and went into limbo.&lt;br /&gt;
&lt;br /&gt;
It was also at this point where the various parties involved split into two separate groups, much in the same fashion as what happened at the W3C[[http://en.wikipedia.org/wiki/W3C 6]] around HTML and the formation of the WHATWG[[http://en.wikipedia.org/wiki/WHAT-WG 7]].&lt;br /&gt;
&lt;br /&gt;
Even with the split and the seeming stalled evolution of the ECMAScript standard, we did experience a major revolution in 2005 when Jesse James Garrett[[http://en.wikipedia.org/wiki/Jesse_James_Garrett 8]] coined the phrase and presented the technique we now know as Ajax.&lt;br /&gt;
&lt;br /&gt;
The above caused a real explosion across the web with the language evolution not so much being spearheaded by ECMA but much more so by open source libraries and the communities that formed around them. This period saw the release of JavaScript libraries such as Prototype[[http://www.prototypejs.org/ 9]], jQuery[[http://jquery.com/ 10]], Dojo[[http://www.dojofoundation.org/projects/dojo 11]] and Mootools[[http://mootools.net/ 12]] among others.&lt;br /&gt;
&lt;br /&gt;
In 2008 the split parties came together in Oslo in an effort to take up the standards process again and drive the language forward using an agenda that is known as Harmony[[http://wiki.ecmascript.org/doku.php?id=harmony:harmony 13]].&lt;br /&gt;
&lt;br /&gt;
All of this then brings us to today, with JavaScript entering a completely new and exciting cycle of evolution, innovation and standardisation, moving beyond the browser to the server with the Nodejs[[http://nodejs.org/ 14]] platform.&lt;br /&gt;
&lt;br /&gt;
* [1] http://en.wikipedia.org/wiki/Java_(programming_language)&lt;br /&gt;
* [2] http://en.wikipedia.org/wiki/Brendan_Eich&lt;br /&gt;
* [3] http://en.wikipedia.org/wiki/Netscape&lt;br /&gt;
* [4] http://en.wikipedia.org/wiki/Marc_Andreessen&lt;br /&gt;
* [5] http://en.wikipedia.org/wiki/Ecma_International&lt;br /&gt;
* [6] http://en.wikipedia.org/wiki/W3C&lt;br /&gt;
* [7] http://en.wikipedia.org/wiki/WHAT-WG&lt;br /&gt;
* [8] http://en.wikipedia.org/wiki/Jesse_James_Garrett&lt;br /&gt;
* [9] http://www.prototypejs.org/&lt;br /&gt;
* [10] http://jquery.com/&lt;br /&gt;
* [11] http://www.dojofoundation.org/projects/dojo&lt;br /&gt;
* [12] http://mootools.net/&lt;br /&gt;
* [13] http://wiki.ecmascript.org/doku.php?id=harmony:harmony&lt;br /&gt;
* [14] http://nodejs.org/&lt;/div&gt;</description>
			<pubDate>Tue, 26 Jun 2012 09:14:18 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:A_Short_History_of_JavaScript</comments>		</item>
		<item>
			<title>A Short History of JavaScript</title>
			<link>http://www.w3.org/community/webed/wiki/A_Short_History_of_JavaScript</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;JavaScript, not to be confused with Java[[http://en.wikipedia.org/wiki/Java_(programming_language) 1]], was created in 10 days in May of 1995 by Brendan Eich[2] at Netscape[3]. JavaScript was not always known as JavaScript though, and was initially known as Mocha, a name chosen by Marc Andreessen[4], founder of Netscape.&lt;br /&gt;
&lt;br /&gt;
In September of 1995 the name was changed to LiveScript but, in December of the same year, upon receiving a trademark license from Sun, the name JavaScript was adopted and stayed.&lt;br /&gt;
&lt;br /&gt;
In 1996 - 1997 JavaScript was taken to ECMA[5] to carve out a standard which other browser vendors could then implement based on the work done at Netscape. The work done over this period of time eventually led to the official release of ECMA-262 Ed.1. The name of the official standard of the language is called ECMAScript with JavaScript being the most well known of the implementations.&lt;br /&gt;
&lt;br /&gt;
The standards process continued in cycles with releases of ECMAScript 2 and in 1999  ECMAScript 3, which is then the baseline for modern day JavaScript, however, it is at this point that things stalled and went into limbo.&lt;br /&gt;
&lt;br /&gt;
It was also at this point where the various parties involved split into two separate groups, much in the same fashion as what happened at the W3C[6] around HTML and the formation of the WHAT-WG[7].&lt;br /&gt;
&lt;br /&gt;
Even with the split and the seeming stalled evolution of the ECMAScript standard, we did experience a major revolution in 2005 when Jesse James Garrett[8] coined the phrase and presented the technique we now know as Ajax.&lt;br /&gt;
&lt;br /&gt;
The above caused a real explosion across the web with the language evolution not so much being spearheaded by ECMA but much more so by open source libraries and the communities that formed around them. This period saw the release of JavaScript libraries such as Prototype[9], jQuery[10], Dojo[11] and Mootools[12] among others.&lt;br /&gt;
&lt;br /&gt;
In 2008 the split parties came together in Oslo in an effort to take up the standards process again and drive the language forward using an agenda that is known as Harmony[13].&lt;br /&gt;
&lt;br /&gt;
All of this then brings us to today, with JavaScript entering a completely new and exciting cycle of evolution, innovation and standardisation, moving beyond the browser to the server with the Nodejs[14] platform.&lt;br /&gt;
&lt;br /&gt;
* [1] http://en.wikipedia.org/wiki/Java_(programming_language)&lt;br /&gt;
* [2] http://en.wikipedia.org/wiki/Brendan_Eich&lt;br /&gt;
* [3] http://en.wikipedia.org/wiki/Netscape&lt;br /&gt;
* [4] http://en.wikipedia.org/wiki/Marc_Andreessen&lt;br /&gt;
* [5] http://en.wikipedia.org/wiki/Ecma_International&lt;br /&gt;
* [6] http://en.wikipedia.org/wiki/W3C&lt;br /&gt;
* [7] http://en.wikipedia.org/wiki/WHAT-WG&lt;br /&gt;
* [8] http://en.wikipedia.org/wiki/Jesse_James_Garrett&lt;br /&gt;
* [9] http://www.prototypejs.org/&lt;br /&gt;
* [10] http://jquery.com/&lt;br /&gt;
* [11] http://www.dojofoundation.org/projects/dojo&lt;br /&gt;
* [12] http://mootools.net/&lt;br /&gt;
* [13] http://wiki.ecmascript.org/doku.php?id=harmony:harmony&lt;br /&gt;
* [14] http://nodejs.org/&lt;/div&gt;</description>
			<pubDate>Tue, 26 Jun 2012 09:10:58 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:A_Short_History_of_JavaScript</comments>		</item>
		<item>
			<title>A Short History of JavaScript</title>
			<link>http://www.w3.org/community/webed/wiki/A_Short_History_of_JavaScript</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;JavaScript, not to be confused with Java[http://en.wikipedia.org/wiki/Java_(programming_language) [1], was created in 10 days in May of 1995 by Brendan Eich[2] at Netscape[3]. JavaScript was not always known as JavaScript though, and was initially known as Mocha, a name chosen by Marc Andreessen[4], founder of Netscape.&lt;br /&gt;
&lt;br /&gt;
In September of 1995 the name was changed to LiveScript but, in December of the same year, upon receiving a trademark license from Sun, the name JavaScript was adopted and stayed.&lt;br /&gt;
&lt;br /&gt;
In 1996 - 1997 JavaScript was taken to ECMA[5] to carve out a standard which other browser vendors could then implement based on the work done at Netscape. The work done over this period of time eventually led to the official release of ECMA-262 Ed.1. The name of the official standard of the language is called ECMAScript with JavaScript being the most well known of the implementations.&lt;br /&gt;
&lt;br /&gt;
The standards process continued in cycles with releases of ECMAScript 2 and in 1999  ECMAScript 3, which is then the baseline for modern day JavaScript, however, it is at this point that things stalled and went into limbo.&lt;br /&gt;
&lt;br /&gt;
It was also at this point where the various parties involved split into two separate groups, much in the same fashion as what happened at the W3C[6] around HTML and the formation of the WHAT-WG[7].&lt;br /&gt;
&lt;br /&gt;
Even with the split and the seeming stalled evolution of the ECMAScript standard, we did experience a major revolution in 2005 when Jesse James Garrett[8] coined the phrase and presented the technique we now know as Ajax.&lt;br /&gt;
&lt;br /&gt;
The above caused a real explosion across the web with the language evolution not so much being spearheaded by ECMA but much more so by open source libraries and the communities that formed around them. This period saw the release of JavaScript libraries such as Prototype[9], jQuery[10], Dojo[11] and Mootools[12] among others.&lt;br /&gt;
&lt;br /&gt;
In 2008 the split parties came together in Oslo in an effort to take up the standards process again and drive the language forward using an agenda that is known as Harmony[13].&lt;br /&gt;
&lt;br /&gt;
All of this then brings us to today, with JavaScript entering a completely new and exciting cycle of evolution, innovation and standardisation, moving beyond the browser to the server with the Nodejs[14] platform.&lt;br /&gt;
&lt;br /&gt;
* [1] http://en.wikipedia.org/wiki/Java_(programming_language)&lt;br /&gt;
* [2] http://en.wikipedia.org/wiki/Brendan_Eich&lt;br /&gt;
* [3] http://en.wikipedia.org/wiki/Netscape&lt;br /&gt;
* [4] http://en.wikipedia.org/wiki/Marc_Andreessen&lt;br /&gt;
* [5] http://en.wikipedia.org/wiki/Ecma_International&lt;br /&gt;
* [6] http://en.wikipedia.org/wiki/W3C&lt;br /&gt;
* [7] http://en.wikipedia.org/wiki/WHAT-WG&lt;br /&gt;
* [8] http://en.wikipedia.org/wiki/Jesse_James_Garrett&lt;br /&gt;
* [9] http://www.prototypejs.org/&lt;br /&gt;
* [10] http://jquery.com/&lt;br /&gt;
* [11] http://www.dojofoundation.org/projects/dojo&lt;br /&gt;
* [12] http://mootools.net/&lt;br /&gt;
* [13] http://wiki.ecmascript.org/doku.php?id=harmony:harmony&lt;br /&gt;
* [14] http://nodejs.org/&lt;/div&gt;</description>
			<pubDate>Tue, 26 Jun 2012 09:10:38 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:A_Short_History_of_JavaScript</comments>		</item>
		<item>
			<title>A Short History of JavaScript</title>
			<link>http://www.w3.org/community/webed/wiki/A_Short_History_of_JavaScript</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;JavaScript, not to be confused with Java[http://en.wikipedia.org/wiki/Java_(programming_language) 1], was created in 10 days in May of 1995 by Brendan Eich[2] at Netscape[3]. JavaScript was not always known as JavaScript though, and was initially known as Mocha, a name chosen by Marc Andreessen[4], founder of Netscape.&lt;br /&gt;
&lt;br /&gt;
In September of 1995 the name was changed to LiveScript but, in December of the same year, upon receiving a trademark license from Sun, the name JavaScript was adopted and stayed.&lt;br /&gt;
&lt;br /&gt;
In 1996 - 1997 JavaScript was taken to ECMA[5] to carve out a standard which other browser vendors could then implement based on the work done at Netscape. The work done over this period of time eventually led to the official release of ECMA-262 Ed.1. The name of the official standard of the language is called ECMAScript with JavaScript being the most well known of the implementations.&lt;br /&gt;
&lt;br /&gt;
The standards process continued in cycles with releases of ECMAScript 2 and in 1999  ECMAScript 3, which is then the baseline for modern day JavaScript, however, it is at this point that things stalled and went into limbo.&lt;br /&gt;
&lt;br /&gt;
It was also at this point where the various parties involved split into two separate groups, much in the same fashion as what happened at the W3C[6] around HTML and the formation of the WHAT-WG[7].&lt;br /&gt;
&lt;br /&gt;
Even with the split and the seeming stalled evolution of the ECMAScript standard, we did experience a major revolution in 2005 when Jesse James Garrett[8] coined the phrase and presented the technique we now know as Ajax.&lt;br /&gt;
&lt;br /&gt;
The above caused a real explosion across the web with the language evolution not so much being spearheaded by ECMA but much more so by open source libraries and the communities that formed around them. This period saw the release of JavaScript libraries such as Prototype[9], jQuery[10], Dojo[11] and Mootools[12] among others.&lt;br /&gt;
&lt;br /&gt;
In 2008 the split parties came together in Oslo in an effort to take up the standards process again and drive the language forward using an agenda that is known as Harmony[13].&lt;br /&gt;
&lt;br /&gt;
All of this then brings us to today, with JavaScript entering a completely new and exciting cycle of evolution, innovation and standardisation, moving beyond the browser to the server with the Nodejs[14] platform.&lt;br /&gt;
&lt;br /&gt;
* [1] http://en.wikipedia.org/wiki/Java_(programming_language)&lt;br /&gt;
* [2] http://en.wikipedia.org/wiki/Brendan_Eich&lt;br /&gt;
* [3] http://en.wikipedia.org/wiki/Netscape&lt;br /&gt;
* [4] http://en.wikipedia.org/wiki/Marc_Andreessen&lt;br /&gt;
* [5] http://en.wikipedia.org/wiki/Ecma_International&lt;br /&gt;
* [6] http://en.wikipedia.org/wiki/W3C&lt;br /&gt;
* [7] http://en.wikipedia.org/wiki/WHAT-WG&lt;br /&gt;
* [8] http://en.wikipedia.org/wiki/Jesse_James_Garrett&lt;br /&gt;
* [9] http://www.prototypejs.org/&lt;br /&gt;
* [10] http://jquery.com/&lt;br /&gt;
* [11] http://www.dojofoundation.org/projects/dojo&lt;br /&gt;
* [12] http://mootools.net/&lt;br /&gt;
* [13] http://wiki.ecmascript.org/doku.php?id=harmony:harmony&lt;br /&gt;
* [14] http://nodejs.org/&lt;/div&gt;</description>
			<pubDate>Tue, 26 Jun 2012 09:10:22 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:A_Short_History_of_JavaScript</comments>		</item>
		<item>
			<title>A Short History of JavaScript</title>
			<link>http://www.w3.org/community/webed/wiki/A_Short_History_of_JavaScript</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;JavaScript, not to be confused with Java[1 http://en.wikipedia.org/wiki/Java_(programming_language)], was created in 10 days in May of 1995 by Brendan Eich[2] at Netscape[3]. JavaScript was not always known as JavaScript though, and was initially known as Mocha, a name chosen by Marc Andreessen[4], founder of Netscape.&lt;br /&gt;
&lt;br /&gt;
In September of 1995 the name was changed to LiveScript but, in December of the same year, upon receiving a trademark license from Sun, the name JavaScript was adopted and stayed.&lt;br /&gt;
&lt;br /&gt;
In 1996 - 1997 JavaScript was taken to ECMA[5] to carve out a standard which other browser vendors could then implement based on the work done at Netscape. The work done over this period of time eventually led to the official release of ECMA-262 Ed.1. The name of the official standard of the language is called ECMAScript with JavaScript being the most well known of the implementations.&lt;br /&gt;
&lt;br /&gt;
The standards process continued in cycles with releases of ECMAScript 2 and in 1999  ECMAScript 3, which is then the baseline for modern day JavaScript, however, it is at this point that things stalled and went into limbo.&lt;br /&gt;
&lt;br /&gt;
It was also at this point where the various parties involved split into two separate groups, much in the same fashion as what happened at the W3C[6] around HTML and the formation of the WHAT-WG[7].&lt;br /&gt;
&lt;br /&gt;
Even with the split and the seeming stalled evolution of the ECMAScript standard, we did experience a major revolution in 2005 when Jesse James Garrett[8] coined the phrase and presented the technique we now know as Ajax.&lt;br /&gt;
&lt;br /&gt;
The above caused a real explosion across the web with the language evolution not so much being spearheaded by ECMA but much more so by open source libraries and the communities that formed around them. This period saw the release of JavaScript libraries such as Prototype[9], jQuery[10], Dojo[11] and Mootools[12] among others.&lt;br /&gt;
&lt;br /&gt;
In 2008 the split parties came together in Oslo in an effort to take up the standards process again and drive the language forward using an agenda that is known as Harmony[13].&lt;br /&gt;
&lt;br /&gt;
All of this then brings us to today, with JavaScript entering a completely new and exciting cycle of evolution, innovation and standardisation, moving beyond the browser to the server with the Nodejs[14] platform.&lt;br /&gt;
&lt;br /&gt;
* [1] http://en.wikipedia.org/wiki/Java_(programming_language)&lt;br /&gt;
* [2] http://en.wikipedia.org/wiki/Brendan_Eich&lt;br /&gt;
* [3] http://en.wikipedia.org/wiki/Netscape&lt;br /&gt;
* [4] http://en.wikipedia.org/wiki/Marc_Andreessen&lt;br /&gt;
* [5] http://en.wikipedia.org/wiki/Ecma_International&lt;br /&gt;
* [6] http://en.wikipedia.org/wiki/W3C&lt;br /&gt;
* [7] http://en.wikipedia.org/wiki/WHAT-WG&lt;br /&gt;
* [8] http://en.wikipedia.org/wiki/Jesse_James_Garrett&lt;br /&gt;
* [9] http://www.prototypejs.org/&lt;br /&gt;
* [10] http://jquery.com/&lt;br /&gt;
* [11] http://www.dojofoundation.org/projects/dojo&lt;br /&gt;
* [12] http://mootools.net/&lt;br /&gt;
* [13] http://wiki.ecmascript.org/doku.php?id=harmony:harmony&lt;br /&gt;
* [14] http://nodejs.org/&lt;/div&gt;</description>
			<pubDate>Tue, 26 Jun 2012 09:10:04 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:A_Short_History_of_JavaScript</comments>		</item>
		<item>
			<title>More about the document head</title>
			<link>http://www.w3.org/community/webed/wiki/More_about_the_document_head</link>
			<description>&lt;p&gt;Cmills:&amp;#32;/* Translations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
 &lt;br /&gt;
In [http://www.w3.org/community/webed/wiki/The_HTML_head_element The HTML &amp;amp;lt;head&amp;amp;gt; element article] of this course we learned about the essential things that go inside the &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; of an HTML document. In this article of the [http://www.w3.org/community/webed/wiki/Main_Page Web Standards Curriculum] we’ll expand on that information and talk about some other — lesser used — things that you can add to the &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; section of an HTML document; these are less essential, but still very useful nonetheless. By the end of this tutorial you’ll know how to collate several HTML documents into a larger multi-part collection, what a favicon is and how to use it, and what RSS is all about. Before you go any further, [http://dev.opera.com/articles/view/supplementary-more-about-the-document/moreinthehead.zip download this article’s accompanying zip file] so you can follow along with the examples.&lt;br /&gt;
&lt;br /&gt;
== Document relationships — collating several HTML documents into a collection ==&lt;br /&gt;
 &lt;br /&gt;
One feature of HTML that stems from the origins of the web as a document repository are document relationships. These define how one document relates to another, for example if it is the previous or next document in a logical chain or if it is the index of a whole series of documents.&lt;br /&gt;
 &lt;br /&gt;
In a sense, you’ve already done this in [http://www.w3.org/community/webed/wiki/The_HTML_head_element The HTML &amp;amp;lt;head&amp;amp;gt; element article], when you applied a style sheet to a document to give it a different look and feel with the &amp;lt;code&amp;gt;link&amp;lt;/code&amp;gt; element:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;!DOCTYPE html&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;html lang=&amp;quot;en-GB&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;head&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;title&amp;amp;gt;Breeding Dogs - Tips about Alsatians&amp;amp;lt;/title&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;screen&amp;quot; href=&amp;quot;styles.css&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; media=&amp;quot;print&amp;quot; href=&amp;quot;printstyles.css&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/head&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;body&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/body&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/html&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
The relationship of the current document to others is defined in much the same way using the &amp;lt;code&amp;gt;link&amp;lt;/code&amp;gt; element and the &amp;lt;code&amp;gt;rel&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;rev&amp;lt;/code&amp;gt; attributes. The &amp;lt;code&amp;gt;rel&amp;lt;/code&amp;gt; attribute (''relationship'') defines the relationship that the linked document has to the current one, and the &amp;lt;code&amp;gt;rev&amp;lt;/code&amp;gt; attribute (''reverse relationship'') defines the relationship the current document has to the linked one.&lt;br /&gt;
&lt;br /&gt;
Don’t worry about the &amp;lt;code&amp;gt;rev&amp;lt;/code&amp;gt; attribute too much — it is a bit confusing, but you will need to use it rarely, if at all.&lt;br /&gt;
 &lt;br /&gt;
There are no mandatory prefixed values for the &amp;lt;code&amp;gt;rel&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;rev&amp;lt;/code&amp;gt; attributes, but there is a taxonomy supported by browsers and indexing tools that you should consider following under most normal circumstances for &amp;lt;code&amp;gt;rel&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* home: The home document of the current collection&lt;br /&gt;
* index: The index of the current collection&lt;br /&gt;
* contents: The contents list of the current collection&lt;br /&gt;
* search: The search page of the current collection&lt;br /&gt;
* glossary: The glossary of the current collection&lt;br /&gt;
* help: The help page of the current collection&lt;br /&gt;
* first: The first document in current collection&lt;br /&gt;
* previous: The previous document from this one in the logical order of the collection&lt;br /&gt;
* next: The document following this one in the logical order of the collection&lt;br /&gt;
* last: The last document of the current collection&lt;br /&gt;
* up: The document one level up in the hierarchy of the current collection&lt;br /&gt;
* copyright:  The copyright information of the current collection&lt;br /&gt;
* author: The information page about the author of the current collection  &lt;br /&gt;
&lt;br /&gt;
Most browsers don’t do anything with this information. Some however will follow the link and load the document in the background so that it shows up a lot faster for the reader. The real browser exception is Opera, which has an extra navigation toolbar you can turn on by selecting View &amp;amp;gt; Toolbars &amp;amp;gt; Navigation bar from the menu. Once turned on you get the link relationships defined in the document as an extra toolbar. Figure 1 shows the W3C HTML standards document in Opera:&lt;br /&gt;
&lt;br /&gt;
[[Image:morehead.png|Screenshot of the Opera browser showing the navigation bar]]&lt;br /&gt;
 &lt;br /&gt;
Figure 1: Opera shows the link relationships of the current document in a special navigation toolbar&lt;br /&gt;
 &lt;br /&gt;
Even though they are not displayed in a visible sense, it is a good idea to provide a human-readable explanation of what the linked documents are about in a &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt; attribute as the file names alone are not necessarily enough.&lt;br /&gt;
 &lt;br /&gt;
Now let’s move on to have a look at how link relationships can be used to collate several documents into a collection. For example, the start page of an online course spanning several documents could be the following ([http://dev.opera.com/articles/view/supplementary-more-about-the-document/start.html start.html]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;!DOCTYPE html&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;html lang=&amp;quot;en-GB&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;head&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;title&amp;amp;gt;Link relationship example&amp;amp;lt;/title&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;contents&amp;quot; title=&amp;quot;table of contents&amp;quot; href=&amp;quot;toc.html&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;next&amp;quot; title=&amp;quot;next: chapter one&amp;quot; href=&amp;quot;chapter1.html&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/head&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;body&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;h1&amp;amp;gt;Course example&amp;amp;lt;/h1&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;p&amp;amp;gt;This would be the cover page of an article series or course&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;ul&amp;amp;gt;&lt;br /&gt;
    &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;a href=&amp;quot;chapter1.html&amp;quot; rel=&amp;quot;next&amp;quot;&amp;amp;gt;Let's start with Chapter One&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;/ul&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/body&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/html&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
The first chapter would be the following ([http://dev.opera.com/articles/view/supplementary-more-about-the-document/chapter1.html chapter1.html]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;!DOCTYPE html&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;html lang=&amp;quot;en-GB&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;head&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;title&amp;amp;gt;Chapter One - Link relationship example&amp;amp;lt;/title&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;contents&amp;quot; title=&amp;quot;Table of Contents&amp;quot; href=&amp;quot;toc.html&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;home&amp;quot; title=&amp;quot;Home Page&amp;quot; href=&amp;quot;start.html&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;prev&amp;quot; title=&amp;quot;previous: Home Page&amp;quot; href=&amp;quot;start.html&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;next&amp;quot; title=&amp;quot;next: Second Chapter&amp;quot; href=&amp;quot;chapter2.html&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/head&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;body&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;h1&amp;amp;gt;Chapter One&amp;amp;lt;/h1&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;p&amp;amp;gt;This would be the chapter one page of an article series or course&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;ul&amp;amp;gt;&lt;br /&gt;
    &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;a href=&amp;quot;start.html&amp;quot; rev=&amp;quot;prev&amp;quot;&amp;amp;gt;Back to Start&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
    &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;a href=&amp;quot;toc.html&amp;quot; rel=&amp;quot;contents&amp;quot;&amp;amp;gt;Table of contents&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
    &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;a href=&amp;quot;chapter2.html&amp;quot; rel=&amp;quot;next&amp;quot;&amp;amp;gt;Go on to Chapter Two&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;/ul&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/body&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/html&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
The second chapter ([http://dev.opera.com/articles/view/supplementary-more-about-the-document/chapter2.html chapter2.html]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;!DOCTYPE html&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;html lang=&amp;quot;en-GB&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;head&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;title&amp;amp;gt;Link relationship example&amp;amp;lt;/title&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;contents&amp;quot; title=&amp;quot;Table of Contents&amp;quot; href=&amp;quot;toc.html&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;home&amp;quot; title=&amp;quot;Home page&amp;quot; href=&amp;quot;start.html&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;prev&amp;quot; title=&amp;quot;previous: first chapter&amp;quot; href=&amp;quot;chapter1.html&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/head&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;body&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;h1&amp;amp;gt;Chapter Two&amp;amp;lt;/h1&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;p&amp;amp;gt;This would be the second chapter page of an article series or course&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;ul&amp;amp;gt;&lt;br /&gt;
    &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;a href=&amp;quot;chapter1.html&amp;quot; rev=&amp;quot;prev&amp;quot;&amp;amp;gt;Back to chapter 1&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
    &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;a href=&amp;quot;toc.html&amp;quot; rel=&amp;quot;contents&amp;quot;&amp;amp;gt;Table of contents&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;/ul&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/body&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/html&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
And finally the table of contents ([http://dev.opera.com/articles/view/supplementary-more-about-the-document/toc.html toc.html]):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;!DOCTYPE html&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;html lang=&amp;quot;en-GB&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;head&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;title&amp;amp;gt;Table of contents - Link relationship example&amp;amp;lt;/title&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;home&amp;quot; title=&amp;quot;home page&amp;quot; href=&amp;quot;start.html&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/head&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;body&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;h1&amp;amp;gt;Table of contents&amp;amp;lt;/h1&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;ul&amp;amp;gt;&lt;br /&gt;
    &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;a href=&amp;quot;chapter1.html&amp;quot;&amp;amp;gt;Chapter One - about stuff&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
    &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;a href=&amp;quot;chapter2.html&amp;quot;&amp;amp;gt;Chapter Two - about other stuff&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;/ul&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;ul&amp;amp;gt;&lt;br /&gt;
    &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;a href=&amp;quot;start.html&amp;quot; rel=&amp;quot;home&amp;quot;&amp;amp;gt;Back to home&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;/ul&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/body&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/html&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
You can also use &amp;lt;code&amp;gt;rel&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;rev&amp;lt;/code&amp;gt; attributes on the links in the document to tell browsers and assistive technology that these anchors correspond with the link relationships. And &amp;lt;code&amp;gt;rel&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;rev&amp;lt;/code&amp;gt; are used for other purposes such as Microformats—[http://dev.opera.com/articles/view/xfn-encoding-extraction-and-visualizat/ check out this article for some uses of the XFN Microformat].&lt;br /&gt;
&lt;br /&gt;
== Linking to alternative versions of the document ==&lt;br /&gt;
 &lt;br /&gt;
The option to link to other documents that have a certain relationship to the document in question also includes different language versions of the same document, or different formats. You can do both by providing a link with a &amp;lt;code&amp;gt;rel&amp;lt;/code&amp;gt; attribute value of &amp;lt;code&amp;gt;alternate&amp;lt;/code&amp;gt;, indicating an alternative version.&lt;br /&gt;
&lt;br /&gt;
=== Translations ===&lt;br /&gt;
 &lt;br /&gt;
Translations are a great candidate for document interlinking. It might for example be that one language version of a document is very successful and visitors who don’t speak that language would love to have that information available to them. By linking from the original to the alternative language version you’ll make it easier for readers of the alternative to understand and promote the content and possibly make the other language version as successful. The following example shows how you can define the other language versions ([http://dev.opera.com/articles/view/supplementary-more-about-the-document/languageexample.html languageexample.html]); note the syntax — it’s pretty intuitive:&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;!DOCTYPE html&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;html lang=&amp;quot;en-GB&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;head&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;title&amp;amp;gt;Multiple Languages example&amp;amp;lt;/title&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;contents&amp;quot; title=&amp;quot;table of contents&amp;quot; href=&amp;quot;toc.html&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;next&amp;quot; title=&amp;quot;next: chapter one&amp;quot; href=&amp;quot;chapter1.html&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;alternate&amp;quot; title=&amp;quot;The course in Dutch&amp;quot; type=&amp;quot;text/html&amp;quot; hreflang=&amp;quot;nl&amp;quot; href=&amp;quot;../nl/start.html&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;alternate&amp;quot; title=&amp;quot;The course in German&amp;quot; type=&amp;quot;text/html&amp;quot; hreflang=&amp;quot;de&amp;quot; href=&amp;quot;../de/start.html&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/head&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;body&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;h1&amp;amp;gt;Course example&amp;amp;lt;/h1&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;p&amp;amp;gt;This would be the cover page of an article series or course&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;ul&amp;amp;gt;&lt;br /&gt;
    &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;a href=&amp;quot;chapter1.html&amp;quot; rel=&amp;quot;next&amp;quot;&amp;amp;gt;Let's start with Chapter One&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;/ul&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;ul&amp;amp;gt;&lt;br /&gt;
    &amp;amp;lt;li&amp;amp;gt;Other languages:&lt;br /&gt;
      &amp;amp;lt;ul&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;a href=&amp;quot;../de/start.html&amp;quot; lang=&amp;quot;de&amp;quot; hreflang=&amp;quot;de&amp;quot;&amp;amp;gt;Deutsch&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
        &amp;amp;lt;li&amp;amp;gt;&amp;amp;lt;a href=&amp;quot;../de/start.html&amp;quot; lang=&amp;quot;nl&amp;quot; hreflang=&amp;quot;nl&amp;quot;&amp;amp;gt;Nederlands&amp;amp;lt;/a&amp;amp;gt;&amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
      &amp;amp;lt;/ul&amp;amp;gt;&lt;br /&gt;
    &amp;amp;lt;/li&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;/ul&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/body&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/html&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
As a recap, the &amp;lt;code&amp;gt;hreflang&amp;lt;/code&amp;gt; attribute on links and anchors defines the human language of the linked document and the &amp;lt;code&amp;gt;lang&amp;lt;/code&amp;gt; attribute defines the language of the text inside the element that has this attribute. This is very important for accessibility as text-to-speech software needs to switch the pronounciation voice from language to language.&lt;br /&gt;
&lt;br /&gt;
Different languages have obviously been around since the Internet first existed (and thousands of years before that), but there is another type of alternative web page that you’ll see a lot as you trawl the web—feeds (eg. RSS feeds). These are very popular, especially for documents that change constantly, such as news sites. We’ll look at these next.&lt;br /&gt;
&lt;br /&gt;
=== Feeds ===&lt;br /&gt;
 &lt;br /&gt;
A feed is a document containing condensed information detailing the new additions to your site in chronological order. Users can subscribe to it and get to know what has changed on your site recently without having to visit it. They do this by using tools like feed readers, eg. [http://reader.google.com/ Google Reader], [http://www.netvibes.com/ Netvibes] or [http://www.bloglines.com/ Bloglines]. Some modern browsers (such as Opera and Firefox) and e-mail clients (such as Mac Mail, or Outlook on Windows) can also process and display feeds. You can recognize that a web site offers a feed by the RSS icon next to the location as shown in Figure 2:&lt;br /&gt;
 &lt;br /&gt;
[[Image:morehead.gif|Screenshot of the Opera browser showing a RSS icon in the navigation bar]]&lt;br /&gt;
 &lt;br /&gt;
Figure 2: Opera shows an orange RSS icon next to the location of web sites that offer a feed.&lt;br /&gt;
 &lt;br /&gt;
Feed pages are either structured using HTML or an XML format like RSS or Atom, and they are hardly ever generated by hand. Most of the time personal publishing systems will do that work for you and all you need to do to offer the world a feed of your site is link to the XML document with the correct meta element in the head of your document. The following is an excerpt from my blog at [http://wait-till-i.com/ http://wait-till-i.com] and points to the RSS feed ([http://dev.opera.com/articles/view/supplementary-more-about-the-document/feedexample.html feedexample.html]):&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;!DOCTYPE html&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;html lang=&amp;quot;en-GB&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;head&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;alternate&amp;quot; type=&amp;quot;application/rss+xml&amp;quot; title=&amp;quot;Wait till I come! RSS Feed&amp;quot; href=&amp;quot;http://www.wait-till-i.com/feed/&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;title&amp;amp;gt;Wait till I come!&amp;amp;lt;/title&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/head&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;body&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;p&amp;amp;gt;Example of an RSS feed&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/body&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/html&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Supplying a feed makes sense for content-heavy web sites that change very often (like blogs or photo sites), and by using a feed reading tool and subscribing to feeds you can cut down on a lot of your surfing and research time. If you don’t update your site that often but you have a lot of content and want people to have a visual reminder of your web site, then you might want to consider using a shortcut icon to stand out in people’s bookmark lists. This is what We’ll cover in the section below.&lt;br /&gt;
&lt;br /&gt;
== Making bookmarking more fun — using favicons ==&lt;br /&gt;
 &lt;br /&gt;
One last subject we’ll cover here is shortcut icons or favicons. These are small images with a file format of .ico — if you place one on your web server, you can use it to show a small icon next to the entry of your web site in a visitor’s bookmark list, as shown in Figure 3:&lt;br /&gt;
&lt;br /&gt;
[[Image:moreheae.gif|Screenshot of bookmark list with icons next to the entries]]&lt;br /&gt;
 &lt;br /&gt;
Figure 3: Icons next to a bookmark make it easier to remember the site. You can add one of these by using a shortcut-icon meta element.&lt;br /&gt;
&lt;br /&gt;
Note that most browsers support formats other than .ico for favicons, but you should stick with .ico as IE doesn't support other favicon formats.&lt;br /&gt;
 &lt;br /&gt;
The biggest obstacle to adding your shortcut icon is actually creating it in the right format as not many graphics creation packages support the ico format. One option is to use the free online tool [http://www.genfavicon.com/ genfavicon]. Once you have it, adding it to your document is as easy as adding another meta element with a &amp;lt;code&amp;gt;rel&amp;lt;/code&amp;gt; value of “Shortcut Icon”, as shown in the following example ([http://dev.opera.com/articles/view/supplementary-more-about-the-document/favicon-example.html favicon-example.html]):&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;!DOCTYPE html&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;html lang=&amp;quot;en-GB&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;head&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;title&amp;amp;gt;Shortcut Icon example&amp;amp;lt;/title&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;link rel=&amp;quot;Shortcut Icon&amp;quot; href=&amp;quot;favicon.ico&amp;quot; type=&amp;quot;image/x-icon&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/head&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;body&amp;amp;gt;&lt;br /&gt;
  &amp;amp;lt;h1&amp;amp;gt;Example of a shortcut icon&amp;amp;lt;/h1&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/body&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;/html&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
If you open this document in a browser it should show the Opera icon next to the address in the location toolbar. If you bookmark it, the same icon will appear next to the bookmark.&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
 &lt;br /&gt;
That’s all for this article, and for the &amp;lt;code&amp;gt;head&amp;lt;/code&amp;gt; section of an HTML document. There are other things we could cover, but they tend to be fairly advanced subjects, and often not a good idea — what we have covered here, and in [http://www.w3.org/community/webed/wiki/The_HTML_head_element The HTML &amp;amp;lt;head&amp;amp;gt; element article], should give you all you need to get on.&lt;br /&gt;
&lt;br /&gt;
== Exercise questions ==&lt;br /&gt;
 &lt;br /&gt;
* Why does it make sense to define link relationships when they are not displayed?&lt;br /&gt;
* How would you link to a search page?&lt;br /&gt;
* What use is offering a feed to your visitors? What &amp;lt;code&amp;gt;rel&amp;lt;/code&amp;gt; value do you use to link to one?&lt;br /&gt;
* What do you need to make sure of when you link to documents in other languages?&lt;br /&gt;
* If you open the example documents in a text editor you’ll find another &amp;lt;code&amp;gt;meta&amp;lt;/code&amp;gt; element we haven’t discussed here with an attribute of &amp;lt;code&amp;gt;content-type&amp;lt;/code&amp;gt;, and something called &amp;lt;code&amp;gt;utf-8&amp;lt;/code&amp;gt;. What is &amp;lt;code&amp;gt;utf-8&amp;lt;/code&amp;gt;?&lt;br /&gt;
 &lt;br /&gt;
Note: This material was originally published as part of the Opera Web Standards Curriculum, available as [http://dev.opera.com/articles/view/supplementary-more-about-the-document/ Supplementary: More about the document &amp;amp;lt;head&amp;amp;gt;], written by Christian Heilmann. Like the original, it is published under the [http://creativecommons.org/licenses/by-nc-sa/2.5/ Creative Commons Attribution, Non Commercial - Share Alike 2.5] license.&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:WSC]]&lt;/div&gt;</description>
			<pubDate>Wed, 23 May 2012 23:06:19 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:More_about_the_document_head</comments>		</item>
		<item>
			<title>WSC proposed updates</title>
			<link>http://www.w3.org/community/webed/wiki/WSC_proposed_updates</link>
			<description>&lt;p&gt;Cmills:&amp;#32;/* JavaScript */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;      &lt;br /&gt;
= Web standards curriculum on W3C Wiki: plan for updates 2011 =&lt;br /&gt;
&lt;br /&gt;
== The beginning ==&lt;br /&gt;
&lt;br /&gt;
[[Introduction to the Web Standards Curriculum]] by Chris Mills. '''{ -- JUST NEEDS A GENERAL READ, AND A LITTLE BIT OF TWEAKING}'''&lt;br /&gt;
&lt;br /&gt;
== Introduction to the world of web standards ==&lt;br /&gt;
&lt;br /&gt;
# [[The history of the Web|The history of the Internet and the web, and the evolution of web standards]], by Mark Norman Francis. { -- NEEDS A GENERAL READ, PLUS I THINK IT COULD BENEFIT FROM A BIT MORE HISTORY BEING ADDED ABOUT THE EVOLUTION OF HTML5 AND CSS3}&lt;br /&gt;
# [[How does the Internet work]]? by Jonathan Lane. {-- NO TWEAKING NEEDED; JUST SPIT AND POLISH}&lt;br /&gt;
# [[The web standards model - HTML CSS and JavaScript]] by Jonathan Lane. { -- A FEW TWEAKS NEEDED - THE HTML SECTION COULD DO WITH AN OVERHAUL TO CCOUNT FOR HTML5, AND DEAL WITH XHTML A BIT BETTER}&lt;br /&gt;
# [[Beautiful dream, but what's the reality]]? by Jonathan Lane. { -- I THINK THIS ARTICLE COULD JUST BE REMOVED, AND A SMALL SECTION ADDED TO THE PREVIOUS ARTICLE TO COVER &amp;quot;THE REALITY OF IT ALL&amp;quot;. AS IT STANDS, THIS ARTICLE IS A BIT OF A RANT, AND NOT REALLY THAT USEFUL TO EDUCATION}&lt;br /&gt;
&lt;br /&gt;
== Web Design Concepts ==&lt;br /&gt;
&lt;br /&gt;
This section won't go into any code or markup details, and will act as an introduction to the design process before you start to create any graphics or code, as well as concepts of web design such as IA, navigation, usability etc.&lt;br /&gt;
&lt;br /&gt;
# [http://www.w3.org/wiki/Information_Architecture_-_planning_out_a_web_site Information Architecture - planning out a web site], by Jonathan Lane.&lt;br /&gt;
# [http://www.w3.org/wiki/What_does_a_good_web_page_need What does a good web page need?], by Mark Norman Francis.&lt;br /&gt;
# [http://www.w3.org/wiki/Colour_theory Colour Theory], by Linda Goin.&lt;br /&gt;
# [http://www.w3.org/wiki/Building_up_a_site_wireframe Building up a site wireframe], by Linda Goin.&lt;br /&gt;
# [http://www.w3.org/wiki/Colour_schemes_and_design_mockups Colour schemes and design mockups], by Linda Goin. &lt;br /&gt;
# [http://www.w3.org/wiki/Typography_on_the_Web Typography on the web], by Paul Haine.&lt;br /&gt;
&lt;br /&gt;
{ -- I THINK THIS WHOLE SECTION NEEDS AN OVERHAUL, AS CURRENTLY IT IS NOT VERY EFFECTIVE. THE TYPOGRAPHY AND IA SECTIONS ARE FINE, BUT I'M NOT SURE ABOUT THE OTHER STUFF. I THINK THE SECTION SHOULD BE RETITLED &amp;quot;PLANNING A WEB SITE&amp;quot;, AND HAVE A STRUCTURE SOMETHING LIKE THE FOLLOWING: &lt;br /&gt;
&lt;br /&gt;
=== Planned New section to replace &amp;quot;Web Design Concepts&amp;quot; - to be called &amp;quot;Planning a web site&amp;quot; ===&lt;br /&gt;
&lt;br /&gt;
# [[Introduction to planning a web site]]&lt;br /&gt;
# Scoping and user research&lt;br /&gt;
# [[Information_Architecture_-_planning_out_a_web_site|Information Architecture - planning out a web site]]. [http://dev.opera.com/articles/view/6-informacios-architektura-egy-website-t/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud1/index.html Spanish translation]&lt;br /&gt;
# [[What_does_a_good_web_page_need|What does a good web page need?]] [http://dev.opera.com/articles/view/7-mi-kell-egy-jo-weblaphoz/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud2/index.html Spanish translation]&lt;br /&gt;
# [[Typography on the Web]]. [http://dev.opera.com/articles/view/11-tipografia-a-weben/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud6/index.html Spanish translation]&lt;br /&gt;
# Colour schemes and design theory&lt;br /&gt;
# Mockups and prototypes&lt;br /&gt;
# User interface Design&lt;br /&gt;
# The Art and Science of CSS-Layouts&lt;br /&gt;
# User experience design - INCLUDE MOBILE/ALTERNATIVE DEVICE USER EXPERIENCE. HOW DOES IT DIFFER?&lt;br /&gt;
# Optimization For Websites&lt;br /&gt;
&lt;br /&gt;
== HTML basics ==&lt;br /&gt;
&lt;br /&gt;
# [http://www.w3.org/wiki/The_basics_of_HTML The basics of HTML], by Mark Norman Francis. { -- THIS LOOKS OK, ALTHOUGH I THINK IT NEEDS A BIT OF UPDATING TO ACCOUNT FOR HTML5, THE HISTORY SECTION, ETC. THE EXAMPLES SHOULD ALSO BE UPDATED TO HTML5 SEMANTICS, WHERE APPROPRIATE, EG NO MORE DIVS FOR PAGE SECTIONS}&lt;br /&gt;
# [http://www.w3.org/wiki/The_HTML_head_element The HTML &amp;amp;lt;head&amp;amp;gt; element], by Christian Heilmann. { -- NEEDS UPDATING, AND HTML5 FEATURES ADDING, SUCH AS META CHARSET} &lt;br /&gt;
# [http://www.w3.org/wiki/Choosing_the_right_doctype_for_your_HTML_documents Choosing the right doctype for your HTML documents], by Roger Johansson. { -- I THINK THAT THIS NEEDS TO BE REWRITTEN TO FOCUS LESS ON DOCTYPES, AND MORE ON HTML/XHTML RULES, HOW THEY DIFFER, WHAT DOCTYPES REALLY ACHIEVED, WHAT ONES YOU MIGHT ENCOUNTER IN THE WILD, WHY WE WILL BE USING HTML5 DOCTYPE IN THIS COURSE, WHAT IT ACHIEVES, ETC.}&lt;br /&gt;
&lt;br /&gt;
== The HTML body ==&lt;br /&gt;
&lt;br /&gt;
{ -- OVERALL THIS IS A REASONABLE SECTION, BUT QUITE A LOT NEEDS ADDING TO BRING IT UP TO DATE WITH HTML5, ETC. I WILL CLEARLY MARK NEW ARTICLES}&lt;br /&gt;
&lt;br /&gt;
# NEW ARTICLE - structural elements, section, article, etc. also including div and span&lt;br /&gt;
# [http://www.w3.org/wiki/Marking_up_textual_content_in_HTML Marking up textual content in HTML], by Mark Norman Francis. { -- NEEDS UPDATING, AS SOME OF THESE ELEMENTS WILL HAVE CHANGED FUNCTION IN HTML5, AND DEPRECATED ELEMENTS HAVE BEEN REPURPOSED}&lt;br /&gt;
# [http://www.w3.org/wiki/HTML_lists HTML Lists], by Ben Buchanan. { -- DOESN'T NEED MANY UPDATES}&lt;br /&gt;
# [http://www.w3.org/wiki/Images_in_HTML Images in HTML], by Christian Heilmann. { -- NEEDS A BIT OF SPIT AND POLISH, AND NEEDS FIGURE AND FIGCAPTION ADDING}&lt;br /&gt;
# [http://www.w3.org/wiki/HTML_links_-_lets_build_a_web HTML links — let's build a web!] by Christian Heilmann. { -- NEEDS SPIT AND POLISH, AND NEEDS THE CONCEPT OF BLOCK LEVEL LINKS ADDING}&lt;br /&gt;
# NEW ARTICLE - HTML5 video and audio&lt;br /&gt;
# [http://www.w3.org/wiki/HTML_tables HTML Tables], by Jen Hanen. { -- NOT MANY UPDATES NEEDED}&lt;br /&gt;
# [http://www.w3.org/wiki/HTML_forms_-_the_basics HTML Forms — the basics], by Jen Hanen. { -- THERE IS A LOT OF NEW HTML5 FORM STUFF TO ADD, OBVIOUSLY - I THINK THAT IN THIS CIRCUMSTANCE, BECAUSE SUPPORT FOR HTML5 FORM STUFF IS PATCHY ACROSS BROWSERS RIGHT NOW, WE SHOULD DO SMALL UPDATES ON THE EXISTING ARTICLE, THEN ADD ONE OR MORE SEPARATE ARTICLES TO COVER THE NEW HTML5 FORM ELEMENTS AND NEW ATTRIBUTES, AND THEN PERHAPS SEPARATE COVERAGE OF VALIDATION}&lt;br /&gt;
# [http://www.w3.org/wiki/Lesser_-_known_semantic_elements Lesser-known semantic elements], by Mark Norman Francis. {THIS WILL NEED UPDATING, AS A NUMBER OF THESE ELEMENTS HAVE BEEN REDEFINED}&lt;br /&gt;
# [http://www.w3.org/wiki/Generic_containers_-_the_div_and_span_elements Generic containers — the div and span elements], by Mark Norman Francis. { -- REMOVE THIS ONE - THIS WILL BE COVERED IN THE STRUCTURAL ELEMENTS ARTICLE}&lt;br /&gt;
# [http://www.w3.org/wiki/Creating_multiple_pages_with_navigation_menus Creating multiple pages with navigation menus], by Christian Heilmann.&lt;br /&gt;
# [http://www.w3.org/wiki/Validating_your_HTML Validating your HTML], by Mark Norman Francis. { -- I THINK THIS COULD BE REWRITTEN AND IMPROVED, AND RELOCATED TO A SECTION ABOUT DEBUGGING WEB PAGES? A MORE COMPLETE TREATMENT WOULD BE NICE}&lt;br /&gt;
&lt;br /&gt;
== Accessibility specifics ==&lt;br /&gt;
&lt;br /&gt;
# [http://www.w3.org/wiki/Accessibility_basics Accessibility basics], by Tom Hughes-Croucher.&lt;br /&gt;
# [http://www.w3.org/wiki/Accessibility_testing Accessibility testing], by Benjamin Hawkes-Lewis.&lt;br /&gt;
&lt;br /&gt;
I THINK THIS NEEDS TO BE EXPANDED OUT TO SEVERAL ARTICLES, TO COVER DIFFERENT ASPECTS, SOMETHING LIKE:&lt;br /&gt;
&lt;br /&gt;
# WRITING A PLAN FOR A11Y TESTING, INCLUDING USE OF REAL USER TESTING, CONFORMANCE CRITERIA, AUTOMATED TOOLS, AND GOOD OLD COMMON SENSE&lt;br /&gt;
# THE LEGAL SIDE OF THINGS, EXPLAINED IN DETAIL&lt;br /&gt;
# DECIPHERING WCAG, AND OTHER CONFORMANCE CRITERIA SUCH AS SECTION 508&lt;br /&gt;
# ACCESSIBILITY TOOLS, WHAT TO USE AND WHAT TO AVOID. HOW FAR WILL THESE GET YOU?&lt;br /&gt;
# REAL A11Y TESTING WITH REAL PEOPLE, HOW TO PUT TOGETHER FOCUS GROUPS, WHAT TO LOOK FOR HERE&lt;br /&gt;
# COMMON SENSE - SOLUTIONS FOR COMMON ACCESSIBILITY ISSUES - A ROADMAP FOR FIXING ISSUES. START WITH SEMANTIC HTML, THEN GO TO VIDEO AND AUDIO CONTENT, JAVASCRIPT, AJAX, ALTERNATIVES. }&lt;br /&gt;
&lt;br /&gt;
== CSS ==&lt;br /&gt;
&lt;br /&gt;
# [http://dev.opera.com/articles/view/27-css-basics/ CSS basics], by Christian Heilmann. { -- NEEDS A BIT OF SPRUCING UP, TO TALK ABOUT NEW STUFF, PLUS WE NEED TO ADD SOME STUFF ABOUT ALL THE NEW CSS SELECTORS. OF DO WE? MAYBE WE COULD JUST COVER THE BASIC SELECTORS HERE, AND THEN COVER SOME OF THE MORE ADVANCED ONES IN APPROPRIATE PLACES, EG FORM RELATED ONES, AND OTHER ADVANCED ONES IN AN ARTICLE OF THEIR OWN - SEE NEXT ARTICLE}&lt;br /&gt;
# NEW ARTICLE - ADVANCED SELECTORS - cover all the advanced selectors that we didn't cover in the previous chapter - last nth of type, valid, invalid, nth child, etc. &lt;br /&gt;
# NEW CHAPTER - CSS3 SHADOWS&lt;br /&gt;
# [http://www.w3.org/wiki/Inheritance_and_cascade Inheritance and Cascade], by Tommy Olsson. { -- NOT MUCH TO UPDATE HERE}&lt;br /&gt;
# [http://www.w3.org/wiki/Text_styling_with_CSS Text styling with CSS], by Ben Henick. { -- THIS IS A VERY WEIGHTY CHAPTER, AND COULD DO WITH SLIMMING DOWN A BIT, AND MAKING MORE GRANULAR, PERHAPS EVEN SPLITTING IT. ALSO ADD WEB FONTS, AND TALK ABOUT SOME OF THE MORE OBSCURE TEXT STYLING STUFF, LIKE TEXT-OVERFLOW, GENERATED CONTENT FOR QUOTES, WORD WRAP, ETC.}&lt;br /&gt;
# [http://www.w3.org/wiki/The_CSS_layout_model_-_boxes_borders_margins_padding The CSS layout model - boxes, borders, margins, padding], by Ben Henick. { -- AGAIN, MIGHT NEED SPLITTING, NEED TO COVER DIFFERENT LAYOUT MODELS, BORDER-RADIUS ETC.}&lt;br /&gt;
# [http://www.w3.org/wiki/CSS_background_images CSS background images], by Nicole Sullivan. { -- NEED TO UPDATE TO COVER MULTIPLE BACKGROUND IMAGES, BORDER-IMAGE, LINEAR GRADIENTS, RADIAL GRADIENTS MIGHT NEED MULTIPLE CHAPTERS}&lt;br /&gt;
# [http://www.w3.org/wiki/Styling_lists_and_links Styling lists and links], by Ben Buchanan. { -- DOESN'T NEED THAT MUCH }&lt;br /&gt;
# [http://www.w3.org/wiki/Styling_tables Styling tables], by Ben Buchanan. { -- DOESN'T NEED THAT MUCH }&lt;br /&gt;
# [http://www.w3.org/wiki/Styling_forms Styling forms], by Ben Henick. { -- NEED TO ADD CSS3 FORM-RELATED PSEUDO CLASSES, AND DISCUSSION OF STYLING ERRORS AND STUFF}&lt;br /&gt;
# [http://www.w3.org/wiki/Floats_and_clearing Floats and clearing], by Tommy Olsson. { - NOT THAT MUCH NEEDED, ALTHOUGH I NEED TO BE CAREFUL TO SEPARATE OUT MULTIPLE COLUMN LAYOUTS, AND COVER MULTI-COL THERE}&lt;br /&gt;
# [http://www.w3.org/wiki/CSS_static_and_relative_positioning CSS static and relative positioning], by Tommy Olsson.&lt;br /&gt;
# [http://www.w3.org/wiki/CSS_absolute_and_fixed_positioning CSS absolute and fixed positioning], by Tommy Olsson. { -- THE POSITIONING CHAPTERS NEED SOME WORK, BUT NOT THAT MUCH}&lt;br /&gt;
# [http://www.w3.org/wiki/CSS3_2D_Transforms CSS3 2D Transforms], by Alexander Futekov { -- NEW CHAPTER}&lt;br /&gt;
# NEW CHAPTER - CSS3 3D TRANSFORMS&lt;br /&gt;
# NEW CHAPTER - CSS3 TRANSITIONS&lt;br /&gt;
# NEW CHAPTER - CSS3 ANIMATIONS&lt;br /&gt;
# NEW CHAPTER - MEDIA QUERIES&lt;br /&gt;
# NEW CHAPTER - VIEWPORT&lt;br /&gt;
# NEW CHAPTER - CREATING AN ADAPTIVE DESIGN, USING MEDIA QUERIES, VIEWPORT, MULTI-COL, ETC.&lt;br /&gt;
# NEW CHAPTER - OBJECT FIT/OBJECT POSITION&lt;br /&gt;
# NEW CHAPTER - OPTIMIZING CSS (INCLUDE IDEAS FOR OPTIMIZING FOR MOBILE  ETC.)&lt;br /&gt;
&lt;br /&gt;
== Advanced CSS study ==&lt;br /&gt;
&lt;br /&gt;
# [http://www.w3.org/wiki/Headers_footers_columns_and_templates Headers, footers, columns, and templates], by Ben Henick { -- NOT SURE HOW USEFUL THIS IS, MAYBE DISSECT IT, PUT THE USEFUL STUFF IN OTHER CHAPTERS. A BIT TOO LONG WINDED. }&lt;br /&gt;
&lt;br /&gt;
== JavaScript ==&lt;br /&gt;
&lt;br /&gt;
Proposed topics, there is still much that can be added here. Wanted to get the initial posted and will continue to add/update.&lt;br /&gt;
&lt;br /&gt;
# A Short History of JavaScript&lt;br /&gt;
# Variables&lt;br /&gt;
## Defining variables&lt;br /&gt;
## Variable scope&lt;br /&gt;
## Don’t pollute the global object&lt;br /&gt;
## The single var ‘pattern’&lt;br /&gt;
# Basic operations&lt;br /&gt;
## JavaScript data types&lt;br /&gt;
### Floats and Integers&lt;br /&gt;
### Booleans&lt;br /&gt;
### Strings&lt;br /&gt;
### Arrays&lt;br /&gt;
### Objects&lt;br /&gt;
## Operators&lt;br /&gt;
## Conditions&lt;br /&gt;
## Loops&lt;br /&gt;
# Functions&lt;br /&gt;
## Declaring functions&lt;br /&gt;
## Functions as Objects&lt;br /&gt;
## Anonymous functions&lt;br /&gt;
## Recursion&lt;br /&gt;
## Context&lt;br /&gt;
## The callback pattern&lt;br /&gt;
# Animation&lt;br /&gt;
## Animation loops with setInterval&lt;br /&gt;
## Other...&lt;br /&gt;
## could use some of [http://www.w3.org/wiki/JavaScript_animation JavaScript animation], by Stuart Langridge&lt;br /&gt;
# [http://www.w3.org/wiki/Objects_in_JavaScript Objects in JavaScript], by Mike West&lt;br /&gt;
# [http://www.w3.org/wiki/Traversing_the_DOM Traversing the DOM], by Mike West&lt;br /&gt;
# [http://www.w3.org/wiki/Creating_and_modifying_HTML Creating and modifying HTML], by Stuart Langridge&lt;br /&gt;
# [http://www.w3.org/wiki/Dynamic_style_-_manipulating_CSS_with_JavaScript Dynamic style - manipulating CSS with JavaScript], by Greg Schechter&lt;br /&gt;
# [http://www.w3.org/wiki/Handling_events_with_JavaScript Handling events with JavaScript], by Robert Nyman&lt;br /&gt;
## Probably needs expanding&lt;br /&gt;
# User interaction&lt;br /&gt;
## Clicking buttons&lt;br /&gt;
## Interacting with mouse movements&lt;br /&gt;
## Keyboard controls&lt;br /&gt;
## touch events/gestures&lt;br /&gt;
# Tool Chest&lt;br /&gt;
## Testing and Debugging&lt;br /&gt;
### Tools for testing and debugging&lt;br /&gt;
### Unit testing with QUnit&lt;br /&gt;
### Cross browser JavaScript (Ouch ;))&lt;br /&gt;
## Code Quality&lt;br /&gt;
### JSLint and JSHint&lt;br /&gt;
## Production ready&lt;br /&gt;
### Google Closure Compiler&lt;br /&gt;
# Closures&lt;br /&gt;
# JavaScript Libraries&lt;br /&gt;
## jQuery&lt;br /&gt;
## jQuery UI&lt;br /&gt;
## Modernizr&lt;br /&gt;
## Yepnope&lt;br /&gt;
# JavaScript Polyfils&lt;br /&gt;
## When to use and when not to&lt;br /&gt;
# JavaScript on the Server&lt;br /&gt;
## Nodejs - There is a lot to discuss here, we can break this down as we progress&lt;br /&gt;
# JavaScript for Mobile&lt;br /&gt;
## The frameworks&lt;br /&gt;
## Considerations for mobile JavaScript (This can have many ‘subdivisions’)&lt;br /&gt;
## Best practices when writing for mobile&lt;br /&gt;
# JavaScript Gotcha’s&lt;br /&gt;
## Why eval() is evil&lt;br /&gt;
## Use === not ==&lt;br /&gt;
## Don’t forget the ;&lt;br /&gt;
## The problem with using typeof for testing for null&lt;br /&gt;
## Avoid built in Object wrappers for primitives (This of course is for the most part)&lt;br /&gt;
# APIs&lt;br /&gt;
## The basics of using an API&lt;br /&gt;
##HTML5 APIs&lt;br /&gt;
### MEDIA API&lt;br /&gt;
### GEOLOCATION (YEAH, NOT HTML5, BUT HEY)&lt;br /&gt;
### WEB WORKERS&lt;br /&gt;
### WEB SOCKETS&lt;br /&gt;
### APPCACHE&lt;br /&gt;
### WEBSQL/INDEXEDDB&lt;br /&gt;
### WEB STORAGE&lt;br /&gt;
### CANVAS (SHOULD PROBABLY HAVE ITS OWN SECTION ENTIRELY)&lt;br /&gt;
### HTML5 HISTORY API&lt;br /&gt;
### DATASETS&lt;br /&gt;
## Popular 3rd party APIs&lt;br /&gt;
### Google Maps&lt;br /&gt;
### Twitter&lt;br /&gt;
### Flickr&lt;br /&gt;
# ECMAScript 5&lt;br /&gt;
## Browser support&lt;br /&gt;
## Cover additions...&lt;br /&gt;
&lt;br /&gt;
What we have so far:&lt;br /&gt;
&lt;br /&gt;
# [http://www.w3.org/wiki/Programming_-_the_real_basics Programming - the real basics!], by Christian Heilmann&lt;br /&gt;
# [http://www.w3.org/wiki/What_can_you_do_with_JavaScript What can you do with JavaScript?], by Christian Heilmann&lt;br /&gt;
# [http://www.w3.org/wiki/Your_first_look_at_JavaScript Your first look at JavaScript], by Christian Heilmann&lt;br /&gt;
# [http://www.w3.org/wiki/JavaScript_best_practices JavaScript best practices], by Christian Heilmann&lt;br /&gt;
# [http://www.w3.org/wiki/The_principles_of_unobtrusive_JavaScript The principles of unobtrusive JavaScript], by PPK&lt;br /&gt;
# [http://www.w3.org/wiki/JavaScript_functions JavaScript functions], by Mike West&lt;br /&gt;
# [http://www.w3.org/wiki/Objects_in_JavaScript Objects in JavaScript], by Mike West&lt;br /&gt;
# [http://www.w3.org/wiki/Traversing_the_DOM Traversing the DOM], by Mike West&lt;br /&gt;
# [http://www.w3.org/wiki/Creating_and_modifying_HTML Creating and modifying HTML], by Stuart Langridge&lt;br /&gt;
# [http://www.w3.org/wiki/Dynamic_style_-_manipulating_CSS_with_JavaScript Dynamic style - manipulating CSS with JavaScript], by Greg Schechter&lt;br /&gt;
# [http://www.w3.org/wiki/Handling_events_with_JavaScript Handling events with JavaScript], by Robert Nyman&lt;br /&gt;
# [http://www.w3.org/wiki/JavaScript_animation JavaScript animation], by Stuart Langridge&lt;br /&gt;
# [http://www.w3.org/wiki/Graceful_degredation_versus_progressive_enhancement Graceful degredation versus progressive enhancement], by Christian Heilmann&lt;br /&gt;
# NEW CHAPTER - OPTIMIZING JAVASCRIPT (INCLUDE IDEAS FOR OPTIMIZING FOR MOBILE  ETC.)&lt;br /&gt;
# NEW CHAPTER - TOUCH EVENTS. THESE DEFINITELY NEED COVERAGE, AS THEY ARE GETTING VERY BIG THESE DAYS. TOUCH DEVICES ARE IMPORTANT.&lt;br /&gt;
&lt;br /&gt;
== OTHER THINGS TO COVER ==&lt;br /&gt;
&lt;br /&gt;
# SVG (REALLY NEEDS ITS OWN COURSE, See the following proposal)&lt;br /&gt;
# WAI-ARIA&lt;br /&gt;
&lt;br /&gt;
=== SVG ===&lt;br /&gt;
&lt;br /&gt;
Source of inspiration :&lt;br /&gt;
&lt;br /&gt;
* http://www.w3.org/Graphics/SVG/IG/resources/svgprimer.html&lt;br /&gt;
* https://developer.mozilla.org/en/SVG/Tutorial&lt;br /&gt;
&lt;br /&gt;
==== SVG BASICS ====&lt;br /&gt;
&lt;br /&gt;
# ''History and usage'' : As for HTML, it could be good to start by giving some context: What is it, Where does it come, What is it made for, How is it different than HTML?&lt;br /&gt;
# ''Syntax and deployment'' : This part would introduce the basic syntax, the concept of viewport and absolute positioning and finally how to embed an SVG document inside other language (basically HTML and CSS)&lt;br /&gt;
# ''Basic shapes'' : This part will be dedicated to the basic shapes available in SVG&lt;br /&gt;
# ''Position and transformation'' : To go deeper inside the viewport thing and to explain the role of the transformations.&lt;br /&gt;
# ''Using text in SVG''&lt;br /&gt;
# ''Styling SVG'' : This is where we would detailed how to use presentation attributes and their CSS counterpart.&lt;br /&gt;
# ''Scripting SVG'' : Where we could introduce the SVG DOM API.&lt;br /&gt;
&lt;br /&gt;
==== Part 2 : SVG ADVANCED ====&lt;br /&gt;
&lt;br /&gt;
# ''How to build Pathes'' : To dig into the syntax of the d attribute on path elements&lt;br /&gt;
# ''Animating the web with SVG Animations'' : How to use SVG Animations&lt;br /&gt;
# ''SVG Filters'' : This would be an introduction to filters but each filters could have it's own article (Filters a really hard things)&lt;br /&gt;
# ''Clipping and Masking''&lt;br /&gt;
# ''Patterns''&lt;br /&gt;
# ''Gradients''&lt;br /&gt;
# ''Dealing with the external'' : This part would be dedicated to the foreignObject element but also to links and images elements.&lt;br /&gt;
&lt;br /&gt;
=== SVG article drafts we could use ===&lt;br /&gt;
&lt;br /&gt;
# [http://www.w3.org/wiki/SVG_Primer SVG Primer] (written by David Storey, but unused)&lt;br /&gt;
# [http://www.w3.org/wiki/SVG_Links SVG Links] (written by David Storey, but unused)&lt;br /&gt;
&lt;br /&gt;
== Adaptive design and development for Mobile and other alternative browsing devices  ==&lt;br /&gt;
&lt;br /&gt;
PROPOSED STRUCTURE&lt;br /&gt;
&lt;br /&gt;
# [[Mobile beginnings: An introduction to the mobile web]] (include history of mobiles, how mobile networks work, what the hardware looks like, what the software looks like)&lt;br /&gt;
# [[What do the devices look like?]] (a fairly detailed reference showing the types of devices you are likely to need to support when building cross device adaptive apps. Include data such as screen resolution, espect ratio and dpi of the different devices. This kid of reference material will be very useful to developers.)&lt;br /&gt;
# [[Mobile constraints and advantages]] (what are the specific constraints you need to work around for mobile and alternative browsing devices? What are the advantages, eg the context specific technologies you can take advantage of?)&lt;br /&gt;
# [[Mobile friendly: web design and development Overview]] (start with a basis of semantic HTML, accessibility best practices are Making an app or site mobile friendly - do you create a different site, or do you adapt your existing site for mobile? A brief introduction to Adaptive design - graceful degradation, progressive enhancement, using media queries and viewport to adapt layout, using feature detection to server appropriate content and services, geolocation, multimedia, offline apps, don't use browser sniffing!) A lot of this will be covered elsewhere.&lt;br /&gt;
# Feature detection, polyfilling, graceful degredation, etc. An article on this would be good, maybe something which showed how to detect for all different features. Kind of like Mark Pilgrims' No bullshit guide to detecting everything. Before he took it all down.&lt;br /&gt;
# MOBILE/DEVICE TESTING&lt;br /&gt;
&lt;br /&gt;
OTHER THINGS TO ADD ELSEWHERE IN THE MATERIAL&lt;br /&gt;
&lt;br /&gt;
# WE SHOULD WRITE AN ARTICLE TITLED &amp;quot;ONE WEB, MANY DEVICES&amp;quot;, PLACED INSIDE http://www.w3.org/wiki/Web_Standards_Curriculum#Introduction_to_the_world_of_web_standards&lt;br /&gt;
# WE SHOULD ALSO SAY SOMETHING ABOUT SEMANTICS AND DIVERSE DEVICES IN http://www.w3.org/wiki/The_web_standards_model_-_HTML_CSS_and_JavaScript&lt;br /&gt;
&lt;br /&gt;
== Supplementary articles ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/wiki/Getting_your_content_online Getting your content online], by Craig Grannell. { -- DOESN'T NEED CHANGES }&lt;br /&gt;
* [http://www.w3.org/wiki/More_about_the_document_head More about the document &amp;amp;lt;head&amp;amp;gt;], by Chris Heilmann. { -- PROBABLY DOESN'T NEED CHANGES, ALTHOUGH IT WOULD BE NICE TO MOVE IT INTO THE MAIN HTML SECTION, AS IT GETS LOST OUT HERE }&lt;br /&gt;
* [http://www.w3.org/wiki/Common_HTML_entities_used_for_typography Common HTML entities used for typography], by Ben Henick. { -- DOESN'T NEED MANY CHANGES }&lt;br /&gt;
* [http://www.w3.org/wiki/The_web_standards_curriculum_glossary The Opera Web Standards Curriculum glossary], by various authors. This is incomplete, and will be added to as time goes by. { -- NEEDS A LOT OF TERMS ADDING, IF IT IS TO BE USEFUL }&lt;br /&gt;
&lt;br /&gt;
== Deprecated articles: removed from original WSC ==&lt;br /&gt;
&lt;br /&gt;
* [[Choosing the right doctype for your HTML documents]]. [http://dev.opera.com/articles/view/14-megfelelo-doctype-valasztasa/ Hungarian translation] | [http://dev.opera.com/articles/view/14-choosing-the-right-doctype-for-your-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/m3/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m3/ud3/index.html Spanish translation]&lt;br /&gt;
* [[Generic containers - the div and span elements]]. [http://dev.opera.com/articles/view/22-altalanos-tarolok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud8/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud8/index.html Spanish translation]&lt;br /&gt;
* [[Text styling with CSS]]. [http://mosaic.uoc.edu/ac/le/ca/m6/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud3/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:WSC]]&lt;/div&gt;</description>
			<pubDate>Wed, 23 May 2012 17:43:32 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:WSC_proposed_updates</comments>		</item>
		<item>
			<title>How to review an article</title>
			<link>http://www.w3.org/community/webed/wiki/How_to_review_an_article</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this article I will give you some tips on reviewing articles for others, along with thoughts on what you should be looking out for.&lt;br /&gt;
&lt;br /&gt;
Note: There are different terms you'll come across that describe the activities we are talking about in this article. You'll hear:&lt;br /&gt;
&lt;br /&gt;
* development editing — this tends to refer to doing high level work on the article — working on chapter structuring, scope and audience level.&lt;br /&gt;
* technical editing and technical reviewing — this refers to editing/reviewing material based on its technical content. Is what the material saying useful, accurate, and appropriate to the audience level? How could it be improved?&lt;br /&gt;
* copy editing — a copy edit tends to be a non-technical edit, where the editor just edits the work to improve grammar/spelling. If something looks wrong but the editor is not sure how it should be corrected, they tend to leave a comment for the author to answer.&lt;br /&gt;
* proof reading — a proof read is a final check to try to weed out as many last minute typos and other errors as possible. The scope of the corrections really shouldn't be any more major than that at this stage&lt;br /&gt;
&lt;br /&gt;
==Reviewing: general==&lt;br /&gt;
&lt;br /&gt;
Generally, when reviewing someone else's article you should first agree on the scope of the review:&lt;br /&gt;
&lt;br /&gt;
# Are you editing the article, or have you been asked just to give comments?&lt;br /&gt;
# Are you commenting on the technical content, the article structure/high level content, the spelling/grammar, or all of them?&lt;br /&gt;
&lt;br /&gt;
There should be a bit of leeway, but you shouldn't stray too far from what was originally agreed. For example, if you are just commenting, then you shouldn't make loads of changes. A typo or two would be ok, but for significant changes, put it in comments to ask what the author thinks.&lt;br /&gt;
&lt;br /&gt;
If you are doing a technical edit, then by all means update code samples and wording that you think is inaccurate or wrong, but don't obsess over spelling and grammar, otherwise you might take too long to get the task done.&lt;br /&gt;
&lt;br /&gt;
Of course, if the editor has published a first draft on the Wiki and asked for help with improvements, then anyone should feel comfortable in making changes that they consider valuable. This is the Wiki way, and we need to be comfortable with that.&lt;br /&gt;
&lt;br /&gt;
If something really bad happens to the content, then we can always roll back an edit, but this is obviously something we want to avoid if possible.&lt;br /&gt;
&lt;br /&gt;
=== Editing ===&lt;br /&gt;
&lt;br /&gt;
When editing content intended for the Wiki, you should make sure it is put on the Wiki in the first place before you start editing it. If it isn't, ask the author to do so, before you start editing. You'll need to login of course before you can then do your edits, but having it on the Wiki first is a good idea because you can then take advantage of the Wiki's version control features, plus the article is then available ad backed up on the cloud. No need for messing around with sending different file versions to each other.&lt;br /&gt;
&lt;br /&gt;
If for some reason you do need to edit some content NOT on the Wiki, make sure it is done in a plain text file. Don't mess around with graphical document editors such as Word or Pages, unless you have a really good reason to do so (for example a visually impaired person might use such an application to write an article because they find the text easier to read in a certain font, zoomed in, etc.)&lt;br /&gt;
&lt;br /&gt;
=== Commenting ===&lt;br /&gt;
&lt;br /&gt;
When you are commenting, it is often a good idea to put comments on the article's discussion page — see the discussion tab at the top of the page. This saves you from cluttering up the article with comments, which can confuse things. Of course, it does mean that the comments won't be in context, so you'll need to describe what part of the article each comment refers to. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;In the first paragraph below the Tips and Tricks heading, you should improve...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If you are finding it really hard to make a comment understandable out of context, then as a last resort, you can put it inside the article, but to make it easy to find, include a unique flag for people to search for, that won't appear normally in text. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;|| In the first paragraph below the Tips and Tricks heading, you should improve...&amp;quot; or&lt;br /&gt;
&amp;quot;CHRIS - In the first paragraph below the Tips and Tricks heading, you should improve...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You should make your edits or comments without fear of breaking anything - the edits can be rolled back if there is a problem. However, make sure that you are confident what you are doing is correct before making changes. If you are really not sure, then you should probably leave a comment instead, asking the author if they think the change should be made.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Different types of review==&lt;br /&gt;
&lt;br /&gt;
Let's now have a look at the different types of tech review. These are not always the task of three separate people — it is entirely possible for a single person to act in all three capacities if you wish.&lt;br /&gt;
&lt;br /&gt;
===Technical review/edit===&lt;br /&gt;
&lt;br /&gt;
As indicated before, this is a review involved with helping to improve the technical content of the article.&lt;br /&gt;
&lt;br /&gt;
Things to look out for:&lt;br /&gt;
&lt;br /&gt;
* Facts and descriptions that are inaccurate or wrong&lt;br /&gt;
* Inconsistent code style&lt;br /&gt;
* Code that breaks recognised best practices (for example only using a single vendor prefix on your CSS properties, missing alt text on HTML images, no labels on form elements)&lt;br /&gt;
* Code that doesn't work cross browser&lt;br /&gt;
* Code that works, but is really slow/inefficient and could be improved upon&lt;br /&gt;
* Code that needs more explanation to be understandable&lt;br /&gt;
* Too many assumptions in terms of the reader's existing knowledge, for example expecting the reader to understand closures when it is a beginner's JavaScript article&lt;br /&gt;
* The other end of the scale — including too much waffle and baby steps when the reader is past that stage already&lt;br /&gt;
Anything that you feel should be added/expanded on&lt;br /&gt;
* Explanation that is poorly written and therefore doesn't do its job&lt;br /&gt;
* Typos in the code&lt;br /&gt;
&lt;br /&gt;
===Development edit===&lt;br /&gt;
&lt;br /&gt;
This is more concerned with making higher level changes - to the structure or scope of the article. Instead of making micro-changes to small details, you should be more concerned with moving section around, and suggesting section additions or changes.&lt;br /&gt;
&lt;br /&gt;
Things to look out for:&lt;br /&gt;
&lt;br /&gt;
* Places where the article deviates from the original description or scope. This is not always a bad thing, but you should at least flag it up.&lt;br /&gt;
* Places where the order of sections or flow of content seems illogical or wrong, and could be improved&lt;br /&gt;
* Places where the article appears to have chunks missing, or superfluous content.&lt;br /&gt;
&lt;br /&gt;
===Language review===&lt;br /&gt;
&lt;br /&gt;
This refers to a copy edit or proof read. Here you are not concerned with the code/meaning; purely with the actual language, meaning the spelling, grammar and style. &lt;br /&gt;
&lt;br /&gt;
Things to look out for:&lt;br /&gt;
&lt;br /&gt;
* Spelling/typos in the explanation&lt;br /&gt;
* Bad grammar&lt;br /&gt;
* Incorrect word usage&lt;br /&gt;
* Really long, run-on sentences that really should be broken up&lt;br /&gt;
* Inconsistencies in style of terminology, for example saying &amp;quot;Next I'll do this&amp;quot; in one place and &amp;quot;Next we'll do this&amp;quot; somewhere else, or saying &amp;quot;Multi-col&amp;quot; in one place and &amp;quot;Multicol&amp;quot; in other places. We already have a [http://www.w3.org/community/webed/wiki/Web_Education_community_group_style_guide style guide], but it needs adding to.&lt;br /&gt;
* Explanation that just doesn't makes sense, and needs rewriting or making clearer&lt;br /&gt;
* Really waffly text that takes ages to make a point. Text should be clear and concise wherever possible.&lt;/div&gt;</description>
			<pubDate>Wed, 23 May 2012 12:25:02 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:How_to_review_an_article</comments>		</item>
		<item>
			<title>How to review an article</title>
			<link>http://www.w3.org/community/webed/wiki/How_to_review_an_article</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this article I will give you some tips on reviewing articles for others, along with thoughts on what you should be looking out for.&lt;br /&gt;
&lt;br /&gt;
To start with, you should think about what type of review you are doing:&lt;br /&gt;
&lt;br /&gt;
# Are you editing the article, or have you been asked just to give comments?&lt;br /&gt;
# Are you commenting on the technical content, the article structure/high level content, the spelling/grammar, or all of them?&lt;br /&gt;
&lt;br /&gt;
We'll look at general tips first, and then follow up with mini-guides to help with the different situations outlined in the above bullets.&lt;br /&gt;
&lt;br /&gt;
Note: There are different terms you'll come across that describe the activities we are talking about in this article. You'll hear:&lt;br /&gt;
&lt;br /&gt;
* development editing — this tends to refer to doing high level work on the article&lt;br /&gt;
* technical editing and technical reviewing&lt;br /&gt;
* copy editing&lt;br /&gt;
* proof reading&lt;br /&gt;
&lt;br /&gt;
==Reviewing: general==&lt;br /&gt;
&lt;br /&gt;
== editing and commenting ==&lt;br /&gt;
&lt;br /&gt;
===When editing===&lt;br /&gt;
&lt;br /&gt;
===When you are just reviewing===&lt;br /&gt;
&lt;br /&gt;
==Different types of review==&lt;br /&gt;
&lt;br /&gt;
===Technical review===&lt;br /&gt;
&lt;br /&gt;
===Development edit===&lt;br /&gt;
&lt;br /&gt;
===Language review===&lt;/div&gt;</description>
			<pubDate>Tue, 22 May 2012 17:52:50 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:How_to_review_an_article</comments>		</item>
		<item>
			<title>How to write an article</title>
			<link>http://www.w3.org/community/webed/wiki/How_to_write_an_article</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There isn't really any single right way to write a tech article, but as with all things, there are mistakes to be made, and things to stay away from. In this article I'm going to give you a loose process to follow when writing an article, as well as some rules/points to keep in mind that may make life easier.&lt;br /&gt;
&lt;br /&gt;
== Process for writing an article ==&lt;br /&gt;
&lt;br /&gt;
So, let's go! When writing an article, I would suggest you follow the below steps. When you become more confident at writing articles, you can probably drop or few or build your own process. It's all about having a workflow that works for you. &lt;br /&gt;
&lt;br /&gt;
===Make it clear what you're writing about===&lt;br /&gt;
&lt;br /&gt;
When you are writing about a topic, make sure that it is clear in your head what you are writing about, and that you can easily communicate that to others. When you want to write an article or series of articles, start by writing:&lt;br /&gt;
&lt;br /&gt;
* A placeholder title, for example &amp;quot;CSS animation basics&amp;quot;. Don't obsess about this right now — you can always change it later. &lt;br /&gt;
* A list of required knowledge for your article, eg &amp;quot;Intermediate to advanced HTML, basic CSS.&amp;quot;&lt;br /&gt;
* A single sentence that describes clearly what the purpose of your writing is. For example &amp;quot;An introductory tutorial that teaches the basics of CSS animations.&amp;quot;&lt;br /&gt;
* An extended outline/abstract that says what your article does, like so:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;This article gives a bit of background on CSS animations then dives into a step-by-step tutorial to show how to build a working animation. Along the way we'll explain what all the related properties and their different values do, what browser support is like, how to provide fallbacks for older browsers.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
It is important to get this information straight in your head before you write an article. If you are not clear on the scope and can't explain it to others, then you will probably find it harder to write about. This is not to say that the scope cannot change as you write the article. But try to keep &amp;quot;scope creep down&amp;quot; as much as possible. Other things can be covered in later articles.&lt;br /&gt;
&lt;br /&gt;
=== Write a clear structure, and loosely stick to it ===&lt;br /&gt;
&lt;br /&gt;
Write out all the top level headings that you will include in the article, to give you a good idea of what the structure will be before you start. For example, in my recent [http://dev.opera.com/articles/view/css3-animations/ Making a move with CSS animations] article, I first wrote out the structure like this:&lt;br /&gt;
&lt;br /&gt;
* Making a move with CSS animations&lt;br /&gt;
** Introduction&lt;br /&gt;
** How mature is the technology?&lt;br /&gt;
** Basic syntax&lt;br /&gt;
*** Defining an animation&lt;br /&gt;
*** Applying an animation&lt;br /&gt;
*** How many times do we want it to happen?&lt;br /&gt;
*** Varying animation rate&lt;br /&gt;
*** Animation delays&lt;br /&gt;
*** Start to end, or back and forth?&lt;br /&gt;
*** animation-fill-mode&lt;br /&gt;
** Animation shorthand&lt;br /&gt;
** A More involved example&lt;br /&gt;
** Summary&lt;br /&gt;
&lt;br /&gt;
Then I filled in all the gaps between the headings. Again, the structure can (and probably will) change somewhat as you are writing it, but you will find things easier if you have an idea of the structure before you start writing, and you can see how much you've got left to write.&lt;br /&gt;
&lt;br /&gt;
If the material ends up taking up more than one article, that is fine. Just write more than one outline, and deal with them separately.&lt;br /&gt;
&lt;br /&gt;
=== Make sure the theory works in practice===&lt;br /&gt;
&lt;br /&gt;
This is not something I always do, but I would advise it wherever possible. Before you start writing about some code that you think should be possible to implement, try it out first to make sure it'll actually work; a stripped down skeleton version at least. I've had a problem a couple of times where I have ended up having to rewrite an article quite significantly because a fundamental part of my code doesn't actually work in practice for whatever reason. &lt;br /&gt;
&lt;br /&gt;
=== Write clearly and purposefully ===&lt;br /&gt;
&lt;br /&gt;
In terms of actual writing conventions, we have started to put together a [http://www.w3.org/community/webed/wiki/Web_Education_community_group_style_guide Web Education community group style guide] for your to follow. You should feel free to add to this as well if you have any good points to make.&lt;br /&gt;
&lt;br /&gt;
Your personal writing style is a different matter. I personally don't want to chain everyone to a strict corporate writing style, because &lt;br /&gt;
&lt;br /&gt;
# I think that is boring&lt;br /&gt;
# It is a community site, so shouldn't have a single regimented author voice&lt;br /&gt;
&lt;br /&gt;
So your writing styles can vary quite widely. What I would like to stress though, is that you should make your writing as clear and purposeful as possible. Remember that you are writing educational material to help people learn, not the old testament or Lord of the rings. A bit of flowery poetic language is good for making things more interesting in place of Lorem Ipsum inside a code example, but it is no good if it gets in the way of understanding the explanation of that example.&lt;br /&gt;
&lt;br /&gt;
And I believe a bit of humour is always good in technical tutorials/references, to break up the monotony and make things a bit more fun. But if it is too often and too extreme, it can become tiresome and put some people off.&lt;br /&gt;
&lt;br /&gt;
Remember that tenet about making your web content accessible to as wide a variety of users as possible? This refers to human language content too!&lt;br /&gt;
&lt;br /&gt;
=== Get your first draft reviewed===&lt;br /&gt;
&lt;br /&gt;
Once you've written a relatively stable first draft, get it looked over by 2 or 3 peers whom you trust. Get them to give you feedback on how the article is progressing, what is good, what could be added to make things better, and what needs improving. See [[How to review an article]] for more details on how to provide feedback.&lt;br /&gt;
&lt;br /&gt;
You should send your article out for review when it is functionallty complete, but not perfect. You needn't get all details make absolutely perfect at this stage — getting feedback is what a first draft is for! But you should also make sure that you haven't got loads of unwritten code examples and section of prose at the point where you submit it.&lt;br /&gt;
&lt;br /&gt;
===Rewrite and encourage contributions from others ===&lt;br /&gt;
&lt;br /&gt;
Once you've got feedback from others, start rewriting the article to fix the problems that have been brought up. And since this is a community effort, we should try to become as comfortable as possible with:&lt;br /&gt;
&lt;br /&gt;
# Editing other people's work&lt;br /&gt;
# Having our material edited by others&lt;br /&gt;
&lt;br /&gt;
Please, when you've submitted an article for first draft, encourage others to add to it and help improve it.&lt;br /&gt;
&lt;br /&gt;
===Get a copy edit/final proof===&lt;br /&gt;
&lt;br /&gt;
When you think the article is completely finished in terms of technical content, it is a good idea to get it proof read/copy edited. Don't get the proof reader/editor to delve deep into the code and the fundamental article structure at this stage: This should be a final check just to get rid of any last minute typos and other article silliness that might still be present.&lt;br /&gt;
&lt;br /&gt;
At this stage, if the proof reader/editor does uncover a major issue with the article, it is probably better to delay publication and work out what to do to sort it out.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Tell the world===&lt;br /&gt;
&lt;br /&gt;
Once your article is published, send a link to it to the [mailto:public-webed@w3.org Web ED CG public mailing list] to tell us all it has been published. Ask us nicely to help promote it via whatever appropriate means we have available. Ideas:&lt;br /&gt;
&lt;br /&gt;
* Twitter&lt;br /&gt;
* Facebook&lt;br /&gt;
* List of educators&lt;br /&gt;
* Forrst&lt;br /&gt;
* add your ideas here&lt;br /&gt;
&lt;br /&gt;
== Rules of article writing ==&lt;br /&gt;
&lt;br /&gt;
These are not hard and fast &amp;quot;must do&amp;quot; rules, rather they are just suggestions that will make your life easier.&lt;br /&gt;
&lt;br /&gt;
===The Queen's English?===&lt;br /&gt;
&lt;br /&gt;
In terms of your writing style, you don't need to obsess about using completely correct &amp;quot;queen's english&amp;quot;; your writing being readable and clear is more important.&lt;br /&gt;
&lt;br /&gt;
===Don't obsess over perfection===&lt;br /&gt;
&lt;br /&gt;
At least, not at first draft stage. I've seen so many books and online resource delivered late because the author just couldn't stop obsessing over the details and fine tuning. As I said above, a first draft should be functionally complete, but not perfect. You and other contributors can work together in harmony to sort out all the problems as you go along. Learn to chill out and let go, and ask for help.&lt;br /&gt;
&lt;br /&gt;
===Set reasonable deadlines===&lt;br /&gt;
&lt;br /&gt;
You will inevitably be able to write an article more effectively if you set yourself a realistic deadline to meet. Don't try to do it in the next 12 hours because it won't happen. but don't make it too long either, otherwise you'll lose momentum and interest.&lt;br /&gt;
&lt;br /&gt;
Only you truly know how busy you are, and how long it will likely take you to write an article. If you really have no idea how long it will take, just set aside an evening, sit down, and try writing a third of the article structure, to try to give yourself an idea. I usually find it helps to split the work into a few sessions, like say 2-3 evenings to write an article. &lt;br /&gt;
&lt;br /&gt;
You need to discipline yourself a bit, otherwise it won't happen.&lt;br /&gt;
&lt;br /&gt;
===Save your work often===&lt;br /&gt;
&lt;br /&gt;
This is pretty obvious, but the number of times you'll lose work because of crashes or stupid mistakes is crazy. I tend to write my articles in a plain text editor, not a big WP package like Word or Pages, because text editors aren't as prone to crashes. If you are writing content for the web, you don't need a word processor anyway.&lt;br /&gt;
&lt;br /&gt;
I also tend to create and save my work straight inside a git repo, and add/commit regularly so that you have a record of what you did, in case you mess up and need to revert to an earlier version.&lt;/div&gt;</description>
			<pubDate>Tue, 22 May 2012 17:13:09 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:How_to_write_an_article</comments>		</item>
		<item>
			<title>How to write an article</title>
			<link>http://www.w3.org/community/webed/wiki/How_to_write_an_article</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There isn't really any single right way to write a tech article, but as with all things, there are mistakes to be made, and things to stay away from. In this article I'm going to give you a loose process to follow when writing an article, as well as some rules/points to keep in mind that may make life easier.&lt;br /&gt;
&lt;br /&gt;
== Process for writing an article ==&lt;br /&gt;
&lt;br /&gt;
So, let's go! When writing an article, I would suggest you follow the below steps. When you become more confident at writing articles, you can probably drop or few or build your own process. It's all about having a workflow that works for you. &lt;br /&gt;
&lt;br /&gt;
===Make it clear what you're writing about===&lt;br /&gt;
&lt;br /&gt;
When you are writing about a topic, make sure that it is clear in your head what you are writing about, and that you can easily communicate that to others. When you want to write an article or series of articles, start by writing:&lt;br /&gt;
&lt;br /&gt;
* A placeholder title, for example &amp;quot;CSS animation basics&amp;quot;. Don't obsess about this right now — you can always change it later. &lt;br /&gt;
* A list of required knowledge for your article, eg &amp;quot;Intermediate to advanced HTML, basic CSS.&amp;quot;&lt;br /&gt;
* A single sentence that describes clearly what the purpose of your writing is. For example &amp;quot;An introductory tutorial that teaches the basics of CSS animations.&amp;quot;&lt;br /&gt;
* An extended outline/abstract that says what your article does, like so:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;This article gives a bit of background on CSS animations then dives into a step-by-step tutorial to show how to build a working animation. Along the way we'll explain what all the related properties and their different values do, what browser support is like, how to provide fallbacks for older browsers.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
It is important to get this information straight in your head before you write an article. If you are not clear on the scope and can't explain it to others, then you will probably find it harder to write about. This is not to say that the scope cannot change as you write the article. But try to keep &amp;quot;scope creep down&amp;quot; as much as possible. Other things can be covered in later articles.&lt;br /&gt;
&lt;br /&gt;
=== Write a clear structure, and loosely stick to it ===&lt;br /&gt;
&lt;br /&gt;
Write out all the top level headings that you will include in the article, to give you a good idea of what the structure will be before you start. For example, in my recent [http://dev.opera.com/articles/view/css3-animations/ Making a move with CSS animations] article, I first wrote out the structure like this:&lt;br /&gt;
&lt;br /&gt;
* Making a move with CSS animations&lt;br /&gt;
** Introduction&lt;br /&gt;
** How mature is the technology?&lt;br /&gt;
** Basic syntax&lt;br /&gt;
*** Defining an animation&lt;br /&gt;
*** Applying an animation&lt;br /&gt;
*** How many times do we want it to happen?&lt;br /&gt;
*** Varying animation rate&lt;br /&gt;
*** Animation delays&lt;br /&gt;
*** Start to end, or back and forth?&lt;br /&gt;
*** animation-fill-mode&lt;br /&gt;
** Animation shorthand&lt;br /&gt;
** A More involved example&lt;br /&gt;
** Summary&lt;br /&gt;
&lt;br /&gt;
Then I filled in all the gaps between the headings. Again, the structure can (and probably will) change somewhat as you are writing it, but you will find things easier if you have an idea of the structure before you start writing, and you can see how much you've got left to write.&lt;br /&gt;
&lt;br /&gt;
If the material ends up taking up more than one article, that is fine. Just write more than one outline, and deal with them separately.&lt;br /&gt;
&lt;br /&gt;
=== Make sure the theory works in practice===&lt;br /&gt;
&lt;br /&gt;
This is not something I always do, but I would advise it wherever possible. Before you start writing about some code that you think should be possible to implement, try it out first to make sure it'll actually work; a stripped down skeleton version at least. I've had a problem a couple of times where I have ended up having to rewrite an article quite significantly because a fundamental part of my code doesn't actually work in practice for whatever reason. &lt;br /&gt;
&lt;br /&gt;
=== Write clearly and purposefully ===&lt;br /&gt;
&lt;br /&gt;
In terms of actual writing conventions, we have started to put together a [http://www.w3.org/community/webed/wiki/Web_Education_community_group_style_guide Web Education community group style guide] for your to follow. You should feel free to add to this as well if you have any good points to make.&lt;br /&gt;
&lt;br /&gt;
Your personal writing style is a different matter. I personally don't want to chain everyone to a strict corporate writing style, because &lt;br /&gt;
&lt;br /&gt;
# I think that is boring&lt;br /&gt;
# It is a community site, so shouldn't have a single regimented author voice&lt;br /&gt;
&lt;br /&gt;
So your writing styles can vary quite widely. What I would like to stress though, is that you should make your writing as clear and purposeful as possible. Remember that you are writing educational material to help people learn, not the old testament or Lord of the rings. A bit of flowery poetic language is good for making things more interesting in place of Lorem Ipsum inside a code example, but it is no good if it gets in the way of understanding the explanation of that example.&lt;br /&gt;
&lt;br /&gt;
And I believe a bit of humour is always good in technical tutorials/references, to break up the monotony and make things a bit more fun. But if it is too often and too extreme, it can become tiresome and put some people off.&lt;br /&gt;
&lt;br /&gt;
Remember that tenet about making your web content accessible to as wide a variety of users as possible? This refers to human language content too!&lt;br /&gt;
&lt;br /&gt;
=== Get your first draft reviewed===&lt;br /&gt;
&lt;br /&gt;
Once you've written a relatively stable first draft, get it looked over by 2 or 3 peers whom you trust. Get them to give you feedback on how the article is progressing, what is good, what could be added to make things better, and what needs improving. See [[How to review an article]] for more details on how to provide feedback.&lt;br /&gt;
&lt;br /&gt;
You should send your article out for review when it is functionallty complete, but not perfect. You needn't get all details make absolutely perfect at this stage — getting feedback is what a first draft is for! But you should also make sure that you haven't got loads of unwritten code examples and section of prose at the point where you submit it.&lt;br /&gt;
&lt;br /&gt;
===Rewrite and encourage contributions from others ===&lt;br /&gt;
&lt;br /&gt;
Once you've got feedback from others, start rewriting the article to fix the problems that have been brought up. And since this is a community effort, we should try to become as comfortable as possible with:&lt;br /&gt;
&lt;br /&gt;
# Editing other people's work&lt;br /&gt;
# Having our material edited by others&lt;br /&gt;
&lt;br /&gt;
Please, when you've submitted an article for first draft, encourage others to add to it and help improve it.&lt;br /&gt;
&lt;br /&gt;
===Get a copy edit/final proof===&lt;br /&gt;
&lt;br /&gt;
When you think the article is completely finished in terms of technical content, it is a good idea to get it proof read/copy edited. Don't get the proof reader/editor to delve deep into the code and the fundamental article structure at this stage: This should be a final check just to get rid of any last minute typos and other article silliness that might still be present.&lt;br /&gt;
&lt;br /&gt;
At this stage, if the proof reader/editor does uncover a major issue with the article, it is probably better to delay publication and work out what to do to sort it out.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Tell the world===&lt;br /&gt;
&lt;br /&gt;
Once your article is published, send a link to it to the [mailto:public-webed@w3.org Web ED CG public mailing list] to tell us all it has been published. Ask us nicely to help promote it via whatever appropriate means we have available. Ideas:&lt;br /&gt;
&lt;br /&gt;
* Twitter&lt;br /&gt;
* Facebook&lt;br /&gt;
* List of educators&lt;br /&gt;
* Forrst&lt;br /&gt;
* add your ideas here&lt;br /&gt;
&lt;br /&gt;
== Rules of article writing ==&lt;br /&gt;
&lt;br /&gt;
These are not hard and fast &amp;quot;must do&amp;quot; rules, rather they are just suggestions that will make your life easier.&lt;br /&gt;
&lt;br /&gt;
===The Queen's English?===&lt;br /&gt;
&lt;br /&gt;
In terms of your writing style, you don't need to obsess about using completely correct &amp;quot;queen's english&amp;quot;; your writing being readable and clear is more important.&lt;br /&gt;
&lt;br /&gt;
===Don't obsess over perfection===&lt;br /&gt;
&lt;br /&gt;
At least, not at first draft stage. I've seen so many books and online resource delivered late because the author just couldn't stop obsessing over the details and fine tuning. As I said above, a first draft should be functionally complete, but not perfect. You and other contributors can work together in harmony to sort out all the problems as you go along. Learn to chill out and let go, and ask for help.&lt;br /&gt;
&lt;br /&gt;
===Set reasonable deadlines===&lt;br /&gt;
&lt;br /&gt;
You will inevitably be able to write an article more effectively if you set yourself a realistic deadline to meet. Don't try to do it in the next 12 hours because it won't happen. but don't make it too long either, otherwise you'll lose momentum and interest.&lt;br /&gt;
&lt;br /&gt;
Only you truly know how busy you are, and how long it will likely take you to write an article. If you really have no idea how long it will take, just set aside an evening, sit down, and try writing a third of the article structure, to try to give yourself an idea. I usually find it helps to split the work into a few sessions, like say 2-3 evenings to write an article. &lt;br /&gt;
&lt;br /&gt;
You need to discipline yourself a bit, otherwise it won't happen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Save your work often===&lt;br /&gt;
&lt;br /&gt;
This is pretty obvious, but the number of times you'll lose work because of crashes or stupid mistakes is crazy. I tend to write my articles in a plain text editor, not a big WP package like Word or Pages, because text editors aren't as prone to crashes. If you are writing content for the web, you don't need a word processor anyway.&lt;br /&gt;
&lt;br /&gt;
I also tend to create and save my work straight inside a git repo, and add/commit regularly so that you have a record of what you did, in case you mess up and need to revert to an earlier version.&lt;/div&gt;</description>
			<pubDate>Tue, 22 May 2012 17:12:46 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:How_to_write_an_article</comments>		</item>
		<item>
			<title>How to write an article</title>
			<link>http://www.w3.org/community/webed/wiki/How_to_write_an_article</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There isn't really any single right way to write a tech article, but as with all things, there are mistakes to be made, and things to stay away from. In this article I'm going to give you a loose process to follow when writing an article, as well as some rules/points to keep in mind that may make life easier.&lt;br /&gt;
&lt;br /&gt;
== Process for writing an article ==&lt;br /&gt;
&lt;br /&gt;
So, let's go! When writing an article, I would suggest you follow the below steps. When you become more confident at writing articles, you can probably drop or few or build your own process. It's all about having a workflow that works for you. &lt;br /&gt;
&lt;br /&gt;
===Make it clear what you're writing about===&lt;br /&gt;
&lt;br /&gt;
When you are writing about a topic, make sure that it is clear in your head what you are writing about, and that you can easily communicate that to others. When you want to write an article or series of articles, start by writing:&lt;br /&gt;
&lt;br /&gt;
* A placeholder title, for example &amp;quot;CSS animation basics&amp;quot;. Don't obsess about this right now — you can always change it later. &lt;br /&gt;
* A list of required knowledge for your article, eg &amp;quot;Intermediate to advanced HTML, basic CSS.&amp;quot;&lt;br /&gt;
* A single sentence that describes clearly what the purpose of your writing is. For example &amp;quot;An introductory tutorial that teaches the basics of CSS animations.&amp;quot;&lt;br /&gt;
* An extended outline/abstract that says what your article does, like so:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;This article gives a bit of background on CSS animations then dives into a step-by-step tutorial to show how to build a working animation. Along the way we'll explain what all the related properties and their different values do, what browser support is like, how to provide fallbacks for older browsers.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
It is important to get this information straight in your head before you write an article. If you are not clear on the scope and can't explain it to others, then you will probably find it harder to write about. This is not to say that the scope cannot change as you write the article. But try to keep &amp;quot;scope creep down&amp;quot; as much as possible. Other things can be covered in later articles.&lt;br /&gt;
&lt;br /&gt;
=== Write a clear structure, and loosely stick to it ===&lt;br /&gt;
&lt;br /&gt;
Write out all the top level headings that you will include in the article, to give you a good idea of what the structure will be before you start. For example, in my recent [http://dev.opera.com/articles/view/css3-animations/ Making a move with CSS animations] article, I first wrote out the structure like this:&lt;br /&gt;
&lt;br /&gt;
* Making a move with CSS animations&lt;br /&gt;
** Introduction&lt;br /&gt;
** How mature is the technology?&lt;br /&gt;
** Basic syntax&lt;br /&gt;
*** Defining an animation&lt;br /&gt;
*** Applying an animation&lt;br /&gt;
*** How many times do we want it to happen?&lt;br /&gt;
*** Varying animation rate&lt;br /&gt;
*** Animation delays&lt;br /&gt;
*** Start to end, or back and forth?&lt;br /&gt;
*** animation-fill-mode&lt;br /&gt;
** Animation shorthand&lt;br /&gt;
** A More involved example&lt;br /&gt;
** Summary&lt;br /&gt;
&lt;br /&gt;
Then I filled in all the gaps between the headings. Again, the structure can (and probably will) change somewhat as you are writing it, but you will find things easier if you have an idea of the structure before you start writing, and you can see how much you've got left to write.&lt;br /&gt;
&lt;br /&gt;
If the material ends up taking up more than one article, that is fine. Just write more than one outline, and deal with them separately.&lt;br /&gt;
&lt;br /&gt;
=== Make sure the theory works in practice===&lt;br /&gt;
&lt;br /&gt;
This is not something I always do, but I would advise it wherever possible. Before you start writing about some code that you think should be possible to implement, try it out first to make sure it'll actually work; a stripped down skeleton version at least. I've had a problem a couple of times where I have ended up having to rewrite an article quite significantly because a fundamental part of my code doesn't actually work in practice for whatever reason. &lt;br /&gt;
&lt;br /&gt;
=== Write clearly and purposefully ===&lt;br /&gt;
&lt;br /&gt;
In terms of actual writing conventions, we have started to put together a [http://www.w3.org/community/webed/wiki/Web_Education_community_group_style_guide Web Education community group style guide] for your to follow. You should feel free to add to this as well if you have any good points to make.&lt;br /&gt;
&lt;br /&gt;
Your personal writing style is a different matter. I personally don't want to chain everyone to a strict corporate writing style, because &lt;br /&gt;
&lt;br /&gt;
# I think that is boring&lt;br /&gt;
# It is a community site, so shouldn't have a single regimented author voice&lt;br /&gt;
&lt;br /&gt;
So your writing styles can vary quite widely. What I would like to stress though, is that you should make your writing as clear and purposeful as possible. Remember that you are writing educational material to help people learn, not the old testament or Lord of the rings. A bit of flowery poetic language is good for making things more interesting in place of Lorem Ipsum inside a code example, but it is no good if it gets in the way of understanding the explanation of that example.&lt;br /&gt;
&lt;br /&gt;
And I believe a bit of humour is always good in technical tutorials/references, to break up the monotony and make things a bit more fun. But if it is too often and too extreme, it can become tiresome and put some people off.&lt;br /&gt;
&lt;br /&gt;
Remember that tenet about making your web content accessible to as wide a variety of users as possible? This refers to human language content too!&lt;br /&gt;
&lt;br /&gt;
=== Get your first draft reviewed===&lt;br /&gt;
&lt;br /&gt;
Once you've written a relatively stable first draft, get it looked over by 2 or 3 peers whom you trust. Get them to give you feedback on how the article is progressing, what is good, what could be added to make things better, and what needs improving. See [[How to review an article]] for more details on how to provide feedback.&lt;br /&gt;
&lt;br /&gt;
You should send your article out for review when it is functionallty complete, but not perfect. You needn't get all details make absolutely perfect at this stage — getting feedback is what a first draft is for! But you should also make sure that you haven't got loads of unwritten code examples and section of prose at the point where you submit it.&lt;br /&gt;
&lt;br /&gt;
===Rewrite and encourage contributions from others ===&lt;br /&gt;
&lt;br /&gt;
Once you've got feedback from others, start rewriting the article to fix the problems that have been brought up. And since this is a community effort, we should try to become as comfortable as possible with:&lt;br /&gt;
&lt;br /&gt;
# Editing other people's work&lt;br /&gt;
# Having our material edited by others&lt;br /&gt;
&lt;br /&gt;
Please, when you've submitted an article for first draft, encourage others to add to it and help improve it.&lt;br /&gt;
&lt;br /&gt;
===Get a copy edit/final proof===&lt;br /&gt;
&lt;br /&gt;
When you think the article is completely finished in terms of technical content, it is a good idea to get it proof read/copy edited. Don't get the proof reader/editor to delve deep into the code and the fundamental article structure at this stage: This should be a final check just to get rid of any last minute typos and other article silliness that might still be present.&lt;br /&gt;
&lt;br /&gt;
At this stage, if the proof reader/editor does uncover a major issue with the article, it is probably better to delay publication and work out what to do to sort it out.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Tell the world===&lt;br /&gt;
&lt;br /&gt;
Once your article is published, send a link to it to the [mailto:public-webed@w3.org Web ED CG public mailing list] to tell us all it has been published. Ask us nicely to help promote it via whatever appropriate means we have available. Ideas:&lt;br /&gt;
&lt;br /&gt;
* Twitter&lt;br /&gt;
* Facebook&lt;br /&gt;
* List of educators&lt;br /&gt;
* Forrst&lt;br /&gt;
* add your ideas here&lt;br /&gt;
&lt;br /&gt;
== Rules of article writing ==&lt;br /&gt;
&lt;br /&gt;
These are not hard and fast &amp;quot;must do&amp;quot; rules, rather they are just suggestions that will make your life easier.&lt;br /&gt;
&lt;br /&gt;
===The Queen's English?===&lt;br /&gt;
&lt;br /&gt;
In terms of your writing style, you don't need to obsess about using completely correct &amp;quot;queen's english&amp;quot;; your writing being readable and clear is more important.&lt;br /&gt;
&lt;br /&gt;
===Don't obsess over perfection===&lt;br /&gt;
&lt;br /&gt;
At least, not at first draft stage. I've seen so many books and online resource delivered late because the author just couldn't stop obsessing over the details and fine tuning. As I said above, a first draft should be functionally complete, but not perfect. You and other contributors can work together in harmony to sort out all the problems as you go along. Learn to chill out and let go, and ask for help.&lt;br /&gt;
&lt;br /&gt;
===Set reasonable deadlines===&lt;br /&gt;
&lt;br /&gt;
You will inevitably &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Use reasonable assets for your medium===&lt;/div&gt;</description>
			<pubDate>Tue, 22 May 2012 16:59:21 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:How_to_write_an_article</comments>		</item>
		<item>
			<title>How to write an article</title>
			<link>http://www.w3.org/community/webed/wiki/How_to_write_an_article</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There isn't really any single right way to write a tech article, but as with all things, there are mistakes to be made, and things to stay away from. In this article I'm going to give you a loose process to follow when writing an article, as well as some rules/points to keep in mind that may make life easier.&lt;br /&gt;
&lt;br /&gt;
== Process for writing an article ==&lt;br /&gt;
&lt;br /&gt;
So, let's go! When writing an article, I would suggest you follow the below steps. When you become more confident at writing articles, you can probably drop or few or build your own process. It's all about having a workflow that works for you. &lt;br /&gt;
&lt;br /&gt;
===Make it clear what you're writing about===&lt;br /&gt;
&lt;br /&gt;
When you are writing about a topic, make sure that it is clear in your head what you are writing about, and that you can easily communicate that to others. When you want to write an article or series of articles, start by writing:&lt;br /&gt;
&lt;br /&gt;
* A placeholder title, for example &amp;quot;CSS animation basics&amp;quot;. Don't obsess about this right now — you can always change it later. &lt;br /&gt;
* A list of required knowledge for your article, eg &amp;quot;Intermediate to advanced HTML, basic CSS.&amp;quot;&lt;br /&gt;
* A single sentence that describes clearly what the purpose of your writing is. For example &amp;quot;An introductory tutorial that teaches the basics of CSS animations.&amp;quot;&lt;br /&gt;
* An extended outline/abstract that says what your article does, like so:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;This article gives a bit of background on CSS animations then dives into a step-by-step tutorial to show how to build a working animation. Along the way we'll explain what all the related properties and their different values do, what browser support is like, how to provide fallbacks for older browsers.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
It is important to get this information straight in your head before you write an article. If you are not clear on the scope and can't explain it to others, then you will probably find it harder to write about. This is not to say that the scope cannot change as you write the article. But try to keep &amp;quot;scope creep down&amp;quot; as much as possible. Other things can be covered in later articles.&lt;br /&gt;
&lt;br /&gt;
=== Write a clear structure, and loosely stick to it ===&lt;br /&gt;
&lt;br /&gt;
Write out all the top level headings that you will include in the article, to give you a good idea of what the structure will be before you start. For example, in my recent [http://dev.opera.com/articles/view/css3-animations/ Making a move with CSS animations] article, I first wrote out the structure like this:&lt;br /&gt;
&lt;br /&gt;
* Making a move with CSS animations&lt;br /&gt;
** Introduction&lt;br /&gt;
** How mature is the technology?&lt;br /&gt;
** Basic syntax&lt;br /&gt;
*** Defining an animation&lt;br /&gt;
*** Applying an animation&lt;br /&gt;
*** How many times do we want it to happen?&lt;br /&gt;
*** Varying animation rate&lt;br /&gt;
*** Animation delays&lt;br /&gt;
*** Start to end, or back and forth?&lt;br /&gt;
*** animation-fill-mode&lt;br /&gt;
** Animation shorthand&lt;br /&gt;
** A More involved example&lt;br /&gt;
** Summary&lt;br /&gt;
&lt;br /&gt;
Then I filled in all the gaps between the headings. Again, the structure can (and probably will) change somewhat as you are writing it, but you will find things easier if you have an idea of the structure before you start writing, and you can see how much you've got left to write.&lt;br /&gt;
&lt;br /&gt;
If the material ends up taking up more than one article, that is fine. Just write more than one outline, and deal with them separately.&lt;br /&gt;
&lt;br /&gt;
=== Make sure the theory works in practice===&lt;br /&gt;
&lt;br /&gt;
This is not something I always do, but I would advise it wherever possible. Before you start writing about some code that you think should be possible to implement, try it out first to make sure it'll actually work; a stripped down skeleton version at least. I've had a problem a couple of times where I have ended up having to rewrite an article quite significantly because a fundamental part of my code doesn't actually work in practice for whatever reason. &lt;br /&gt;
&lt;br /&gt;
=== Write clearly and purposefully ===&lt;br /&gt;
&lt;br /&gt;
In terms of actual writing conventions, we have started to put together a [http://www.w3.org/community/webed/wiki/Web_Education_community_group_style_guide Web Education community group style guide] for your to follow. You should feel free to add to this as well if you have any good points to make.&lt;br /&gt;
&lt;br /&gt;
Your personal writing style is a different matter. I personally don't want to chain everyone to a strict corporate writing style, because &lt;br /&gt;
&lt;br /&gt;
# I think that is boring&lt;br /&gt;
# It is a community site, so shouldn't have a single regimented author voice&lt;br /&gt;
&lt;br /&gt;
So your writing styles can vary quite widely. What I would like to stress though, is that you should make your writing as clear and purposeful as possible. Remember that you are writing educational material to help people learn, not the old testament or Lord of the rings. A bit of flowery poetic language is good for making things more interesting in place of Lorem Ipsum inside a code example, but it is no good if it gets in the way of understanding the explanation of that example.&lt;br /&gt;
&lt;br /&gt;
And I believe a bit of humour is always good in technical tutorials/references, to break up the monotony and make things a bit more fun. But if it is too often and too extreme, it can become tiresome and put some people off.&lt;br /&gt;
&lt;br /&gt;
Remember that tenet about making your web content accessible to as wide a variety of users as possible? This refers to human language content too!&lt;br /&gt;
&lt;br /&gt;
=== Get your first draft reviewed===&lt;br /&gt;
&lt;br /&gt;
Once you've written a relatively stable first draft, get it looked over by 2 or 3 peers whom you trust. Get them to give you feedback on how the article is progressing, what is good, what could be added to make things better, and what needs improving. See [[How to review an article]] for more details on how to provide feedback.&lt;br /&gt;
&lt;br /&gt;
===Rewrite and encourage contributions from others ===&lt;br /&gt;
&lt;br /&gt;
===Get a final proof===&lt;br /&gt;
&lt;br /&gt;
===Tell the world===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rules of article writing ==&lt;br /&gt;
&lt;br /&gt;
===The Queen's English?===&lt;br /&gt;
&lt;br /&gt;
===Don't obsess over perfection===&lt;br /&gt;
&lt;br /&gt;
===Set reasonable deadlines===&lt;br /&gt;
&lt;br /&gt;
===Use reasonable assets for your medium===&lt;/div&gt;</description>
			<pubDate>Tue, 22 May 2012 16:14:35 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:How_to_write_an_article</comments>		</item>
		<item>
			<title>How to write an article</title>
			<link>http://www.w3.org/community/webed/wiki/How_to_write_an_article</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There isn't really any single right way to write a tech article, but as with all things, there are mistakes to be made, and things to stay away from. In this article I'm going to give you a loose process to follow when writing an article, as well as some rules/points to keep in mind that may make life easier.&lt;br /&gt;
&lt;br /&gt;
== Process for writing an article ==&lt;br /&gt;
&lt;br /&gt;
So, let's go! When writing an article, I would suggest you follow the below steps. When you become more confident at writing articles, you can probably drop or few or build your own process. It's all about having a workflow that works for you. &lt;br /&gt;
&lt;br /&gt;
===Make it clear what you're writing about===&lt;br /&gt;
&lt;br /&gt;
When you are writing about a topic, make sure that it is clear in your head what you are writing about, and that you can easily communicate that to others. When you want to write an article or series of articles, start by writing:&lt;br /&gt;
&lt;br /&gt;
* A placeholder title, for example &amp;quot;CSS animation basics&amp;quot;. Don't obsess about this right now — you can always change it later. &lt;br /&gt;
* A list of required knowledge for your article, eg &amp;quot;Intermediate to advanced HTML, basic CSS.&amp;quot;&lt;br /&gt;
* A single sentence that describes clearly what the purpose of your writing is. For example &amp;quot;An introductory tutorial that teaches the basics of CSS animations.&amp;quot;&lt;br /&gt;
* An extended outline/abstract that says what your article does, like so:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;This article gives a bit of background on CSS animations then dives into a step-by-step tutorial to show how to build a working animation. Along the way we'll explain what all the related properties and their different values do, what browser support is like, how to provide fallbacks for older browsers.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
It is important to get this information straight in your head before you write an article. If you are not clear on the scope and can't explain it to others, then you will probably find it harder to write about. This is not to say that the scope cannot change as you write the article. But try to keep &amp;quot;scope creep down&amp;quot; as much as possible. Other things can be covered in later articles.&lt;br /&gt;
&lt;br /&gt;
=== Write a clear structure, and loosely stick to it ===&lt;br /&gt;
&lt;br /&gt;
Write out all the top level headings that you will include in the article, to give you a good idea of what the structure will be before you start. For example, in my recent [http://dev.opera.com/articles/view/css3-animations/ Making a move with CSS animations] article, I first wrote out the structure like this:&lt;br /&gt;
&lt;br /&gt;
* Making a move with CSS animations&lt;br /&gt;
** Introduction&lt;br /&gt;
** How mature is the technology?&lt;br /&gt;
** Basic syntax&lt;br /&gt;
*** Defining an animation&lt;br /&gt;
*** Applying an animation&lt;br /&gt;
*** How many times do we want it to happen?&lt;br /&gt;
*** Varying animation rate&lt;br /&gt;
*** Animation delays&lt;br /&gt;
*** Start to end, or back and forth?&lt;br /&gt;
*** animation-fill-mode&lt;br /&gt;
** Animation shorthand&lt;br /&gt;
** A More involved example&lt;br /&gt;
** Summary&lt;br /&gt;
&lt;br /&gt;
Then I filled in all the gaps between the headings. Again, the structure can (and probably will) change somewhat as you are writing it, but you will find things easier if you have an idea of the structure before you start writing, and you can see how much you've got left to write.&lt;br /&gt;
&lt;br /&gt;
If the material ends up taking up more than one article, that is fine. Just write more than one outline, and deal with them separately.&lt;br /&gt;
&lt;br /&gt;
=== Make sure the theory works in practice===&lt;br /&gt;
&lt;br /&gt;
This is not something I always do, but I would advise it wherever possible. Before you start writing about some code that you think should be possible to implement, try it out first to make sure it'll actually work; a stripped down skeleton version at least. I've had a problem a couple of times where I have ended up having to rewrite an article quite significantly because a fundamental part of my code doesn't actually work in practice for whatever reason. &lt;br /&gt;
&lt;br /&gt;
=== Write clearly and purposefully ===&lt;br /&gt;
&lt;br /&gt;
In terms of actual writing conventions, we have started to put together a [http://www.w3.org/community/webed/wiki/Web_Education_community_group_style_guide Web Education community group style guide] for your to follow. You should feel free to add to this as well if you have any good points to make.&lt;br /&gt;
&lt;br /&gt;
Your personal writing style is a different matter. I personally don't want to chain everyone to a strict corporate writing style, because &lt;br /&gt;
&lt;br /&gt;
# I think that is boring&lt;br /&gt;
# It is a community site, so shouldn't have a single regimented author voice&lt;br /&gt;
&lt;br /&gt;
So your writing styles can vary quite widely. What I would like to stress though, is that you should make your writing as clear and purposeful as possible. Remember that you are writing educational material to help people learn, not the old testament or Lord of the rings. A bit of flowery poetic language is good for making things more interesting in place of Lorem Ipsum inside a code example, but it is no good if it gets in the way of understanding the explanation of that example.&lt;br /&gt;
&lt;br /&gt;
And I believe a bit of humour is always good in technical tutorials/references, to break up the monotony and make things a bit more fun. But if it is too often and too extreme, it can become tiresome and put some people off.&lt;br /&gt;
&lt;br /&gt;
Remember that tenet about making your web content accessible to as wide a variety of users as possible? This refers to human language content too!&lt;br /&gt;
&lt;br /&gt;
=== Get your first draft reviewed===&lt;br /&gt;
&lt;br /&gt;
Once you've written a relatively stable first draft, get it looked over by 2 or 3 peers whom you trust. Get them to give you feedback on how the article is progressing, what is good, what could be added to make things better, and what needs improving. See [How to review an article] for more details on how to provide feedback.&lt;br /&gt;
&lt;br /&gt;
===Rewrite and encourage contributions from others ===&lt;br /&gt;
&lt;br /&gt;
===Get a final proof===&lt;br /&gt;
&lt;br /&gt;
===Tell the world===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rules of article writing ==&lt;br /&gt;
&lt;br /&gt;
===The Queen's English?===&lt;br /&gt;
&lt;br /&gt;
===Don't obsess over perfection===&lt;br /&gt;
&lt;br /&gt;
===Set reasonable deadlines===&lt;br /&gt;
&lt;br /&gt;
===Use reasonable assets for your medium===&lt;/div&gt;</description>
			<pubDate>Tue, 22 May 2012 16:14:11 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:How_to_write_an_article</comments>		</item>
		<item>
			<title>How to review an article</title>
			<link>http://www.w3.org/community/webed/wiki/How_to_review_an_article</link>
			<description>&lt;p&gt;Cmills:&amp;#32;Created page with &amp;quot;Welcome to how to review an article&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to how to review an article&lt;/div&gt;</description>
			<pubDate>Tue, 22 May 2012 16:13:21 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:How_to_review_an_article</comments>		</item>
		<item>
			<title>Optimizing content for different browsers: the RIGHT way</title>
			<link>http://www.w3.org/community/webed/wiki/Optimizing_content_for_different_browsers:_the_RIGHT_way</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
If you've done a bit of front-end web development, you're bound to have noticed that not all browsers render ''all web content in exactly the same way''. And [http://dowebsitesneedtolookexactlythesameineverybrowser.com neither should they have to]: arguably your web content doesn't need to look exactly the same across every browser and device and user might choose to view it on, as long as it still provides a good user experience and gives them access to the content and services required by their current browsing experience.&lt;br /&gt;
&lt;br /&gt;
To get your web content working well on all of the huge, diverse number of different web browsers and web-enabled devices that exist (or even a good proportion of them), you're going to have to do some work, optimizing the layouts and content delivered to each browser, and sometimes even directing certain devices to completely separate web sites. Examples of where such optimization might be required include:&lt;br /&gt;
&lt;br /&gt;
* Serving different layouts to narrow screen devices (eg mobile phones) and wide screen devices.&lt;br /&gt;
* Serving smaller image and video files (or even alternative content representations) to devices that are on a slower internet connection.&lt;br /&gt;
* Serving cutting edge styling to modern browsers, and alternative styling rules to older browsers that don't support the cutting edge CSS.&lt;br /&gt;
&lt;br /&gt;
There are dozens of techniques available to implement such content, but we don't have space to get anywhere near covering them all in this article. We will provide resources to give you pointers to more information at the end.&lt;br /&gt;
&lt;br /&gt;
This article first focuses on the different mechanisms available to allow us to detect what browser is accessing our content. We'll look at the right and wrong way to do this, and then round it off by showing the different mechanisms available to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
==Browser detection is not the way to go!==&lt;br /&gt;
&lt;br /&gt;
Ok, so the last paragraph in the introduction is a bit misleading — when you want to serve different content to different browsers, detecting the actual browser type and version itself is the wrong way to go in most cases. It is much better to detect whether the browser supports the technologies your web site is using — referred to as feature detection. &lt;br /&gt;
&lt;br /&gt;
This sounds a bit confusing, so let's investigate further.&lt;br /&gt;
&lt;br /&gt;
===A brief history of browser sniffing===&lt;br /&gt;
&lt;br /&gt;
These days, a lot of web standards features are supported pretty consistently across browsers, or at least, modern browsers.&lt;br /&gt;
&lt;br /&gt;
We'll touch a bit on older browsers we're still sometimes required to support later in the article. We'll also look later at the fact that really new, cutting edge web standards features (such as parts of CSS3 and HTML5) sometimes don't work the same across modern browsers, and the best way to deal with that.&lt;br /&gt;
&lt;br /&gt;
For now, let's rewind back to the early-to-mid-1990s. Back then, web standards were not supported very consistently at all across browsers, so developers were forced to either only support certain browsers, or fork their code, sending completely different codebases to different browsers. The way this was done back then was browser sniffing, or to be more accurate, UA sniffing.&lt;br /&gt;
&lt;br /&gt;
Every browser has a UA string that you can query to find out what browser it is. This is done in JavaScript using the &amp;lt;code&amp;gt;Navigator&amp;lt;/code&amp;gt; object. For example, I'm currently using Opera 12.00 beta. If I run &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; in my browser, I get the following returned:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; Edition Next; en) Presto/2.10.289 Version/12.00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I can use this to identify the browser as Opera, and then serve code to just Opera as a result.&lt;br /&gt;
&lt;br /&gt;
Back in 1993, NCSA Mosaic was the most popular browser. It was identified by &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;NCSA_Mosaic/2.0 (Windows 3.1)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was pretty simple. Then Netscape came along, identified by a UA string of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Mozilla/1.0 (Win3.1)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was also pretty simple, but here's how the problems started. Netscape supported a new killer web feature of the time, Frames, and Mosaic didn't. So web developers used browser sniffing to detect the browser being used and serve content in frames only to Netscape.&lt;br /&gt;
&lt;br /&gt;
Internet Explorer then came along, and also supported frames, but to make sure it was being served frames, Microsoft used the following UA string to identify itself as Mozilla (compatible):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This is pretty silly, but things got even sillier. Other browser came along later on, with different rendering engines and names, but they all had to keep the Mozilla string inside their UA string, to make sure they were served good content by all this browser sniffing code. For example:&lt;br /&gt;
&lt;br /&gt;
* Mozilla: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826&amp;lt;/code&amp;gt;&lt;br /&gt;
* Firefox: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Opera 9.5: &amp;lt;code&amp;gt;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Opera/9.51 (Windows NT 5.1; U; en)&amp;lt;/code&amp;gt;!!!&lt;br /&gt;
* KHTML: &amp;lt;code&amp;gt;Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Safari: &amp;lt;code&amp;gt;Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5&amp;lt;/code&amp;gt;&lt;br /&gt;
* Chrome: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, all these user agent strings are trying to include some kind of identification of the actual browser they belong to and device install on, while strategically trying to be matched by browser sniffing code to make sure the browsers get served decent code.&lt;br /&gt;
&lt;br /&gt;
===The problem with browser sniffing===&lt;br /&gt;
&lt;br /&gt;
I'm sure you'll agree that the above situation is silly. All of these crazy verbose UA strings have arisen because web developers used short-sighted browser sniffing in the first place, which just sniffed for the first browser to support frames (and later other cool features). When new browsers came out, they had to change their UA strings to work with the browser sniffing code. The other choice would be for developers to keep changing their sniffing code every time a new browser comes out that they want to support. This has happened frequently as well.&lt;br /&gt;
&lt;br /&gt;
and this is the crux of why browser sniffing is so bad — it only solves the problem now, and isn't future proof at all. It is also really error prone. When you are browser sniffing, what you are really want to do is check whether the browser accessing your site supports the technologies your content is built from. But instead of doing this directly, you are making an educated guess dependant on the contents of the UA string, which isn't very precise at all!&lt;br /&gt;
&lt;br /&gt;
For example, you'll notice that the above Opera UA string starts with &amp;lt;code&amp;gt;Opera/9.80&amp;lt;/code&amp;gt;, even though at the time of writing we are on version 11.64! This is because of widespread erroneous browsing sniffing code, which looked at Opera UA strings and interpreted Opera 10+ as Opera 1, serving incorrect content as a result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Why feature detection is better===&lt;br /&gt;
&lt;br /&gt;
Feature detection is a much better way to do things — instead of seeing what browser is accessing the content and serving appropriate code, the idea here is to query the browser to detect whether it supports the features  our content relies on, and then serve content as appropriate. Let's take HTML5 video as an example. You could detect support using some simple code such as this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;if(!!document.createElement('video').canPlayType === true) {&lt;br /&gt;
  // run some code that relies on HTML5 video&lt;br /&gt;
} else {&lt;br /&gt;
  // do something else&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is much more future proof, because existing browsers that support HTML5 video will run the correct code, and future browsers that support HTML5 video will do as well. You don't have to keep updating your code each time a new browser is released.&lt;br /&gt;
&lt;br /&gt;
==Strategies for supporting different browsers==&lt;br /&gt;
&lt;br /&gt;
Now we've got the argument for feature detection out of the way, let's look at some strategies you can use to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
===Graceful degradation===&lt;br /&gt;
&lt;br /&gt;
The good news about web technologies is that they are largely designed so that they will work as well as possible if something is not done quite right — this is contrary to other programming environments where nothing will work if there is the slightest error present in the code.&lt;br /&gt;
&lt;br /&gt;
Part of this related to how browsers deal with unknown elements and CSS properties. If a browser encounters an unknown CSS property, it will just ignore it and move on. If a browser encounters an unknown HTML element, it will treat it like an anonymous inline element, similar to a &amp;lt;code&amp;gt;&amp;amp;lt;span&amp;amp;gt;&amp;lt;/code&amp;gt;. This means that if a browser is served some HTML or CSS features it can't understand, it will generally just ignore it and move on, rendering the rest of the content. Obviously this might not give you a usable result in all cases, but for text and image content, you'll find that older browsers will render a usable result, even if it doesn't look quite as nice and shiny as in modern browsers. This is generally called graceful degradation.&lt;br /&gt;
&lt;br /&gt;
A quick example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;border-radius&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;box-shadow&amp;lt;/code&amp;gt; aren't supported in older browsers like IE6, but you're still going to be able to read the content inside the box, even if it hasn't got rounded corners and a drop shadow.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
===Vendor prefixes, and alternative styles===&lt;br /&gt;
&lt;br /&gt;
Of course, you can't rely on graceful degradation in all cases. In some cases, a feature not being supported will result in your content breaking to the point where it is not really usable. In the case of CSS, examples include:&lt;br /&gt;
&lt;br /&gt;
1. Sizing a layout using [http://snook.ca/archives/html_and_css/font-size-with-rem rem units] — these units are not supported in older browsers, resulting in the layout falling apart. To remedy this, you could provide a fallback sized in a unit like pixels later in the cascade, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;nav {&lt;br /&gt;
  width: 180px;&lt;br /&gt;
  width: 18rem;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modern browsers that understand both will first apply the pixel value then override it with the rem value. Older browsers that don't understand rems will just apply the first line, then ignore the second one. &lt;br /&gt;
&lt;br /&gt;
2. Filling in a background using a CSS3 gradient — in browsers that don't support the gradient, it will not render at all, which could cause content to be unreadable.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
To make things better, you could provide a solid background colour as a fallback, or a gradient slice image, like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-image: url(gradient-slice.png);&lt;br /&gt;
  background-image: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
====IE conditional comments====&lt;br /&gt;
&lt;br /&gt;
If you are specifically dealing with fallbacks for old versions of Internet Explorer, you can separate these out into separate stylesheets, and then link to these stylesheets inside an IE conditional comment. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;normal-styles.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;!--[if lte IE 6]&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot;  href=&amp;quot;ie-fixes.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;![endif]--&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the first link element will be given to all browsers, whereas the second one will only be picked up by IE versions 6 and less. In the latter, you could put all your IE fallback styles (such as giving IE6 different width and height values to compensate for its broken box model.)&lt;br /&gt;
&lt;br /&gt;
You can read more about IE conditional comments in Bruce Lawson's article [http://dev.opera.com/articles/view/supporting-ie-with-conditional-comments/ Supporting IE with conditional comments].&lt;br /&gt;
&lt;br /&gt;
====Vendor prefixes====&lt;br /&gt;
&lt;br /&gt;
Returning to the gradient example we saw earlier, you may have noticed that something wasn't quite right there. To get the gradient rendering across all modern browsers, you need to include multiple versions of the declaration, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-image: url(gradient-slice.png);&lt;br /&gt;
  background-image: -webkit-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-image: -moz-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-image: -ms-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-image: -o-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-image: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is because the [http://dev.w3.org/csswg/css3-images/ CSS Image Values and Replaced Content Module Level 3] — the spec that CSS gradients are specified in, is not finalised. Unfinished CSS features are implemented in browsers in an experimental capacity, with a vendor-specific prefix so that different browser's implementations can be tested without impacting on other browser's implementations. In the above example:&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;-webkit-&amp;lt;/code&amp;gt; prefixed property will work in WebKit-based browsers such as Chrome and Safari&lt;br /&gt;
* The &amp;lt;code&amp;gt;-moz-&amp;lt;/code&amp;gt; prefixed property will work in Firefox&lt;br /&gt;
* The &amp;lt;code&amp;gt;-ms-&amp;lt;/code&amp;gt; prefixed property will work in Internet Explorer&lt;br /&gt;
* The &amp;lt;code&amp;gt;-o-&amp;lt;/code&amp;gt; prefixed property will work in Opera&lt;br /&gt;
&lt;br /&gt;
Official W3C policy states that you shouldn't really use experimental properties in production code, but people do, as they want to make sites look cool and keep on the cutting edge. I don't see a problem with this, but if you want to use vendor prefixed properties in your code, you really should use include all the different prefixes so that as many browsers as possible can use all the features you are implementing.&lt;br /&gt;
&lt;br /&gt;
Notice that an unprefixed version of the property has also been included, at the bottom of the list: this is so that when the CSS feature is finalised, and the prefixes are removed, the code will still work — this is good future proofing practice.&lt;br /&gt;
&lt;br /&gt;
===Progressive enhancement===&lt;br /&gt;
&lt;br /&gt;
The flip side of graceful degradation is progressive enhancement - this goes in the other direction. Instead of building a great experience as the default and then hoping it degrades to something that is still usable in less capable browsers, you build a basic experience that works in all browsers, and then layer an enhanced experience on top of that.&lt;br /&gt;
&lt;br /&gt;
... NEED TO FILL IN AN EXAMPLE?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Polyfills/shims===&lt;br /&gt;
&lt;br /&gt;
Another approach you can take to dealing with disparate browser support is using Polyfills/shims. These are bits of utility code (usually JavaScript) that fakes support for a feature you want to use in browsers that don't support that feature natively. &lt;br /&gt;
&lt;br /&gt;
You generally use a polyfill by simply applying the JavaScript to your page via &amp;lt;code&amp;gt;&amp;amp;lt;script src=&amp;quot;script.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/code&amp;gt;, although many of them do have other instructions besides. Always reach the author's instructions carefully before attempting to use one! Polyfill/shim examples include:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/scottjehl/Respond respond.js] for making Media Queries work in old versions of IE&lt;br /&gt;
* [http://css3pie.com/ CSS3PIE] for making bling like rounded corners and drop shadows work in old versions of IE&lt;br /&gt;
* [http://www.delphiki.com/html5/playr/ Playr] for making HTML5 video &amp;lt;code&amp;gt;&amp;amp;lt;track&amp;amp;gt;&amp;lt;/code&amp;gt; work in non-supporting browsers&lt;br /&gt;
* [http://code.google.com/p/html5shiv/ HTML5 shiv] for making old versions of IE render HTML5 semantic elements properly&lt;br /&gt;
* [http://excanvas.sourceforge.net/ Excanvas] for making Interner Explorer support HTML5 &amp;lt;code&amp;gt;&amp;amp;lt;canvas&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You might think this sounds wonderful! Why worry about what feature different browser support, if you can just fill in support for the ones that don't using JavaScript? The trouble is that using a Polyfill does add weight to a page, both in terms of extra files requiring download, and extra processing required to put the polyfill in action. If you used loads of polyfills on every one of your pages, they would likely be significantly slower to download and run, as well as making your code base a lot more fiddly and complex.&lt;br /&gt;
&lt;br /&gt;
So they are a great idea, but use them sparingly.&lt;br /&gt;
&lt;br /&gt;
===Feature detection with Modernizr===&lt;br /&gt;
&lt;br /&gt;
You might be thinking at this point &amp;quot;well isn't there a way to only load those extra resources if the browser really needs them?&amp;quot; Well, yes there is. The general idea is to do feature detection to see if the browser supports those features, and then pull in a polyfill or un some alternative code only if needed.&lt;br /&gt;
&lt;br /&gt;
The easiest way to do the feature detection part of this is through a feature detection library called [http://www.modernizr.com Modernizr]. This is a JavaScript library that provides an easy way to do pretty much all of the feature detection you could need. All you have to do is&lt;br /&gt;
&lt;br /&gt;
# Download the library and attach it to your page via a &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
# add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to your page's &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
When your page runs, Modernizr runs feature tests on all manner of HTML5/CSS3/etc. features, then it does two things. First, it adds classes to your &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element to allow you to apply CSS to the page selectively, depending on whether the browser supports various feature or not. Second, it provides you with a JavaScript API to allow you to do the same kind of selective code application in your JavaScript. Let's look at these two aspects in more detail.&lt;br /&gt;
&lt;br /&gt;
====Selective CSS application====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get things going, you need to link to the Modernizr library and add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element in your source code. when the page is run, modernizr runs all its feature detection tests and lets you know the results of those tests via a series of classes appended to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element. They will look something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;amp;lt;html lang=&amp;quot;en-gb&amp;quot; class=&amp;quot; js no-flexbox no-flexbox-legacy canvas canvastext webgl no-touch geolocation postmessage websqldatabase no-indexeddb&lt;br /&gt;
 hashchange history draganddrop no-websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations&lt;br /&gt;
 csscolumns cssgradients no-cssreflections csstransforms no-csstransforms3d csstransitions fontface generatedcontent video audio&lt;br /&gt;
 localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is really powerful, as it allows you to apply CSS to the page selectively, depending whether it supports certain feature or not. For example, if your code uses an animated 3D transform by default to reveal some content underneath:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#shutter:hover {&lt;br /&gt;
  transform: rotateX(90deg);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can include alternative styling that overrides this in browsers that don't support 3D transforms like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;.no-csstransforms3d #shutter:hover {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  right: 100px;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It might not look quite as elegant, but it would still produce an ok experience that allows access to the underlying content.&lt;br /&gt;
&lt;br /&gt;
====Selective JavaScript application====&lt;br /&gt;
&lt;br /&gt;
Modernizr also provides a nice easy JavaScript API to allow you to execute code selectively, depending on whether CSS/HTML/other features are supported by the browser. Each test is a simple method on the Modernizr object, which returns a boolean (true/false) result. For example, if you wanted to query whether the current browser supports 3D transforms in JavaScript, you would write &amp;lt;code&amp;gt;if(Modernizr.csstransforms3d)&amp;lt;/code&amp;gt;. So you could have a block of code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;if(Modernizr.csstransforms3d) {&lt;br /&gt;
  // run killer feature that relies on 3D transforms being available&lt;br /&gt;
} else {&lt;br /&gt;
  // run an alternative chunk of code that provides a graceful fallback&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Problems with Modernizr====&lt;br /&gt;
&lt;br /&gt;
Modernizr, as with everything, isn't perfect. Two of the main problems are:&lt;br /&gt;
&lt;br /&gt;
# Not everything can be feature detected and therefore dealt with in this elegant manner.&lt;br /&gt;
# The full Modernizr library weighs in at 49KB, which is quite a lot of extra code to download for a few feature tests.&lt;br /&gt;
&lt;br /&gt;
However, you can customize Modernizr and create a version suitable for your site that only contains the tests you need, which cuts down on the file weight. And even though you can't feature detect everything, you will find it invaluable in many situations.&lt;br /&gt;
&lt;br /&gt;
===YepNope - load only what you need!===&lt;br /&gt;
&lt;br /&gt;
Now we've covered the feature detection side of things, lets cover what we can do to load resources like Polyfills only when you need them. To help you out with this, Modernizr comes packaged with a really smart, dandy little utility library called YepNope. This can do a lot, but in a nutshell, it allows you to specify a test of some kind, and then say what happens when the test is passed, and when it fails. Here's a simple example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;yepnope({&lt;br /&gt;
  test : Modernizr.canvas,&lt;br /&gt;
  yep  : 'normal.js',&lt;br /&gt;
  nope : ['polyfill.js', 'normal.js']&lt;br /&gt;
});&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, you are sating what the test is, then saying that if the test is passed, just load the normal script, but if the test fails, load the normal script and a polyfill to allow the code to work in an older browser.&lt;br /&gt;
&lt;br /&gt;
You can find a lot more details on how to use YepNope at [http://yepnopejs.com/ The YepNope homepage].&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
I hope that's helped you get all these ideas clear in your head — why browser sniffing is bad, why feature detection is a much better way to detect whether a browser will run your site features or not, and different strategies for providing different capability browsers with different but acceptable experiences.&lt;br /&gt;
&lt;br /&gt;
If you want to read more sources about the topics discussed above, please check out the following pages:&lt;br /&gt;
&lt;br /&gt;
* [http://css-tricks.com/browser-detection-is-bad/ CSS Tricks: Browser detection is bad]&lt;br /&gt;
* [http://webaim.org/blog/user-agent-string-history/ WebAIM: History of the browser user-agent string]. A great account of why user agent sniffing was responsible for so much evil, historically speaking.&lt;br /&gt;
* [http://www.mezzoblue.com/archives/2007/11/12/detect_this/ Dave Shea: Detect This]. A good concrete example of why browsing sniffing is so bad.&amp;lt;/a&amp;gt;&lt;br /&gt;
* [http://modernizr.com Modernizr homepage]: find out all about how to use Modernizr, and download custom builds&amp;lt;/a&amp;gt;&lt;br /&gt;
* [http://yepnopejs.com/ YepNope homepage]: find out how to do more with it!&amp;lt;/a&amp;gt;&lt;/div&gt;</description>
			<pubDate>Tue, 22 May 2012 10:53:18 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Optimizing_content_for_different_browsers:_the_RIGHT_way</comments>		</item>
		<item>
			<title>How to write an article</title>
			<link>http://www.w3.org/community/webed/wiki/How_to_write_an_article</link>
			<description>&lt;p&gt;Cmills:&amp;#32;Created page with &amp;quot;There isn't really any single right way to write a tech article, but as with all things, there are mistakes to be made, and things to stay away from. In this article I'm going to…&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There isn't really any single right way to write a tech article, but as with all things, there are mistakes to be made, and things to stay away from. In this article I'm going to give you a loose process to follow when writing an article, as well as some rules/points to keep in mind that may make life easier.&lt;br /&gt;
&lt;br /&gt;
== Process for writing an article ==&lt;br /&gt;
&lt;br /&gt;
So, let's go! When writing an article, I would suggest you follow the below steps. When you become more confident at writing articles, you can probably drop or few or build your own process. It's all about having a workflow that works for you. &lt;br /&gt;
&lt;br /&gt;
== Rules of article writing ==&lt;/div&gt;</description>
			<pubDate>Mon, 21 May 2012 17:02:46 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:How_to_write_an_article</comments>		</item>
		<item>
			<title>Optimizing content for different browsers: the RIGHT way</title>
			<link>http://www.w3.org/community/webed/wiki/Optimizing_content_for_different_browsers:_the_RIGHT_way</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
If you've done a bit of front-end web development, you're bound to have noticed that not all browsers render ''all web content in exactly the same way''. And [http://dowebsitesneedtolookexactlythesameineverybrowser.com neither should they have to]: arguably your web content doesn't need to look exactly the same across every browser and device and user might choose to view it on, as long as it still provides a good user experience and gives them access to the content and services required by their current browsing experience.&lt;br /&gt;
&lt;br /&gt;
To get your web content working well on all of the huge, diverse number of different web browsers and web-enabled devices that exist (or even a good proportion of them), you're going to have to do some work, optimizing the layouts and content delivered to each browser, and sometimes even directing certain devices to completely separate web sites. Examples of where such optimization might be required include:&lt;br /&gt;
&lt;br /&gt;
* Serving different layouts to narrow screen devices (eg mobile phones) and wide screen devices.&lt;br /&gt;
* Serving smaller image and video files (or even alternative content representations) to devices that are on a slower internet connection.&lt;br /&gt;
* Serving cutting edge styling to modern browsers, and alternative styling rules to older browsers that don't support the cutting edge CSS.&lt;br /&gt;
&lt;br /&gt;
There are dozens of techniques available to implement such content, but we don't have space to get anywhere near covering them all in this article. We will provide resources to give you pointers to more information at the end.&lt;br /&gt;
&lt;br /&gt;
This article first focuses on the different mechanisms available to allow us to detect what browser is accessing our content. We'll look at the right and wrong way to do this, and then round it off by showing the different mechanisms available to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
==Browser detection is not the way to go!==&lt;br /&gt;
&lt;br /&gt;
Ok, so the last paragraph in the introduction is a bit misleading — when you want to serve different content to different browsers, detecting the actual browser type and version itself is the wrong way to go in most cases. It is much better to detect whether the browser supports the technologies your web site is using — referred to as feature detection. &lt;br /&gt;
&lt;br /&gt;
This sounds a bit confusing, so let's investigate further.&lt;br /&gt;
&lt;br /&gt;
===A brief history of browser sniffing===&lt;br /&gt;
&lt;br /&gt;
These days, a lot of web standards features are supported pretty consistently across browsers, or at least, modern browsers.&lt;br /&gt;
&lt;br /&gt;
We'll touch a bit on older browsers we're still sometimes required to support later in the article. We'll also look later at the fact that really new, cutting edge web standards features (such as parts of CSS3 and HTML5) sometimes don't work the same across modern browsers, and the best way to deal with that.&lt;br /&gt;
&lt;br /&gt;
For now, let's rewind back to the early-to-mid-1990s. Back then, web standards were not supported very consistently at all across browsers, so developers were forced to either only support certain browsers, or fork their code, sending completely different codebases to different browsers. The way this was done back then was browser sniffing, or to be more accurate, UA sniffing.&lt;br /&gt;
&lt;br /&gt;
Every browser has a UA string that you can query to find out what browser it is. This is done in JavaScript using the &amp;lt;code&amp;gt;Navigator&amp;lt;/code&amp;gt; object. For example, I'm currently using Opera 12.00 beta. If I run &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; in my browser, I get the following returned:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; Edition Next; en) Presto/2.10.289 Version/12.00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I can use this to identify the browser as Opera, and then serve code to just Opera as a result.&lt;br /&gt;
&lt;br /&gt;
Back in 1993, NCSA Mosaic was the most popular browser. It was identified by &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;NCSA_Mosaic/2.0 (Windows 3.1)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was pretty simple. Then Netscape came along, identified by a US string of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Mozilla/1.0 (Win3.1)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was also pretty simple, but here's how the problems started. Netscape supported a new killer web feature of the time, Frames, and Mosaic didn't. So web developers used browser sniffing to detect the browser being used and serve content in frames only to Netscape.&lt;br /&gt;
&lt;br /&gt;
Internet Explorer then came along, and also supported frames, but to make sure it was being served frames, Microsoft used the following UA string to identify itself as Mozilla (compatible):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This is pretty silly, but things got even sillier. Other browser came along later on, with different rendering engines and names, but they all had to keep the Mozilla string inside their UA string, to make sure they were served good content by all this browser sniffing code. For example:&lt;br /&gt;
&lt;br /&gt;
* Mozilla: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826&amp;lt;/code&amp;gt;&lt;br /&gt;
* Firefox: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Opera 9.5: &amp;lt;code&amp;gt;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Opera/9.51 (Windows NT 5.1; U; en)&amp;lt;/code&amp;gt;!!!&lt;br /&gt;
* KHTML: &amp;lt;code&amp;gt;Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Safari: &amp;lt;code&amp;gt;Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5&amp;lt;/code&amp;gt;&lt;br /&gt;
* Chrome: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, all these user agent strings are trying to include some kind of identification of the actual browser they belong to and device install on, while strategically trying to be matched by browser sniffing code to make sure the browsers get served decent code.&lt;br /&gt;
&lt;br /&gt;
===The problem with browser sniffing===&lt;br /&gt;
&lt;br /&gt;
I'm sure you'll agree that the above situation is silly. All of these crazy verbose US strings have arisen because web developers used short-sighted browser sniffing in the first place, which just sniffed for the first browser to support frames (and later other cool features). When new browsers came out, they had to change their UA strings to work with the browser sniffing code. The other choice would be for developers to keep changing their sniffing code every time a new browser comes out that they want to support. This has happened frequently as well.&lt;br /&gt;
&lt;br /&gt;
and this is the crux of why browser sniffing is so bad — it only solves the problem now, and isn't future proof at all. It is also really error prone. When you are browser sniffing, what you are really want to do is check whether the browser accessing your site supports the technologies your content is built from. But instead of doing this directly, you are making an educated guess dependant on the contents of the UA string, which isn't very precise at all!&lt;br /&gt;
&lt;br /&gt;
For example, you'll notice that the above Opera UA string starts with &amp;lt;code&amp;gt;Opera/9.80&amp;lt;/code&amp;gt;, even though at the time of writing we are on version 11.64! This is because of widespread erroneous browsing sniffing code, which looked at Opera UA strings and interpreted Opera 10+ as Opera 1, serving incorrect content as a result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Why feature detection is better===&lt;br /&gt;
&lt;br /&gt;
Feature detection is a much better way to do things — instead of seeing what browser is accessing the content and serving appropriate code, the idea here is to query the browser to detect whether it supports the features  our content relies on, and then serve content as appropriate. Let's take HTML5 video as an example. You could detect support using some simple code such as this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;if(!!document.createElement('video').canPlayType === true) {&lt;br /&gt;
  // run some code that relies on HTML5 video&lt;br /&gt;
} else {&lt;br /&gt;
  // do something else&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is much more future proof, because existing browsers that support HTML5 video will run the correct code, and future browsers that support HTML5 video will do as well. You don't have to keep updating your code each time a new browser is released.&lt;br /&gt;
&lt;br /&gt;
==Strategies for supporting different browsers==&lt;br /&gt;
&lt;br /&gt;
Now we've got the argument for feature detection out of the way, let's look at some strategies you can use to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
===Graceful degradation===&lt;br /&gt;
&lt;br /&gt;
The good news about web technologies is that they are largely designed so that they will work as well as possible if something is not done quite right — this is contrary to other programming environments where nothing will work if there is the slightest error present in the code.&lt;br /&gt;
&lt;br /&gt;
Part of this related to how browsers deal with unknown elements and CSS properties. If a browser encounters an unknown CSS property, it will just ignore it and move on. If a browser encounters an unknown HTML element, it will treat it like an anonymous inline element, similar to a &amp;lt;code&amp;gt;&amp;amp;lt;span&amp;amp;gt;&amp;lt;/code&amp;gt;. This means that if a browser is served some HTML or CSS features it can't understand, it will generally just ignore it and move on, rendering the rest of the content. Obviously this might not give you a usable result in all cases, but for text and image content, you'll find that older browsers will render a usable result, even if it doesn't look quite as nice and shiny as in modern browsers. This is generally called graceful degradation.&lt;br /&gt;
&lt;br /&gt;
A quick example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;border-radius&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;box-shadow&amp;lt;/code&amp;gt; aren't supported in older browsers like IE6, but you're still going to be able to read the content inside the box, even if it hasn't got rounded corners and a drop shadow.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
===Vendor prefixes, and alternative styles===&lt;br /&gt;
&lt;br /&gt;
Of course, you can't rely on graceful degradation in all cases. In some cases, a feature not being supported will result in your content breaking to the point where it is not really usable. In the case of CSS, examples include:&lt;br /&gt;
&lt;br /&gt;
1. Sizing a layout using [http://snook.ca/archives/html_and_css/font-size-with-rem rem units] — these units are not supported in older browsers, resulting in the layout falling apart. To remedy this, you could provide a fallback sized in a unit like pixels later in the cascade, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;nav {&lt;br /&gt;
  width: 180px;&lt;br /&gt;
  width: 18rem;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modern browsers that understand both will first apply the pixel value then override it with the rem value. Older browsers that don't understand rems will just apply the first line, then ignore the second one. &lt;br /&gt;
&lt;br /&gt;
2. Filling in a background using a CSS3 gradient — in browsers that don't support the gradient, it will not render at all, which could cause content to be unreadable.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
To make things better, you could provide a solid background colour as a fallback, or a gradient slice image, like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-image: url(gradient-slice.png);&lt;br /&gt;
  background-image: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
====IE conditional comments====&lt;br /&gt;
&lt;br /&gt;
If you are specifically dealing with fallbacks for old versions of Internet Explorer, you can separate these out into separate stylesheets, and then link to these stylesheets inside an IE conditional comment. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;normal-styles.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;!--[if lte IE 6]&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot;  href=&amp;quot;ie-fixes.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;![endif]--&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the first link element will be given to all browsers, whereas the second one will only be picked up by IE versions 6 and less. In the latter, you could put all your IE fallback styles (such as giving IE6 different width and height values to compensate for its broken box model.)&lt;br /&gt;
&lt;br /&gt;
You can read more about IE conditional comments in Bruce Lawson's article [http://dev.opera.com/articles/view/supporting-ie-with-conditional-comments/ Supporting IE with conditional comments].&lt;br /&gt;
&lt;br /&gt;
====Vendor prefixes====&lt;br /&gt;
&lt;br /&gt;
Returning to the gradient example we saw earlier, you may have noticed that something wasn't quite right there. To get the gradient rendering across all modern browsers, you need to include multiple versions of the declaration, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-image: url(gradient-slice.png);&lt;br /&gt;
  background-image: -webkit-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-image: -moz-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-image: -ms-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-image: -o-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-image: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is because the [http://dev.w3.org/csswg/css3-images/ CSS Image Values and Replaced Content Module Level 3] — the spec that CSS gradients are specified in, is not finalised. Unfinished CSS features are implemented in browsers in an experimental capacity, with a vendor-specific prefix so that different browser's implementations can be tested without impacting on other browser's implementations. In the above example:&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;-webkit-&amp;lt;/code&amp;gt; prefixed property will work in WebKit-based browsers such as Chrome and Safari&lt;br /&gt;
* The &amp;lt;code&amp;gt;-moz-&amp;lt;/code&amp;gt; prefixed property will work in Firefox&lt;br /&gt;
* The &amp;lt;code&amp;gt;-ms-&amp;lt;/code&amp;gt; prefixed property will work in Internet Explorer&lt;br /&gt;
* The &amp;lt;code&amp;gt;-o-&amp;lt;/code&amp;gt; prefixed property will work in Opera&lt;br /&gt;
&lt;br /&gt;
Official W3C policy states that you shouldn't really use experimental properties in production code, but people do, as they want to make sites look cool and keep on the cutting edge. I don't see a problem with this, but if you want to use vendor prefixed properties in your code, you really should use include all the different prefixes so that as many browsers as possible can use all the features you are implementing.&lt;br /&gt;
&lt;br /&gt;
Notice that an unprefixed version of the property has also been included, at the bottom of the list: this is so that when the CSS feature is finalised, and the prefixes are removed, the code will still work — this is good future proofing practice.&lt;br /&gt;
&lt;br /&gt;
===Progressive enhancement===&lt;br /&gt;
&lt;br /&gt;
The flip side of graceful degradation is progressive enhancement - this goes in the other direction. Instead of building a great experience as the default and then hoping it degrades to something that is still usable in less capable browsers, you build a basic experience that works in all browsers, and then layer an enhanced experience on top of that.&lt;br /&gt;
&lt;br /&gt;
... NEED TO FILL IN AN EXAMPLE?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Polyfills/shims===&lt;br /&gt;
&lt;br /&gt;
Another approach you can take to dealing with disparate browser support is using Polyfills/shims. These are bits of utility code (usually JavaScript) that fakes support for a feature you want to use in browsers that don't support that feature natively. &lt;br /&gt;
&lt;br /&gt;
You generally use a polyfill by simply applying the JavaScript to your page via &amp;lt;code&amp;gt;&amp;amp;lt;script src=&amp;quot;script.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/code&amp;gt;, although many of them do have other instructions besides. Always reach the author's instructions carefully before attempting to use one! Polyfill/shim examples include:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/scottjehl/Respond respond.js] for making Media Queries work in old versions of IE&lt;br /&gt;
* [http://css3pie.com/ CSS3PIE] for making bling like rounded corners and drop shadows work in old versions of IE&lt;br /&gt;
* [http://www.delphiki.com/html5/playr/ Playr] for making HTML5 video &amp;lt;code&amp;gt;&amp;amp;lt;track&amp;amp;gt;&amp;lt;/code&amp;gt; work in non-supporting browsers&lt;br /&gt;
* [http://code.google.com/p/html5shiv/ HTML5 shiv] for making old versions of IE render HTML5 semantic elements properly&lt;br /&gt;
* [http://excanvas.sourceforge.net/ Excanvas] for making Interner Explorer support HTML5 &amp;lt;code&amp;gt;&amp;amp;lt;canvas&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You might think this sounds wonderful! Why worry about what feature different browser support, if you can just fill in support for the ones that don't using JavaScript? The trouble is that using a Polyfill does add weight to a page, both in terms of extra files requiring download, and extra processing required to put the polyfill in action. If you used loads of polyfills on every one of your pages, they would likely be significantly slower to download and run, as well as making your code base a lot more fiddly and complex.&lt;br /&gt;
&lt;br /&gt;
So they are a great idea, but use them sparingly.&lt;br /&gt;
&lt;br /&gt;
===Feature detection with Modernizr===&lt;br /&gt;
&lt;br /&gt;
You might be thinking at this point &amp;quot;well isn't there a way to only load those extra resources if the browser really needs them?&amp;quot; Well, yes there is. The general idea is to do feature detection to see if the browser supports those features, and then pull in a polyfill or un some alternative code only if needed.&lt;br /&gt;
&lt;br /&gt;
The easiest way to do the feature detection part of this is through a feature detection library called [http://www.modernizr.com Modernizr]. This is a JavaScript library that provides an easy way to do pretty much all of the feature detection you could need. All you have to do is&lt;br /&gt;
&lt;br /&gt;
# Download the library and attach it to your page via a &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
# add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to your page's &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
When your page runs, Modernizr runs feature tests on all manner of HTML5/CSS3/etc. features, then it does two things. First, it adds classes to your &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element to allow you to apply CSS to the page selectively, depending on whether the browser supports various feature or not. Second, it provides you with a JavaScript API to allow you to do the same kind of selective code application in your JavaScript. Let's look at these two aspects in more detail.&lt;br /&gt;
&lt;br /&gt;
====Selective CSS application====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get things going, you need to link to the Modernizr library and add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element in your source code. when the page is run, modernizr runs all its feature detection tests and lets you know the results of those tests via a series of classes appended to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element. They will look something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;amp;lt;html lang=&amp;quot;en-gb&amp;quot; class=&amp;quot; js no-flexbox no-flexbox-legacy canvas canvastext webgl no-touch geolocation postmessage websqldatabase no-indexeddb&lt;br /&gt;
 hashchange history draganddrop no-websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations&lt;br /&gt;
 csscolumns cssgradients no-cssreflections csstransforms no-csstransforms3d csstransitions fontface generatedcontent video audio&lt;br /&gt;
 localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is really powerful, as it allows you to apply CSS to the page selectively, depending whether it supports certain feature or not. For example, if your code uses an animated 3D transform by default to reveal some content underneath:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#shutter:hover {&lt;br /&gt;
  transform: rotateX(90deg);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can include alternative styling that overrides this in browsers that don't support 3D transforms like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;.no-csstransforms3d #shutter:hover {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  right: 100px;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It might not look quite as elegant, but it would still produce an ok experience that allows access to the underlying content.&lt;br /&gt;
&lt;br /&gt;
====Selective JavaScript application====&lt;br /&gt;
&lt;br /&gt;
Modernizr also provides a nice easy JavaScript API to allow you to execute code selectively, depending on whether CSS/HTML/other features are supported by the browser. Each test is a simple method on the Modernizr object, which returns a boolean (true/false) result. For example, if you wanted to query whether the current browser supports 3D transforms in JavaScript, you would write &amp;lt;code&amp;gt;if(Modernizr.csstransforms3d)&amp;lt;/code&amp;gt;. So you could have a block of code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;if(Modernizr.csstransforms3d) {&lt;br /&gt;
  // run killer feature that relies on 3D transforms being available&lt;br /&gt;
} else {&lt;br /&gt;
  // run an alternative chunk of code that provides a graceful fallback&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Problems with Modernizr====&lt;br /&gt;
&lt;br /&gt;
Modernizr, as with everything, isn't perfect. Two of the main problems are:&lt;br /&gt;
&lt;br /&gt;
# Not everything can be feature detected and therefore dealt with in this elegant manner.&lt;br /&gt;
# The full Modernizr library weighs in at 49KB, which is quite a lot of extra code to download for a few feature tests.&lt;br /&gt;
&lt;br /&gt;
However, you can customize Modernizr and create a version suitable for your site that only contains the tests you need, which cuts down on the file weight. And even though you can't feature detect everything, you will find it invaluable in many situations.&lt;br /&gt;
&lt;br /&gt;
===YepNope - load only what you need!===&lt;br /&gt;
&lt;br /&gt;
Now we've covered the feature detection side of things, lets cover what we can do to load resources like Polyfills only when you need them. To help you out with this, Modernizr comes packaged with a really smart, dandy little utility library called YepNope. This can do a lot, but in a nutshell, it allows you to specify a test of some kind, and then say what happens when the test is passed, and when it fails. Here's a simple example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;yepnope({&lt;br /&gt;
  test : Modernizr.canvas,&lt;br /&gt;
  yep  : 'normal.js',&lt;br /&gt;
  nope : ['polyfill.js', 'normal.js']&lt;br /&gt;
});&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, you are sating what the test is, then saying that if the test is passed, just load the normal script, but if the test fails, load the normal script and a polyfill to allow the code to work in an older browser.&lt;br /&gt;
&lt;br /&gt;
You can find a lot more details on how to use YepNope at [http://yepnopejs.com/ The YepNope homepage].&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
I hope that's helped you get all these ideas clear in your head — why browser sniffing is bad, why feature detection is a much better way to detect whether a browser will run your site features or not, and different strategies for providing different capability browsers with different but acceptable experiences.&lt;br /&gt;
&lt;br /&gt;
If you want to read more sources about the topics discussed above, please check out the following pages:&lt;br /&gt;
&lt;br /&gt;
* [http://css-tricks.com/browser-detection-is-bad/ CSS Tricks: Browser detection is bad]&lt;br /&gt;
* [http://webaim.org/blog/user-agent-string-history/ WebAIM: History of the browser user-agent string]. A great account of why user agent sniffing was responsible for so much evil, historically speaking.&lt;br /&gt;
* [http://www.mezzoblue.com/archives/2007/11/12/detect_this/ Dave Shea: Detect This]. A good concrete example of why browsing sniffing is so bad.&amp;lt;/a&amp;gt;&lt;br /&gt;
* [http://modernizr.com Modernizr homepage]: find out all about how to use Modernizr, and download custom builds&amp;lt;/a&amp;gt;&lt;br /&gt;
* [http://yepnopejs.com/ YepNope homepage]: find out how to do more with it!&amp;lt;/a&amp;gt;&lt;/div&gt;</description>
			<pubDate>Mon, 21 May 2012 16:40:41 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Optimizing_content_for_different_browsers:_the_RIGHT_way</comments>		</item>
		<item>
			<title>Main Page</title>
			<link>http://www.w3.org/community/webed/wiki/Main_Page</link>
			<description>&lt;p&gt;Cmills:&amp;#32;/* Project activities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Web Education Community Group Wiki! This page contains resources to help you teach or learn modern web development:&lt;br /&gt;
&lt;br /&gt;
* The first section — [http://www.w3.org/community/webed/wiki/Main_Page#Web_Standards_Curriculum_table_of_contents The web standards curriculum] — is a series of tutorial articles covering web design and development high level concepts, and essential technologies such as HTML, CSS and JavaScript. This is ideal for beginners wanting to learn the art of web design, or teachers looking for accurate material to use as the basis of teaching material.&lt;br /&gt;
* The second section — [http://www.w3.org/community/webed/wiki/Main_Page#References References] — is designed for looking up HTML and CSS language features.&lt;br /&gt;
* The third section — [http://www.w3.org/community/webed/wiki/Main_Page#Curriculum_structures Curriculum structures] — is a complete set of web design-related curricula for teachers to use to put together courses, which includes sample assignments, example questions, reading lists, assessment criteria, and more.&lt;br /&gt;
&lt;br /&gt;
Note: This is not a finalised site, but a development site for our material — it will be placed on a dedicated publishing platform in coming months, and a lot more material will be added. If you would like to contribute, please join the [http://www.w3.org/community/webed/ Web Education Community Group]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Web Standards Curriculum table of contents =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
What follows is a list of all the articles within the web standards curriculum, which will give you an essential grounding in Hypertext Markup Language (HTML), Cascading Stylesheets (CSS), JavaScript, accessibility, and the other topics you need to be a modern web developer/designer. Reading them in order makes the most sense, but they are written to work individually, so you can dip in and out as it suits you, if you need to hone individual skills.&lt;br /&gt;
&lt;br /&gt;
Note: This material was originally published as part of the Opera Web Standards Curriculum, available as [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur/#toc Introductory material], written by Chris Mills. Like the original, it is published under the [http://creativecommons.org/licenses/by-nc-sa/2.5/ Creative Commons Attribution, Non Commercial - Share Alike 2.5] license.&lt;br /&gt;
&lt;br /&gt;
Note #2: Many of the links below currently point to the [http://dev.opera.com dev.opera] versions, but we'll change these over to the W3C versions as we add more to the site. We are very happy to add these to the W3C pages, for a wider readership and more maintenance help.&lt;br /&gt;
&lt;br /&gt;
== The beginning ==&lt;br /&gt;
&lt;br /&gt;
[[Introduction to the Web Standards Curriculum]]&lt;br /&gt;
* [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-he/ Hebrew translation] | [http://dev.opera.com/articles/view/1-bevezeto-a-webes-szabvanyokba/ Hungarian translation] | [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-it/ Italian translation] | [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/ Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/ Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Introduction to the world of web standards ==&lt;br /&gt;
&lt;br /&gt;
# [[The history of the Web|The history of the Internet and the web, and the evolution of web standards]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-he/ Hebrew translation] | [http://dev.opera.com/articles/view/2-az-internet-es-a-web-tortenete/ Hungarian translation] | [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-it/ Italian translation] | [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/m1/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud1/index.html Spanish translation]&lt;br /&gt;
# [[How does the Internet work]]?&lt;br /&gt;
#* [http://dev.opera.com/articles/view/3-hogyan-mukodik-az-internet/ Hungarian translation] | [http://dev.opera.com/articles/view/3-how-does-the-internet-work-ja/ Japanese translation]| [http://mosaic.uoc.edu/ac/le/ca/m1/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud2/index.html Spanish translation]&lt;br /&gt;
# [[The web standards model - HTML CSS and JavaScript]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/4-a-webes-szabvanyok-modellje/ Hungarian translation] | [http://dev.opera.com/articles/view/4-the-web-standards-model-html-css-a-ja/ Japanese translation]| [http://mosaic.uoc.edu/ac/le/ca/m1/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/ca/m1/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud3/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Web Design Concepts ==&lt;br /&gt;
&lt;br /&gt;
This section won't go into any code or markup details, and will act as an introduction to the design process before you start to create any graphics or code, as well as concepts of web design such as IA, navigation, usability etc.&lt;br /&gt;
&lt;br /&gt;
# [[Information_Architecture_-_planning_out_a_web_site|Information Architecture - planning out a web site]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/6-informacios-architektura-egy-website-t/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud1/index.html Spanish translation]&lt;br /&gt;
# [[What_does_a_good_web_page_need|What does a good web page need?]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/7-mi-kell-egy-jo-weblaphoz/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud2/index.html Spanish translation]&lt;br /&gt;
# [[Colour_theory|Colour Theory]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/8-a-szinek-elmelete/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud3/index.html Spanish translation]&lt;br /&gt;
# [[Building up a site wireframe]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/9-egy-site-keretenek-felepitese/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud4/index.html Spanish translation] &lt;br /&gt;
# [[Colour schemes and design mockups]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/10-szinsemak-es-designtervek/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud5/index.html Spanish translation]&lt;br /&gt;
# [[Typography on the Web]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/11-tipografia-a-weben/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud6/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== HTML beginnings ==&lt;br /&gt;
&lt;br /&gt;
# [[The basics of HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/12-a-html-alapjai/ Hungarian translation] | [http://dev.opera.com/articles/view/12-the-basics-of-html-ja/ Japanese translation]&lt;br /&gt;
# [[Doctypes and markup styles]]&lt;br /&gt;
# [[The_HTML_head_element|The HTML &amp;amp;lt;head&amp;amp;gt; element]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/13-a-html-head-eleme/ Hungarian translation] | [http://dev.opera.com/articles/view/13-the-html-head-element-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/m3/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m3/ud1/index.html Spanish translation]&lt;br /&gt;
# [[More_about_the_document_head|More about the document &amp;amp;lt;head&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
== The HTML body ==&lt;br /&gt;
&lt;br /&gt;
# [[Marking up textual content in HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/15-szoveges-reszek-megjelolese/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud1/index.html Spanish translation]&lt;br /&gt;
# [[HTML lists|HTML Lists]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/16-html-listak/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud2/index.html Spanish translation]&lt;br /&gt;
# [[Images in HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/17-kepek-a-htmlben/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud3/index.html Spanish translation]&lt;br /&gt;
# [[HTML_links_-_lets_build_a_web|HTML links — let's build a web!]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/18-html-hivatkozasok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud4/index.html Spanish translation]&lt;br /&gt;
# [[HTML tables]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/19-html-tablazatok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud5/index.html Spanish translation]&lt;br /&gt;
# [[HTML forms - the basics]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/20-html-urlapok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud6/index.html Spanish translation]&lt;br /&gt;
# [[HTML5 form additions]]&lt;br /&gt;
# [[HTML structural elements]]&lt;br /&gt;
# [[Lesser - known semantic elements]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/21-kevesse-ismert/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud7/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud7/index.html Spanish translation]&lt;br /&gt;
# [[Creating multiple pages with navigation menus]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m4/ud9/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud9/index.html Spanish translation]&lt;br /&gt;
# [[Validating your HTML]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m4/ud10/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud10/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Accessibility ==&lt;br /&gt;
&lt;br /&gt;
# [[Accessibility basics]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m5/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m5/ud1/index.html Spanish translation]&lt;br /&gt;
# [[Accessibility testing]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m5/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m5/ud2/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== CSS ==&lt;br /&gt;
&lt;br /&gt;
# [[CSS_basics|CSS basics]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud1/index.html Spanish translation]&lt;br /&gt;
# [[Advanced CSS selectors]]&lt;br /&gt;
# [[Inheritance and cascade]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud2/index.html Spanish translation]&lt;br /&gt;
# [[CSS text styling part 1]]&lt;br /&gt;
# [[The_CSS_layout_model_-_boxes_borders_margins_padding|The CSS layout model - boxes, borders, margins, padding]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud4/index.html Spanish translation]&lt;br /&gt;
# [[CSS background images]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud5/index.html Spanish translation]&lt;br /&gt;
# [[Styling_lists_and_links|Styling lists and links]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud6/index.html Spanish translation]&lt;br /&gt;
# [[Styling tables]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud7/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud7/index.html Spanish translation]&lt;br /&gt;
# [[Styling forms]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud8/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud8/index.html Spanish translation]&lt;br /&gt;
# [[Floats and clearing]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud9/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud9/index.html Spanish translation]&lt;br /&gt;
# [[CSS static and relative positioning]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud10/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud10/index.html Spanish translation]&lt;br /&gt;
# [[CSS absolute and fixed positioning]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud11/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud11/index.html | Spanish translation]&lt;br /&gt;
# [[Debugging CSS]]&lt;br /&gt;
# [[CSS shorthand reference]]&lt;br /&gt;
&lt;br /&gt;
== Advanced CSS study ==&lt;br /&gt;
&lt;br /&gt;
# [[Headers_footers_columns_and_templates|Headers, footers, columns, and templates]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m7/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m7/ud1/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== JavaScript core skills ==&lt;br /&gt;
&lt;br /&gt;
# [[Programming_-_the_real_basics|Programming - the real basics!]]&lt;br /&gt;
# [[What can you do with JavaScript]]&lt;br /&gt;
# [[Your first look at JavaScript]]&lt;br /&gt;
# [[JavaScript best practices]]&lt;br /&gt;
# [[The principles of unobtrusive JavaScript]]&lt;br /&gt;
# [[JavaScript functions]]&lt;br /&gt;
# [[Objects in JavaScript]]&lt;br /&gt;
# [[Traversing the DOM]]&lt;br /&gt;
# [[Creating and modifying HTML]]&lt;br /&gt;
# [[Dynamic style - manipulating CSS with JavaScript]]&lt;br /&gt;
# [[Handling events with JavaScript]]&lt;br /&gt;
# [[JavaScript animation]]&lt;br /&gt;
# [[Graceful degredation versus progressive enhancement]]&lt;br /&gt;
&lt;br /&gt;
== Mobile web development ==&lt;br /&gt;
&lt;br /&gt;
# [[Introduction_to_mobile_web|Mobile 1: Introduction to mobile web]]&lt;br /&gt;
&lt;br /&gt;
== Supplementary articles ==&lt;br /&gt;
&lt;br /&gt;
* [[Getting your content online]]&lt;br /&gt;
* [[Common HTML entities used for typography]]&lt;br /&gt;
* [[The web standards curriculum glossary]]&lt;br /&gt;
* [[Optimizing content for different browsers: the RIGHT way]]&lt;br /&gt;
&lt;br /&gt;
== Proposed Updates and Additions to Web Standards Curriculum ==&lt;br /&gt;
&lt;br /&gt;
* [[WSC_proposed_updates|Web standards curriculum on W3C Wiki: plan for updates 2011]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:WSC]]&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
&lt;br /&gt;
* [[HTML]]&lt;br /&gt;
* [[CSS]]&lt;br /&gt;
&lt;br /&gt;
= Curriculum structures =&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact_Curriculum Overview of InterACT curriculum articles]&lt;br /&gt;
&lt;br /&gt;
== Basics and &amp;quot;soft&amp;quot; skills ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Internet_Fundamentals Internet Fundamentals]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Digital_Design_Production Digital Design Production]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Writing_for_the_Web Writing for the Web]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Project_Management Project Management]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Professional_Development Professional Development]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Independent_Study Independent Study]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Internship Internship]&lt;br /&gt;
&lt;br /&gt;
== Web design ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Web_Design_1 Web Design 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Web_Design_2 Web Design 2]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Accessibility Accessibility]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Usability_1 Usability 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Findability Findability]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Interaction_Design_1 Interaction Design 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Prototyping Prototyping]&lt;br /&gt;
&lt;br /&gt;
== Web development ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/DOM_Scripting_1 DOM Scripting 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Server-Side_Scripting_1 Server-side Scripting 1]&lt;br /&gt;
&lt;br /&gt;
= Teaching materials =&lt;br /&gt;
&lt;br /&gt;
Each page in this section includes teaching notes, examples, slidedecks and other materials for teachers to use for hands-on teaching of the curriculum structures outlined in the [[#Curriculum_structures|Curriculum structures]] section.&lt;br /&gt;
&lt;br /&gt;
* [[HTML Basics and Web Standards Concepts teaching materials]] (learning competency included in [http://www.w3.org/community/webed/wiki/Interact/Web_Design_1 Web Design 1])&lt;br /&gt;
&lt;br /&gt;
= Project activities =&lt;br /&gt;
&lt;br /&gt;
This section houses a record of all activities being undertaken in past, present or future by the Web Education Community Group, split into projects.&lt;br /&gt;
&lt;br /&gt;
IMPORTANT: Please don't pollute these pages with random stuff - if you just want to doodle or record random thoughts, put it in the [[ Ideas Playground ]].&lt;br /&gt;
&lt;br /&gt;
* [[Learning material]]&lt;br /&gt;
* [[Curriculum]]&lt;br /&gt;
* [[Outreach]]&lt;br /&gt;
* [[Training and certification]]&lt;br /&gt;
* [[Membership and policy]]&lt;br /&gt;
* International projects&lt;br /&gt;
** [[Croatian international project]]&lt;br /&gt;
** [[French international project]]&lt;br /&gt;
** [[Japanese international project]]&lt;br /&gt;
** [[fa/|Persian language international project]]&lt;br /&gt;
** [[Es/|Spanish international project]]&lt;br /&gt;
** [[Turkish international project]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other available resources are as follows:&lt;br /&gt;
&lt;br /&gt;
* [[ WEST | Web Education Supplementary Toolkit ]]&lt;br /&gt;
* [[ Web Education community group style guide ]]&lt;br /&gt;
* [[How to write an article]]&lt;br /&gt;
* [[How to review an article]]&lt;/div&gt;</description>
			<pubDate>Mon, 21 May 2012 15:09:27 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Main_Page</comments>		</item>
		<item>
			<title>Optimizing content for different browsers: the RIGHT way</title>
			<link>http://www.w3.org/community/webed/wiki/Optimizing_content_for_different_browsers:_the_RIGHT_way</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
If you've done a bit of front-end web development, you're bound to have noticed that not all browsers render ''all web content in exactly the same way''. And [http://dowebsitesneedtolookexactlythesameineverybrowser.com neither should they have to]: arguably your web content doesn't need to look exactly the same across every browser and device and user might choose to view it on, as long as it still provides a good user experience and gives them access to the content and services required by their current browsing experience.&lt;br /&gt;
&lt;br /&gt;
To get your web content working well on all of the huge, diverse number of different web browsers and web-enabled devices that exist (or even a good proportion of them), you're going to have to do some work, optimizing the layouts and content delivered to each browser, and sometimes even directing certain devices to completely separate web sites. Examples of where such optimization might be required include:&lt;br /&gt;
&lt;br /&gt;
* Serving different layouts to narrow screen devices (eg mobile phones) and wide screen devices.&lt;br /&gt;
* Serving smaller image and video files (or even alternative content representations) to devices that are on a slower internet connection.&lt;br /&gt;
* Serving cutting edge styling to modern browsers, and alternative styling rules to older browsers that don't support the cutting edge CSS.&lt;br /&gt;
&lt;br /&gt;
There are dozens of techniques available to implement such content, but we don't have space to get anywhere near covering them all in this article. We will provide resources to give you pointers to more information at the end.&lt;br /&gt;
&lt;br /&gt;
This article first focuses on the different mechanisms available to allow us to detect what browser is accessing our content. We'll look at the right and wrong way to do this, and then round it off by showing the different mechanisms available to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
==Browser detection is not the way to go!==&lt;br /&gt;
&lt;br /&gt;
Ok, so the last paragraph in the introduction is a bit misleading — when you want to serve different content to different browsers, detecting the actual browser type and version itself is the wrong way to go in most cases. It is much better to detect whether the browser supports the technologies your web site is using — referred to as feature detection. &lt;br /&gt;
&lt;br /&gt;
This sounds a bit confusing, so let's investigate further.&lt;br /&gt;
&lt;br /&gt;
===A brief history of browser sniffing===&lt;br /&gt;
&lt;br /&gt;
These days, a lot of web standards features are supported pretty consistently across browsers, or at least, modern browsers.&lt;br /&gt;
&lt;br /&gt;
We'll touch a bit on older browsers we're still sometimes required to support later in the article. We'll also look later at the fact that really new, cutting edge web standards features (such as parts of CSS3 and HTML5) sometimes don't work the same across modern browsers, and the best way to deal with that.&lt;br /&gt;
&lt;br /&gt;
For now, let's rewind back to the early-to-mid-1990s. Back then, web standards were not supported very consistently at all across browsers, so developers were forced to either only support certain browsers, or fork their code, sending completely different codebases to different browsers. The way this was done back then was browser sniffing, or to be more accurate, UA sniffing.&lt;br /&gt;
&lt;br /&gt;
Every browser has a UA string that you can query to find out what browser it is. This is done in JavaScript using the &amp;lt;code&amp;gt;Navigator&amp;lt;/code&amp;gt; object. For example, I'm currently using Opera 12.00 beta. If I run &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; in my browser, I get the following returned:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; Edition Next; en) Presto/2.10.289 Version/12.00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I can use this to identify the browser as Opera, and then serve code to just Opera as a result.&lt;br /&gt;
&lt;br /&gt;
Back in 1993, NCSA Mosaic was the most popular browser. It was identified by &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;NCSA_Mosaic/2.0 (Windows 3.1)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was pretty simple. Then Netscape came along, identified by a US string of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Mozilla/1.0 (Win3.1)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was also pretty simple, but here's how the problems started. Netscape supported a new killer web feature of the time, Frames, and Mosaic didn't. So web developers used browser sniffing to detect the browser being used and serve content in frames only to Netscape.&lt;br /&gt;
&lt;br /&gt;
Internet Explorer then came along, and also supported frames, but to make sure it was being served frames, Microsoft used the following UA string to identify itself as Mozilla (compatible):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This is pretty silly, but things got even sillier. Other browser came along later on, with different rendering engines and names, but they all had to keep the Mozilla string inside their UA string, to make sure they were served good content by all this browser sniffing code. For example:&lt;br /&gt;
&lt;br /&gt;
* Mozilla: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826&amp;lt;/code&amp;gt;&lt;br /&gt;
* Firefox: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Opera 9.5: &amp;lt;code&amp;gt;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Opera/9.51 (Windows NT 5.1; U; en)&amp;lt;/code&amp;gt;!!!&lt;br /&gt;
* KHTML: &amp;lt;code&amp;gt;Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Safari: &amp;lt;code&amp;gt;Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5&amp;lt;/code&amp;gt;&lt;br /&gt;
* Chrome: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, all these user agent strings are trying to include some kind of identification of the actual browser they belong to and device install on, while strategically trying to be matched by browser sniffing code to make sure the browsers get served decent code.&lt;br /&gt;
&lt;br /&gt;
===The problem with browser sniffing===&lt;br /&gt;
&lt;br /&gt;
I'm sure you'll agree that the above situation is silly. All of these crazy verbose US strings have arisen because web developers used short-sighted browser sniffing in the first place, which just sniffed for the first browser to support frames (and later other cool features). When new browsers came out, they had to change their UA strings to work with the browser sniffing code. The other choice would be for developers to keep changing their sniffing code every time a new browser comes out that they want to support. This has happened frequently as well.&lt;br /&gt;
&lt;br /&gt;
and this is the crux of why browser sniffing is so bad — it only solves the problem now, and isn't future proof at all. It is also really error prone. When you are browser sniffing, what you are really want to do is check whether the browser accessing your site supports the technologies your content is built from. But instead of doing this directly, you are making an educated guess dependant on the contents of the UA string, which isn't very precise at all!&lt;br /&gt;
&lt;br /&gt;
For example, you'll notice that the above Opera UA string starts with &amp;lt;code&amp;gt;Opera/9.80&amp;lt;/code&amp;gt;, even though at the time of writing we are on version 11.64! This is because of widespread erroneous browsing sniffing code, which looked at Opera UA strings and interpreted Opera 10+ as Opera 1, serving incorrect content as a result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Why feature detection is better===&lt;br /&gt;
&lt;br /&gt;
Feature detection is a much better way to do things — instead of seeing what browser is accessing the content and serving appropriate code, the idea here is to query the browser to detect whether it supports the features  our content relies on, and then serve content as appropriate. Let's take HTML5 video as an example. You could detect support using some simple code such as this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;if(!!document.createElement('video').canPlayType === true) {&lt;br /&gt;
  // run some code that relies on HTML5 video&lt;br /&gt;
} else {&lt;br /&gt;
  // do something else&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is much more future proof, because existing browsers that support HTML5 video will run the correct code, and future browsers that support HTML5 video will do as well. You don't have to keep updating your code each time a new browser is released.&lt;br /&gt;
&lt;br /&gt;
==Strategies for supporting different browsers==&lt;br /&gt;
&lt;br /&gt;
Now we've got the argument for feature detection out of the way, let's look at some strategies you can use to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
===Graceful degradation===&lt;br /&gt;
&lt;br /&gt;
The good news about web technologies is that they are largely designed so that they will work as well as possible if something is not done quite right — this is contrary to other programming environments where nothing will work if there is the slightest error present in the code.&lt;br /&gt;
&lt;br /&gt;
Part of this related to how browsers deal with unknown elements and CSS properties. If a browser encounters an unknown CSS property, it will just ignore it and move on. If a browser encounters an unknown HTML element, it will treat it like an anonymous inline element, similar to a &amp;lt;code&amp;gt;&amp;amp;lt;span&amp;amp;gt;&amp;lt;/code&amp;gt;. This means that if a browser is served some HTML or CSS features it can't understand, it will generally just ignore it and move on, rendering the rest of the content. Obviously this might not give you a usable result in all cases, but for text and image content, you'll find that older browsers will render a usable result, even if it doesn't look quite as nice and shiny as in modern browsers. This is generally called graceful degradation.&lt;br /&gt;
&lt;br /&gt;
A quick example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;border-radius&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;box-shadow&amp;lt;/code&amp;gt; aren't supported in older browsers like IE6, but you're still going to be able to read the content inside the box, even if it hasn't got rounded corners and a drop shadow.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
===Vendor prefixes, and alternative styles===&lt;br /&gt;
&lt;br /&gt;
Of course, you can't rely on graceful degradation in all cases. In some cases, a feature not being supported will result in your content breaking to the point where it is not really usable. In the case of CSS, examples include:&lt;br /&gt;
&lt;br /&gt;
1. Sizing a layout using [http://snook.ca/archives/html_and_css/font-size-with-rem rem units] — these units are not supported in older browsers, resulting in the layout falling apart. To remedy this, you could provide a fallback sized in a unit like pixels later in the cascade, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;nav {&lt;br /&gt;
  width: 180px;&lt;br /&gt;
  width: 18rem;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modern browsers that understand both will first apply the pixel value then override it with the rem value. Older browsers that don't understand rems will just apply the first line, then ignore the second one. &lt;br /&gt;
&lt;br /&gt;
2. Filling in a background using a CSS3 gradient — in browsers that don't support the gradient, it will not render at all, which could cause content to be unreadable.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
To make things better, you could provide a solid background colour as a fallback, like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
====IE conditional comments====&lt;br /&gt;
&lt;br /&gt;
If you are specifically dealing with fallbacks for old versions of Internet Explorer, you can separate these out into separate stylesheets, and then link to these stylesheets inside an IE conditional comment. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;normal-styles.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;!--[if lte IE 6]&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot;  href=&amp;quot;ie-fixes.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;![endif]--&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the first link element will be given to all browsers, whereas the second one will only be picked up by IE versions 6 and less. In the latter, you could put all your IE fallback styles (such as giving IE6 different width and height values to compensate for its broken box model.)&lt;br /&gt;
&lt;br /&gt;
You can read more about IE conditional comments in Bruce Lawson's article [http://dev.opera.com/articles/view/supporting-ie-with-conditional-comments/ Supporting IE with conditional comments].&lt;br /&gt;
&lt;br /&gt;
====Vendor prefixes====&lt;br /&gt;
&lt;br /&gt;
Returning to the gradient example we saw earlier, you may have noticed that something wasn't quite right there. To get the gradient rendering across all modern browsers, you need to include multiple versions of the declaration, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: -webkit-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -moz-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -ms-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -o-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is because the [http://dev.w3.org/csswg/css3-images/ CSS Image Values and Replaced Content Module Level 3] — the spec that CSS gradients are specified in, is not finalised. Unfinished CSS features are implemented in browsers in an experimental capacity, with a vendor-specific prefix so that different browser's implementations can be tested without impacting on other browser's implementations. In the above example:&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;-webkit-&amp;lt;/code&amp;gt; prefixed property will work in WebKit-based browsers such as Chrome and Safari&lt;br /&gt;
* The &amp;lt;code&amp;gt;-moz-&amp;lt;/code&amp;gt; prefixed property will work in Firefox&lt;br /&gt;
* The &amp;lt;code&amp;gt;-ms-&amp;lt;/code&amp;gt; prefixed property will work in Internet Explorer&lt;br /&gt;
* The &amp;lt;code&amp;gt;-o-&amp;lt;/code&amp;gt; prefixed property will work in Opera&lt;br /&gt;
&lt;br /&gt;
Official W3C policy states that you shouldn't really use experimental properties in production code, but people do, as they want to make sites look cool and keep on the cutting edge. I don't see a problem with this, but if you want to use vendor prefixed properties in your code, you really should use include all the different prefixes so that as many browsers as possible can use all the features you are implementing.&lt;br /&gt;
&lt;br /&gt;
Notice that an unprefixed version of the property has also been included, at the bottom of the list: this is so that when the CSS feature is finalised, and the prefixes are removed, the code will still work — this is good future proofing practice.&lt;br /&gt;
&lt;br /&gt;
===Progressive enhancement===&lt;br /&gt;
&lt;br /&gt;
The flip side of graceful degradation is progressive enhancement - this goes in the other direction. Instead of building a great experience as the default and then hoping it degrades to something that is still usable in less capable browsers, you build a basic experience that works in all browsers, and then layer an enhanced experience on top of that.&lt;br /&gt;
&lt;br /&gt;
... NEED TO FILL IN AN EXAMPLE?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Polyfills/shims===&lt;br /&gt;
&lt;br /&gt;
Another approach you can take to dealing with disparate browser support is using Polyfills/shims. These are bits of utility code (usually JavaScript) that fakes support for a feature you want to use in browsers that don't support that feature natively. &lt;br /&gt;
&lt;br /&gt;
You generally use a polyfill by simply applying the JavaScript to your page via &amp;lt;code&amp;gt;&amp;amp;lt;script src=&amp;quot;script.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/code&amp;gt;, although many of them do have other instructions besides. Always reach the author's instructions carefully before attempting to use one! Polyfill/shim examples include:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/scottjehl/Respond respond.js] for making Media Queries work in old versions of IE&lt;br /&gt;
* [http://css3pie.com/ CSS3PIE] for making bling like rounded corners and drop shadows work in old versions of IE&lt;br /&gt;
* [http://www.delphiki.com/html5/playr/ Playr] for making HTML5 video &amp;lt;code&amp;gt;&amp;amp;lt;track&amp;amp;gt;&amp;lt;/code&amp;gt; work in non-supporting browsers&lt;br /&gt;
* [http://code.google.com/p/html5shiv/ HTML5 shiv] for making old versions of IE render HTML5 semantic elements properly&lt;br /&gt;
* [http://excanvas.sourceforge.net/ Excanvas] for making Interner Explorer support HTML5 &amp;lt;code&amp;gt;&amp;amp;lt;canvas&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You might think this sounds wonderful! Why worry about what feature different browser support, if you can just fill in support for the ones that don't using JavaScript? The trouble is that using a Polyfill does add weight to a page, both in terms of extra files requiring download, and extra processing required to put the polyfill in action. If you used loads of polyfills on every one of your pages, they would likely be significantly slower to download and run, as well as making your code base a lot more fiddly and complex.&lt;br /&gt;
&lt;br /&gt;
So they are a great idea, but use them sparingly.&lt;br /&gt;
&lt;br /&gt;
===Feature detection with Modernizr===&lt;br /&gt;
&lt;br /&gt;
You might be thinking at this point &amp;quot;well isn't there a way to only load those extra resources if the browser really needs them?&amp;quot; Well, yes there is. The general idea is to do feature detection to see if the browser supports those features, and then pull in a polyfill or un some alternative code only if needed.&lt;br /&gt;
&lt;br /&gt;
The easiest way to do the feature detection part of this is through a feature detection library called [http://www.modernizr.com Modernizr]. This is a JavaScript library that provides an easy way to do pretty much all of the feature detection you could need. All you have to do is&lt;br /&gt;
&lt;br /&gt;
# Download the library and attach it to your page via a &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
# add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to your page's &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
When your page runs, Modernizr runs feature tests on all manner of HTML5/CSS3/etc. features, then it does two things. First, it adds classes to your &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element to allow you to apply CSS to the page selectively, depending on whether the browser supports various feature or not. Second, it provides you with a JavaScript API to allow you to do the same kind of selective code application in your JavaScript. Let's look at these two aspects in more detail.&lt;br /&gt;
&lt;br /&gt;
====Selective CSS application====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get things going, you need to link to the Modernizr library and add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element in your source code. when the page is run, modernizr runs all its feature detection tests and lets you know the results of those tests via a series of classes appended to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element. They will look something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 &amp;amp;lt;html lang=&amp;quot;en-gb&amp;quot; class=&amp;quot; js no-flexbox no-flexbox-legacy canvas canvastext webgl no-touch geolocation postmessage websqldatabase no-indexeddb&lt;br /&gt;
 hashchange history draganddrop no-websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations&lt;br /&gt;
 csscolumns cssgradients no-cssreflections csstransforms no-csstransforms3d csstransitions fontface generatedcontent video audio&lt;br /&gt;
 localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is really powerful, as it allows you to apply CSS to the page selectively, depending whether it supports certain feature or not. For example, if your code uses an animated 3D transform by default to reveal some content underneath:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;#shutter:hover {&lt;br /&gt;
  transform: rotateX(90deg);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can include alternative styling that overrides this in browsers that don't support 3D transforms like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;.no-csstransforms3d #shutter:hover {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  right: 100px;&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It might not look quite as elegant, but it would still produce an ok experience that allows access to the underlying content.&lt;br /&gt;
&lt;br /&gt;
====Selective JavaScript application====&lt;br /&gt;
&lt;br /&gt;
Modernizr also provides a nice easy JavaScript API to allow you to execute code selectively, depending on whether CSS/HTML/other features are supported by the browser. Each test is a simple method on the Modernizr object, which returns a boolean (true/false) result. For example, if you wanted to query whether the current browser supports 3D transforms in JavaScript, you would write &amp;lt;code&amp;gt;if(Modernizr.csstransforms3d)&amp;lt;/code&amp;gt;. So you could have a block of code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;if(Modernizr.csstransforms3d) {&lt;br /&gt;
  // run killer feature that relies on 3D transforms being available&lt;br /&gt;
} else {&lt;br /&gt;
  // run an alternative chunk of code that provides a graceful fallback&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Problems with Modernizr====&lt;br /&gt;
&lt;br /&gt;
Modernizr, as with everything, isn't perfect. Two of the main problems are:&lt;br /&gt;
&lt;br /&gt;
# Not everything can be feature detected and therefore dealt with in this elegant manner.&lt;br /&gt;
# The full Modernizr library weighs in at 49KB, which is quite a lot of extra code to download for a few feature tests.&lt;br /&gt;
&lt;br /&gt;
However, you can customize Modernizr and create a version suitable for your site that only contains the tests you need, which cuts down on the file weight. And even though you can't feature detect everything, you will find it invaluable in many situations.&lt;br /&gt;
&lt;br /&gt;
===YepNope - load only what you need!===&lt;br /&gt;
&lt;br /&gt;
Now we've covered the feature detection side of things, lets cover what we can do to load resources like Polyfills only when you need them. To help you out with this, Modernizr comes packaged with a really smart, dandy little utility library called YepNope. This can do a lot, but in a nutshell, it allows you to specify a test of some kind, and then say what happens when the test is passed, and when it fails. Here's a simple example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;yepnope({&lt;br /&gt;
  test : Modernizr.canvas,&lt;br /&gt;
  yep  : 'normal.js',&lt;br /&gt;
  nope : ['polyfill.js', 'normal.js']&lt;br /&gt;
});&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, you are sating what the test is, then saying that if the test is passed, just load the normal script, but if the test fails, load the normal script and a polyfill to allow the code to work in an older browser.&lt;br /&gt;
&lt;br /&gt;
You can find a lot more details on how to use YepNope at [http://yepnopejs.com/ The YepNope homepage].&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
I hope that's helped you get all these ideas clear in your head — why browser sniffing is bad, why feature detection is a much better way to detect whether a browser will run your site features or not, and different strategies for providing different capability browsers with different but acceptable experiences.&lt;br /&gt;
&lt;br /&gt;
If you want to read more sources about the topics discussed above, please check out the following pages:&lt;br /&gt;
&lt;br /&gt;
* [http://css-tricks.com/browser-detection-is-bad/ CSS Tricks: Browser detection is bad]&lt;br /&gt;
* [http://webaim.org/blog/user-agent-string-history/ WebAIM: History of the browser user-agent string]. A great account of why user agent sniffing was responsible for so much evil, historically speaking.&lt;br /&gt;
* [http://www.mezzoblue.com/archives/2007/11/12/detect_this/ Dave Shea: Detect This]. A good concrete example of why browsing sniffing is so bad.&amp;lt;/a&amp;gt;&lt;br /&gt;
* [http://modernizr.com Modernizr homepage]: find out all about how to use Modernizr, and download custom builds&amp;lt;/a&amp;gt;&lt;br /&gt;
* [http://yepnopejs.com/ YepNope homepage]: find out how to do more with it!&amp;lt;/a&amp;gt;&lt;/div&gt;</description>
			<pubDate>Mon, 21 May 2012 15:04:48 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Optimizing_content_for_different_browsers:_the_RIGHT_way</comments>		</item>
		<item>
			<title>Optimizing content for different browsers: the RIGHT way</title>
			<link>http://www.w3.org/community/webed/wiki/Optimizing_content_for_different_browsers:_the_RIGHT_way</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
If you've done a bit of front-end web development, you're bound to have noticed that not all browsers render ''all web content in exactly the same way''. And [http://dowebsitesneedtolookexactlythesameineverybrowser.com neither should they have to]: arguably your web content doesn't need to look exactly the same across every browser and device and user might choose to view it on, as long as it still provides a good user experience and gives them access to the content and services required by their current browsing experience.&lt;br /&gt;
&lt;br /&gt;
To get your web content working well on all of the huge, diverse number of different web browsers and web-enabled devices that exist (or even a good proportion of them), you're going to have to do some work, optimizing the layouts and content delivered to each browser, and sometimes even directing certain devices to completely separate web sites. Examples of where such optimization might be required include:&lt;br /&gt;
&lt;br /&gt;
* Serving different layouts to narrow screen devices (eg mobile phones) and wide screen devices.&lt;br /&gt;
* Serving smaller image and video files (or even alternative content representations) to devices that are on a slower internet connection.&lt;br /&gt;
* Serving cutting edge styling to modern browsers, and alternative styling rules to older browsers that don't support the cutting edge CSS.&lt;br /&gt;
&lt;br /&gt;
There are dozens of techniques available to implement such content, but we don't have space to get anywhere near covering them all in this article. We will provide resources to give you pointers to more information at the end.&lt;br /&gt;
&lt;br /&gt;
This article first focuses on the different mechanisms available to allow us to detect what browser is accessing our content. We'll look at the right and wrong way to do this, and then round it off by showing the different mechanisms available to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
==Browser detection is not the way to go!==&lt;br /&gt;
&lt;br /&gt;
Ok, so the last paragraph in the introduction is a bit misleading — when you want to serve different content to different browsers, detecting the actual browser type and version itself is the wrong way to go in most cases. It is much better to detect whether the browser supports the technologies your web site is using — referred to as feature detection. &lt;br /&gt;
&lt;br /&gt;
This sounds a bit confusing, so let's investigate further.&lt;br /&gt;
&lt;br /&gt;
===A brief history of browser sniffing===&lt;br /&gt;
&lt;br /&gt;
These days, a lot of web standards features are supported pretty consistently across browsers, or at least, modern browsers.&lt;br /&gt;
&lt;br /&gt;
We'll touch a bit on older browsers we're still sometimes required to support later in the article. We'll also look later at the fact that really new, cutting edge web standards features (such as parts of CSS3 and HTML5) sometimes don't work the same across modern browsers, and the best way to deal with that.&lt;br /&gt;
&lt;br /&gt;
For now, let's rewind back to the early-to-mid-1990s. Back then, web standards were not supported very consistently at all across browsers, so developers were forced to either only support certain browsers, or fork their code, sending completely different codebases to different browsers. The way this was done back then was browser sniffing, or to be more accurate, UA sniffing.&lt;br /&gt;
&lt;br /&gt;
Every browser has a UA string that you can query to find out what browser it is. This is done in JavaScript using the &amp;lt;code&amp;gt;Navigator&amp;lt;/code&amp;gt; object. For example, I'm currently using Opera 12.00 beta. If I run &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; in my browser, I get the following returned:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; Edition Next; en) Presto/2.10.289 Version/12.00&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I can use this to identify the browser as Opera, and then serve code to just Opera as a result.&lt;br /&gt;
&lt;br /&gt;
Back in 1993, NCSA Mosaic was the most popular browser. It was identified by &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;NCSA_Mosaic/2.0 (Windows 3.1)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was pretty simple. Then Netscape came along, identified by a US string of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.0 (Win3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was also pretty simple, but here's how the problems started. Netscape supported a new killer web feature of the time, Frames, and Mosaic didn't. So web developers used browser sniffing to detect the browser being used and serve content in frames only to Netscape.&lt;br /&gt;
&lt;br /&gt;
Internet Explorer then came along, and also supported frames, but to make sure it was being served frames, Microsoft used the following UA string to identify itself as Mozilla (compatible):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This is pretty silly, but things got even sillier. Other browser came along later on, with different rendering engines and names, but they all had to keep the Mozilla string inside their UA string, to make sure they were served good content by all this browser sniffing code. For example:&lt;br /&gt;
&lt;br /&gt;
* Mozilla: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826&amp;lt;/code&amp;gt;&lt;br /&gt;
* Firefox: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Opera 9.5: &amp;lt;code&amp;gt;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Opera/9.51 (Windows NT 5.1; U; en)&amp;lt;/code&amp;gt;!!!&lt;br /&gt;
* KHTML: &amp;lt;code&amp;gt;Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Safari: &amp;lt;code&amp;gt;Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5&amp;lt;/code&amp;gt;&lt;br /&gt;
* Chrome: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, all these user agent strings are trying to include some kind of identification of the actual browser they belong to and device install on, while strategically trying to be matched by browser sniffing code to make sure the browsers get served decent code.&lt;br /&gt;
&lt;br /&gt;
===The problem with browser sniffing===&lt;br /&gt;
&lt;br /&gt;
I'm sure you'll agree that the above situation is silly. All of these crazy verbose US strings have arisen because web developers used short-sighted browser sniffing in the first place, which just sniffed for the first browser to support frames (and later other cool features). When new browsers came out, they had to change their UA strings to work with the browser sniffing code. The other choice would be for developers to keep changing their sniffing code every time a new browser comes out that they want to support. This has happened frequently as well.&lt;br /&gt;
&lt;br /&gt;
and this is the crux of why browser sniffing is so bad — it only solves the problem now, and isn't future proof at all. It is also really error prone. When you are browser sniffing, what you are really want to do is check whether the browser accessing your site supports the technologies your content is built from. But instead of doing this directly, you are making an educated guess dependant on the contents of the UA string, which isn't very precise at all!&lt;br /&gt;
&lt;br /&gt;
For example, you'll notice that the above Opera UA string starts with &amp;lt;code&amp;gt;Opera/9.80&amp;lt;/code&amp;gt;, even though at the time of writing we are on version 11.64! This is because of widespread erroneous browsing sniffing code, which looked at Opera UA strings and interpreted Opera 10+ as Opera 1, serving incorrect content as a result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Why feature detection is better===&lt;br /&gt;
&lt;br /&gt;
Feature detection is a much better way to do things — instead of seeing what browser is accessing the content and serving appropriate code, the idea here is to query the browser to detect whether it supports the features  our content relies on, and then serve content as appropriate. Let's take HTML5 video as an example. You could detect support using some simple code such as this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(!!document.createElement('video').canPlayType === true) {&lt;br /&gt;
  // run some code that relies on HTML5 video&lt;br /&gt;
} else {&lt;br /&gt;
  // do something else&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is much more future proof, because existing browsers that support HTML5 video will run the correct code, and future browsers that support HTML5 video will do as well. You don't have to keep updating your code each time a new browser is released.&lt;br /&gt;
&lt;br /&gt;
==Strategies for supporting different browsers==&lt;br /&gt;
&lt;br /&gt;
Now we've got the argument for feature detection out of the way, let's look at some strategies you can use to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
===Graceful degradation===&lt;br /&gt;
&lt;br /&gt;
The good news about web technologies is that they are largely designed so that they will work as well as possible if something is not done quite right — this is contrary to other programming environments where nothing will work if there is the slightest error present in the code.&lt;br /&gt;
&lt;br /&gt;
Part of this related to how browsers deal with unknown elements and CSS properties. If a browser encounters an unknown CSS property, it will just ignore it and move on. If a browser encounters an unknown HTML element, it will treat it like an anonymous inline element, similar to a &amp;lt;code&amp;gt;&amp;amp;lt;span&amp;amp;gt;&amp;lt;/code&amp;gt;. This means that if a browser is served some HTML or CSS features it can't understand, it will generally just ignore it and move on, rendering the rest of the content. Obviously this might not give you a usable result in all cases, but for text and image content, you'll find that older browsers will render a usable result, even if it doesn't look quite as nice and shiny as in modern browsers. This is generally called graceful degradation.&lt;br /&gt;
&lt;br /&gt;
A quick example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;border-radius&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;box-shadow&amp;lt;/code&amp;gt; aren't supported in older browsers like IE6, but you're still going to be able to read the content inside the box, even if it hasn't got rounded corners and a drop shadow.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
===Vendor prefixes, and alternative styles===&lt;br /&gt;
&lt;br /&gt;
Of course, you can't rely on graceful degradation in all cases. In some cases, a feature not being supported will result in your content breaking to the point where it is not really usable. In the case of CSS, examples include:&lt;br /&gt;
&lt;br /&gt;
1. Sizing a layout using &amp;lt;a href=&amp;quot;http://snook.ca/archives/html_and_css/font-size-with-rem&amp;quot;&amp;gt;rem units&amp;lt;/a&amp;gt; — these units are not supported in older browsers, resulting in the layout falling apart. To remedy this, you could provide a fallback sized in a unit like pixels later in the cascade, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;nav {&lt;br /&gt;
  width: 180px;&lt;br /&gt;
  width: 18rem;&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modern browsers that understand both will first apply the pixel value then override it with the rem value. Older browsers that don't understand rems will just apply the first line, then ignore the second one. &lt;br /&gt;
&lt;br /&gt;
2. Filling in a background using a CSS3 gradient — in browsers that don't support the gradient, it will not render at all, which could cause content to be unreadable.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
To make things better, you could provide a solid background colour as a fallback, like so:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
====IE conditional comments====&lt;br /&gt;
&lt;br /&gt;
If you are specifically dealing with fallbacks for old versions of Internet Explorer, you can separate these out into separate stylesheets, and then link to these stylesheets inside an IE conditional comment. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;normal-styles.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;!--[if lte IE 6]&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot;  href=&amp;quot;ie-fixes.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;![endif]--&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the first link element will be given to all browsers, whereas the second one will only be picked up by IE versions 6 and less. In the latter, you could put all your IE fallback styles (such as giving IE6 different width and height values to compensate for its broken box model.)&lt;br /&gt;
&lt;br /&gt;
You can read more about IE conditional comments in Bruce Lawson's article &amp;lt;a href=&amp;quot;http://dev.opera.com/articles/view/supporting-ie-with-conditional-comments/&amp;quot;&amp;gt;Supporting IE with conditional comments&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Vendor prefixes====&lt;br /&gt;
&lt;br /&gt;
Returning to the gradient example we saw earlier, you may have noticed that something wasn't quite right there. To get the gradient rendering across all modern browsers, you need to include multiple versions of the declaration, like this:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: -webkit-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -moz-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -ms-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -o-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
This is because the &amp;lt;a href=&amp;quot;http://dev.w3.org/csswg/css3-images/&amp;quot;&amp;gt;CSS Image Values and Replaced Content Module Level 3&amp;lt;/a&amp;gt; — the spec that CSS gradients are specified in, is not finalised. Unfinished CSS features are implemented in browsers in an experimental capacity, with a vendor-specific prefix so that different browser's implementations can be tested without impacting on other browser's implementations. In the above example:&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;-webkit-&amp;lt;/code&amp;gt; prefixed property will work in WebKit-based browsers such as Chrome and Safari&lt;br /&gt;
* The &amp;lt;code&amp;gt;-moz-&amp;lt;/code&amp;gt; prefixed property will work in Firefox&lt;br /&gt;
* The &amp;lt;code&amp;gt;-ms-&amp;lt;/code&amp;gt; prefixed property will work in Internet Explorer&lt;br /&gt;
* The &amp;lt;code&amp;gt;-o-&amp;lt;/code&amp;gt; prefixed property will work in Opera&lt;br /&gt;
&lt;br /&gt;
Official W3C policy states that you shouldn't really use experimental properties in production code, but people do, as they want to make sites look cool and keep on the cutting edge. I don't see a problem with this, but if you want to use vendor prefixed properties in your code, you really should use include all the different prefixes so that as many browsers as possible can use all the features you are implementing.&lt;br /&gt;
&lt;br /&gt;
Notice that an unprefixed version of the property has also been included, at the bottom of the list: this is so that when the CSS feature is finalised, and the prefixes are removed, the code will still work — this is good future proofing practice.&lt;br /&gt;
&lt;br /&gt;
===Progressive enhancement===&lt;br /&gt;
&lt;br /&gt;
The flip side of graceful degradation is progressive enhancement - this goes in the other direction. Instead of building a great experience as the default and then hoping it degrades to something that is still usable in less capable browsers, you build a basic experience that works in all browsers, and then layer an enhanced experience on top of that.&lt;br /&gt;
&lt;br /&gt;
... NEED TO FILL IN AN EXAMPLE?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Polyfills/shims===&lt;br /&gt;
&lt;br /&gt;
Another approach you can take to dealing with disparate browser support is using Polyfills/shims. These are bits of utility code (usually JavaScript) that fakes support for a feature you want to use in browsers that don't support that feature natively. &lt;br /&gt;
&lt;br /&gt;
You generally use a polyfill by simply applying the JavaScript to your page via &amp;lt;code&amp;gt;&amp;amp;lt;script src=&amp;quot;script.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/code&amp;gt;, although many of them do have other instructions besides. Always reach the author's instructions carefully before attempting to use one! Polyfill/shim examples include:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You might think this sounds wonderful! Why worry about what feature different browser support, if you can just fill in support for the ones that don't using JavaScript? The trouble is that using a Polyfill does add weight to a page, both in terms of extra files requiring download, and extra processing required to put the polyfill in action. If you used loads of polyfills on every one of your pages, they would likely be significantly slower to download and run, as well as making your code base a lot more fiddly and complex.&lt;br /&gt;
&lt;br /&gt;
So they are great, but use them sparingly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Feature detection with Modernizr===&lt;br /&gt;
&lt;br /&gt;
You might be thinking at this point &amp;quot;well isn't there a way to only load those extra resources if the browser really needs them?&amp;quot; Well, yes there is. The general idea is to do feature detection to see if the browser supports those features, and then pull in a polyfill or un some alternative code only if needed.&lt;br /&gt;
&lt;br /&gt;
The easiest way to do the feature detection part of this is through a feature detection library called &amp;lt;a href=&amp;quot;http://www.modernizr.com&amp;quot;&amp;gt;Modernizr&amp;lt;/a&amp;gt;. This is a JavaScript library that provides an easy way to do pretty much all of the feature detection you could need. All you have to do is&lt;br /&gt;
&lt;br /&gt;
# Download the library and attach it to your page via a &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
# add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to your page's &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
When your page runs, Modernizr runs feature tests on all manner of HTML5/CSS3/etc. features, then it does two things. First, it adds classes to your &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element to allow you to apply CSS to the page selectively, depending on whether the browser supports various feature or not. Second, it provides you with a JavaScript API to allow you to do the same kind of selective code application in your JavaScript. Let's look at these two aspects in more detail.&lt;br /&gt;
&lt;br /&gt;
====Selective CSS application====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get things going, you need to link to the Modernizr library and add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element in your source code. when the page is run, modernizr runs all its feature detection tests and lets you know the results of those tests via a series of classes appended to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element. They will look something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;amp;lt;html lang=&amp;quot;en-gb&amp;quot; class=&amp;quot; js no-flexbox no-flexbox-legacy canvas canvastext webgl no-touch geolocation postmessage websqldatabase no-indexeddb&lt;br /&gt;
 hashchange history draganddrop no-websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations&lt;br /&gt;
 csscolumns cssgradients no-cssreflections csstransforms no-csstransforms3d csstransitions fontface generatedcontent video audio&lt;br /&gt;
 localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is really powerful, as it allows you to apply CSS to the page selectively, depending whether it supports certain feature or not. For example, if your code uses an animated 3D transform by default to reveal some content underneath:&lt;br /&gt;
&lt;br /&gt;
#shutter:hover {&lt;br /&gt;
  transform: rotateX(90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
You can include alternative styling that overrides this in browsers that don't support 3D transforms like this:&lt;br /&gt;
&lt;br /&gt;
.no-csstransforms3d #shutter:hover {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  right: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
It might not look quite as elegant, but it would still produce an ok experience that allows access to the underlying content.&lt;br /&gt;
&lt;br /&gt;
====Selective JavaScript application====&lt;br /&gt;
&lt;br /&gt;
Modernizr also provides a nice easy JavaScript API to allow you to execute code selectively, depending on whether CSS/HTML/other features are supported by the browser. Each test is a simple method on the Modernizr object, which returns a boolean (true/false) result. For example, if you wanted to query whether the current browser supports 3D transforms in JavaScript, you would write &amp;lt;code&amp;gt;if(Modernizr.csstransforms3d)&amp;lt;/code&amp;gt;. So you could have a block of code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(Modernizr.csstransforms3d) {&lt;br /&gt;
  // run killer feature that relies on 3D transforms being available&lt;br /&gt;
} else {&lt;br /&gt;
  // run an alternative chunk of code that provides a graceful fallback&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Problems with Modernizr====&lt;br /&gt;
&lt;br /&gt;
Modernizr, as with everything, isn't perfect. Two of the main problems are:&lt;br /&gt;
&lt;br /&gt;
# Not everything can be feature detected and therefore dealt with in this elegant manner.&lt;br /&gt;
# The full Modernizr library weighs in at 49KB, which is quite a lot of extra code to download for a few feature tests.&lt;br /&gt;
&lt;br /&gt;
However, you can customize Modernizr and create a version suitable for your site that only contains the tests you need, which cuts down on the file weight. And even though you can't feature detect everything, you will find it invaluable in many situations.&lt;br /&gt;
&lt;br /&gt;
===YepNope - load only what you need!===&lt;br /&gt;
&lt;br /&gt;
Now we've covered the feature detection side of things, lets cover what we can do to load resources like Polyfills only when you need them. To help you out with this, Modernizr comes packaged with a really smart, dandy little utility library called YepNope. This can do a lot, but in a nutshell, it allows you to specify a test of some kind, and then say what happens when the test is passed, and when it fails. Here's a simple example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;yepnope({&lt;br /&gt;
  test : Modernizr.canvas,&lt;br /&gt;
  yep  : 'normal.js',&lt;br /&gt;
  nope : ['polyfill.js', 'normal.js']&lt;br /&gt;
});&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, you are sating what the test is, then saying that if the test is passed, just load the normal script, but if the test fails, load the normal script and a polyfill to allow the code to work in an older browser.&lt;br /&gt;
&lt;br /&gt;
You can find a lot more details on how to use YepNope at &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;The YepNope homepage&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
I hope that's helped you get all these ideas clear in your head — why browser sniffing is bad, why feature detection is a much better way to detect whether a browser will run your site features or not, and different strategies for providing different capability browsers with different but acceptable experiences.&lt;br /&gt;
&lt;br /&gt;
If you want to read more sources about the topics discussed above, please check out the following pages:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://css-tricks.com/browser-detection-is-bad/&amp;quot;&amp;gt;CSS Tricks: Browser detection is bad&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://webaim.org/blog/user-agent-string-history/&amp;quot;&amp;gt;WebAIM: History of the browser user-agent string&amp;lt;/a&amp;gt;. A great account of why user agent sniffing was responsible for so much evil, historically speaking.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://www.mezzoblue.com/archives/2007/11/12/detect_this/&amp;quot;&amp;gt;Dave Shea: Detect This. A good concrete example of why browsing sniffing is so bad.&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://modernizr.com&amp;quot;&amp;gt;Modernizr homepage: find out all about how to use Modernizr, and download custom builds&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;YepNope homepage: find out how to do more with it!&amp;lt;/a&amp;gt;&lt;/div&gt;</description>
			<pubDate>Mon, 21 May 2012 14:55:02 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Optimizing_content_for_different_browsers:_the_RIGHT_way</comments>		</item>
		<item>
			<title>Optimizing content for different browsers: the RIGHT way</title>
			<link>http://www.w3.org/community/webed/wiki/Optimizing_content_for_different_browsers:_the_RIGHT_way</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
If you've done a bit of front-end web development, you're bound to have noticed that not all browsers render ''all web content in exactly the same way''. And [http://dowebsitesneedtolookexactlythesameineverybrowser.com neither should they have to]: arguably your web content doesn't need to look exactly the same across every browser and device and user might choose to view it on, as long as it still provides a good user experience and gives them access to the content and services required by their current browsing experience.&lt;br /&gt;
&lt;br /&gt;
To get your web content working well on all of the huge, diverse number of different web browsers and web-enabled devices that exist (or even a good proportion of them), you're going to have to do some work, optimizing the layouts and content delivered to each browser, and sometimes even directing certain devices to completely separate web sites. Examples of where such optimization might be required include:&lt;br /&gt;
&lt;br /&gt;
* Serving different layouts to narrow screen devices (eg mobile phones) and wide screen devices.&lt;br /&gt;
* Serving smaller image and video files (or even alternative content representations) to devices that are on a slower internet connection.&lt;br /&gt;
* Serving cutting edge styling to modern browsers, and alternative styling rules to older browsers that don't support the cutting edge CSS.&lt;br /&gt;
&lt;br /&gt;
There are dozens of techniques available to implement such content, but we don't have space to get anywhere near covering them all in this article. We will provide resources to give you pointers to more information at the end.&lt;br /&gt;
&lt;br /&gt;
This article first focuses on the different mechanisms available to allow us to detect what browser is accessing our content. We'll look at the right and wrong way to do this, and then round it off by showing the different mechanisms available to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
==Browser detection is not the way to go!==&lt;br /&gt;
&lt;br /&gt;
Ok, so the last paragraph in the introduction is a bit misleading — when you want to serve different content to different browsers, detecting the actual browser type and version itself is the wrong way to go in most cases. It is much better to detect whether the browser supports the technologies your web site is using — referred to as feature detection. &lt;br /&gt;
&lt;br /&gt;
This sounds a bit confusing, so let's investigate further.&lt;br /&gt;
&lt;br /&gt;
===A brief history of browser sniffing===&lt;br /&gt;
&lt;br /&gt;
These days, a lot of web standards features are supported pretty consistently across browsers, or at least, modern browsers.&lt;br /&gt;
&lt;br /&gt;
We'll touch a bit on older browsers we're still sometimes required to support later in the article. We'll also look later at the fact that really new, cutting edge web standards features (such as parts of CSS3 and HTML5) sometimes don't work the same across modern browsers, and the best way to deal with that.&lt;br /&gt;
&lt;br /&gt;
For now, let's rewind back to the early-to-mid-1990s. Back then, web standards were not supported very consistently at all across browsers, so developers were forced to either only support certain browsers, or fork their code, sending completely different codebases to different browsers. The way this was done back then was browser sniffing, or to be more accurate, UA sniffing.&lt;br /&gt;
&lt;br /&gt;
Every browser has a UA string that you can query to find out what browser it is. This is done in JavaScript using the &amp;lt;code&amp;gt;Navigator&amp;lt;/code&amp;gt; object. For example, I'm currently using Opera 12.00 beta. If I run &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; in my browser, I get the following returned:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; Edition Next; en) Presto/2.10.289 Version/12.00&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I can use this to identify the browser as Opera, and then serve code to just Opera as a result.&lt;br /&gt;
&lt;br /&gt;
Back in 1993, NCSA Mosaic was the most popular browser. It was identified by &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;NCSA_Mosaic/2.0 (Windows 3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was pretty simple. Then Netscape came along, identified by a US string of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.0 (Win3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was also pretty simple, but here's how the problems started. Netscape supported a new killer web feature of the time, Frames, and Mosaic didn't. So web developers used browser sniffing to detect the browser being used and serve content in frames only to Netscape.&lt;br /&gt;
&lt;br /&gt;
Internet Explorer then came along, and also supported frames, but to make sure it was being served frames, Microsoft used the following UA string to identify itself as Mozilla (compatible):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This is pretty silly, but things got even sillier. Other browser came along later on, with different rendering engines and names, but they all had to keep the Mozilla string inside their UA string, to make sure they were served good content by all this browser sniffing code. For example:&lt;br /&gt;
&lt;br /&gt;
* Mozilla: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826&amp;lt;/code&amp;gt;&lt;br /&gt;
* Firefox: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Opera 9.5: &amp;lt;code&amp;gt;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Opera/9.51 (Windows NT 5.1; U; en)&amp;lt;/code&amp;gt;!!!&lt;br /&gt;
* KHTML: &amp;lt;code&amp;gt;Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Safari: &amp;lt;code&amp;gt;Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5&amp;lt;/code&amp;gt;&lt;br /&gt;
* Chrome: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, all these user agent strings are trying to include some kind of identification of the actual browser they belong to and device install on, while strategically trying to be matched by browser sniffing code to make sure the browsers get served decent code.&lt;br /&gt;
&lt;br /&gt;
===The problem with browser sniffing===&lt;br /&gt;
&lt;br /&gt;
I'm sure you'll agree that the above situation is silly. All of these crazy verbose US strings have arisen because web developers used short-sighted browser sniffing in the first place, which just sniffed for the first browser to support frames (and later other cool features). When new browsers came out, they had to change their UA strings to work with the browser sniffing code. The other choice would be for developers to keep changing their sniffing code every time a new browser comes out that they want to support. This has happened frequently as well.&lt;br /&gt;
&lt;br /&gt;
and this is the crux of why browser sniffing is so bad — it only solves the problem now, and isn't future proof at all. It is also really error prone. When you are browser sniffing, what you are really want to do is check whether the browser accessing your site supports the technologies your content is built from. But instead of doing this directly, you are making an educated guess dependant on the contents of the UA string, which isn't very precise at all!&lt;br /&gt;
&lt;br /&gt;
For example, you'll notice that the above Opera UA string starts with &amp;lt;code&amp;gt;Opera/9.80&amp;lt;/code&amp;gt;, even though at the time of writing we are on version 11.64! This is because of widespread erroneous browsing sniffing code, which looked at Opera UA strings and interpreted Opera 10+ as Opera 1, serving incorrect content as a result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Why feature detection is better===&lt;br /&gt;
&lt;br /&gt;
Feature detection is a much better way to do things — instead of seeing what browser is accessing the content and serving appropriate code, the idea here is to query the browser to detect whether it supports the features  our content relies on, and then serve content as appropriate. Let's take HTML5 video as an example. You could detect support using some simple code such as this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(!!document.createElement('video').canPlayType === true) {&lt;br /&gt;
  // run some code that relies on HTML5 video&lt;br /&gt;
} else {&lt;br /&gt;
  // do something else&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is much more future proof, because existing browsers that support HTML5 video will run the correct code, and future browsers that support HTML5 video will do as well. You don't have to keep updating your code each time a new browser is released.&lt;br /&gt;
&lt;br /&gt;
==Strategies for supporting different browsers==&lt;br /&gt;
&lt;br /&gt;
Now we've got the argument for feature detection out of the way, let's look at some strategies you can use to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
===Graceful degradation===&lt;br /&gt;
&lt;br /&gt;
The good news about web technologies is that they are largely designed so that they will work as well as possible if something is not done quite right — this is contrary to other programming environments where nothing will work if there is the slightest error present in the code.&lt;br /&gt;
&lt;br /&gt;
Part of this related to how browsers deal with unknown elements and CSS properties. If a browser encounters an unknown CSS property, it will just ignore it and move on. If a browser encounters an unknown HTML element, it will treat it like an anonymous inline element, similar to a &amp;lt;code&amp;gt;&amp;amp;lt;span&amp;amp;gt;&amp;lt;/code&amp;gt;. This means that if a browser is served some HTML or CSS features it can't understand, it will generally just ignore it and move on, rendering the rest of the content. Obviously this might not give you a usable result in all cases, but for text and image content, you'll find that older browsers will render a usable result, even if it doesn't look quite as nice and shiny as in modern browsers. This is generally called graceful degradation.&lt;br /&gt;
&lt;br /&gt;
A quick example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;border-radius&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;box-shadow&amp;lt;/code&amp;gt; aren't supported in older browsers like IE6, but you're still going to be able to read the content inside the box, even if it hasn't got rounded corners and a drop shadow.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
===Vendor prefixes, and alternative styles===&lt;br /&gt;
&lt;br /&gt;
Of course, you can't rely on graceful degradation in all cases. In some cases, a feature not being supported will result in your content breaking to the point where it is not really usable. In the case of CSS, examples include:&lt;br /&gt;
&lt;br /&gt;
1. Sizing a layout using &amp;lt;a href=&amp;quot;http://snook.ca/archives/html_and_css/font-size-with-rem&amp;quot;&amp;gt;rem units&amp;lt;/a&amp;gt; — these units are not supported in older browsers, resulting in the layout falling apart. To remedy this, you could provide a fallback sized in a unit like pixels later in the cascade, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;nav {&lt;br /&gt;
  width: 180px;&lt;br /&gt;
  width: 18rem;&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modern browsers that understand both will first apply the pixel value then override it with the rem value. Older browsers that don't understand rems will just apply the first line, then ignore the second one. &lt;br /&gt;
&lt;br /&gt;
2. Filling in a background using a CSS3 gradient — in browsers that don't support the gradient, it will not render at all, which could cause content to be unreadable.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
To make things better, you could provide a solid background colour as a fallback, like so:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
====IE conditional comments====&lt;br /&gt;
&lt;br /&gt;
If you are specifically dealing with fallbacks for old versions of Internet Explorer, you can separate these out into separate stylesheets, and then link to these stylesheets inside an IE conditional comment. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;normal-styles.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;!--[if lte IE 6]&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot;  href=&amp;quot;ie-fixes.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;![endif]--&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the first link element will be given to all browsers, whereas the second one will only be picked up by IE versions 6 and less. In the latter, you could put all your IE fallback styles (such as giving IE6 different width and height values to compensate for its broken box model.)&lt;br /&gt;
&lt;br /&gt;
You can read more about IE conditional comments in Bruce Lawson's article &amp;lt;a href=&amp;quot;http://dev.opera.com/articles/view/supporting-ie-with-conditional-comments/&amp;quot;&amp;gt;Supporting IE with conditional comments&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Vendor prefixes====&lt;br /&gt;
&lt;br /&gt;
Returning to the gradient example we saw earlier, you may have noticed that something wasn't quite right there. To get the gradient rendering across all modern browsers, you need to include multiple versions of the declaration, like this:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: -webkit-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -moz-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -ms-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -o-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
This is because the &amp;lt;a href=&amp;quot;http://dev.w3.org/csswg/css3-images/&amp;quot;&amp;gt;CSS Image Values and Replaced Content Module Level 3&amp;lt;/a&amp;gt; — the spec that CSS gradients are specified in, is not finalised. Unfinished CSS features are implemented in browsers in an experimental capacity, with a vendor-specific prefix so that different browser's implementations can be tested without impacting on other browser's implementations. In the above example:&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;-webkit-&amp;lt;/code&amp;gt; prefixed property will work in WebKit-based browsers such as Chrome and Safari&lt;br /&gt;
* The &amp;lt;code&amp;gt;-moz-&amp;lt;/code&amp;gt; prefixed property will work in Firefox&lt;br /&gt;
* The &amp;lt;code&amp;gt;-ms-&amp;lt;/code&amp;gt; prefixed property will work in Internet Explorer&lt;br /&gt;
* The &amp;lt;code&amp;gt;-o-&amp;lt;/code&amp;gt; prefixed property will work in Opera&lt;br /&gt;
&lt;br /&gt;
Official W3C policy states that you shouldn't really use experimental properties in production code, but people do, as they want to make sites look cool and keep on the cutting edge. I don't see a problem with this, but if you want to use vendor prefixed properties in your code, you really should use include all the different prefixes so that as many browsers as possible can use all the features you are implementing.&lt;br /&gt;
&lt;br /&gt;
Notice that an unprefixed version of the property has also been included, at the bottom of the list: this is so that when the CSS feature is finalised, and the prefixes are removed, the code will still work — this is good future proofing practice.&lt;br /&gt;
&lt;br /&gt;
===Progressive enhancement===&lt;br /&gt;
&lt;br /&gt;
The flip side of graceful degradation is progressive enhancement - this goes in the other direction. Instead of building a great experience as the default and then hoping it degrades to something that is still usable in less capable browsers, you build a basic experience that works in all browsers, and then layer an enhanced experience on top of that.&lt;br /&gt;
&lt;br /&gt;
... NEED TO FILL IN AN EXAMPLE?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Polyfills/shims===&lt;br /&gt;
&lt;br /&gt;
Another approach you can take to dealing with disparate browser support is using Polyfills/shims. These are bits of utility code (usually JavaScript) that fakes support for a feature you want to use in browsers that don't support that feature natively. &lt;br /&gt;
&lt;br /&gt;
You generally use a polyfill by simply applying the JavaScript to your page via &amp;lt;code&amp;gt;&amp;amp;lt;script src=&amp;quot;script.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/code&amp;gt;, although many of them do have other instructions besides. Always reach the author's instructions carefully before attempting to use one! Polyfill/shim examples include:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You might think this sounds wonderful! Why worry about what feature different browser support, if you can just fill in support for the ones that don't using JavaScript? The trouble is that using a Polyfill does add weight to a page, both in terms of extra files requiring download, and extra processing required to put the polyfill in action. If you used loads of polyfills on every one of your pages, they would likely be significantly slower to download and run, as well as making your code base a lot more fiddly and complex.&lt;br /&gt;
&lt;br /&gt;
So they are great, but use them sparingly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Feature detection with Modernizr===&lt;br /&gt;
&lt;br /&gt;
You might be thinking at this point &amp;quot;well isn't there a way to only load those extra resources if the browser really needs them?&amp;quot; Well, yes there is. The general idea is to do feature detection to see if the browser supports those features, and then pull in a polyfill or un some alternative code only if needed.&lt;br /&gt;
&lt;br /&gt;
The easiest way to do the feature detection part of this is through a feature detection library called &amp;lt;a href=&amp;quot;http://www.modernizr.com&amp;quot;&amp;gt;Modernizr&amp;lt;/a&amp;gt;. This is a JavaScript library that provides an easy way to do pretty much all of the feature detection you could need. All you have to do is&lt;br /&gt;
&lt;br /&gt;
# Download the library and attach it to your page via a &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
# add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to your page's &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
When your page runs, Modernizr runs feature tests on all manner of HTML5/CSS3/etc. features, then it does two things. First, it adds classes to your &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element to allow you to apply CSS to the page selectively, depending on whether the browser supports various feature or not. Second, it provides you with a JavaScript API to allow you to do the same kind of selective code application in your JavaScript. Let's look at these two aspects in more detail.&lt;br /&gt;
&lt;br /&gt;
====Selective CSS application====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get things going, you need to link to the Modernizr library and add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element in your source code. when the page is run, modernizr runs all its feature detection tests and lets you know the results of those tests via a series of classes appended to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element. They will look something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;amp;lt;html lang=&amp;quot;en-gb&amp;quot; class=&amp;quot; js no-flexbox no-flexbox-legacy canvas canvastext webgl no-touch geolocation postmessage websqldatabase no-indexeddb&lt;br /&gt;
 hashchange history draganddrop no-websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations&lt;br /&gt;
 csscolumns cssgradients no-cssreflections csstransforms no-csstransforms3d csstransitions fontface generatedcontent video audio&lt;br /&gt;
 localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is really powerful, as it allows you to apply CSS to the page selectively, depending whether it supports certain feature or not. For example, if your code uses an animated 3D transform by default to reveal some content underneath:&lt;br /&gt;
&lt;br /&gt;
#shutter:hover {&lt;br /&gt;
  transform: rotateX(90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
You can include alternative styling that overrides this in browsers that don't support 3D transforms like this:&lt;br /&gt;
&lt;br /&gt;
.no-csstransforms3d #shutter:hover {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  right: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
It might not look quite as elegant, but it would still produce an ok experience that allows access to the underlying content.&lt;br /&gt;
&lt;br /&gt;
====Selective JavaScript application====&lt;br /&gt;
&lt;br /&gt;
Modernizr also provides a nice easy JavaScript API to allow you to execute code selectively, depending on whether CSS/HTML/other features are supported by the browser. Each test is a simple method on the Modernizr object, which returns a boolean (true/false) result. For example, if you wanted to query whether the current browser supports 3D transforms in JavaScript, you would write &amp;lt;code&amp;gt;if(Modernizr.csstransforms3d)&amp;lt;/code&amp;gt;. So you could have a block of code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(Modernizr.csstransforms3d) {&lt;br /&gt;
  // run killer feature that relies on 3D transforms being available&lt;br /&gt;
} else {&lt;br /&gt;
  // run an alternative chunk of code that provides a graceful fallback&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Problems with Modernizr====&lt;br /&gt;
&lt;br /&gt;
Modernizr, as with everything, isn't perfect. Two of the main problems are:&lt;br /&gt;
&lt;br /&gt;
# Not everything can be feature detected and therefore dealt with in this elegant manner.&lt;br /&gt;
# The full Modernizr library weighs in at 49KB, which is quite a lot of extra code to download for a few feature tests.&lt;br /&gt;
&lt;br /&gt;
However, you can customize Modernizr and create a version suitable for your site that only contains the tests you need, which cuts down on the file weight. And even though you can't feature detect everything, you will find it invaluable in many situations.&lt;br /&gt;
&lt;br /&gt;
===YepNope - load only what you need!===&lt;br /&gt;
&lt;br /&gt;
Now we've covered the feature detection side of things, lets cover what we can do to load resources like Polyfills only when you need them. To help you out with this, Modernizr comes packaged with a really smart, dandy little utility library called YepNope. This can do a lot, but in a nutshell, it allows you to specify a test of some kind, and then say what happens when the test is passed, and when it fails. Here's a simple example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;yepnope({&lt;br /&gt;
  test : Modernizr.canvas,&lt;br /&gt;
  yep  : 'normal.js',&lt;br /&gt;
  nope : ['polyfill.js', 'normal.js']&lt;br /&gt;
});&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, you are sating what the test is, then saying that if the test is passed, just load the normal script, but if the test fails, load the normal script and a polyfill to allow the code to work in an older browser.&lt;br /&gt;
&lt;br /&gt;
You can find a lot more details on how to use YepNope at &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;The YepNope homepage&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
I hope that's helped you get all these ideas clear in your head — why browser sniffing is bad, why feature detection is a much better way to detect whether a browser will run your site features or not, and different strategies for providing different capability browsers with different but acceptable experiences.&lt;br /&gt;
&lt;br /&gt;
If you want to read more sources about the topics discussed above, please check out the following pages:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://css-tricks.com/browser-detection-is-bad/&amp;quot;&amp;gt;CSS Tricks: Browser detection is bad&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://webaim.org/blog/user-agent-string-history/&amp;quot;&amp;gt;WebAIM: History of the browser user-agent string&amp;lt;/a&amp;gt;. A great account of why user agent sniffing was responsible for so much evil, historically speaking.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://www.mezzoblue.com/archives/2007/11/12/detect_this/&amp;quot;&amp;gt;Dave Shea: Detect This. A good concrete example of why browsing sniffing is so bad.&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://modernizr.com&amp;quot;&amp;gt;Modernizr homepage: find out all about how to use Modernizr, and download custom builds&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;YepNope homepage: find out how to do more with it!&amp;lt;/a&amp;gt;&lt;/div&gt;</description>
			<pubDate>Mon, 21 May 2012 13:53:54 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Optimizing_content_for_different_browsers:_the_RIGHT_way</comments>		</item>
		<item>
			<title>Optimizing content for different browsers: the RIGHT way</title>
			<link>http://www.w3.org/community/webed/wiki/Optimizing_content_for_different_browsers:_the_RIGHT_way</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
If you've done a bit of front-end web development, you're bound to have noticed that not all browsers render ''all web content in exactly the same way''. And [http://dowebsitesneedtolookexactlythesameineverybrowser.com|neither should they have to]: arguably your web content doesn't need to look exactly the same across every browser and device and user might choose to view it on, as long as it still provides a good user experience and gives them access to the content and services required by their current browsing experience.&lt;br /&gt;
&lt;br /&gt;
To get your web content working well on all of the huge, diverse number of different web browsers and web-enabled devices that exist (or even a good proportion of them), you're going to have to do some work, optimizing the layouts and content delivered to each browser, and sometimes even directing certain devices to completely separate web sites. Examples of where such optimization might be required include:&lt;br /&gt;
&lt;br /&gt;
* Serving different layouts to narrow screen devices (eg mobile phones) and wide screen devices.&lt;br /&gt;
* Serving smaller image and video files (or even alternative content representations) to devices that are on a slower internet connection.&lt;br /&gt;
* Serving cutting edge styling to modern browsers, and alternative styling rules to older browsers that don't support the cutting edge CSS.&lt;br /&gt;
&lt;br /&gt;
There are dozens of techniques available to implement such content, but we don't have space to get anywhere near covering them all in this article. We will provide resources to give you pointers to more information at the end.&lt;br /&gt;
&lt;br /&gt;
This article first focuses on the different mechanisms available to allow us to detect what browser is accessing our content. We'll look at the right and wrong way to do this, and then round it off by showing the different mechanisms available to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
==Browser detection is not the way to go!==&lt;br /&gt;
&lt;br /&gt;
Ok, so the last paragraph in the introduction is a bit misleading — when you want to serve different content to different browsers, detecting the actual browser type and version itself is the wrong way to go in most cases. It is much better to detect whether the browser supports the technologies your web site is using — referred to as feature detection. &lt;br /&gt;
&lt;br /&gt;
This sounds a bit confusing, so let's investigate further.&lt;br /&gt;
&lt;br /&gt;
===A brief history of browser sniffing===&lt;br /&gt;
&lt;br /&gt;
These days, a lot of web standards features are supported pretty consistently across browsers, or at least, modern browsers.&lt;br /&gt;
&lt;br /&gt;
We'll touch a bit on older browsers we're still sometimes required to support later in the article. We'll also look later at the fact that really new, cutting edge web standards features (such as parts of CSS3 and HTML5) sometimes don't work the same across modern browsers, and the best way to deal with that.&lt;br /&gt;
&lt;br /&gt;
For now, let's rewind back to the early-to-mid-1990s. Back then, web standards were not supported very consistently at all across browsers, so developers were forced to either only support certain browsers, or fork their code, sending completely different codebases to different browsers. The way this was done back then was browser sniffing, or to be more accurate, UA sniffing.&lt;br /&gt;
&lt;br /&gt;
Every browser has a UA string that you can query to find out what browser it is. This is done in JavaScript using the &amp;lt;code&amp;gt;Navigator&amp;lt;/code&amp;gt; object. For example, I'm currently using Opera 12.00 beta. If I run &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; in my browser, I get the following returned:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; Edition Next; en) Presto/2.10.289 Version/12.00&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I can use this to identify the browser as Opera, and then serve code to just Opera as a result.&lt;br /&gt;
&lt;br /&gt;
Back in 1993, NCSA Mosaic was the most popular browser. It was identified by &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;NCSA_Mosaic/2.0 (Windows 3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was pretty simple. Then Netscape came along, identified by a US string of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.0 (Win3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was also pretty simple, but here's how the problems started. Netscape supported a new killer web feature of the time, Frames, and Mosaic didn't. So web developers used browser sniffing to detect the browser being used and serve content in frames only to Netscape.&lt;br /&gt;
&lt;br /&gt;
Internet Explorer then came along, and also supported frames, but to make sure it was being served frames, Microsoft used the following UA string to identify itself as Mozilla (compatible):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This is pretty silly, but things got even sillier. Other browser came along later on, with different rendering engines and names, but they all had to keep the Mozilla string inside their UA string, to make sure they were served good content by all this browser sniffing code. For example:&lt;br /&gt;
&lt;br /&gt;
* Mozilla: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826&amp;lt;/code&amp;gt;&lt;br /&gt;
* Firefox: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Opera 9.5: &amp;lt;code&amp;gt;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Opera/9.51 (Windows NT 5.1; U; en)&amp;lt;/code&amp;gt;!!!&lt;br /&gt;
* KHTML: &amp;lt;code&amp;gt;Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Safari: &amp;lt;code&amp;gt;Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5&amp;lt;/code&amp;gt;&lt;br /&gt;
* Chrome: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, all these user agent strings are trying to include some kind of identification of the actual browser they belong to and device install on, while strategically trying to be matched by browser sniffing code to make sure the browsers get served decent code.&lt;br /&gt;
&lt;br /&gt;
===The problem with browser sniffing===&lt;br /&gt;
&lt;br /&gt;
I'm sure you'll agree that the above situation is silly. All of these crazy verbose US strings have arisen because web developers used short-sighted browser sniffing in the first place, which just sniffed for the first browser to support frames (and later other cool features). When new browsers came out, they had to change their UA strings to work with the browser sniffing code. The other choice would be for developers to keep changing their sniffing code every time a new browser comes out that they want to support. This has happened frequently as well.&lt;br /&gt;
&lt;br /&gt;
and this is the crux of why browser sniffing is so bad — it only solves the problem now, and isn't future proof at all. It is also really error prone. When you are browser sniffing, what you are really want to do is check whether the browser accessing your site supports the technologies your content is built from. But instead of doing this directly, you are making an educated guess dependant on the contents of the UA string, which isn't very precise at all!&lt;br /&gt;
&lt;br /&gt;
For example, you'll notice that the above Opera UA string starts with &amp;lt;code&amp;gt;Opera/9.80&amp;lt;/code&amp;gt;, even though at the time of writing we are on version 11.64! This is because of widespread erroneous browsing sniffing code, which looked at Opera UA strings and interpreted Opera 10+ as Opera 1, serving incorrect content as a result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Why feature detection is better===&lt;br /&gt;
&lt;br /&gt;
Feature detection is a much better way to do things — instead of seeing what browser is accessing the content and serving appropriate code, the idea here is to query the browser to detect whether it supports the features  our content relies on, and then serve content as appropriate. Let's take HTML5 video as an example. You could detect support using some simple code such as this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(!!document.createElement('video').canPlayType === true) {&lt;br /&gt;
  // run some code that relies on HTML5 video&lt;br /&gt;
} else {&lt;br /&gt;
  // do something else&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is much more future proof, because existing browsers that support HTML5 video will run the correct code, and future browsers that support HTML5 video will do as well. You don't have to keep updating your code each time a new browser is released.&lt;br /&gt;
&lt;br /&gt;
==Strategies for supporting different browsers==&lt;br /&gt;
&lt;br /&gt;
Now we've got the argument for feature detection out of the way, let's look at some strategies you can use to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
===Graceful degradation===&lt;br /&gt;
&lt;br /&gt;
The good news about web technologies is that they are largely designed so that they will work as well as possible if something is not done quite right — this is contrary to other programming environments where nothing will work if there is the slightest error present in the code.&lt;br /&gt;
&lt;br /&gt;
Part of this related to how browsers deal with unknown elements and CSS properties. If a browser encounters an unknown CSS property, it will just ignore it and move on. If a browser encounters an unknown HTML element, it will treat it like an anonymous inline element, similar to a &amp;lt;code&amp;gt;&amp;amp;lt;span&amp;amp;gt;&amp;lt;/code&amp;gt;. This means that if a browser is served some HTML or CSS features it can't understand, it will generally just ignore it and move on, rendering the rest of the content. Obviously this might not give you a usable result in all cases, but for text and image content, you'll find that older browsers will render a usable result, even if it doesn't look quite as nice and shiny as in modern browsers. This is generally called graceful degradation.&lt;br /&gt;
&lt;br /&gt;
A quick example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;border-radius&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;box-shadow&amp;lt;/code&amp;gt; aren't supported in older browsers like IE6, but you're still going to be able to read the content inside the box, even if it hasn't got rounded corners and a drop shadow.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
===Vendor prefixes, and alternative styles===&lt;br /&gt;
&lt;br /&gt;
Of course, you can't rely on graceful degradation in all cases. In some cases, a feature not being supported will result in your content breaking to the point where it is not really usable. In the case of CSS, examples include:&lt;br /&gt;
&lt;br /&gt;
1. Sizing a layout using &amp;lt;a href=&amp;quot;http://snook.ca/archives/html_and_css/font-size-with-rem&amp;quot;&amp;gt;rem units&amp;lt;/a&amp;gt; — these units are not supported in older browsers, resulting in the layout falling apart. To remedy this, you could provide a fallback sized in a unit like pixels later in the cascade, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;nav {&lt;br /&gt;
  width: 180px;&lt;br /&gt;
  width: 18rem;&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modern browsers that understand both will first apply the pixel value then override it with the rem value. Older browsers that don't understand rems will just apply the first line, then ignore the second one. &lt;br /&gt;
&lt;br /&gt;
2. Filling in a background using a CSS3 gradient — in browsers that don't support the gradient, it will not render at all, which could cause content to be unreadable.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
To make things better, you could provide a solid background colour as a fallback, like so:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
====IE conditional comments====&lt;br /&gt;
&lt;br /&gt;
If you are specifically dealing with fallbacks for old versions of Internet Explorer, you can separate these out into separate stylesheets, and then link to these stylesheets inside an IE conditional comment. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;normal-styles.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;!--[if lte IE 6]&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot;  href=&amp;quot;ie-fixes.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;![endif]--&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the first link element will be given to all browsers, whereas the second one will only be picked up by IE versions 6 and less. In the latter, you could put all your IE fallback styles (such as giving IE6 different width and height values to compensate for its broken box model.)&lt;br /&gt;
&lt;br /&gt;
You can read more about IE conditional comments in Bruce Lawson's article &amp;lt;a href=&amp;quot;http://dev.opera.com/articles/view/supporting-ie-with-conditional-comments/&amp;quot;&amp;gt;Supporting IE with conditional comments&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Vendor prefixes====&lt;br /&gt;
&lt;br /&gt;
Returning to the gradient example we saw earlier, you may have noticed that something wasn't quite right there. To get the gradient rendering across all modern browsers, you need to include multiple versions of the declaration, like this:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: -webkit-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -moz-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -ms-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -o-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
This is because the &amp;lt;a href=&amp;quot;http://dev.w3.org/csswg/css3-images/&amp;quot;&amp;gt;CSS Image Values and Replaced Content Module Level 3&amp;lt;/a&amp;gt; — the spec that CSS gradients are specified in, is not finalised. Unfinished CSS features are implemented in browsers in an experimental capacity, with a vendor-specific prefix so that different browser's implementations can be tested without impacting on other browser's implementations. In the above example:&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;-webkit-&amp;lt;/code&amp;gt; prefixed property will work in WebKit-based browsers such as Chrome and Safari&lt;br /&gt;
* The &amp;lt;code&amp;gt;-moz-&amp;lt;/code&amp;gt; prefixed property will work in Firefox&lt;br /&gt;
* The &amp;lt;code&amp;gt;-ms-&amp;lt;/code&amp;gt; prefixed property will work in Internet Explorer&lt;br /&gt;
* The &amp;lt;code&amp;gt;-o-&amp;lt;/code&amp;gt; prefixed property will work in Opera&lt;br /&gt;
&lt;br /&gt;
Official W3C policy states that you shouldn't really use experimental properties in production code, but people do, as they want to make sites look cool and keep on the cutting edge. I don't see a problem with this, but if you want to use vendor prefixed properties in your code, you really should use include all the different prefixes so that as many browsers as possible can use all the features you are implementing.&lt;br /&gt;
&lt;br /&gt;
Notice that an unprefixed version of the property has also been included, at the bottom of the list: this is so that when the CSS feature is finalised, and the prefixes are removed, the code will still work — this is good future proofing practice.&lt;br /&gt;
&lt;br /&gt;
===Progressive enhancement===&lt;br /&gt;
&lt;br /&gt;
The flip side of graceful degradation is progressive enhancement - this goes in the other direction. Instead of building a great experience as the default and then hoping it degrades to something that is still usable in less capable browsers, you build a basic experience that works in all browsers, and then layer an enhanced experience on top of that.&lt;br /&gt;
&lt;br /&gt;
... NEED TO FILL IN AN EXAMPLE?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Polyfills/shims===&lt;br /&gt;
&lt;br /&gt;
Another approach you can take to dealing with disparate browser support is using Polyfills/shims. These are bits of utility code (usually JavaScript) that fakes support for a feature you want to use in browsers that don't support that feature natively. &lt;br /&gt;
&lt;br /&gt;
You generally use a polyfill by simply applying the JavaScript to your page via &amp;lt;code&amp;gt;&amp;amp;lt;script src=&amp;quot;script.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/code&amp;gt;, although many of them do have other instructions besides. Always reach the author's instructions carefully before attempting to use one! Polyfill/shim examples include:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You might think this sounds wonderful! Why worry about what feature different browser support, if you can just fill in support for the ones that don't using JavaScript? The trouble is that using a Polyfill does add weight to a page, both in terms of extra files requiring download, and extra processing required to put the polyfill in action. If you used loads of polyfills on every one of your pages, they would likely be significantly slower to download and run, as well as making your code base a lot more fiddly and complex.&lt;br /&gt;
&lt;br /&gt;
So they are great, but use them sparingly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Feature detection with Modernizr===&lt;br /&gt;
&lt;br /&gt;
You might be thinking at this point &amp;quot;well isn't there a way to only load those extra resources if the browser really needs them?&amp;quot; Well, yes there is. The general idea is to do feature detection to see if the browser supports those features, and then pull in a polyfill or un some alternative code only if needed.&lt;br /&gt;
&lt;br /&gt;
The easiest way to do the feature detection part of this is through a feature detection library called &amp;lt;a href=&amp;quot;http://www.modernizr.com&amp;quot;&amp;gt;Modernizr&amp;lt;/a&amp;gt;. This is a JavaScript library that provides an easy way to do pretty much all of the feature detection you could need. All you have to do is&lt;br /&gt;
&lt;br /&gt;
# Download the library and attach it to your page via a &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
# add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to your page's &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
When your page runs, Modernizr runs feature tests on all manner of HTML5/CSS3/etc. features, then it does two things. First, it adds classes to your &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element to allow you to apply CSS to the page selectively, depending on whether the browser supports various feature or not. Second, it provides you with a JavaScript API to allow you to do the same kind of selective code application in your JavaScript. Let's look at these two aspects in more detail.&lt;br /&gt;
&lt;br /&gt;
====Selective CSS application====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get things going, you need to link to the Modernizr library and add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element in your source code. when the page is run, modernizr runs all its feature detection tests and lets you know the results of those tests via a series of classes appended to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element. They will look something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;amp;lt;html lang=&amp;quot;en-gb&amp;quot; class=&amp;quot; js no-flexbox no-flexbox-legacy canvas canvastext webgl no-touch geolocation postmessage websqldatabase no-indexeddb&lt;br /&gt;
 hashchange history draganddrop no-websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations&lt;br /&gt;
 csscolumns cssgradients no-cssreflections csstransforms no-csstransforms3d csstransitions fontface generatedcontent video audio&lt;br /&gt;
 localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is really powerful, as it allows you to apply CSS to the page selectively, depending whether it supports certain feature or not. For example, if your code uses an animated 3D transform by default to reveal some content underneath:&lt;br /&gt;
&lt;br /&gt;
#shutter:hover {&lt;br /&gt;
  transform: rotateX(90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
You can include alternative styling that overrides this in browsers that don't support 3D transforms like this:&lt;br /&gt;
&lt;br /&gt;
.no-csstransforms3d #shutter:hover {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  right: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
It might not look quite as elegant, but it would still produce an ok experience that allows access to the underlying content.&lt;br /&gt;
&lt;br /&gt;
====Selective JavaScript application====&lt;br /&gt;
&lt;br /&gt;
Modernizr also provides a nice easy JavaScript API to allow you to execute code selectively, depending on whether CSS/HTML/other features are supported by the browser. Each test is a simple method on the Modernizr object, which returns a boolean (true/false) result. For example, if you wanted to query whether the current browser supports 3D transforms in JavaScript, you would write &amp;lt;code&amp;gt;if(Modernizr.csstransforms3d)&amp;lt;/code&amp;gt;. So you could have a block of code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(Modernizr.csstransforms3d) {&lt;br /&gt;
  // run killer feature that relies on 3D transforms being available&lt;br /&gt;
} else {&lt;br /&gt;
  // run an alternative chunk of code that provides a graceful fallback&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Problems with Modernizr====&lt;br /&gt;
&lt;br /&gt;
Modernizr, as with everything, isn't perfect. Two of the main problems are:&lt;br /&gt;
&lt;br /&gt;
# Not everything can be feature detected and therefore dealt with in this elegant manner.&lt;br /&gt;
# The full Modernizr library weighs in at 49KB, which is quite a lot of extra code to download for a few feature tests.&lt;br /&gt;
&lt;br /&gt;
However, you can customize Modernizr and create a version suitable for your site that only contains the tests you need, which cuts down on the file weight. And even though you can't feature detect everything, you will find it invaluable in many situations.&lt;br /&gt;
&lt;br /&gt;
===YepNope - load only what you need!===&lt;br /&gt;
&lt;br /&gt;
Now we've covered the feature detection side of things, lets cover what we can do to load resources like Polyfills only when you need them. To help you out with this, Modernizr comes packaged with a really smart, dandy little utility library called YepNope. This can do a lot, but in a nutshell, it allows you to specify a test of some kind, and then say what happens when the test is passed, and when it fails. Here's a simple example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;yepnope({&lt;br /&gt;
  test : Modernizr.canvas,&lt;br /&gt;
  yep  : 'normal.js',&lt;br /&gt;
  nope : ['polyfill.js', 'normal.js']&lt;br /&gt;
});&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, you are sating what the test is, then saying that if the test is passed, just load the normal script, but if the test fails, load the normal script and a polyfill to allow the code to work in an older browser.&lt;br /&gt;
&lt;br /&gt;
You can find a lot more details on how to use YepNope at &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;The YepNope homepage&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
I hope that's helped you get all these ideas clear in your head — why browser sniffing is bad, why feature detection is a much better way to detect whether a browser will run your site features or not, and different strategies for providing different capability browsers with different but acceptable experiences.&lt;br /&gt;
&lt;br /&gt;
If you want to read more sources about the topics discussed above, please check out the following pages:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://css-tricks.com/browser-detection-is-bad/&amp;quot;&amp;gt;CSS Tricks: Browser detection is bad&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://webaim.org/blog/user-agent-string-history/&amp;quot;&amp;gt;WebAIM: History of the browser user-agent string&amp;lt;/a&amp;gt;. A great account of why user agent sniffing was responsible for so much evil, historically speaking.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://www.mezzoblue.com/archives/2007/11/12/detect_this/&amp;quot;&amp;gt;Dave Shea: Detect This. A good concrete example of why browsing sniffing is so bad.&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://modernizr.com&amp;quot;&amp;gt;Modernizr homepage: find out all about how to use Modernizr, and download custom builds&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;YepNope homepage: find out how to do more with it!&amp;lt;/a&amp;gt;&lt;/div&gt;</description>
			<pubDate>Mon, 21 May 2012 13:53:34 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Optimizing_content_for_different_browsers:_the_RIGHT_way</comments>		</item>
		<item>
			<title>Optimizing content for different browsers: the RIGHT way</title>
			<link>http://www.w3.org/community/webed/wiki/Optimizing_content_for_different_browsers:_the_RIGHT_way</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
If you've done a bit of front-end web development, you're bound to have noticed that not all browsers render ''all web content in exactly the same way''. And [http://dowebsitesneedtolookexactlythesameineverybrowser.com | neither should they have to]: arguably your web content doesn't need to look exactly the same across every browser and device and user might choose to view it on, as long as it still provides a good user experience and gives them access to the content and services required by their current browsing experience.&lt;br /&gt;
&lt;br /&gt;
To get your web content working well on all of the huge, diverse number of different web browsers and web-enabled devices that exist (or even a good proportion of them), you're going to have to do some work, optimizing the layouts and content delivered to each browser, and sometimes even directing certain devices to completely separate web sites. Examples of where such optimization might be required include:&lt;br /&gt;
&lt;br /&gt;
* Serving different layouts to narrow screen devices (eg mobile phones) and wide screen devices.&lt;br /&gt;
* Serving smaller image and video files (or even alternative content representations) to devices that are on a slower internet connection.&lt;br /&gt;
* Serving cutting edge styling to modern browsers, and alternative styling rules to older browsers that don't support the cutting edge CSS.&lt;br /&gt;
&lt;br /&gt;
There are dozens of techniques available to implement such content, but we don't have space to get anywhere near covering them all in this article. We will provide resources to give you pointers to more information at the end.&lt;br /&gt;
&lt;br /&gt;
This article first focuses on the different mechanisms available to allow us to detect what browser is accessing our content. We'll look at the right and wrong way to do this, and then round it off by showing the different mechanisms available to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
==Browser detection is not the way to go!==&lt;br /&gt;
&lt;br /&gt;
Ok, so the last paragraph in the introduction is a bit misleading — when you want to serve different content to different browsers, detecting the actual browser type and version itself is the wrong way to go in most cases. It is much better to detect whether the browser supports the technologies your web site is using — referred to as feature detection. &lt;br /&gt;
&lt;br /&gt;
This sounds a bit confusing, so let's investigate further.&lt;br /&gt;
&lt;br /&gt;
===A brief history of browser sniffing===&lt;br /&gt;
&lt;br /&gt;
These days, a lot of web standards features are supported pretty consistently across browsers, or at least, modern browsers.&lt;br /&gt;
&lt;br /&gt;
We'll touch a bit on older browsers we're still sometimes required to support later in the article. We'll also look later at the fact that really new, cutting edge web standards features (such as parts of CSS3 and HTML5) sometimes don't work the same across modern browsers, and the best way to deal with that.&lt;br /&gt;
&lt;br /&gt;
For now, let's rewind back to the early-to-mid-1990s. Back then, web standards were not supported very consistently at all across browsers, so developers were forced to either only support certain browsers, or fork their code, sending completely different codebases to different browsers. The way this was done back then was browser sniffing, or to be more accurate, UA sniffing.&lt;br /&gt;
&lt;br /&gt;
Every browser has a UA string that you can query to find out what browser it is. This is done in JavaScript using the &amp;lt;code&amp;gt;Navigator&amp;lt;/code&amp;gt; object. For example, I'm currently using Opera 12.00 beta. If I run &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; in my browser, I get the following returned:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; Edition Next; en) Presto/2.10.289 Version/12.00&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I can use this to identify the browser as Opera, and then serve code to just Opera as a result.&lt;br /&gt;
&lt;br /&gt;
Back in 1993, NCSA Mosaic was the most popular browser. It was identified by &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;NCSA_Mosaic/2.0 (Windows 3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was pretty simple. Then Netscape came along, identified by a US string of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.0 (Win3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was also pretty simple, but here's how the problems started. Netscape supported a new killer web feature of the time, Frames, and Mosaic didn't. So web developers used browser sniffing to detect the browser being used and serve content in frames only to Netscape.&lt;br /&gt;
&lt;br /&gt;
Internet Explorer then came along, and also supported frames, but to make sure it was being served frames, Microsoft used the following UA string to identify itself as Mozilla (compatible):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This is pretty silly, but things got even sillier. Other browser came along later on, with different rendering engines and names, but they all had to keep the Mozilla string inside their UA string, to make sure they were served good content by all this browser sniffing code. For example:&lt;br /&gt;
&lt;br /&gt;
* Mozilla: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826&amp;lt;/code&amp;gt;&lt;br /&gt;
* Firefox: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Opera 9.5: &amp;lt;code&amp;gt;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Opera/9.51 (Windows NT 5.1; U; en)&amp;lt;/code&amp;gt;!!!&lt;br /&gt;
* KHTML: &amp;lt;code&amp;gt;Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Safari: &amp;lt;code&amp;gt;Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5&amp;lt;/code&amp;gt;&lt;br /&gt;
* Chrome: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, all these user agent strings are trying to include some kind of identification of the actual browser they belong to and device install on, while strategically trying to be matched by browser sniffing code to make sure the browsers get served decent code.&lt;br /&gt;
&lt;br /&gt;
===The problem with browser sniffing===&lt;br /&gt;
&lt;br /&gt;
I'm sure you'll agree that the above situation is silly. All of these crazy verbose US strings have arisen because web developers used short-sighted browser sniffing in the first place, which just sniffed for the first browser to support frames (and later other cool features). When new browsers came out, they had to change their UA strings to work with the browser sniffing code. The other choice would be for developers to keep changing their sniffing code every time a new browser comes out that they want to support. This has happened frequently as well.&lt;br /&gt;
&lt;br /&gt;
and this is the crux of why browser sniffing is so bad — it only solves the problem now, and isn't future proof at all. It is also really error prone. When you are browser sniffing, what you are really want to do is check whether the browser accessing your site supports the technologies your content is built from. But instead of doing this directly, you are making an educated guess dependant on the contents of the UA string, which isn't very precise at all!&lt;br /&gt;
&lt;br /&gt;
For example, you'll notice that the above Opera UA string starts with &amp;lt;code&amp;gt;Opera/9.80&amp;lt;/code&amp;gt;, even though at the time of writing we are on version 11.64! This is because of widespread erroneous browsing sniffing code, which looked at Opera UA strings and interpreted Opera 10+ as Opera 1, serving incorrect content as a result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Why feature detection is better===&lt;br /&gt;
&lt;br /&gt;
Feature detection is a much better way to do things — instead of seeing what browser is accessing the content and serving appropriate code, the idea here is to query the browser to detect whether it supports the features  our content relies on, and then serve content as appropriate. Let's take HTML5 video as an example. You could detect support using some simple code such as this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(!!document.createElement('video').canPlayType === true) {&lt;br /&gt;
  // run some code that relies on HTML5 video&lt;br /&gt;
} else {&lt;br /&gt;
  // do something else&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is much more future proof, because existing browsers that support HTML5 video will run the correct code, and future browsers that support HTML5 video will do as well. You don't have to keep updating your code each time a new browser is released.&lt;br /&gt;
&lt;br /&gt;
==Strategies for supporting different browsers==&lt;br /&gt;
&lt;br /&gt;
Now we've got the argument for feature detection out of the way, let's look at some strategies you can use to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
===Graceful degradation===&lt;br /&gt;
&lt;br /&gt;
The good news about web technologies is that they are largely designed so that they will work as well as possible if something is not done quite right — this is contrary to other programming environments where nothing will work if there is the slightest error present in the code.&lt;br /&gt;
&lt;br /&gt;
Part of this related to how browsers deal with unknown elements and CSS properties. If a browser encounters an unknown CSS property, it will just ignore it and move on. If a browser encounters an unknown HTML element, it will treat it like an anonymous inline element, similar to a &amp;lt;code&amp;gt;&amp;amp;lt;span&amp;amp;gt;&amp;lt;/code&amp;gt;. This means that if a browser is served some HTML or CSS features it can't understand, it will generally just ignore it and move on, rendering the rest of the content. Obviously this might not give you a usable result in all cases, but for text and image content, you'll find that older browsers will render a usable result, even if it doesn't look quite as nice and shiny as in modern browsers. This is generally called graceful degradation.&lt;br /&gt;
&lt;br /&gt;
A quick example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;border-radius&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;box-shadow&amp;lt;/code&amp;gt; aren't supported in older browsers like IE6, but you're still going to be able to read the content inside the box, even if it hasn't got rounded corners and a drop shadow.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
===Vendor prefixes, and alternative styles===&lt;br /&gt;
&lt;br /&gt;
Of course, you can't rely on graceful degradation in all cases. In some cases, a feature not being supported will result in your content breaking to the point where it is not really usable. In the case of CSS, examples include:&lt;br /&gt;
&lt;br /&gt;
1. Sizing a layout using &amp;lt;a href=&amp;quot;http://snook.ca/archives/html_and_css/font-size-with-rem&amp;quot;&amp;gt;rem units&amp;lt;/a&amp;gt; — these units are not supported in older browsers, resulting in the layout falling apart. To remedy this, you could provide a fallback sized in a unit like pixels later in the cascade, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;nav {&lt;br /&gt;
  width: 180px;&lt;br /&gt;
  width: 18rem;&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modern browsers that understand both will first apply the pixel value then override it with the rem value. Older browsers that don't understand rems will just apply the first line, then ignore the second one. &lt;br /&gt;
&lt;br /&gt;
2. Filling in a background using a CSS3 gradient — in browsers that don't support the gradient, it will not render at all, which could cause content to be unreadable.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
To make things better, you could provide a solid background colour as a fallback, like so:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
====IE conditional comments====&lt;br /&gt;
&lt;br /&gt;
If you are specifically dealing with fallbacks for old versions of Internet Explorer, you can separate these out into separate stylesheets, and then link to these stylesheets inside an IE conditional comment. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;normal-styles.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;!--[if lte IE 6]&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot;  href=&amp;quot;ie-fixes.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;![endif]--&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the first link element will be given to all browsers, whereas the second one will only be picked up by IE versions 6 and less. In the latter, you could put all your IE fallback styles (such as giving IE6 different width and height values to compensate for its broken box model.)&lt;br /&gt;
&lt;br /&gt;
You can read more about IE conditional comments in Bruce Lawson's article &amp;lt;a href=&amp;quot;http://dev.opera.com/articles/view/supporting-ie-with-conditional-comments/&amp;quot;&amp;gt;Supporting IE with conditional comments&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Vendor prefixes====&lt;br /&gt;
&lt;br /&gt;
Returning to the gradient example we saw earlier, you may have noticed that something wasn't quite right there. To get the gradient rendering across all modern browsers, you need to include multiple versions of the declaration, like this:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: -webkit-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -moz-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -ms-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -o-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
This is because the &amp;lt;a href=&amp;quot;http://dev.w3.org/csswg/css3-images/&amp;quot;&amp;gt;CSS Image Values and Replaced Content Module Level 3&amp;lt;/a&amp;gt; — the spec that CSS gradients are specified in, is not finalised. Unfinished CSS features are implemented in browsers in an experimental capacity, with a vendor-specific prefix so that different browser's implementations can be tested without impacting on other browser's implementations. In the above example:&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;-webkit-&amp;lt;/code&amp;gt; prefixed property will work in WebKit-based browsers such as Chrome and Safari&lt;br /&gt;
* The &amp;lt;code&amp;gt;-moz-&amp;lt;/code&amp;gt; prefixed property will work in Firefox&lt;br /&gt;
* The &amp;lt;code&amp;gt;-ms-&amp;lt;/code&amp;gt; prefixed property will work in Internet Explorer&lt;br /&gt;
* The &amp;lt;code&amp;gt;-o-&amp;lt;/code&amp;gt; prefixed property will work in Opera&lt;br /&gt;
&lt;br /&gt;
Official W3C policy states that you shouldn't really use experimental properties in production code, but people do, as they want to make sites look cool and keep on the cutting edge. I don't see a problem with this, but if you want to use vendor prefixed properties in your code, you really should use include all the different prefixes so that as many browsers as possible can use all the features you are implementing.&lt;br /&gt;
&lt;br /&gt;
Notice that an unprefixed version of the property has also been included, at the bottom of the list: this is so that when the CSS feature is finalised, and the prefixes are removed, the code will still work — this is good future proofing practice.&lt;br /&gt;
&lt;br /&gt;
===Progressive enhancement===&lt;br /&gt;
&lt;br /&gt;
The flip side of graceful degradation is progressive enhancement - this goes in the other direction. Instead of building a great experience as the default and then hoping it degrades to something that is still usable in less capable browsers, you build a basic experience that works in all browsers, and then layer an enhanced experience on top of that.&lt;br /&gt;
&lt;br /&gt;
... NEED TO FILL IN AN EXAMPLE?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Polyfills/shims===&lt;br /&gt;
&lt;br /&gt;
Another approach you can take to dealing with disparate browser support is using Polyfills/shims. These are bits of utility code (usually JavaScript) that fakes support for a feature you want to use in browsers that don't support that feature natively. &lt;br /&gt;
&lt;br /&gt;
You generally use a polyfill by simply applying the JavaScript to your page via &amp;lt;code&amp;gt;&amp;amp;lt;script src=&amp;quot;script.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/code&amp;gt;, although many of them do have other instructions besides. Always reach the author's instructions carefully before attempting to use one! Polyfill/shim examples include:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You might think this sounds wonderful! Why worry about what feature different browser support, if you can just fill in support for the ones that don't using JavaScript? The trouble is that using a Polyfill does add weight to a page, both in terms of extra files requiring download, and extra processing required to put the polyfill in action. If you used loads of polyfills on every one of your pages, they would likely be significantly slower to download and run, as well as making your code base a lot more fiddly and complex.&lt;br /&gt;
&lt;br /&gt;
So they are great, but use them sparingly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Feature detection with Modernizr===&lt;br /&gt;
&lt;br /&gt;
You might be thinking at this point &amp;quot;well isn't there a way to only load those extra resources if the browser really needs them?&amp;quot; Well, yes there is. The general idea is to do feature detection to see if the browser supports those features, and then pull in a polyfill or un some alternative code only if needed.&lt;br /&gt;
&lt;br /&gt;
The easiest way to do the feature detection part of this is through a feature detection library called &amp;lt;a href=&amp;quot;http://www.modernizr.com&amp;quot;&amp;gt;Modernizr&amp;lt;/a&amp;gt;. This is a JavaScript library that provides an easy way to do pretty much all of the feature detection you could need. All you have to do is&lt;br /&gt;
&lt;br /&gt;
# Download the library and attach it to your page via a &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
# add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to your page's &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
When your page runs, Modernizr runs feature tests on all manner of HTML5/CSS3/etc. features, then it does two things. First, it adds classes to your &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element to allow you to apply CSS to the page selectively, depending on whether the browser supports various feature or not. Second, it provides you with a JavaScript API to allow you to do the same kind of selective code application in your JavaScript. Let's look at these two aspects in more detail.&lt;br /&gt;
&lt;br /&gt;
====Selective CSS application====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get things going, you need to link to the Modernizr library and add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element in your source code. when the page is run, modernizr runs all its feature detection tests and lets you know the results of those tests via a series of classes appended to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element. They will look something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;amp;lt;html lang=&amp;quot;en-gb&amp;quot; class=&amp;quot; js no-flexbox no-flexbox-legacy canvas canvastext webgl no-touch geolocation postmessage websqldatabase no-indexeddb&lt;br /&gt;
 hashchange history draganddrop no-websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations&lt;br /&gt;
 csscolumns cssgradients no-cssreflections csstransforms no-csstransforms3d csstransitions fontface generatedcontent video audio&lt;br /&gt;
 localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is really powerful, as it allows you to apply CSS to the page selectively, depending whether it supports certain feature or not. For example, if your code uses an animated 3D transform by default to reveal some content underneath:&lt;br /&gt;
&lt;br /&gt;
#shutter:hover {&lt;br /&gt;
  transform: rotateX(90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
You can include alternative styling that overrides this in browsers that don't support 3D transforms like this:&lt;br /&gt;
&lt;br /&gt;
.no-csstransforms3d #shutter:hover {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  right: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
It might not look quite as elegant, but it would still produce an ok experience that allows access to the underlying content.&lt;br /&gt;
&lt;br /&gt;
====Selective JavaScript application====&lt;br /&gt;
&lt;br /&gt;
Modernizr also provides a nice easy JavaScript API to allow you to execute code selectively, depending on whether CSS/HTML/other features are supported by the browser. Each test is a simple method on the Modernizr object, which returns a boolean (true/false) result. For example, if you wanted to query whether the current browser supports 3D transforms in JavaScript, you would write &amp;lt;code&amp;gt;if(Modernizr.csstransforms3d)&amp;lt;/code&amp;gt;. So you could have a block of code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(Modernizr.csstransforms3d) {&lt;br /&gt;
  // run killer feature that relies on 3D transforms being available&lt;br /&gt;
} else {&lt;br /&gt;
  // run an alternative chunk of code that provides a graceful fallback&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Problems with Modernizr====&lt;br /&gt;
&lt;br /&gt;
Modernizr, as with everything, isn't perfect. Two of the main problems are:&lt;br /&gt;
&lt;br /&gt;
# Not everything can be feature detected and therefore dealt with in this elegant manner.&lt;br /&gt;
# The full Modernizr library weighs in at 49KB, which is quite a lot of extra code to download for a few feature tests.&lt;br /&gt;
&lt;br /&gt;
However, you can customize Modernizr and create a version suitable for your site that only contains the tests you need, which cuts down on the file weight. And even though you can't feature detect everything, you will find it invaluable in many situations.&lt;br /&gt;
&lt;br /&gt;
===YepNope - load only what you need!===&lt;br /&gt;
&lt;br /&gt;
Now we've covered the feature detection side of things, lets cover what we can do to load resources like Polyfills only when you need them. To help you out with this, Modernizr comes packaged with a really smart, dandy little utility library called YepNope. This can do a lot, but in a nutshell, it allows you to specify a test of some kind, and then say what happens when the test is passed, and when it fails. Here's a simple example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;yepnope({&lt;br /&gt;
  test : Modernizr.canvas,&lt;br /&gt;
  yep  : 'normal.js',&lt;br /&gt;
  nope : ['polyfill.js', 'normal.js']&lt;br /&gt;
});&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, you are sating what the test is, then saying that if the test is passed, just load the normal script, but if the test fails, load the normal script and a polyfill to allow the code to work in an older browser.&lt;br /&gt;
&lt;br /&gt;
You can find a lot more details on how to use YepNope at &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;The YepNope homepage&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
I hope that's helped you get all these ideas clear in your head — why browser sniffing is bad, why feature detection is a much better way to detect whether a browser will run your site features or not, and different strategies for providing different capability browsers with different but acceptable experiences.&lt;br /&gt;
&lt;br /&gt;
If you want to read more sources about the topics discussed above, please check out the following pages:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://css-tricks.com/browser-detection-is-bad/&amp;quot;&amp;gt;CSS Tricks: Browser detection is bad&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://webaim.org/blog/user-agent-string-history/&amp;quot;&amp;gt;WebAIM: History of the browser user-agent string&amp;lt;/a&amp;gt;. A great account of why user agent sniffing was responsible for so much evil, historically speaking.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://www.mezzoblue.com/archives/2007/11/12/detect_this/&amp;quot;&amp;gt;Dave Shea: Detect This. A good concrete example of why browsing sniffing is so bad.&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://modernizr.com&amp;quot;&amp;gt;Modernizr homepage: find out all about how to use Modernizr, and download custom builds&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;YepNope homepage: find out how to do more with it!&amp;lt;/a&amp;gt;&lt;/div&gt;</description>
			<pubDate>Mon, 21 May 2012 13:53:18 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Optimizing_content_for_different_browsers:_the_RIGHT_way</comments>		</item>
		<item>
			<title>Optimizing content for different browsers: the RIGHT way</title>
			<link>http://www.w3.org/community/webed/wiki/Optimizing_content_for_different_browsers:_the_RIGHT_way</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
If you've done a bit of front-end web development, you're bound to have noticed that not all browsers render ''all web content in exactly the same way''. And [http://dowebsitesneedtolookexactlythesameineverybrowser.com/ | neither should they have to]: arguably your web content doesn't need to look exactly the same across every browser and device and user might choose to view it on, as long as it still provides a good user experience and gives them access to the content and services required by their current browsing experience.&lt;br /&gt;
&lt;br /&gt;
To get your web content working well on all of the huge, diverse number of different web browsers and web-enabled devices that exist (or even a good proportion of them), you're going to have to do some work, optimizing the layouts and content delivered to each browser, and sometimes even directing certain devices to completely separate web sites. Examples of where such optimization might be required include:&lt;br /&gt;
&lt;br /&gt;
* Serving different layouts to narrow screen devices (eg mobile phones) and wide screen devices.&lt;br /&gt;
* Serving smaller image and video files (or even alternative content representations) to devices that are on a slower internet connection.&lt;br /&gt;
* Serving cutting edge styling to modern browsers, and alternative styling rules to older browsers that don't support the cutting edge CSS.&lt;br /&gt;
&lt;br /&gt;
There are dozens of techniques available to implement such content, but we don't have space to get anywhere near covering them all in this article. We will provide resources to give you pointers to more information at the end.&lt;br /&gt;
&lt;br /&gt;
This article first focuses on the different mechanisms available to allow us to detect what browser is accessing our content. We'll look at the right and wrong way to do this, and then round it off by showing the different mechanisms available to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
==Browser detection is not the way to go!==&lt;br /&gt;
&lt;br /&gt;
Ok, so the last paragraph in the introduction is a bit misleading — when you want to serve different content to different browsers, detecting the actual browser type and version itself is the wrong way to go in most cases. It is much better to detect whether the browser supports the technologies your web site is using — referred to as feature detection. &lt;br /&gt;
&lt;br /&gt;
This sounds a bit confusing, so let's investigate further.&lt;br /&gt;
&lt;br /&gt;
===A brief history of browser sniffing===&lt;br /&gt;
&lt;br /&gt;
These days, a lot of web standards features are supported pretty consistently across browsers, or at least, modern browsers.&lt;br /&gt;
&lt;br /&gt;
We'll touch a bit on older browsers we're still sometimes required to support later in the article. We'll also look later at the fact that really new, cutting edge web standards features (such as parts of CSS3 and HTML5) sometimes don't work the same across modern browsers, and the best way to deal with that.&lt;br /&gt;
&lt;br /&gt;
For now, let's rewind back to the early-to-mid-1990s. Back then, web standards were not supported very consistently at all across browsers, so developers were forced to either only support certain browsers, or fork their code, sending completely different codebases to different browsers. The way this was done back then was browser sniffing, or to be more accurate, UA sniffing.&lt;br /&gt;
&lt;br /&gt;
Every browser has a UA string that you can query to find out what browser it is. This is done in JavaScript using the &amp;lt;code&amp;gt;Navigator&amp;lt;/code&amp;gt; object. For example, I'm currently using Opera 12.00 beta. If I run &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; in my browser, I get the following returned:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; Edition Next; en) Presto/2.10.289 Version/12.00&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I can use this to identify the browser as Opera, and then serve code to just Opera as a result.&lt;br /&gt;
&lt;br /&gt;
Back in 1993, NCSA Mosaic was the most popular browser. It was identified by &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;NCSA_Mosaic/2.0 (Windows 3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was pretty simple. Then Netscape came along, identified by a US string of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.0 (Win3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was also pretty simple, but here's how the problems started. Netscape supported a new killer web feature of the time, Frames, and Mosaic didn't. So web developers used browser sniffing to detect the browser being used and serve content in frames only to Netscape.&lt;br /&gt;
&lt;br /&gt;
Internet Explorer then came along, and also supported frames, but to make sure it was being served frames, Microsoft used the following UA string to identify itself as Mozilla (compatible):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This is pretty silly, but things got even sillier. Other browser came along later on, with different rendering engines and names, but they all had to keep the Mozilla string inside their UA string, to make sure they were served good content by all this browser sniffing code. For example:&lt;br /&gt;
&lt;br /&gt;
* Mozilla: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826&amp;lt;/code&amp;gt;&lt;br /&gt;
* Firefox: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Opera 9.5: &amp;lt;code&amp;gt;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Opera/9.51 (Windows NT 5.1; U; en)&amp;lt;/code&amp;gt;!!!&lt;br /&gt;
* KHTML: &amp;lt;code&amp;gt;Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Safari: &amp;lt;code&amp;gt;Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5&amp;lt;/code&amp;gt;&lt;br /&gt;
* Chrome: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, all these user agent strings are trying to include some kind of identification of the actual browser they belong to and device install on, while strategically trying to be matched by browser sniffing code to make sure the browsers get served decent code.&lt;br /&gt;
&lt;br /&gt;
===The problem with browser sniffing===&lt;br /&gt;
&lt;br /&gt;
I'm sure you'll agree that the above situation is silly. All of these crazy verbose US strings have arisen because web developers used short-sighted browser sniffing in the first place, which just sniffed for the first browser to support frames (and later other cool features). When new browsers came out, they had to change their UA strings to work with the browser sniffing code. The other choice would be for developers to keep changing their sniffing code every time a new browser comes out that they want to support. This has happened frequently as well.&lt;br /&gt;
&lt;br /&gt;
and this is the crux of why browser sniffing is so bad — it only solves the problem now, and isn't future proof at all. It is also really error prone. When you are browser sniffing, what you are really want to do is check whether the browser accessing your site supports the technologies your content is built from. But instead of doing this directly, you are making an educated guess dependant on the contents of the UA string, which isn't very precise at all!&lt;br /&gt;
&lt;br /&gt;
For example, you'll notice that the above Opera UA string starts with &amp;lt;code&amp;gt;Opera/9.80&amp;lt;/code&amp;gt;, even though at the time of writing we are on version 11.64! This is because of widespread erroneous browsing sniffing code, which looked at Opera UA strings and interpreted Opera 10+ as Opera 1, serving incorrect content as a result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Why feature detection is better===&lt;br /&gt;
&lt;br /&gt;
Feature detection is a much better way to do things — instead of seeing what browser is accessing the content and serving appropriate code, the idea here is to query the browser to detect whether it supports the features  our content relies on, and then serve content as appropriate. Let's take HTML5 video as an example. You could detect support using some simple code such as this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(!!document.createElement('video').canPlayType === true) {&lt;br /&gt;
  // run some code that relies on HTML5 video&lt;br /&gt;
} else {&lt;br /&gt;
  // do something else&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is much more future proof, because existing browsers that support HTML5 video will run the correct code, and future browsers that support HTML5 video will do as well. You don't have to keep updating your code each time a new browser is released.&lt;br /&gt;
&lt;br /&gt;
==Strategies for supporting different browsers==&lt;br /&gt;
&lt;br /&gt;
Now we've got the argument for feature detection out of the way, let's look at some strategies you can use to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
===Graceful degradation===&lt;br /&gt;
&lt;br /&gt;
The good news about web technologies is that they are largely designed so that they will work as well as possible if something is not done quite right — this is contrary to other programming environments where nothing will work if there is the slightest error present in the code.&lt;br /&gt;
&lt;br /&gt;
Part of this related to how browsers deal with unknown elements and CSS properties. If a browser encounters an unknown CSS property, it will just ignore it and move on. If a browser encounters an unknown HTML element, it will treat it like an anonymous inline element, similar to a &amp;lt;code&amp;gt;&amp;amp;lt;span&amp;amp;gt;&amp;lt;/code&amp;gt;. This means that if a browser is served some HTML or CSS features it can't understand, it will generally just ignore it and move on, rendering the rest of the content. Obviously this might not give you a usable result in all cases, but for text and image content, you'll find that older browsers will render a usable result, even if it doesn't look quite as nice and shiny as in modern browsers. This is generally called graceful degradation.&lt;br /&gt;
&lt;br /&gt;
A quick example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;border-radius&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;box-shadow&amp;lt;/code&amp;gt; aren't supported in older browsers like IE6, but you're still going to be able to read the content inside the box, even if it hasn't got rounded corners and a drop shadow.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
===Vendor prefixes, and alternative styles===&lt;br /&gt;
&lt;br /&gt;
Of course, you can't rely on graceful degradation in all cases. In some cases, a feature not being supported will result in your content breaking to the point where it is not really usable. In the case of CSS, examples include:&lt;br /&gt;
&lt;br /&gt;
1. Sizing a layout using &amp;lt;a href=&amp;quot;http://snook.ca/archives/html_and_css/font-size-with-rem&amp;quot;&amp;gt;rem units&amp;lt;/a&amp;gt; — these units are not supported in older browsers, resulting in the layout falling apart. To remedy this, you could provide a fallback sized in a unit like pixels later in the cascade, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;nav {&lt;br /&gt;
  width: 180px;&lt;br /&gt;
  width: 18rem;&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modern browsers that understand both will first apply the pixel value then override it with the rem value. Older browsers that don't understand rems will just apply the first line, then ignore the second one. &lt;br /&gt;
&lt;br /&gt;
2. Filling in a background using a CSS3 gradient — in browsers that don't support the gradient, it will not render at all, which could cause content to be unreadable.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
To make things better, you could provide a solid background colour as a fallback, like so:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
====IE conditional comments====&lt;br /&gt;
&lt;br /&gt;
If you are specifically dealing with fallbacks for old versions of Internet Explorer, you can separate these out into separate stylesheets, and then link to these stylesheets inside an IE conditional comment. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;normal-styles.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;!--[if lte IE 6]&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot;  href=&amp;quot;ie-fixes.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;![endif]--&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the first link element will be given to all browsers, whereas the second one will only be picked up by IE versions 6 and less. In the latter, you could put all your IE fallback styles (such as giving IE6 different width and height values to compensate for its broken box model.)&lt;br /&gt;
&lt;br /&gt;
You can read more about IE conditional comments in Bruce Lawson's article &amp;lt;a href=&amp;quot;http://dev.opera.com/articles/view/supporting-ie-with-conditional-comments/&amp;quot;&amp;gt;Supporting IE with conditional comments&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Vendor prefixes====&lt;br /&gt;
&lt;br /&gt;
Returning to the gradient example we saw earlier, you may have noticed that something wasn't quite right there. To get the gradient rendering across all modern browsers, you need to include multiple versions of the declaration, like this:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: -webkit-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -moz-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -ms-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -o-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
This is because the &amp;lt;a href=&amp;quot;http://dev.w3.org/csswg/css3-images/&amp;quot;&amp;gt;CSS Image Values and Replaced Content Module Level 3&amp;lt;/a&amp;gt; — the spec that CSS gradients are specified in, is not finalised. Unfinished CSS features are implemented in browsers in an experimental capacity, with a vendor-specific prefix so that different browser's implementations can be tested without impacting on other browser's implementations. In the above example:&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;-webkit-&amp;lt;/code&amp;gt; prefixed property will work in WebKit-based browsers such as Chrome and Safari&lt;br /&gt;
* The &amp;lt;code&amp;gt;-moz-&amp;lt;/code&amp;gt; prefixed property will work in Firefox&lt;br /&gt;
* The &amp;lt;code&amp;gt;-ms-&amp;lt;/code&amp;gt; prefixed property will work in Internet Explorer&lt;br /&gt;
* The &amp;lt;code&amp;gt;-o-&amp;lt;/code&amp;gt; prefixed property will work in Opera&lt;br /&gt;
&lt;br /&gt;
Official W3C policy states that you shouldn't really use experimental properties in production code, but people do, as they want to make sites look cool and keep on the cutting edge. I don't see a problem with this, but if you want to use vendor prefixed properties in your code, you really should use include all the different prefixes so that as many browsers as possible can use all the features you are implementing.&lt;br /&gt;
&lt;br /&gt;
Notice that an unprefixed version of the property has also been included, at the bottom of the list: this is so that when the CSS feature is finalised, and the prefixes are removed, the code will still work — this is good future proofing practice.&lt;br /&gt;
&lt;br /&gt;
===Progressive enhancement===&lt;br /&gt;
&lt;br /&gt;
The flip side of graceful degradation is progressive enhancement - this goes in the other direction. Instead of building a great experience as the default and then hoping it degrades to something that is still usable in less capable browsers, you build a basic experience that works in all browsers, and then layer an enhanced experience on top of that.&lt;br /&gt;
&lt;br /&gt;
... NEED TO FILL IN AN EXAMPLE?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Polyfills/shims===&lt;br /&gt;
&lt;br /&gt;
Another approach you can take to dealing with disparate browser support is using Polyfills/shims. These are bits of utility code (usually JavaScript) that fakes support for a feature you want to use in browsers that don't support that feature natively. &lt;br /&gt;
&lt;br /&gt;
You generally use a polyfill by simply applying the JavaScript to your page via &amp;lt;code&amp;gt;&amp;amp;lt;script src=&amp;quot;script.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/code&amp;gt;, although many of them do have other instructions besides. Always reach the author's instructions carefully before attempting to use one! Polyfill/shim examples include:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You might think this sounds wonderful! Why worry about what feature different browser support, if you can just fill in support for the ones that don't using JavaScript? The trouble is that using a Polyfill does add weight to a page, both in terms of extra files requiring download, and extra processing required to put the polyfill in action. If you used loads of polyfills on every one of your pages, they would likely be significantly slower to download and run, as well as making your code base a lot more fiddly and complex.&lt;br /&gt;
&lt;br /&gt;
So they are great, but use them sparingly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Feature detection with Modernizr===&lt;br /&gt;
&lt;br /&gt;
You might be thinking at this point &amp;quot;well isn't there a way to only load those extra resources if the browser really needs them?&amp;quot; Well, yes there is. The general idea is to do feature detection to see if the browser supports those features, and then pull in a polyfill or un some alternative code only if needed.&lt;br /&gt;
&lt;br /&gt;
The easiest way to do the feature detection part of this is through a feature detection library called &amp;lt;a href=&amp;quot;http://www.modernizr.com&amp;quot;&amp;gt;Modernizr&amp;lt;/a&amp;gt;. This is a JavaScript library that provides an easy way to do pretty much all of the feature detection you could need. All you have to do is&lt;br /&gt;
&lt;br /&gt;
# Download the library and attach it to your page via a &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
# add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to your page's &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
When your page runs, Modernizr runs feature tests on all manner of HTML5/CSS3/etc. features, then it does two things. First, it adds classes to your &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element to allow you to apply CSS to the page selectively, depending on whether the browser supports various feature or not. Second, it provides you with a JavaScript API to allow you to do the same kind of selective code application in your JavaScript. Let's look at these two aspects in more detail.&lt;br /&gt;
&lt;br /&gt;
====Selective CSS application====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get things going, you need to link to the Modernizr library and add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element in your source code. when the page is run, modernizr runs all its feature detection tests and lets you know the results of those tests via a series of classes appended to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element. They will look something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;amp;lt;html lang=&amp;quot;en-gb&amp;quot; class=&amp;quot; js no-flexbox no-flexbox-legacy canvas canvastext webgl no-touch geolocation postmessage websqldatabase no-indexeddb&lt;br /&gt;
 hashchange history draganddrop no-websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations&lt;br /&gt;
 csscolumns cssgradients no-cssreflections csstransforms no-csstransforms3d csstransitions fontface generatedcontent video audio&lt;br /&gt;
 localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is really powerful, as it allows you to apply CSS to the page selectively, depending whether it supports certain feature or not. For example, if your code uses an animated 3D transform by default to reveal some content underneath:&lt;br /&gt;
&lt;br /&gt;
#shutter:hover {&lt;br /&gt;
  transform: rotateX(90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
You can include alternative styling that overrides this in browsers that don't support 3D transforms like this:&lt;br /&gt;
&lt;br /&gt;
.no-csstransforms3d #shutter:hover {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  right: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
It might not look quite as elegant, but it would still produce an ok experience that allows access to the underlying content.&lt;br /&gt;
&lt;br /&gt;
====Selective JavaScript application====&lt;br /&gt;
&lt;br /&gt;
Modernizr also provides a nice easy JavaScript API to allow you to execute code selectively, depending on whether CSS/HTML/other features are supported by the browser. Each test is a simple method on the Modernizr object, which returns a boolean (true/false) result. For example, if you wanted to query whether the current browser supports 3D transforms in JavaScript, you would write &amp;lt;code&amp;gt;if(Modernizr.csstransforms3d)&amp;lt;/code&amp;gt;. So you could have a block of code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(Modernizr.csstransforms3d) {&lt;br /&gt;
  // run killer feature that relies on 3D transforms being available&lt;br /&gt;
} else {&lt;br /&gt;
  // run an alternative chunk of code that provides a graceful fallback&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Problems with Modernizr====&lt;br /&gt;
&lt;br /&gt;
Modernizr, as with everything, isn't perfect. Two of the main problems are:&lt;br /&gt;
&lt;br /&gt;
# Not everything can be feature detected and therefore dealt with in this elegant manner.&lt;br /&gt;
# The full Modernizr library weighs in at 49KB, which is quite a lot of extra code to download for a few feature tests.&lt;br /&gt;
&lt;br /&gt;
However, you can customize Modernizr and create a version suitable for your site that only contains the tests you need, which cuts down on the file weight. And even though you can't feature detect everything, you will find it invaluable in many situations.&lt;br /&gt;
&lt;br /&gt;
===YepNope - load only what you need!===&lt;br /&gt;
&lt;br /&gt;
Now we've covered the feature detection side of things, lets cover what we can do to load resources like Polyfills only when you need them. To help you out with this, Modernizr comes packaged with a really smart, dandy little utility library called YepNope. This can do a lot, but in a nutshell, it allows you to specify a test of some kind, and then say what happens when the test is passed, and when it fails. Here's a simple example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;yepnope({&lt;br /&gt;
  test : Modernizr.canvas,&lt;br /&gt;
  yep  : 'normal.js',&lt;br /&gt;
  nope : ['polyfill.js', 'normal.js']&lt;br /&gt;
});&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, you are sating what the test is, then saying that if the test is passed, just load the normal script, but if the test fails, load the normal script and a polyfill to allow the code to work in an older browser.&lt;br /&gt;
&lt;br /&gt;
You can find a lot more details on how to use YepNope at &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;The YepNope homepage&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
I hope that's helped you get all these ideas clear in your head — why browser sniffing is bad, why feature detection is a much better way to detect whether a browser will run your site features or not, and different strategies for providing different capability browsers with different but acceptable experiences.&lt;br /&gt;
&lt;br /&gt;
If you want to read more sources about the topics discussed above, please check out the following pages:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://css-tricks.com/browser-detection-is-bad/&amp;quot;&amp;gt;CSS Tricks: Browser detection is bad&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://webaim.org/blog/user-agent-string-history/&amp;quot;&amp;gt;WebAIM: History of the browser user-agent string&amp;lt;/a&amp;gt;. A great account of why user agent sniffing was responsible for so much evil, historically speaking.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://www.mezzoblue.com/archives/2007/11/12/detect_this/&amp;quot;&amp;gt;Dave Shea: Detect This. A good concrete example of why browsing sniffing is so bad.&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://modernizr.com&amp;quot;&amp;gt;Modernizr homepage: find out all about how to use Modernizr, and download custom builds&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;YepNope homepage: find out how to do more with it!&amp;lt;/a&amp;gt;&lt;/div&gt;</description>
			<pubDate>Mon, 21 May 2012 13:52:27 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Optimizing_content_for_different_browsers:_the_RIGHT_way</comments>		</item>
		<item>
			<title>Optimizing content for different browsers: the RIGHT way</title>
			<link>http://www.w3.org/community/webed/wiki/Optimizing_content_for_different_browsers:_the_RIGHT_way</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
&lt;br /&gt;
If you've done a bit of front-end web development, you're bound to have noticed that not all browsers render ''all web content in exactly the same way''. And [http://dowebsitesneedtolookexactlythesameineverybrowser.com/| neither should they have to]: arguably your web content doesn't need to look exactly the same across every browser and device and user might choose to view it on, as long as it still provides a good user experience and gives them access to the content and services required by their current browsing experience.&lt;br /&gt;
&lt;br /&gt;
To get your web content working well on all of the huge, diverse number of different web browsers and web-enabled devices that exist (or even a good proportion of them), you're going to have to do some work, optimizing the layouts and content delivered to each browser, and sometimes even directing certain devices to completely separate web sites. Examples of where such optimization might be required include:&lt;br /&gt;
&lt;br /&gt;
* Serving different layouts to narrow screen devices (eg mobile phones) and wide screen devices.&lt;br /&gt;
* Serving smaller image and video files (or even alternative content representations) to devices that are on a slower internet connection.&lt;br /&gt;
* Serving cutting edge styling to modern browsers, and alternative styling rules to older browsers that don't support the cutting edge CSS.&lt;br /&gt;
&lt;br /&gt;
There are dozens of techniques available to implement such content, but we don't have space to get anywhere near covering them all in this article. We will provide resources to give you pointers to more information at the end.&lt;br /&gt;
&lt;br /&gt;
This article first focuses on the different mechanisms available to allow us to detect what browser is accessing our content. We'll look at the right and wrong way to do this, and then round it off by showing the different mechanisms available to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
==Browser detection is not the way to go!==&lt;br /&gt;
&lt;br /&gt;
Ok, so the last paragraph in the introduction is a bit misleading — when you want to serve different content to different browsers, detecting the actual browser type and version itself is the wrong way to go in most cases. It is much better to detect whether the browser supports the technologies your web site is using — referred to as feature detection. &lt;br /&gt;
&lt;br /&gt;
This sounds a bit confusing, so let's investigate further.&lt;br /&gt;
&lt;br /&gt;
===A brief history of browser sniffing===&lt;br /&gt;
&lt;br /&gt;
These days, a lot of web standards features are supported pretty consistently across browsers, or at least, modern browsers.&lt;br /&gt;
&lt;br /&gt;
We'll touch a bit on older browsers we're still sometimes required to support later in the article. We'll also look later at the fact that really new, cutting edge web standards features (such as parts of CSS3 and HTML5) sometimes don't work the same across modern browsers, and the best way to deal with that.&lt;br /&gt;
&lt;br /&gt;
For now, let's rewind back to the early-to-mid-1990s. Back then, web standards were not supported very consistently at all across browsers, so developers were forced to either only support certain browsers, or fork their code, sending completely different codebases to different browsers. The way this was done back then was browser sniffing, or to be more accurate, UA sniffing.&lt;br /&gt;
&lt;br /&gt;
Every browser has a UA string that you can query to find out what browser it is. This is done in JavaScript using the &amp;lt;code&amp;gt;Navigator&amp;lt;/code&amp;gt; object. For example, I'm currently using Opera 12.00 beta. If I run &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; in my browser, I get the following returned:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; Edition Next; en) Presto/2.10.289 Version/12.00&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I can use this to identify the browser as Opera, and then serve code to just Opera as a result.&lt;br /&gt;
&lt;br /&gt;
Back in 1993, NCSA Mosaic was the most popular browser. It was identified by &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;NCSA_Mosaic/2.0 (Windows 3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was pretty simple. Then Netscape came along, identified by a US string of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.0 (Win3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was also pretty simple, but here's how the problems started. Netscape supported a new killer web feature of the time, Frames, and Mosaic didn't. So web developers used browser sniffing to detect the browser being used and serve content in frames only to Netscape.&lt;br /&gt;
&lt;br /&gt;
Internet Explorer then came along, and also supported frames, but to make sure it was being served frames, Microsoft used the following UA string to identify itself as Mozilla (compatible):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This is pretty silly, but things got even sillier. Other browser came along later on, with different rendering engines and names, but they all had to keep the Mozilla string inside their UA string, to make sure they were served good content by all this browser sniffing code. For example:&lt;br /&gt;
&lt;br /&gt;
* Mozilla: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826&amp;lt;/code&amp;gt;&lt;br /&gt;
* Firefox: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Opera 9.5: &amp;lt;code&amp;gt;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Opera/9.51 (Windows NT 5.1; U; en)&amp;lt;/code&amp;gt;!!!&lt;br /&gt;
* KHTML: &amp;lt;code&amp;gt;Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Safari: &amp;lt;code&amp;gt;Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5&amp;lt;/code&amp;gt;&lt;br /&gt;
* Chrome: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, all these user agent strings are trying to include some kind of identification of the actual browser they belong to and device install on, while strategically trying to be matched by browser sniffing code to make sure the browsers get served decent code.&lt;br /&gt;
&lt;br /&gt;
===The problem with browser sniffing===&lt;br /&gt;
&lt;br /&gt;
I'm sure you'll agree that the above situation is silly. All of these crazy verbose US strings have arisen because web developers used short-sighted browser sniffing in the first place, which just sniffed for the first browser to support frames (and later other cool features). When new browsers came out, they had to change their UA strings to work with the browser sniffing code. The other choice would be for developers to keep changing their sniffing code every time a new browser comes out that they want to support. This has happened frequently as well.&lt;br /&gt;
&lt;br /&gt;
and this is the crux of why browser sniffing is so bad — it only solves the problem now, and isn't future proof at all. It is also really error prone. When you are browser sniffing, what you are really want to do is check whether the browser accessing your site supports the technologies your content is built from. But instead of doing this directly, you are making an educated guess dependant on the contents of the UA string, which isn't very precise at all!&lt;br /&gt;
&lt;br /&gt;
For example, you'll notice that the above Opera UA string starts with &amp;lt;code&amp;gt;Opera/9.80&amp;lt;/code&amp;gt;, even though at the time of writing we are on version 11.64! This is because of widespread erroneous browsing sniffing code, which looked at Opera UA strings and interpreted Opera 10+ as Opera 1, serving incorrect content as a result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Why feature detection is better===&lt;br /&gt;
&lt;br /&gt;
Feature detection is a much better way to do things — instead of seeing what browser is accessing the content and serving appropriate code, the idea here is to query the browser to detect whether it supports the features  our content relies on, and then serve content as appropriate. Let's take HTML5 video as an example. You could detect support using some simple code such as this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(!!document.createElement('video').canPlayType === true) {&lt;br /&gt;
  // run some code that relies on HTML5 video&lt;br /&gt;
} else {&lt;br /&gt;
  // do something else&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is much more future proof, because existing browsers that support HTML5 video will run the correct code, and future browsers that support HTML5 video will do as well. You don't have to keep updating your code each time a new browser is released.&lt;br /&gt;
&lt;br /&gt;
==Strategies for supporting different browsers==&lt;br /&gt;
&lt;br /&gt;
Now we've got the argument for feature detection out of the way, let's look at some strategies you can use to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
===Graceful degradation===&lt;br /&gt;
&lt;br /&gt;
The good news about web technologies is that they are largely designed so that they will work as well as possible if something is not done quite right — this is contrary to other programming environments where nothing will work if there is the slightest error present in the code.&lt;br /&gt;
&lt;br /&gt;
Part of this related to how browsers deal with unknown elements and CSS properties. If a browser encounters an unknown CSS property, it will just ignore it and move on. If a browser encounters an unknown HTML element, it will treat it like an anonymous inline element, similar to a &amp;lt;code&amp;gt;&amp;amp;lt;span&amp;amp;gt;&amp;lt;/code&amp;gt;. This means that if a browser is served some HTML or CSS features it can't understand, it will generally just ignore it and move on, rendering the rest of the content. Obviously this might not give you a usable result in all cases, but for text and image content, you'll find that older browsers will render a usable result, even if it doesn't look quite as nice and shiny as in modern browsers. This is generally called graceful degradation.&lt;br /&gt;
&lt;br /&gt;
A quick example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;border-radius&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;box-shadow&amp;lt;/code&amp;gt; aren't supported in older browsers like IE6, but you're still going to be able to read the content inside the box, even if it hasn't got rounded corners and a drop shadow.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
===Vendor prefixes, and alternative styles===&lt;br /&gt;
&lt;br /&gt;
Of course, you can't rely on graceful degradation in all cases. In some cases, a feature not being supported will result in your content breaking to the point where it is not really usable. In the case of CSS, examples include:&lt;br /&gt;
&lt;br /&gt;
1. Sizing a layout using &amp;lt;a href=&amp;quot;http://snook.ca/archives/html_and_css/font-size-with-rem&amp;quot;&amp;gt;rem units&amp;lt;/a&amp;gt; — these units are not supported in older browsers, resulting in the layout falling apart. To remedy this, you could provide a fallback sized in a unit like pixels later in the cascade, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;nav {&lt;br /&gt;
  width: 180px;&lt;br /&gt;
  width: 18rem;&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modern browsers that understand both will first apply the pixel value then override it with the rem value. Older browsers that don't understand rems will just apply the first line, then ignore the second one. &lt;br /&gt;
&lt;br /&gt;
2. Filling in a background using a CSS3 gradient — in browsers that don't support the gradient, it will not render at all, which could cause content to be unreadable.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
To make things better, you could provide a solid background colour as a fallback, like so:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
====IE conditional comments====&lt;br /&gt;
&lt;br /&gt;
If you are specifically dealing with fallbacks for old versions of Internet Explorer, you can separate these out into separate stylesheets, and then link to these stylesheets inside an IE conditional comment. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;normal-styles.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;!--[if lte IE 6]&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot;  href=&amp;quot;ie-fixes.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;![endif]--&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the first link element will be given to all browsers, whereas the second one will only be picked up by IE versions 6 and less. In the latter, you could put all your IE fallback styles (such as giving IE6 different width and height values to compensate for its broken box model.)&lt;br /&gt;
&lt;br /&gt;
You can read more about IE conditional comments in Bruce Lawson's article &amp;lt;a href=&amp;quot;http://dev.opera.com/articles/view/supporting-ie-with-conditional-comments/&amp;quot;&amp;gt;Supporting IE with conditional comments&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Vendor prefixes====&lt;br /&gt;
&lt;br /&gt;
Returning to the gradient example we saw earlier, you may have noticed that something wasn't quite right there. To get the gradient rendering across all modern browsers, you need to include multiple versions of the declaration, like this:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: -webkit-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -moz-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -ms-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -o-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
This is because the &amp;lt;a href=&amp;quot;http://dev.w3.org/csswg/css3-images/&amp;quot;&amp;gt;CSS Image Values and Replaced Content Module Level 3&amp;lt;/a&amp;gt; — the spec that CSS gradients are specified in, is not finalised. Unfinished CSS features are implemented in browsers in an experimental capacity, with a vendor-specific prefix so that different browser's implementations can be tested without impacting on other browser's implementations. In the above example:&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;-webkit-&amp;lt;/code&amp;gt; prefixed property will work in WebKit-based browsers such as Chrome and Safari&lt;br /&gt;
* The &amp;lt;code&amp;gt;-moz-&amp;lt;/code&amp;gt; prefixed property will work in Firefox&lt;br /&gt;
* The &amp;lt;code&amp;gt;-ms-&amp;lt;/code&amp;gt; prefixed property will work in Internet Explorer&lt;br /&gt;
* The &amp;lt;code&amp;gt;-o-&amp;lt;/code&amp;gt; prefixed property will work in Opera&lt;br /&gt;
&lt;br /&gt;
Official W3C policy states that you shouldn't really use experimental properties in production code, but people do, as they want to make sites look cool and keep on the cutting edge. I don't see a problem with this, but if you want to use vendor prefixed properties in your code, you really should use include all the different prefixes so that as many browsers as possible can use all the features you are implementing.&lt;br /&gt;
&lt;br /&gt;
Notice that an unprefixed version of the property has also been included, at the bottom of the list: this is so that when the CSS feature is finalised, and the prefixes are removed, the code will still work — this is good future proofing practice.&lt;br /&gt;
&lt;br /&gt;
===Progressive enhancement===&lt;br /&gt;
&lt;br /&gt;
The flip side of graceful degradation is progressive enhancement - this goes in the other direction. Instead of building a great experience as the default and then hoping it degrades to something that is still usable in less capable browsers, you build a basic experience that works in all browsers, and then layer an enhanced experience on top of that.&lt;br /&gt;
&lt;br /&gt;
... NEED TO FILL IN AN EXAMPLE?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Polyfills/shims===&lt;br /&gt;
&lt;br /&gt;
Another approach you can take to dealing with disparate browser support is using Polyfills/shims. These are bits of utility code (usually JavaScript) that fakes support for a feature you want to use in browsers that don't support that feature natively. &lt;br /&gt;
&lt;br /&gt;
You generally use a polyfill by simply applying the JavaScript to your page via &amp;lt;code&amp;gt;&amp;amp;lt;script src=&amp;quot;script.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/code&amp;gt;, although many of them do have other instructions besides. Always reach the author's instructions carefully before attempting to use one! Polyfill/shim examples include:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You might think this sounds wonderful! Why worry about what feature different browser support, if you can just fill in support for the ones that don't using JavaScript? The trouble is that using a Polyfill does add weight to a page, both in terms of extra files requiring download, and extra processing required to put the polyfill in action. If you used loads of polyfills on every one of your pages, they would likely be significantly slower to download and run, as well as making your code base a lot more fiddly and complex.&lt;br /&gt;
&lt;br /&gt;
So they are great, but use them sparingly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Feature detection with Modernizr===&lt;br /&gt;
&lt;br /&gt;
You might be thinking at this point &amp;quot;well isn't there a way to only load those extra resources if the browser really needs them?&amp;quot; Well, yes there is. The general idea is to do feature detection to see if the browser supports those features, and then pull in a polyfill or un some alternative code only if needed.&lt;br /&gt;
&lt;br /&gt;
The easiest way to do the feature detection part of this is through a feature detection library called &amp;lt;a href=&amp;quot;http://www.modernizr.com&amp;quot;&amp;gt;Modernizr&amp;lt;/a&amp;gt;. This is a JavaScript library that provides an easy way to do pretty much all of the feature detection you could need. All you have to do is&lt;br /&gt;
&lt;br /&gt;
# Download the library and attach it to your page via a &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
# add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to your page's &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
When your page runs, Modernizr runs feature tests on all manner of HTML5/CSS3/etc. features, then it does two things. First, it adds classes to your &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element to allow you to apply CSS to the page selectively, depending on whether the browser supports various feature or not. Second, it provides you with a JavaScript API to allow you to do the same kind of selective code application in your JavaScript. Let's look at these two aspects in more detail.&lt;br /&gt;
&lt;br /&gt;
====Selective CSS application====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get things going, you need to link to the Modernizr library and add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element in your source code. when the page is run, modernizr runs all its feature detection tests and lets you know the results of those tests via a series of classes appended to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element. They will look something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;amp;lt;html lang=&amp;quot;en-gb&amp;quot; class=&amp;quot; js no-flexbox no-flexbox-legacy canvas canvastext webgl no-touch geolocation postmessage websqldatabase no-indexeddb&lt;br /&gt;
 hashchange history draganddrop no-websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations&lt;br /&gt;
 csscolumns cssgradients no-cssreflections csstransforms no-csstransforms3d csstransitions fontface generatedcontent video audio&lt;br /&gt;
 localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is really powerful, as it allows you to apply CSS to the page selectively, depending whether it supports certain feature or not. For example, if your code uses an animated 3D transform by default to reveal some content underneath:&lt;br /&gt;
&lt;br /&gt;
#shutter:hover {&lt;br /&gt;
  transform: rotateX(90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
You can include alternative styling that overrides this in browsers that don't support 3D transforms like this:&lt;br /&gt;
&lt;br /&gt;
.no-csstransforms3d #shutter:hover {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  right: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
It might not look quite as elegant, but it would still produce an ok experience that allows access to the underlying content.&lt;br /&gt;
&lt;br /&gt;
====Selective JavaScript application====&lt;br /&gt;
&lt;br /&gt;
Modernizr also provides a nice easy JavaScript API to allow you to execute code selectively, depending on whether CSS/HTML/other features are supported by the browser. Each test is a simple method on the Modernizr object, which returns a boolean (true/false) result. For example, if you wanted to query whether the current browser supports 3D transforms in JavaScript, you would write &amp;lt;code&amp;gt;if(Modernizr.csstransforms3d)&amp;lt;/code&amp;gt;. So you could have a block of code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(Modernizr.csstransforms3d) {&lt;br /&gt;
  // run killer feature that relies on 3D transforms being available&lt;br /&gt;
} else {&lt;br /&gt;
  // run an alternative chunk of code that provides a graceful fallback&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Problems with Modernizr====&lt;br /&gt;
&lt;br /&gt;
Modernizr, as with everything, isn't perfect. Two of the main problems are:&lt;br /&gt;
&lt;br /&gt;
# Not everything can be feature detected and therefore dealt with in this elegant manner.&lt;br /&gt;
# The full Modernizr library weighs in at 49KB, which is quite a lot of extra code to download for a few feature tests.&lt;br /&gt;
&lt;br /&gt;
However, you can customize Modernizr and create a version suitable for your site that only contains the tests you need, which cuts down on the file weight. And even though you can't feature detect everything, you will find it invaluable in many situations.&lt;br /&gt;
&lt;br /&gt;
===YepNope - load only what you need!===&lt;br /&gt;
&lt;br /&gt;
Now we've covered the feature detection side of things, lets cover what we can do to load resources like Polyfills only when you need them. To help you out with this, Modernizr comes packaged with a really smart, dandy little utility library called YepNope. This can do a lot, but in a nutshell, it allows you to specify a test of some kind, and then say what happens when the test is passed, and when it fails. Here's a simple example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;yepnope({&lt;br /&gt;
  test : Modernizr.canvas,&lt;br /&gt;
  yep  : 'normal.js',&lt;br /&gt;
  nope : ['polyfill.js', 'normal.js']&lt;br /&gt;
});&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, you are sating what the test is, then saying that if the test is passed, just load the normal script, but if the test fails, load the normal script and a polyfill to allow the code to work in an older browser.&lt;br /&gt;
&lt;br /&gt;
You can find a lot more details on how to use YepNope at &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;The YepNope homepage&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
I hope that's helped you get all these ideas clear in your head — why browser sniffing is bad, why feature detection is a much better way to detect whether a browser will run your site features or not, and different strategies for providing different capability browsers with different but acceptable experiences.&lt;br /&gt;
&lt;br /&gt;
If you want to read more sources about the topics discussed above, please check out the following pages:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://css-tricks.com/browser-detection-is-bad/&amp;quot;&amp;gt;CSS Tricks: Browser detection is bad&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://webaim.org/blog/user-agent-string-history/&amp;quot;&amp;gt;WebAIM: History of the browser user-agent string&amp;lt;/a&amp;gt;. A great account of why user agent sniffing was responsible for so much evil, historically speaking.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://www.mezzoblue.com/archives/2007/11/12/detect_this/&amp;quot;&amp;gt;Dave Shea: Detect This. A good concrete example of why browsing sniffing is so bad.&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://modernizr.com&amp;quot;&amp;gt;Modernizr homepage: find out all about how to use Modernizr, and download custom builds&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;YepNope homepage: find out how to do more with it!&amp;lt;/a&amp;gt;&lt;/div&gt;</description>
			<pubDate>Mon, 21 May 2012 13:51:57 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Optimizing_content_for_different_browsers:_the_RIGHT_way</comments>		</item>
		<item>
			<title>Optimizing content for different browsers: the RIGHT way</title>
			<link>http://www.w3.org/community/webed/wiki/Optimizing_content_for_different_browsers:_the_RIGHT_way</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(Alternative title — &amp;quot;Browser sniffing and why it's satan&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
If you've done a bit of front-end web development, you're bound to have noticed that not all browsers render ''all web content in exactly the same way''. And [http://dowebsitesneedtolookexactlythesameineverybrowser.com/|neither should they have to]: arguably your web content doesn't need to look exactly the same across every browser and device and user might choose to view it on, as long as it still provides a good user experience and gives them access to the content and services required by their current browsing experience.&lt;br /&gt;
&lt;br /&gt;
To get your web content working well on all of the huge, diverse number of different web browsers and web-enabled devices that exist (or even a good proportion of them), you're going to have to do some work, optimizing the layouts and content delivered to each browser, and sometimes even directing certain devices to completely separate web sites. Examples of where such optimization might be required include:&lt;br /&gt;
&lt;br /&gt;
* Serving different layouts to narrow screen devices (eg mobile phones) and wide screen devices.&lt;br /&gt;
* Serving smaller image and video files (or even alternative content representations) to devices that are on a slower internet connection.&lt;br /&gt;
* Serving cutting edge styling to modern browsers, and alternative styling rules to older browsers that don't support the cutting edge CSS.&lt;br /&gt;
&lt;br /&gt;
There are dozens of techniques available to implement such content, but we don't have space to get anywhere near covering them all in this article. We will provide resources to give you pointers to more information at the end.&lt;br /&gt;
&lt;br /&gt;
This article first focuses on the different mechanisms available to allow us to detect what browser is accessing our content. We'll look at the right and wrong way to do this, and then round it off by showing the different mechanisms available to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
==Browser detection is not the way to go!==&lt;br /&gt;
&lt;br /&gt;
Ok, so the last paragraph in the introduction is a bit misleading — when you want to serve different content to different browsers, detecting the actual browser type and version itself is the wrong way to go in most cases. It is much better to detect whether the browser supports the technologies your web site is using — referred to as feature detection. &lt;br /&gt;
&lt;br /&gt;
This sounds a bit confusing, so let's investigate further.&lt;br /&gt;
&lt;br /&gt;
===A brief history of browser sniffing===&lt;br /&gt;
&lt;br /&gt;
These days, a lot of web standards features are supported pretty consistently across browsers, or at least, modern browsers.&lt;br /&gt;
&lt;br /&gt;
We'll touch a bit on older browsers we're still sometimes required to support later in the article. We'll also look later at the fact that really new, cutting edge web standards features (such as parts of CSS3 and HTML5) sometimes don't work the same across modern browsers, and the best way to deal with that.&lt;br /&gt;
&lt;br /&gt;
For now, let's rewind back to the early-to-mid-1990s. Back then, web standards were not supported very consistently at all across browsers, so developers were forced to either only support certain browsers, or fork their code, sending completely different codebases to different browsers. The way this was done back then was browser sniffing, or to be more accurate, UA sniffing.&lt;br /&gt;
&lt;br /&gt;
Every browser has a UA string that you can query to find out what browser it is. This is done in JavaScript using the &amp;lt;code&amp;gt;Navigator&amp;lt;/code&amp;gt; object. For example, I'm currently using Opera 12.00 beta. If I run &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; in my browser, I get the following returned:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; Edition Next; en) Presto/2.10.289 Version/12.00&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I can use this to identify the browser as Opera, and then serve code to just Opera as a result.&lt;br /&gt;
&lt;br /&gt;
Back in 1993, NCSA Mosaic was the most popular browser. It was identified by &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;NCSA_Mosaic/2.0 (Windows 3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was pretty simple. Then Netscape came along, identified by a US string of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.0 (Win3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was also pretty simple, but here's how the problems started. Netscape supported a new killer web feature of the time, Frames, and Mosaic didn't. So web developers used browser sniffing to detect the browser being used and serve content in frames only to Netscape.&lt;br /&gt;
&lt;br /&gt;
Internet Explorer then came along, and also supported frames, but to make sure it was being served frames, Microsoft used the following UA string to identify itself as Mozilla (compatible):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This is pretty silly, but things got even sillier. Other browser came along later on, with different rendering engines and names, but they all had to keep the Mozilla string inside their UA string, to make sure they were served good content by all this browser sniffing code. For example:&lt;br /&gt;
&lt;br /&gt;
* Mozilla: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826&amp;lt;/code&amp;gt;&lt;br /&gt;
* Firefox: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Opera 9.5: &amp;lt;code&amp;gt;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Opera/9.51 (Windows NT 5.1; U; en)&amp;lt;/code&amp;gt;!!!&lt;br /&gt;
* KHTML: &amp;lt;code&amp;gt;Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Safari: &amp;lt;code&amp;gt;Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5&amp;lt;/code&amp;gt;&lt;br /&gt;
* Chrome: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, all these user agent strings are trying to include some kind of identification of the actual browser they belong to and device install on, while strategically trying to be matched by browser sniffing code to make sure the browsers get served decent code.&lt;br /&gt;
&lt;br /&gt;
===The problem with browser sniffing===&lt;br /&gt;
&lt;br /&gt;
I'm sure you'll agree that the above situation is silly. All of these crazy verbose US strings have arisen because web developers used short-sighted browser sniffing in the first place, which just sniffed for the first browser to support frames (and later other cool features). When new browsers came out, they had to change their UA strings to work with the browser sniffing code. The other choice would be for developers to keep changing their sniffing code every time a new browser comes out that they want to support. This has happened frequently as well.&lt;br /&gt;
&lt;br /&gt;
and this is the crux of why browser sniffing is so bad — it only solves the problem now, and isn't future proof at all. It is also really error prone. When you are browser sniffing, what you are really want to do is check whether the browser accessing your site supports the technologies your content is built from. But instead of doing this directly, you are making an educated guess dependant on the contents of the UA string, which isn't very precise at all!&lt;br /&gt;
&lt;br /&gt;
For example, you'll notice that the above Opera UA string starts with &amp;lt;code&amp;gt;Opera/9.80&amp;lt;/code&amp;gt;, even though at the time of writing we are on version 11.64! This is because of widespread erroneous browsing sniffing code, which looked at Opera UA strings and interpreted Opera 10+ as Opera 1, serving incorrect content as a result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Why feature detection is better===&lt;br /&gt;
&lt;br /&gt;
Feature detection is a much better way to do things — instead of seeing what browser is accessing the content and serving appropriate code, the idea here is to query the browser to detect whether it supports the features  our content relies on, and then serve content as appropriate. Let's take HTML5 video as an example. You could detect support using some simple code such as this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(!!document.createElement('video').canPlayType === true) {&lt;br /&gt;
  // run some code that relies on HTML5 video&lt;br /&gt;
} else {&lt;br /&gt;
  // do something else&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is much more future proof, because existing browsers that support HTML5 video will run the correct code, and future browsers that support HTML5 video will do as well. You don't have to keep updating your code each time a new browser is released.&lt;br /&gt;
&lt;br /&gt;
==Strategies for supporting different browsers==&lt;br /&gt;
&lt;br /&gt;
Now we've got the argument for feature detection out of the way, let's look at some strategies you can use to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
===Graceful degradation===&lt;br /&gt;
&lt;br /&gt;
The good news about web technologies is that they are largely designed so that they will work as well as possible if something is not done quite right — this is contrary to other programming environments where nothing will work if there is the slightest error present in the code.&lt;br /&gt;
&lt;br /&gt;
Part of this related to how browsers deal with unknown elements and CSS properties. If a browser encounters an unknown CSS property, it will just ignore it and move on. If a browser encounters an unknown HTML element, it will treat it like an anonymous inline element, similar to a &amp;lt;code&amp;gt;&amp;amp;lt;span&amp;amp;gt;&amp;lt;/code&amp;gt;. This means that if a browser is served some HTML or CSS features it can't understand, it will generally just ignore it and move on, rendering the rest of the content. Obviously this might not give you a usable result in all cases, but for text and image content, you'll find that older browsers will render a usable result, even if it doesn't look quite as nice and shiny as in modern browsers. This is generally called graceful degradation.&lt;br /&gt;
&lt;br /&gt;
A quick example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;border-radius&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;box-shadow&amp;lt;/code&amp;gt; aren't supported in older browsers like IE6, but you're still going to be able to read the content inside the box, even if it hasn't got rounded corners and a drop shadow.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
===Vendor prefixes, and alternative styles===&lt;br /&gt;
&lt;br /&gt;
Of course, you can't rely on graceful degradation in all cases. In some cases, a feature not being supported will result in your content breaking to the point where it is not really usable. In the case of CSS, examples include:&lt;br /&gt;
&lt;br /&gt;
1. Sizing a layout using &amp;lt;a href=&amp;quot;http://snook.ca/archives/html_and_css/font-size-with-rem&amp;quot;&amp;gt;rem units&amp;lt;/a&amp;gt; — these units are not supported in older browsers, resulting in the layout falling apart. To remedy this, you could provide a fallback sized in a unit like pixels later in the cascade, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;nav {&lt;br /&gt;
  width: 180px;&lt;br /&gt;
  width: 18rem;&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modern browsers that understand both will first apply the pixel value then override it with the rem value. Older browsers that don't understand rems will just apply the first line, then ignore the second one. &lt;br /&gt;
&lt;br /&gt;
2. Filling in a background using a CSS3 gradient — in browsers that don't support the gradient, it will not render at all, which could cause content to be unreadable.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
To make things better, you could provide a solid background colour as a fallback, like so:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
====IE conditional comments====&lt;br /&gt;
&lt;br /&gt;
If you are specifically dealing with fallbacks for old versions of Internet Explorer, you can separate these out into separate stylesheets, and then link to these stylesheets inside an IE conditional comment. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;normal-styles.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;!--[if lte IE 6]&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot;  href=&amp;quot;ie-fixes.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;![endif]--&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the first link element will be given to all browsers, whereas the second one will only be picked up by IE versions 6 and less. In the latter, you could put all your IE fallback styles (such as giving IE6 different width and height values to compensate for its broken box model.)&lt;br /&gt;
&lt;br /&gt;
You can read more about IE conditional comments in Bruce Lawson's article &amp;lt;a href=&amp;quot;http://dev.opera.com/articles/view/supporting-ie-with-conditional-comments/&amp;quot;&amp;gt;Supporting IE with conditional comments&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Vendor prefixes====&lt;br /&gt;
&lt;br /&gt;
Returning to the gradient example we saw earlier, you may have noticed that something wasn't quite right there. To get the gradient rendering across all modern browsers, you need to include multiple versions of the declaration, like this:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: -webkit-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -moz-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -ms-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -o-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
This is because the &amp;lt;a href=&amp;quot;http://dev.w3.org/csswg/css3-images/&amp;quot;&amp;gt;CSS Image Values and Replaced Content Module Level 3&amp;lt;/a&amp;gt; — the spec that CSS gradients are specified in, is not finalised. Unfinished CSS features are implemented in browsers in an experimental capacity, with a vendor-specific prefix so that different browser's implementations can be tested without impacting on other browser's implementations. In the above example:&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;-webkit-&amp;lt;/code&amp;gt; prefixed property will work in WebKit-based browsers such as Chrome and Safari&lt;br /&gt;
* The &amp;lt;code&amp;gt;-moz-&amp;lt;/code&amp;gt; prefixed property will work in Firefox&lt;br /&gt;
* The &amp;lt;code&amp;gt;-ms-&amp;lt;/code&amp;gt; prefixed property will work in Internet Explorer&lt;br /&gt;
* The &amp;lt;code&amp;gt;-o-&amp;lt;/code&amp;gt; prefixed property will work in Opera&lt;br /&gt;
&lt;br /&gt;
Official W3C policy states that you shouldn't really use experimental properties in production code, but people do, as they want to make sites look cool and keep on the cutting edge. I don't see a problem with this, but if you want to use vendor prefixed properties in your code, you really should use include all the different prefixes so that as many browsers as possible can use all the features you are implementing.&lt;br /&gt;
&lt;br /&gt;
Notice that an unprefixed version of the property has also been included, at the bottom of the list: this is so that when the CSS feature is finalised, and the prefixes are removed, the code will still work — this is good future proofing practice.&lt;br /&gt;
&lt;br /&gt;
===Progressive enhancement===&lt;br /&gt;
&lt;br /&gt;
The flip side of graceful degradation is progressive enhancement - this goes in the other direction. Instead of building a great experience as the default and then hoping it degrades to something that is still usable in less capable browsers, you build a basic experience that works in all browsers, and then layer an enhanced experience on top of that.&lt;br /&gt;
&lt;br /&gt;
... NEED TO FILL IN AN EXAMPLE?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Polyfills/shims===&lt;br /&gt;
&lt;br /&gt;
Another approach you can take to dealing with disparate browser support is using Polyfills/shims. These are bits of utility code (usually JavaScript) that fakes support for a feature you want to use in browsers that don't support that feature natively. &lt;br /&gt;
&lt;br /&gt;
You generally use a polyfill by simply applying the JavaScript to your page via &amp;lt;code&amp;gt;&amp;amp;lt;script src=&amp;quot;script.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/code&amp;gt;, although many of them do have other instructions besides. Always reach the author's instructions carefully before attempting to use one! Polyfill/shim examples include:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You might think this sounds wonderful! Why worry about what feature different browser support, if you can just fill in support for the ones that don't using JavaScript? The trouble is that using a Polyfill does add weight to a page, both in terms of extra files requiring download, and extra processing required to put the polyfill in action. If you used loads of polyfills on every one of your pages, they would likely be significantly slower to download and run, as well as making your code base a lot more fiddly and complex.&lt;br /&gt;
&lt;br /&gt;
So they are great, but use them sparingly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Feature detection with Modernizr===&lt;br /&gt;
&lt;br /&gt;
You might be thinking at this point &amp;quot;well isn't there a way to only load those extra resources if the browser really needs them?&amp;quot; Well, yes there is. The general idea is to do feature detection to see if the browser supports those features, and then pull in a polyfill or un some alternative code only if needed.&lt;br /&gt;
&lt;br /&gt;
The easiest way to do the feature detection part of this is through a feature detection library called &amp;lt;a href=&amp;quot;http://www.modernizr.com&amp;quot;&amp;gt;Modernizr&amp;lt;/a&amp;gt;. This is a JavaScript library that provides an easy way to do pretty much all of the feature detection you could need. All you have to do is&lt;br /&gt;
&lt;br /&gt;
# Download the library and attach it to your page via a &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
# add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to your page's &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
When your page runs, Modernizr runs feature tests on all manner of HTML5/CSS3/etc. features, then it does two things. First, it adds classes to your &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element to allow you to apply CSS to the page selectively, depending on whether the browser supports various feature or not. Second, it provides you with a JavaScript API to allow you to do the same kind of selective code application in your JavaScript. Let's look at these two aspects in more detail.&lt;br /&gt;
&lt;br /&gt;
====Selective CSS application====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get things going, you need to link to the Modernizr library and add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element in your source code. when the page is run, modernizr runs all its feature detection tests and lets you know the results of those tests via a series of classes appended to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element. They will look something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;amp;lt;html lang=&amp;quot;en-gb&amp;quot; class=&amp;quot; js no-flexbox no-flexbox-legacy canvas canvastext webgl no-touch geolocation postmessage websqldatabase no-indexeddb&lt;br /&gt;
 hashchange history draganddrop no-websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations&lt;br /&gt;
 csscolumns cssgradients no-cssreflections csstransforms no-csstransforms3d csstransitions fontface generatedcontent video audio&lt;br /&gt;
 localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is really powerful, as it allows you to apply CSS to the page selectively, depending whether it supports certain feature or not. For example, if your code uses an animated 3D transform by default to reveal some content underneath:&lt;br /&gt;
&lt;br /&gt;
#shutter:hover {&lt;br /&gt;
  transform: rotateX(90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
You can include alternative styling that overrides this in browsers that don't support 3D transforms like this:&lt;br /&gt;
&lt;br /&gt;
.no-csstransforms3d #shutter:hover {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  right: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
It might not look quite as elegant, but it would still produce an ok experience that allows access to the underlying content.&lt;br /&gt;
&lt;br /&gt;
====Selective JavaScript application====&lt;br /&gt;
&lt;br /&gt;
Modernizr also provides a nice easy JavaScript API to allow you to execute code selectively, depending on whether CSS/HTML/other features are supported by the browser. Each test is a simple method on the Modernizr object, which returns a boolean (true/false) result. For example, if you wanted to query whether the current browser supports 3D transforms in JavaScript, you would write &amp;lt;code&amp;gt;if(Modernizr.csstransforms3d)&amp;lt;/code&amp;gt;. So you could have a block of code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(Modernizr.csstransforms3d) {&lt;br /&gt;
  // run killer feature that relies on 3D transforms being available&lt;br /&gt;
} else {&lt;br /&gt;
  // run an alternative chunk of code that provides a graceful fallback&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Problems with Modernizr====&lt;br /&gt;
&lt;br /&gt;
Modernizr, as with everything, isn't perfect. Two of the main problems are:&lt;br /&gt;
&lt;br /&gt;
# Not everything can be feature detected and therefore dealt with in this elegant manner.&lt;br /&gt;
# The full Modernizr library weighs in at 49KB, which is quite a lot of extra code to download for a few feature tests.&lt;br /&gt;
&lt;br /&gt;
However, you can customize Modernizr and create a version suitable for your site that only contains the tests you need, which cuts down on the file weight. And even though you can't feature detect everything, you will find it invaluable in many situations.&lt;br /&gt;
&lt;br /&gt;
===YepNope - load only what you need!===&lt;br /&gt;
&lt;br /&gt;
Now we've covered the feature detection side of things, lets cover what we can do to load resources like Polyfills only when you need them. To help you out with this, Modernizr comes packaged with a really smart, dandy little utility library called YepNope. This can do a lot, but in a nutshell, it allows you to specify a test of some kind, and then say what happens when the test is passed, and when it fails. Here's a simple example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;yepnope({&lt;br /&gt;
  test : Modernizr.canvas,&lt;br /&gt;
  yep  : 'normal.js',&lt;br /&gt;
  nope : ['polyfill.js', 'normal.js']&lt;br /&gt;
});&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, you are sating what the test is, then saying that if the test is passed, just load the normal script, but if the test fails, load the normal script and a polyfill to allow the code to work in an older browser.&lt;br /&gt;
&lt;br /&gt;
You can find a lot more details on how to use YepNope at &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;The YepNope homepage&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
I hope that's helped you get all these ideas clear in your head — why browser sniffing is bad, why feature detection is a much better way to detect whether a browser will run your site features or not, and different strategies for providing different capability browsers with different but acceptable experiences.&lt;br /&gt;
&lt;br /&gt;
If you want to read more sources about the topics discussed above, please check out the following pages:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://css-tricks.com/browser-detection-is-bad/&amp;quot;&amp;gt;CSS Tricks: Browser detection is bad&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://webaim.org/blog/user-agent-string-history/&amp;quot;&amp;gt;WebAIM: History of the browser user-agent string&amp;lt;/a&amp;gt;. A great account of why user agent sniffing was responsible for so much evil, historically speaking.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://www.mezzoblue.com/archives/2007/11/12/detect_this/&amp;quot;&amp;gt;Dave Shea: Detect This. A good concrete example of why browsing sniffing is so bad.&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://modernizr.com&amp;quot;&amp;gt;Modernizr homepage: find out all about how to use Modernizr, and download custom builds&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;YepNope homepage: find out how to do more with it!&amp;lt;/a&amp;gt;&lt;/div&gt;</description>
			<pubDate>Mon, 21 May 2012 13:51:33 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Optimizing_content_for_different_browsers:_the_RIGHT_way</comments>		</item>
		<item>
			<title>Optimizing content for different browsers: the RIGHT way</title>
			<link>http://www.w3.org/community/webed/wiki/Optimizing_content_for_different_browsers:_the_RIGHT_way</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(Alternative title — &amp;quot;Browser sniffing and why it's satan&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
If you've done a bit of front-end web development, you're bound to have noticed that not all browsers render ''all web content in exactly the same way''. And &amp;lt;a href=&amp;quot;http://dowebsitesneedtolookexactlythesameineverybrowser.com/&amp;quot;&amp;gt;neither should they have to&amp;lt;/a&amp;gt;: arguably your web content doesn't need to look exactly the same across every browser and device and user might choose to view it on, as long as it still provides a good user experience and gives them access to the content and services required by their current browsing experience.&lt;br /&gt;
&lt;br /&gt;
To get your web content working well on all of the huge, diverse number of different web browsers and web-enabled devices that exist (or even a good proportion of them), you're going to have to do some work, optimizing the layouts and content delivered to each browser, and sometimes even directing certain devices to completely separate web sites. Examples of where such optimization might be required include:&lt;br /&gt;
&lt;br /&gt;
* Serving different layouts to narrow screen devices (eg mobile phones) and wide screen devices.&lt;br /&gt;
* Serving smaller image and video files (or even alternative content representations) to devices that are on a slower internet connection.&lt;br /&gt;
* Serving cutting edge styling to modern browsers, and alternative styling rules to older browsers that don't support the cutting edge CSS.&lt;br /&gt;
&lt;br /&gt;
There are dozens of techniques available to implement such content, but we don't have space to get anywhere near covering them all in this article. We will provide resources to give you pointers to more information at the end.&lt;br /&gt;
&lt;br /&gt;
This article first focuses on the different mechanisms available to allow us to detect what browser is accessing our content. We'll look at the right and wrong way to do this, and then round it off by showing the different mechanisms available to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
==Browser detection is not the way to go!==&lt;br /&gt;
&lt;br /&gt;
Ok, so the last paragraph in the introduction is a bit misleading — when you want to serve different content to different browsers, detecting the actual browser type and version itself is the wrong way to go in most cases. It is much better to detect whether the browser supports the technologies your web site is using — referred to as feature detection. &lt;br /&gt;
&lt;br /&gt;
This sounds a bit confusing, so let's investigate further.&lt;br /&gt;
&lt;br /&gt;
===A brief history of browser sniffing===&lt;br /&gt;
&lt;br /&gt;
These days, a lot of web standards features are supported pretty consistently across browsers, or at least, modern browsers.&lt;br /&gt;
&lt;br /&gt;
We'll touch a bit on older browsers we're still sometimes required to support later in the article. We'll also look later at the fact that really new, cutting edge web standards features (such as parts of CSS3 and HTML5) sometimes don't work the same across modern browsers, and the best way to deal with that.&lt;br /&gt;
&lt;br /&gt;
For now, let's rewind back to the early-to-mid-1990s. Back then, web standards were not supported very consistently at all across browsers, so developers were forced to either only support certain browsers, or fork their code, sending completely different codebases to different browsers. The way this was done back then was browser sniffing, or to be more accurate, UA sniffing.&lt;br /&gt;
&lt;br /&gt;
Every browser has a UA string that you can query to find out what browser it is. This is done in JavaScript using the &amp;lt;code&amp;gt;Navigator&amp;lt;/code&amp;gt; object. For example, I'm currently using Opera 12.00 beta. If I run &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; in my browser, I get the following returned:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; Edition Next; en) Presto/2.10.289 Version/12.00&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I can use this to identify the browser as Opera, and then serve code to just Opera as a result.&lt;br /&gt;
&lt;br /&gt;
Back in 1993, NCSA Mosaic was the most popular browser. It was identified by &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;NCSA_Mosaic/2.0 (Windows 3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was pretty simple. Then Netscape came along, identified by a US string of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.0 (Win3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was also pretty simple, but here's how the problems started. Netscape supported a new killer web feature of the time, Frames, and Mosaic didn't. So web developers used browser sniffing to detect the browser being used and serve content in frames only to Netscape.&lt;br /&gt;
&lt;br /&gt;
Internet Explorer then came along, and also supported frames, but to make sure it was being served frames, Microsoft used the following UA string to identify itself as Mozilla (compatible):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This is pretty silly, but things got even sillier. Other browser came along later on, with different rendering engines and names, but they all had to keep the Mozilla string inside their UA string, to make sure they were served good content by all this browser sniffing code. For example:&lt;br /&gt;
&lt;br /&gt;
* Mozilla: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826&amp;lt;/code&amp;gt;&lt;br /&gt;
* Firefox: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Opera 9.5: &amp;lt;code&amp;gt;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Opera/9.51 (Windows NT 5.1; U; en)&amp;lt;/code&amp;gt;!!!&lt;br /&gt;
* KHTML: &amp;lt;code&amp;gt;Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Safari: &amp;lt;code&amp;gt;Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5&amp;lt;/code&amp;gt;&lt;br /&gt;
* Chrome: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, all these user agent strings are trying to include some kind of identification of the actual browser they belong to and device install on, while strategically trying to be matched by browser sniffing code to make sure the browsers get served decent code.&lt;br /&gt;
&lt;br /&gt;
===The problem with browser sniffing===&lt;br /&gt;
&lt;br /&gt;
I'm sure you'll agree that the above situation is silly. All of these crazy verbose US strings have arisen because web developers used short-sighted browser sniffing in the first place, which just sniffed for the first browser to support frames (and later other cool features). When new browsers came out, they had to change their UA strings to work with the browser sniffing code. The other choice would be for developers to keep changing their sniffing code every time a new browser comes out that they want to support. This has happened frequently as well.&lt;br /&gt;
&lt;br /&gt;
and this is the crux of why browser sniffing is so bad — it only solves the problem now, and isn't future proof at all. It is also really error prone. When you are browser sniffing, what you are really want to do is check whether the browser accessing your site supports the technologies your content is built from. But instead of doing this directly, you are making an educated guess dependant on the contents of the UA string, which isn't very precise at all!&lt;br /&gt;
&lt;br /&gt;
For example, you'll notice that the above Opera UA string starts with &amp;lt;code&amp;gt;Opera/9.80&amp;lt;/code&amp;gt;, even though at the time of writing we are on version 11.64! This is because of widespread erroneous browsing sniffing code, which looked at Opera UA strings and interpreted Opera 10+ as Opera 1, serving incorrect content as a result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Why feature detection is better===&lt;br /&gt;
&lt;br /&gt;
Feature detection is a much better way to do things — instead of seeing what browser is accessing the content and serving appropriate code, the idea here is to query the browser to detect whether it supports the features  our content relies on, and then serve content as appropriate. Let's take HTML5 video as an example. You could detect support using some simple code such as this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(!!document.createElement('video').canPlayType === true) {&lt;br /&gt;
  // run some code that relies on HTML5 video&lt;br /&gt;
} else {&lt;br /&gt;
  // do something else&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is much more future proof, because existing browsers that support HTML5 video will run the correct code, and future browsers that support HTML5 video will do as well. You don't have to keep updating your code each time a new browser is released.&lt;br /&gt;
&lt;br /&gt;
==Strategies for supporting different browsers==&lt;br /&gt;
&lt;br /&gt;
Now we've got the argument for feature detection out of the way, let's look at some strategies you can use to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
===Graceful degradation===&lt;br /&gt;
&lt;br /&gt;
The good news about web technologies is that they are largely designed so that they will work as well as possible if something is not done quite right — this is contrary to other programming environments where nothing will work if there is the slightest error present in the code.&lt;br /&gt;
&lt;br /&gt;
Part of this related to how browsers deal with unknown elements and CSS properties. If a browser encounters an unknown CSS property, it will just ignore it and move on. If a browser encounters an unknown HTML element, it will treat it like an anonymous inline element, similar to a &amp;lt;code&amp;gt;&amp;amp;lt;span&amp;amp;gt;&amp;lt;/code&amp;gt;. This means that if a browser is served some HTML or CSS features it can't understand, it will generally just ignore it and move on, rendering the rest of the content. Obviously this might not give you a usable result in all cases, but for text and image content, you'll find that older browsers will render a usable result, even if it doesn't look quite as nice and shiny as in modern browsers. This is generally called graceful degradation.&lt;br /&gt;
&lt;br /&gt;
A quick example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;border-radius&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;box-shadow&amp;lt;/code&amp;gt; aren't supported in older browsers like IE6, but you're still going to be able to read the content inside the box, even if it hasn't got rounded corners and a drop shadow.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
===Vendor prefixes, and alternative styles===&lt;br /&gt;
&lt;br /&gt;
Of course, you can't rely on graceful degradation in all cases. In some cases, a feature not being supported will result in your content breaking to the point where it is not really usable. In the case of CSS, examples include:&lt;br /&gt;
&lt;br /&gt;
1. Sizing a layout using &amp;lt;a href=&amp;quot;http://snook.ca/archives/html_and_css/font-size-with-rem&amp;quot;&amp;gt;rem units&amp;lt;/a&amp;gt; — these units are not supported in older browsers, resulting in the layout falling apart. To remedy this, you could provide a fallback sized in a unit like pixels later in the cascade, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;nav {&lt;br /&gt;
  width: 180px;&lt;br /&gt;
  width: 18rem;&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modern browsers that understand both will first apply the pixel value then override it with the rem value. Older browsers that don't understand rems will just apply the first line, then ignore the second one. &lt;br /&gt;
&lt;br /&gt;
2. Filling in a background using a CSS3 gradient — in browsers that don't support the gradient, it will not render at all, which could cause content to be unreadable.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
To make things better, you could provide a solid background colour as a fallback, like so:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
====IE conditional comments====&lt;br /&gt;
&lt;br /&gt;
If you are specifically dealing with fallbacks for old versions of Internet Explorer, you can separate these out into separate stylesheets, and then link to these stylesheets inside an IE conditional comment. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;normal-styles.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;!--[if lte IE 6]&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot;  href=&amp;quot;ie-fixes.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;![endif]--&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the first link element will be given to all browsers, whereas the second one will only be picked up by IE versions 6 and less. In the latter, you could put all your IE fallback styles (such as giving IE6 different width and height values to compensate for its broken box model.)&lt;br /&gt;
&lt;br /&gt;
You can read more about IE conditional comments in Bruce Lawson's article &amp;lt;a href=&amp;quot;http://dev.opera.com/articles/view/supporting-ie-with-conditional-comments/&amp;quot;&amp;gt;Supporting IE with conditional comments&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Vendor prefixes====&lt;br /&gt;
&lt;br /&gt;
Returning to the gradient example we saw earlier, you may have noticed that something wasn't quite right there. To get the gradient rendering across all modern browsers, you need to include multiple versions of the declaration, like this:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: -webkit-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -moz-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -ms-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -o-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
This is because the &amp;lt;a href=&amp;quot;http://dev.w3.org/csswg/css3-images/&amp;quot;&amp;gt;CSS Image Values and Replaced Content Module Level 3&amp;lt;/a&amp;gt; — the spec that CSS gradients are specified in, is not finalised. Unfinished CSS features are implemented in browsers in an experimental capacity, with a vendor-specific prefix so that different browser's implementations can be tested without impacting on other browser's implementations. In the above example:&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;-webkit-&amp;lt;/code&amp;gt; prefixed property will work in WebKit-based browsers such as Chrome and Safari&lt;br /&gt;
* The &amp;lt;code&amp;gt;-moz-&amp;lt;/code&amp;gt; prefixed property will work in Firefox&lt;br /&gt;
* The &amp;lt;code&amp;gt;-ms-&amp;lt;/code&amp;gt; prefixed property will work in Internet Explorer&lt;br /&gt;
* The &amp;lt;code&amp;gt;-o-&amp;lt;/code&amp;gt; prefixed property will work in Opera&lt;br /&gt;
&lt;br /&gt;
Official W3C policy states that you shouldn't really use experimental properties in production code, but people do, as they want to make sites look cool and keep on the cutting edge. I don't see a problem with this, but if you want to use vendor prefixed properties in your code, you really should use include all the different prefixes so that as many browsers as possible can use all the features you are implementing.&lt;br /&gt;
&lt;br /&gt;
Notice that an unprefixed version of the property has also been included, at the bottom of the list: this is so that when the CSS feature is finalised, and the prefixes are removed, the code will still work — this is good future proofing practice.&lt;br /&gt;
&lt;br /&gt;
===Progressive enhancement===&lt;br /&gt;
&lt;br /&gt;
The flip side of graceful degradation is progressive enhancement - this goes in the other direction. Instead of building a great experience as the default and then hoping it degrades to something that is still usable in less capable browsers, you build a basic experience that works in all browsers, and then layer an enhanced experience on top of that.&lt;br /&gt;
&lt;br /&gt;
... NEED TO FILL IN AN EXAMPLE?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Polyfills/shims===&lt;br /&gt;
&lt;br /&gt;
Another approach you can take to dealing with disparate browser support is using Polyfills/shims. These are bits of utility code (usually JavaScript) that fakes support for a feature you want to use in browsers that don't support that feature natively. &lt;br /&gt;
&lt;br /&gt;
You generally use a polyfill by simply applying the JavaScript to your page via &amp;lt;code&amp;gt;&amp;amp;lt;script src=&amp;quot;script.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/code&amp;gt;, although many of them do have other instructions besides. Always reach the author's instructions carefully before attempting to use one! Polyfill/shim examples include:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You might think this sounds wonderful! Why worry about what feature different browser support, if you can just fill in support for the ones that don't using JavaScript? The trouble is that using a Polyfill does add weight to a page, both in terms of extra files requiring download, and extra processing required to put the polyfill in action. If you used loads of polyfills on every one of your pages, they would likely be significantly slower to download and run, as well as making your code base a lot more fiddly and complex.&lt;br /&gt;
&lt;br /&gt;
So they are great, but use them sparingly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Feature detection with Modernizr===&lt;br /&gt;
&lt;br /&gt;
You might be thinking at this point &amp;quot;well isn't there a way to only load those extra resources if the browser really needs them?&amp;quot; Well, yes there is. The general idea is to do feature detection to see if the browser supports those features, and then pull in a polyfill or un some alternative code only if needed.&lt;br /&gt;
&lt;br /&gt;
The easiest way to do the feature detection part of this is through a feature detection library called &amp;lt;a href=&amp;quot;http://www.modernizr.com&amp;quot;&amp;gt;Modernizr&amp;lt;/a&amp;gt;. This is a JavaScript library that provides an easy way to do pretty much all of the feature detection you could need. All you have to do is&lt;br /&gt;
&lt;br /&gt;
# Download the library and attach it to your page via a &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
# add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to your page's &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
When your page runs, Modernizr runs feature tests on all manner of HTML5/CSS3/etc. features, then it does two things. First, it adds classes to your &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element to allow you to apply CSS to the page selectively, depending on whether the browser supports various feature or not. Second, it provides you with a JavaScript API to allow you to do the same kind of selective code application in your JavaScript. Let's look at these two aspects in more detail.&lt;br /&gt;
&lt;br /&gt;
====Selective CSS application====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get things going, you need to link to the Modernizr library and add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element in your source code. when the page is run, modernizr runs all its feature detection tests and lets you know the results of those tests via a series of classes appended to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element. They will look something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&lt;br /&gt;
 &amp;amp;lt;html lang=&amp;quot;en-gb&amp;quot; class=&amp;quot; js no-flexbox no-flexbox-legacy canvas canvastext webgl no-touch geolocation postmessage websqldatabase no-indexeddb&lt;br /&gt;
 hashchange history draganddrop no-websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations&lt;br /&gt;
 csscolumns cssgradients no-cssreflections csstransforms no-csstransforms3d csstransitions fontface generatedcontent video audio&lt;br /&gt;
 localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths&amp;quot;&amp;amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is really powerful, as it allows you to apply CSS to the page selectively, depending whether it supports certain feature or not. For example, if your code uses an animated 3D transform by default to reveal some content underneath:&lt;br /&gt;
&lt;br /&gt;
#shutter:hover {&lt;br /&gt;
  transform: rotateX(90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
You can include alternative styling that overrides this in browsers that don't support 3D transforms like this:&lt;br /&gt;
&lt;br /&gt;
.no-csstransforms3d #shutter:hover {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  right: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
It might not look quite as elegant, but it would still produce an ok experience that allows access to the underlying content.&lt;br /&gt;
&lt;br /&gt;
====Selective JavaScript application====&lt;br /&gt;
&lt;br /&gt;
Modernizr also provides a nice easy JavaScript API to allow you to execute code selectively, depending on whether CSS/HTML/other features are supported by the browser. Each test is a simple method on the Modernizr object, which returns a boolean (true/false) result. For example, if you wanted to query whether the current browser supports 3D transforms in JavaScript, you would write &amp;lt;code&amp;gt;if(Modernizr.csstransforms3d)&amp;lt;/code&amp;gt;. So you could have a block of code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(Modernizr.csstransforms3d) {&lt;br /&gt;
  // run killer feature that relies on 3D transforms being available&lt;br /&gt;
} else {&lt;br /&gt;
  // run an alternative chunk of code that provides a graceful fallback&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Problems with Modernizr====&lt;br /&gt;
&lt;br /&gt;
Modernizr, as with everything, isn't perfect. Two of the main problems are:&lt;br /&gt;
&lt;br /&gt;
# Not everything can be feature detected and therefore dealt with in this elegant manner.&lt;br /&gt;
# The full Modernizr library weighs in at 49KB, which is quite a lot of extra code to download for a few feature tests.&lt;br /&gt;
&lt;br /&gt;
However, you can customize Modernizr and create a version suitable for your site that only contains the tests you need, which cuts down on the file weight. And even though you can't feature detect everything, you will find it invaluable in many situations.&lt;br /&gt;
&lt;br /&gt;
===YepNope - load only what you need!===&lt;br /&gt;
&lt;br /&gt;
Now we've covered the feature detection side of things, lets cover what we can do to load resources like Polyfills only when you need them. To help you out with this, Modernizr comes packaged with a really smart, dandy little utility library called YepNope. This can do a lot, but in a nutshell, it allows you to specify a test of some kind, and then say what happens when the test is passed, and when it fails. Here's a simple example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;yepnope({&lt;br /&gt;
  test : Modernizr.canvas,&lt;br /&gt;
  yep  : 'normal.js',&lt;br /&gt;
  nope : ['polyfill.js', 'normal.js']&lt;br /&gt;
});&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, you are sating what the test is, then saying that if the test is passed, just load the normal script, but if the test fails, load the normal script and a polyfill to allow the code to work in an older browser.&lt;br /&gt;
&lt;br /&gt;
You can find a lot more details on how to use YepNope at &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;The YepNope homepage&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
I hope that's helped you get all these ideas clear in your head — why browser sniffing is bad, why feature detection is a much better way to detect whether a browser will run your site features or not, and different strategies for providing different capability browsers with different but acceptable experiences.&lt;br /&gt;
&lt;br /&gt;
If you want to read more sources about the topics discussed above, please check out the following pages:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://css-tricks.com/browser-detection-is-bad/&amp;quot;&amp;gt;CSS Tricks: Browser detection is bad&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://webaim.org/blog/user-agent-string-history/&amp;quot;&amp;gt;WebAIM: History of the browser user-agent string&amp;lt;/a&amp;gt;. A great account of why user agent sniffing was responsible for so much evil, historically speaking.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://www.mezzoblue.com/archives/2007/11/12/detect_this/&amp;quot;&amp;gt;Dave Shea: Detect This. A good concrete example of why browsing sniffing is so bad.&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://modernizr.com&amp;quot;&amp;gt;Modernizr homepage: find out all about how to use Modernizr, and download custom builds&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;YepNope homepage: find out how to do more with it!&amp;lt;/a&amp;gt;&lt;/div&gt;</description>
			<pubDate>Mon, 21 May 2012 13:26:17 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Optimizing_content_for_different_browsers:_the_RIGHT_way</comments>		</item>
		<item>
			<title>Talk:Optimizing content for different browsers: the RIGHT way</title>
			<link>http://www.w3.org/community/webed/wiki/Talk:Optimizing_content_for_different_browsers:_the_RIGHT_way</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I don't think we should use &amp;quot;browsing context&amp;quot; this way. In HTML5, a browsing context is a runtime document object (e.g. a window, tab, iframe), of which several might combine to form a user experience of a site; you seem to be using it to refer to different kinds of browsing experiences. I think this muddles the term. --[[User:Schepers|Doug Schepers]] 04:27, 21 May 2012 (UTC)&lt;br /&gt;
&lt;br /&gt;
Ah. I didn't realise that. I'll think up a different term then. --[[User:Cmills|Chris Mills]]&lt;/div&gt;</description>
			<pubDate>Mon, 21 May 2012 08:06:49 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Optimizing_content_for_different_browsers:_the_RIGHT_way</comments>		</item>
		<item>
			<title>Optimizing content for different browsers: the RIGHT way</title>
			<link>http://www.w3.org/community/webed/wiki/Optimizing_content_for_different_browsers:_the_RIGHT_way</link>
			<description>&lt;p&gt;Cmills:&amp;#32;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(Alternative title — &amp;quot;Browser sniffing and why it's satan&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
If you've done a bit of front-end web development, you're bound to have noticed that not all browsers render ''all web content in exactly the same way''. And &amp;lt;a href=&amp;quot;http://dowebsitesneedtolookexactlythesameineverybrowser.com/&amp;quot;&amp;gt;neither should they have to&amp;lt;/a&amp;gt;: arguably your web content doesn't need to look exactly the same across every browser and device and user might choose to view it on, as long as it still provides a good user experience and gives them access to the content and services required by their current browsing context.&lt;br /&gt;
&lt;br /&gt;
Note: a browsing context means a certain way of consuming web context. So IE on a desktop computer, Opera Mobile on an Android tablet, a text-only browser, a blind user using the web through a screen reader, etc etc. &lt;br /&gt;
&lt;br /&gt;
To get your web content working well on all of the huge, diverse number of different browsing contexts that exist (or even a good proportion of them), you're going to have to do some work, optimizing the layouts and content delivered to each context, and sometimes even directing certain devices to completely separate web sites. Examples of where such optimization might be required include:&lt;br /&gt;
&lt;br /&gt;
* Serving different layouts to narrow screen devices (eg mobile phones) and wide screen devices.&lt;br /&gt;
* Serving smaller image and video files (or even alternative content representations) to devices that are on a slower internet connection.&lt;br /&gt;
* Serving cutting edge styling to modern browsers, and alternative styling rules to older browsers that don't support the cutting edge CSS.&lt;br /&gt;
&lt;br /&gt;
There are dozens of techniques available to implement such content, but we don't have space to get anywhere near covering them all in this article. We will provide resources to give you pointers to more information at the end.&lt;br /&gt;
&lt;br /&gt;
This article first focuses on the different mechanisms available to allow us to detect what browser is accessing our content. We'll look at the right and wrong way to do this, and then round it off by showing the different mechanisms available to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
==Browser detection is not the way to go!==&lt;br /&gt;
&lt;br /&gt;
Ok, so the last paragraph in the introduction is a bit misleading — when you want to serve different content to different browsers, detecting the actual browser type and version itself is the wrong way to go in most cases. It is much better to detect whether the browser supports the technologies your web site is using — referred to as feature detection. &lt;br /&gt;
&lt;br /&gt;
This sounds a bit confusing, so let's investigate further.&lt;br /&gt;
&lt;br /&gt;
===A brief history of browser sniffing===&lt;br /&gt;
&lt;br /&gt;
These days, a lot of web standards features are supported pretty consistently across browsers, or at least, modern browsers.&lt;br /&gt;
&lt;br /&gt;
We'll touch a bit on older browsers we're still sometimes required to support later in the article. We'll also look later at the fact that really new, cutting edge web standards features (such as parts of CSS3 and HTML5) sometimes don't work the same across modern browsers, and the best way to deal with that.&lt;br /&gt;
&lt;br /&gt;
For now, let's rewind back to the early-to-mid-1990s. Back then, web standards were not supported very consistently at all across browsers, so developers were forced to either only support certain browsers, or fork their code, sending completely different codebases to different browsers. The way this was done back then was browser sniffing, or to be more accurate, UA sniffing.&lt;br /&gt;
&lt;br /&gt;
Every browser has a UA string that you can query to find out what browser it is. This is done in JavaScript using the &amp;lt;code&amp;gt;Navigator&amp;lt;/code&amp;gt; object. For example, I'm currently using Opera 12.00 beta. If I run &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; in my browser, I get the following returned:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; Edition Next; en) Presto/2.10.289 Version/12.00&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I can use this to identify the browser as Opera, and then serve code to just Opera as a result.&lt;br /&gt;
&lt;br /&gt;
Back in 1993, NCSA Mosaic was the most popular browser. It was identified by &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;NCSA_Mosaic/2.0 (Windows 3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was pretty simple. Then Netscape came along, identified by a US string of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.0 (Win3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was also pretty simple, but here's how the problems started. Netscape supported a new killer web feature of the time, Frames, and Mosaic didn't. So web developers used browser sniffing to detect the browser being used and serve content in frames only to Netscape.&lt;br /&gt;
&lt;br /&gt;
Internet Explorer then came along, and also supported frames, but to make sure it was being served frames, Microsoft used the following UA string to identify itself as Mozilla (compatible):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This is pretty silly, but things got even sillier. Other browser came along later on, with different rendering engines and names, but they all had to keep the Mozilla string inside their UA string, to make sure they were served good content by all this browser sniffing code. For example:&lt;br /&gt;
&lt;br /&gt;
* Mozilla: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826&amp;lt;/code&amp;gt;&lt;br /&gt;
* Firefox: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Opera 9.5: &amp;lt;code&amp;gt;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Opera/9.51 (Windows NT 5.1; U; en)&amp;lt;/code&amp;gt;!!!&lt;br /&gt;
* KHTML: &amp;lt;code&amp;gt;Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Safari: &amp;lt;code&amp;gt;Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5&amp;lt;/code&amp;gt;&lt;br /&gt;
* Chrome: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, all these user agent strings are trying to include some kind of identification of the actual browser they belong to and device install on, while strategically trying to be matched by browser sniffing code to make sure the browsers get served decent code.&lt;br /&gt;
&lt;br /&gt;
===The problem with browser sniffing===&lt;br /&gt;
&lt;br /&gt;
I'm sure you'll agree that the above situation is silly. All of these crazy verbose US strings have arisen because web developers used short-sighted browser sniffing in the first place, which just sniffed for the first browser to support frames (and later other cool features). When new browsers came out, they had to change their UA strings to work with the browser sniffing code. The other choice would be for developers to keep changing their sniffing code every time a new browser comes out that they want to support. This has happened frequently as well.&lt;br /&gt;
&lt;br /&gt;
and this is the crux of why browser sniffing is so bad — it only solves the problem now, and isn't future proof at all. It is also really error prone. When you are browser sniffing, what you are really want to do is check whether the browser accessing your site supports the technologies your content is built from. But instead of doing this directly, you are making an educated guess dependant on the contents of the UA string, which isn't very precise at all!&lt;br /&gt;
&lt;br /&gt;
For example, you'll notice that the above Opera UA string starts with &amp;lt;code&amp;gt;Opera/9.80&amp;lt;/code&amp;gt;, even though at the time of writing we are on version 11.64! This is because of widespread erroneous browsing sniffing code, which looked at Opera UA strings and interpreted Opera 10+ as Opera 1, serving incorrect content as a result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Why feature detection is better===&lt;br /&gt;
&lt;br /&gt;
Feature detection is a much better way to do things — instead of seeing what browser is accessing the content and serving appropriate code, the idea here is to query the browser to detect whether it supports the features  our content relies on, and then serve content as appropriate. Let's take HTML5 video as an example. You could detect support using some simple code such as this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(!!document.createElement('video').canPlayType === true) {&lt;br /&gt;
  // run some code that relies on HTML5 video&lt;br /&gt;
} else {&lt;br /&gt;
  // do something else&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is much more future proof, because existing browsers that support HTML5 video will run the correct code, and future browsers that support HTML5 video will do as well. You don't have to keep updating your code each time a new browser is released.&lt;br /&gt;
&lt;br /&gt;
==Strategies for supporting different browsers==&lt;br /&gt;
&lt;br /&gt;
Now we've got the argument for feature detection out of the way, let's look at some strategies you can use to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
===Graceful degradation===&lt;br /&gt;
&lt;br /&gt;
The good news about web technologies is that they are largely designed so that they will work as well as possible if something is not done quite right — this is contrary to other programming environments where nothing will work if there is the slightest error present in the code.&lt;br /&gt;
&lt;br /&gt;
Part of this related to how browsers deal with unknown elements and CSS properties. If a browser encounters an unknown CSS property, it will just ignore it and move on. If a browser encounters an unknown HTML element, it will treat it like an anonymous inline element, similar to a &amp;lt;code&amp;gt;&amp;amp;lt;span&amp;amp;gt;&amp;lt;/code&amp;gt;. This means that if a browser is served some HTML or CSS features it can't understand, it will generally just ignore it and move on, rendering the rest of the content. Obviously this might not give you a usable result in all cases, but for text and image content, you'll find that older browsers will render a usable result, even if it doesn't look quite as nice and shiny as in modern browsers. This is generally called graceful degradation.&lt;br /&gt;
&lt;br /&gt;
A quick example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;border-radius&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;box-shadow&amp;lt;/code&amp;gt; aren't supported in older browsers like IE6, but you're still going to be able to read the content inside the box, even if it hasn't got rounded corners and a drop shadow.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
===Vendor prefixes, and alternative styles===&lt;br /&gt;
&lt;br /&gt;
Of course, you can't rely on graceful degradation in all cases. In some cases, a feature not being supported will result in your content breaking to the point where it is not really usable. In the case of CSS, examples include:&lt;br /&gt;
&lt;br /&gt;
1. Sizing a layout using &amp;lt;a href=&amp;quot;http://snook.ca/archives/html_and_css/font-size-with-rem&amp;quot;&amp;gt;rem units&amp;lt;/a&amp;gt; — these units are not supported in older browsers, resulting in the layout falling apart. To remedy this, you could provide a fallback sized in a unit like pixels later in the cascade, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;nav {&lt;br /&gt;
  width: 180px;&lt;br /&gt;
  width: 18rem;&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modern browsers that understand both will first apply the pixel value then override it with the rem value. Older browsers that don't understand rems will just apply the first line, then ignore the second one. &lt;br /&gt;
&lt;br /&gt;
2. Filling in a background using a CSS3 gradient — in browsers that don't support the gradient, it will not render at all, which could cause content to be unreadable.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
To make things better, you could provide a solid background colour as a fallback, like so:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
====IE conditional comments====&lt;br /&gt;
&lt;br /&gt;
If you are specifically dealing with fallbacks for old versions of Internet Explorer, you can separate these out into separate stylesheets, and then link to these stylesheets inside an IE conditional comment. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;normal-styles.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;!--[if lte IE 6]&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot;  href=&amp;quot;ie-fixes.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;![endif]--&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the first link element will be given to all browsers, whereas the second one will only be picked up by IE versions 6 and less. In the latter, you could put all your IE fallback styles (such as giving IE6 different width and height values to compensate for its broken box model.)&lt;br /&gt;
&lt;br /&gt;
You can read more about IE conditional comments in Bruce Lawson's article &amp;lt;a href=&amp;quot;http://dev.opera.com/articles/view/supporting-ie-with-conditional-comments/&amp;quot;&amp;gt;Supporting IE with conditional comments&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Vendor prefixes====&lt;br /&gt;
&lt;br /&gt;
Returning to the gradient example we saw earlier, you may have noticed that something wasn't quite right there. To get the gradient rendering across all modern browsers, you need to include multiple versions of the declaration, like this:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: -webkit-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -moz-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -ms-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -o-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
This is because the &amp;lt;a href=&amp;quot;http://dev.w3.org/csswg/css3-images/&amp;quot;&amp;gt;CSS Image Values and Replaced Content Module Level 3&amp;lt;/a&amp;gt; — the spec that CSS gradients are specified in, is not finalised. Unfinished CSS features are implemented in browsers in an experimental capacity, with a vendor-specific prefix so that different browser's implementations can be tested without impacting on other browser's implementations. In the above example:&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;-webkit-&amp;lt;/code&amp;gt; prefixed property will work in WebKit-based browsers such as Chrome and Safari&lt;br /&gt;
* The &amp;lt;code&amp;gt;-moz-&amp;lt;/code&amp;gt; prefixed property will work in Firefox&lt;br /&gt;
* The &amp;lt;code&amp;gt;-ms-&amp;lt;/code&amp;gt; prefixed property will work in Internet Explorer&lt;br /&gt;
* The &amp;lt;code&amp;gt;-o-&amp;lt;/code&amp;gt; prefixed property will work in Opera&lt;br /&gt;
&lt;br /&gt;
Official W3C policy states that you shouldn't really use experimental properties in production code, but people do, as they want to make sites look cool and keep on the cutting edge. I don't see a problem with this, but if you want to use vendor prefixed properties in your code, you really should use include all the different prefixes so that as many browsers as possible can use all the features you are implementing.&lt;br /&gt;
&lt;br /&gt;
Notice that an unprefixed version of the property has also been included, at the bottom of the list: this is so that when the CSS feature is finalised, and the prefixes are removed, the code will still work — this is good future proofing practice.&lt;br /&gt;
&lt;br /&gt;
===Progressive enhancement===&lt;br /&gt;
&lt;br /&gt;
The flip side of graceful degradation is progressive enhancement - this goes in the other direction. Instead of building a great experience as the default and then hoping it degrades to something that is still usable in less capable browsers, you build a basic experience that works in all browsers, and then layer an enhanced experience on top of that.&lt;br /&gt;
&lt;br /&gt;
... NEED TO FILL IN AN EXAMPLE?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Polyfills/shims===&lt;br /&gt;
&lt;br /&gt;
Another approach you can take to dealing with disparate browser support is using Polyfills/shims. These are bits of utility code (usually JavaScript) that fakes support for a feature you want to use in browsers that don't support that feature natively. &lt;br /&gt;
&lt;br /&gt;
You generally use a polyfill by simply applying the JavaScript to your page via &amp;lt;code&amp;gt;&amp;amp;lt;script src=&amp;quot;script.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/code&amp;gt;, although many of them do have other instructions besides. Always reach the author's instructions carefully before attempting to use one! Polyfill/shim examples include:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You might think this sounds wonderful! Why worry about what feature different browser support, if you can just fill in support for the ones that don't using JavaScript? The trouble is that using a Polyfill does add weight to a page, both in terms of extra files requiring download, and extra processing required to put the polyfill in action. If you used loads of polyfills on every one of your pages, they would likely be significantly slower to download and run, as well as making your code base a lot more fiddly and complex.&lt;br /&gt;
&lt;br /&gt;
So they are great, but use them sparingly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Feature detection with Modernizr===&lt;br /&gt;
&lt;br /&gt;
You might be thinking at this point &amp;quot;well isn't there a way to only load those extra resources if the browser really needs them?&amp;quot; Well, yes there is. The general idea is to do feature detection to see if the browser supports those features, and then pull in a polyfill or un some alternative code only if needed.&lt;br /&gt;
&lt;br /&gt;
The easiest way to do the feature detection part of this is through a feature detection library called &amp;lt;a href=&amp;quot;http://www.modernizr.com&amp;quot;&amp;gt;Modernizr&amp;lt;/a&amp;gt;. This is a JavaScript library that provides an easy way to do pretty much all of the feature detection you could need. All you have to do is&lt;br /&gt;
&lt;br /&gt;
# Download the library and attach it to your page via a &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
# add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to your page's &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
When your page runs, Modernizr runs feature tests on all manner of HTML5/CSS3/etc. features, then it does two things. First, it adds classes to your &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element to allow you to apply CSS to the page selectively, depending on whether the browser supports various feature or not. Second, it provides you with a JavaScript API to allow you to do the same kind of selective code application in your JavaScript. Let's look at these two aspects in more detail.&lt;br /&gt;
&lt;br /&gt;
====Selective CSS application====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get things going, you need to link to the Modernizr library and add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element in your source code. when the page is run, modernizr runs all its feature detection tests and lets you know the results of those tests via a series of classes appended to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element. They will look something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;html lang=&amp;quot;en-gb&amp;quot; class=&amp;quot; js no-flexbox no-flexbox-legacy canvas canvastext webgl no-touch geolocation postmessage websqldatabase no-indexeddb hashchange history draganddrop no-websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations csscolumns cssgradients no-cssreflections csstransforms no-csstransforms3d csstransitions fontface generatedcontent video audio localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths&amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is really powerful, as it allows you to apply CSS to the page selectively, depending whether it supports certain feature or not. For example, if your code uses an animated 3D transform by default to reveal some content underneath:&lt;br /&gt;
&lt;br /&gt;
#shutter:hover {&lt;br /&gt;
  transform: rotateX(90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
You can include alternative styling that overrides this in browsers that don't support 3D transforms like this:&lt;br /&gt;
&lt;br /&gt;
.no-csstransforms3d #shutter:hover {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  right: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
It might not look quite as elegant, but it would still produce an ok experience that allows access to the underlying content.&lt;br /&gt;
&lt;br /&gt;
====Selective JavaScript application====&lt;br /&gt;
&lt;br /&gt;
Modernizr also provides a nice easy JavaScript API to allow you to execute code selectively, depending on whether CSS/HTML/other features are supported by the browser. Each test is a simple method on the Modernizr object, which returns a boolean (true/false) result. For example, if you wanted to query whether the current browser supports 3D transforms in JavaScript, you would write &amp;lt;code&amp;gt;if(Modernizr.csstransforms3d)&amp;lt;/code&amp;gt;. So you could have a block of code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(Modernizr.csstransforms3d) {&lt;br /&gt;
  // run killer feature that relies on 3D transforms being available&lt;br /&gt;
} else {&lt;br /&gt;
  // run an alternative chunk of code that provides a graceful fallback&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Problems with Modernizr====&lt;br /&gt;
&lt;br /&gt;
Modernizr, as with everything, isn't perfect. Two of the main problems are:&lt;br /&gt;
&lt;br /&gt;
# Not everything can be feature detected and therefore dealt with in this elegant manner.&lt;br /&gt;
# The full Modernizr library weighs in at 49KB, which is quite a lot of extra code to download for a few feature tests.&lt;br /&gt;
&lt;br /&gt;
However, you can customize Modernizr and create a version suitable for your site that only contains the tests you need, which cuts down on the file weight. And even though you can't feature detect everything, you will find it invaluable in many situations.&lt;br /&gt;
&lt;br /&gt;
===YepNope - load only what you need!===&lt;br /&gt;
&lt;br /&gt;
Now we've covered the feature detection side of things, lets cover what we can do to load resources like Polyfills only when you need them. To help you out with this, Modernizr comes packaged with a really smart, dandy little utility library called YepNope. This can do a lot, but in a nutshell, it allows you to specify a test of some kind, and then say what happens when the test is passed, and when it fails. Here's a simple example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;yepnope({&lt;br /&gt;
  test : Modernizr.canvas,&lt;br /&gt;
  yep  : 'normal.js',&lt;br /&gt;
  nope : ['polyfill.js', 'normal.js']&lt;br /&gt;
});&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, you are sating what the test is, then saying that if the test is passed, just load the normal script, but if the test fails, load the normal script and a polyfill to allow the code to work in an older browser.&lt;br /&gt;
&lt;br /&gt;
You can find a lot more details on how to use YepNope at &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;The YepNope homepage&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
I hope that's helped you get all these ideas clear in your head — why browser sniffing is bad, why feature detection is a much better way to detect whether a browser will run your site features or not, and different strategies for providing different capability browsers with different but acceptable experiences.&lt;br /&gt;
&lt;br /&gt;
If you want to read more sources about the topics discussed above, please check out the following pages:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://css-tricks.com/browser-detection-is-bad/&amp;quot;&amp;gt;CSS Tricks: Browser detection is bad&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://webaim.org/blog/user-agent-string-history/&amp;quot;&amp;gt;WebAIM: History of the browser user-agent string&amp;lt;/a&amp;gt;. A great account of why user agent sniffing was responsible for so much evil, historically speaking.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://www.mezzoblue.com/archives/2007/11/12/detect_this/&amp;quot;&amp;gt;Dave Shea: Detect This. A good concrete example of why browsing sniffing is so bad.&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://modernizr.com&amp;quot;&amp;gt;Modernizr homepage: find out all about how to use Modernizr, and download custom builds&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;YepNope homepage: find out how to do more with it!&amp;lt;/a&amp;gt;&lt;/div&gt;</description>
			<pubDate>Sun, 20 May 2012 20:07:15 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Optimizing_content_for_different_browsers:_the_RIGHT_way</comments>		</item>
		<item>
			<title>Optimizing content for different browsers: the RIGHT way</title>
			<link>http://www.w3.org/community/webed/wiki/Optimizing_content_for_different_browsers:_the_RIGHT_way</link>
			<description>&lt;p&gt;Cmills:&amp;#32;Created page with &amp;quot;=Optimizing content for different browsers, the RIGHT way=  (Alternative title — &amp;quot;Browser sniffing and why it's satan&amp;quot;)  ==Introduction==  If you've done a bit of front-end web…&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Optimizing content for different browsers, the RIGHT way=&lt;br /&gt;
&lt;br /&gt;
(Alternative title — &amp;quot;Browser sniffing and why it's satan&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
If you've done a bit of front-end web development, you're bound to have noticed that not all browsers render ''all web content in exactly the same way''. And &amp;lt;a href=&amp;quot;http://dowebsitesneedtolookexactlythesameineverybrowser.com/&amp;quot;&amp;gt;neither should they have to&amp;lt;/a&amp;gt;: arguably your web content doesn't need to look exactly the same across every browser and device and user might choose to view it on, as long as it still provides a good user experience and gives them access to the content and services required by their current browsing context.&lt;br /&gt;
&lt;br /&gt;
Note: a browsing context means a certain way of consuming web context. So IE on a desktop computer, Opera Mobile on an Android tablet, a text-only browser, a blind user using the web through a screen reader, etc etc. &lt;br /&gt;
&lt;br /&gt;
To get your web content working well on all of the huge, diverse number of different browsing contexts that exist (or even a good proportion of them), you're going to have to do some work, optimizing the layouts and content delivered to each context, and sometimes even directing certain devices to completely separate web sites. Examples of where such optimization might be required include:&lt;br /&gt;
&lt;br /&gt;
* Serving different layouts to narrow screen devices (eg mobile phones) and wide screen devices.&lt;br /&gt;
* Serving smaller image and video files (or even alternative content representations) to devices that are on a slower internet connection.&lt;br /&gt;
* Serving cutting edge styling to modern browsers, and alternative styling rules to older browsers that don't support the cutting edge CSS.&lt;br /&gt;
&lt;br /&gt;
There are dozens of techniques available to implement such content, but we don't have space to get anywhere near covering them all in this article. We will provide resources to give you pointers to more information at the end.&lt;br /&gt;
&lt;br /&gt;
This article first focuses on the different mechanisms available to allow us to detect what browser is accessing our content. We'll look at the right and wrong way to do this, and then round it off by showing the different mechanisms available to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
==Browser detection is not the way to go!==&lt;br /&gt;
&lt;br /&gt;
Ok, so the last paragraph in the introduction is a bit misleading — when you want to serve different content to different browsers, detecting the actual browser type and version itself is the wrong way to go in most cases. It is much better to detect whether the browser supports the technologies your web site is using — referred to as feature detection. &lt;br /&gt;
&lt;br /&gt;
This sounds a bit confusing, so let's investigate further.&lt;br /&gt;
&lt;br /&gt;
===A brief history of browser sniffing===&lt;br /&gt;
&lt;br /&gt;
These days, a lot of web standards features are supported pretty consistently across browsers, or at least, modern browsers.&lt;br /&gt;
&lt;br /&gt;
We'll touch a bit on older browsers we're still sometimes required to support later in the article. We'll also look later at the fact that really new, cutting edge web standards features (such as parts of CSS3 and HTML5) sometimes don't work the same across modern browsers, and the best way to deal with that.&lt;br /&gt;
&lt;br /&gt;
For now, let's rewind back to the early-to-mid-1990s. Back then, web standards were not supported very consistently at all across browsers, so developers were forced to either only support certain browsers, or fork their code, sending completely different codebases to different browsers. The way this was done back then was browser sniffing, or to be more accurate, UA sniffing.&lt;br /&gt;
&lt;br /&gt;
Every browser has a UA string that you can query to find out what browser it is. This is done in JavaScript using the &amp;lt;code&amp;gt;Navigator&amp;lt;/code&amp;gt; object. For example, I'm currently using Opera 12.00 beta. If I run &amp;lt;code&amp;gt;navigator.userAgent&amp;lt;/code&amp;gt; in my browser, I get the following returned:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; Edition Next; en) Presto/2.10.289 Version/12.00&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I can use this to identify the browser as Opera, and then serve code to just Opera as a result.&lt;br /&gt;
&lt;br /&gt;
Back in 1993, NCSA Mosaic was the most popular browser. It was identified by &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;NCSA_Mosaic/2.0 (Windows 3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was pretty simple. Then Netscape came along, identified by a US string of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.0 (Win3.1)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This was also pretty simple, but here's how the problems started. Netscape supported a new killer web feature of the time, Frames, and Mosaic didn't. So web developers used browser sniffing to detect the browser being used and serve content in frames only to Netscape.&lt;br /&gt;
&lt;br /&gt;
Internet Explorer then came along, and also supported frames, but to make sure it was being served frames, Microsoft used the following UA string to identify itself as Mozilla (compatible):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This is pretty silly, but things got even sillier. Other browser came along later on, with different rendering engines and names, but they all had to keep the Mozilla string inside their UA string, to make sure they were served good content by all this browser sniffing code. For example:&lt;br /&gt;
&lt;br /&gt;
* Mozilla: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826&amp;lt;/code&amp;gt;&lt;br /&gt;
* Firefox: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0&amp;lt;/code&amp;gt;&lt;br /&gt;
* Opera 9.5: &amp;lt;code&amp;gt;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Opera/9.51 (Windows NT 5.1; U; en)&amp;lt;/code&amp;gt;!!!&lt;br /&gt;
* KHTML: &amp;lt;code&amp;gt;Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Safari: &amp;lt;code&amp;gt;Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5&amp;lt;/code&amp;gt;&lt;br /&gt;
* Chrome: &amp;lt;code&amp;gt;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, all these user agent strings are trying to include some kind of identification of the actual browser they belong to and device install on, while strategically trying to be matched by browser sniffing code to make sure the browsers get served decent code.&lt;br /&gt;
&lt;br /&gt;
===The problem with browser sniffing===&lt;br /&gt;
&lt;br /&gt;
I'm sure you'll agree that the above situation is silly. All of these crazy verbose US strings have arisen because web developers used short-sighted browser sniffing in the first place, which just sniffed for the first browser to support frames (and later other cool features). When new browsers came out, they had to change their UA strings to work with the browser sniffing code. The other choice would be for developers to keep changing their sniffing code every time a new browser comes out that they want to support. This has happened frequently as well.&lt;br /&gt;
&lt;br /&gt;
and this is the crux of why browser sniffing is so bad — it only solves the problem now, and isn't future proof at all. It is also really error prone. When you are browser sniffing, what you are really want to do is check whether the browser accessing your site supports the technologies your content is built from. But instead of doing this directly, you are making an educated guess dependant on the contents of the UA string, which isn't very precise at all!&lt;br /&gt;
&lt;br /&gt;
For example, you'll notice that the above Opera UA string starts with &amp;lt;code&amp;gt;Opera/9.80&amp;lt;/code&amp;gt;, even though at the time of writing we are on version 11.64! This is because of widespread erroneous browsing sniffing code, which looked at Opera UA strings and interpreted Opera 10+ as Opera 1, serving incorrect content as a result.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Why feature detection is better===&lt;br /&gt;
&lt;br /&gt;
Feature detection is a much better way to do things — instead of seeing what browser is accessing the content and serving appropriate code, the idea here is to query the browser to detect whether it supports the features  our content relies on, and then serve content as appropriate. Let's take HTML5 video as an example. You could detect support using some simple code such as this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(!!document.createElement('video').canPlayType === true) {&lt;br /&gt;
  // run some code that relies on HTML5 video&lt;br /&gt;
} else {&lt;br /&gt;
  // do something else&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is much more future proof, because existing browsers that support HTML5 video will run the correct code, and future browsers that support HTML5 video will do as well. You don't have to keep updating your code each time a new browser is released.&lt;br /&gt;
&lt;br /&gt;
==Strategies for supporting different browsers==&lt;br /&gt;
&lt;br /&gt;
Now we've got the argument for feature detection out of the way, let's look at some strategies you can use to serve appropriate content to different browsers.&lt;br /&gt;
&lt;br /&gt;
===Graceful degradation===&lt;br /&gt;
&lt;br /&gt;
The good news about web technologies is that they are largely designed so that they will work as well as possible if something is not done quite right — this is contrary to other programming environments where nothing will work if there is the slightest error present in the code.&lt;br /&gt;
&lt;br /&gt;
Part of this related to how browsers deal with unknown elements and CSS properties. If a browser encounters an unknown CSS property, it will just ignore it and move on. If a browser encounters an unknown HTML element, it will treat it like an anonymous inline element, similar to a &amp;lt;code&amp;gt;&amp;amp;lt;span&amp;amp;gt;&amp;lt;/code&amp;gt;. This means that if a browser is served some HTML or CSS features it can't understand, it will generally just ignore it and move on, rendering the rest of the content. Obviously this might not give you a usable result in all cases, but for text and image content, you'll find that older browsers will render a usable result, even if it doesn't look quite as nice and shiny as in modern browsers. This is generally called graceful degradation.&lt;br /&gt;
&lt;br /&gt;
A quick example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;border-radius&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;box-shadow&amp;lt;/code&amp;gt; aren't supported in older browsers like IE6, but you're still going to be able to read the content inside the box, even if it hasn't got rounded corners and a drop shadow.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
===Vendor prefixes, and alternative styles===&lt;br /&gt;
&lt;br /&gt;
Of course, you can't rely on graceful degradation in all cases. In some cases, a feature not being supported will result in your content breaking to the point where it is not really usable. In the case of CSS, examples include:&lt;br /&gt;
&lt;br /&gt;
1. Sizing a layout using &amp;lt;a href=&amp;quot;http://snook.ca/archives/html_and_css/font-size-with-rem&amp;quot;&amp;gt;rem units&amp;lt;/a&amp;gt; — these units are not supported in older browsers, resulting in the layout falling apart. To remedy this, you could provide a fallback sized in a unit like pixels later in the cascade, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;nav {&lt;br /&gt;
  width: 180px;&lt;br /&gt;
  width: 18rem;&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modern browsers that understand both will first apply the pixel value then override it with the rem value. Older browsers that don't understand rems will just apply the first line, then ignore the second one. &lt;br /&gt;
&lt;br /&gt;
2. Filling in a background using a CSS3 gradient — in browsers that don't support the gradient, it will not render at all, which could cause content to be unreadable.&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
To make things better, you could provide a solid background colour as a fallback, like so:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
[INCLUDE FIGURE TO ILLUSTRATE THIS]&lt;br /&gt;
&lt;br /&gt;
====IE conditional comments====&lt;br /&gt;
&lt;br /&gt;
If you are specifically dealing with fallbacks for old versions of Internet Explorer, you can separate these out into separate stylesheets, and then link to these stylesheets inside an IE conditional comment. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;normal-styles.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;!--[if lte IE 6]&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;link rel=&amp;quot;stylesheet&amp;quot;  href=&amp;quot;ie-fixes.css&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;amp;gt;&lt;br /&gt;
&amp;amp;lt;![endif]--&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this case, the first link element will be given to all browsers, whereas the second one will only be picked up by IE versions 6 and less. In the latter, you could put all your IE fallback styles (such as giving IE6 different width and height values to compensate for its broken box model.)&lt;br /&gt;
&lt;br /&gt;
You can read more about IE conditional comments in Bruce Lawson's article &amp;lt;a href=&amp;quot;http://dev.opera.com/articles/view/supporting-ie-with-conditional-comments/&amp;quot;&amp;gt;Supporting IE with conditional comments&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Vendor prefixes====&lt;br /&gt;
&lt;br /&gt;
Returning to the gradient example we saw earlier, you may have noticed that something wasn't quite right there. To get the gradient rendering across all modern browsers, you need to include multiple versions of the declaration, like this:&lt;br /&gt;
&lt;br /&gt;
nav {&lt;br /&gt;
  background-color: red;&lt;br /&gt;
  background-color: -webkit-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -moz-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -ms-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: -o-linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
  background-color: linear-gradient(top right, #A60000, #FFFFFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
This is because the &amp;lt;a href=&amp;quot;http://dev.w3.org/csswg/css3-images/&amp;quot;&amp;gt;CSS Image Values and Replaced Content Module Level 3&amp;lt;/a&amp;gt; — the spec that CSS gradients are specified in, is not finalised. Unfinished CSS features are implemented in browsers in an experimental capacity, with a vendor-specific prefix so that different browser's implementations can be tested without impacting on other browser's implementations. In the above example:&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;code&amp;gt;-webkit-&amp;lt;/code&amp;gt; prefixed property will work in WebKit-based browsers such as Chrome and Safari&lt;br /&gt;
* The &amp;lt;code&amp;gt;-moz-&amp;lt;/code&amp;gt; prefixed property will work in Firefox&lt;br /&gt;
* The &amp;lt;code&amp;gt;-ms-&amp;lt;/code&amp;gt; prefixed property will work in Internet Explorer&lt;br /&gt;
* The &amp;lt;code&amp;gt;-o-&amp;lt;/code&amp;gt; prefixed property will work in Opera&lt;br /&gt;
&lt;br /&gt;
Official W3C policy states that you shouldn't really use experimental properties in production code, but people do, as they want to make sites look cool and keep on the cutting edge. I don't see a problem with this, but if you want to use vendor prefixed properties in your code, you really should use include all the different prefixes so that as many browsers as possible can use all the features you are implementing.&lt;br /&gt;
&lt;br /&gt;
Notice that an unprefixed version of the property has also been included, at the bottom of the list: this is so that when the CSS feature is finalised, and the prefixes are removed, the code will still work — this is good future proofing practice.&lt;br /&gt;
&lt;br /&gt;
===Progressive enhancement===&lt;br /&gt;
&lt;br /&gt;
The flip side of graceful degradation is progressive enhancement - this goes in the other direction. Instead of building a great experience as the default and then hoping it degrades to something that is still usable in less capable browsers, you build a basic experience that works in all browsers, and then layer an enhanced experience on top of that.&lt;br /&gt;
&lt;br /&gt;
... NEED TO FILL IN AN EXAMPLE?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Polyfills/shims===&lt;br /&gt;
&lt;br /&gt;
Another approach you can take to dealing with disparate browser support is using Polyfills/shims. These are bits of utility code (usually JavaScript) that fakes support for a feature you want to use in browsers that don't support that feature natively. &lt;br /&gt;
&lt;br /&gt;
You generally use a polyfill by simply applying the JavaScript to your page via &amp;lt;code&amp;gt;&amp;amp;lt;script src=&amp;quot;script.js&amp;quot;&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/code&amp;gt;, although many of them do have other instructions besides. Always reach the author's instructions carefully before attempting to use one! Polyfill/shim examples include:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You might think this sounds wonderful! Why worry about what feature different browser support, if you can just fill in support for the ones that don't using JavaScript? The trouble is that using a Polyfill does add weight to a page, both in terms of extra files requiring download, and extra processing required to put the polyfill in action. If you used loads of polyfills on every one of your pages, they would likely be significantly slower to download and run, as well as making your code base a lot more fiddly and complex.&lt;br /&gt;
&lt;br /&gt;
So they are great, but use them sparingly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Feature detection with Modernizr===&lt;br /&gt;
&lt;br /&gt;
You might be thinking at this point &amp;quot;well isn't there a way to only load those extra resources if the browser really needs them?&amp;quot; Well, yes there is. The general idea is to do feature detection to see if the browser supports those features, and then pull in a polyfill or un some alternative code only if needed.&lt;br /&gt;
&lt;br /&gt;
The easiest way to do the feature detection part of this is through a feature detection library called &amp;lt;a href=&amp;quot;http://www.modernizr.com&amp;quot;&amp;gt;Modernizr&amp;lt;/a&amp;gt;. This is a JavaScript library that provides an easy way to do pretty much all of the feature detection you could need. All you have to do is&lt;br /&gt;
&lt;br /&gt;
# Download the library and attach it to your page via a &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
# add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to your page's &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element.&lt;br /&gt;
&lt;br /&gt;
When your page runs, Modernizr runs feature tests on all manner of HTML5/CSS3/etc. features, then it does two things. First, it adds classes to your &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element to allow you to apply CSS to the page selectively, depending on whether the browser supports various feature or not. Second, it provides you with a JavaScript API to allow you to do the same kind of selective code application in your JavaScript. Let's look at these two aspects in more detail.&lt;br /&gt;
&lt;br /&gt;
====Selective CSS application====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get things going, you need to link to the Modernizr library and add a class of &amp;lt;code&amp;gt;no-js&amp;lt;/code&amp;gt; to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element in your source code. when the page is run, modernizr runs all its feature detection tests and lets you know the results of those tests via a series of classes appended to the &amp;lt;code&amp;gt;&amp;amp;lt;html&amp;amp;gt;&amp;lt;/code&amp;gt; element. They will look something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;html lang=&amp;quot;en-gb&amp;quot; class=&amp;quot; js no-flexbox no-flexbox-legacy canvas canvastext webgl no-touch geolocation postmessage websqldatabase no-indexeddb hashchange history draganddrop no-websockets rgba hsla multiplebgs backgroundsize borderimage borderradius boxshadow textshadow opacity cssanimations csscolumns cssgradients no-cssreflections csstransforms no-csstransforms3d csstransitions fontface generatedcontent video audio localstorage sessionstorage webworkers applicationcache svg inlinesvg smil svgclippaths&amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is really powerful, as it allows you to apply CSS to the page selectively, depending whether it supports certain feature or not. For example, if your code uses an animated 3D transform by default to reveal some content underneath:&lt;br /&gt;
&lt;br /&gt;
#shutter:hover {&lt;br /&gt;
  transform: rotateX(90deg);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
You can include alternative styling that overrides this in browsers that don't support 3D transforms like this:&lt;br /&gt;
&lt;br /&gt;
.no-csstransforms3d #shutter:hover {&lt;br /&gt;
  position: relative;&lt;br /&gt;
  right: 100px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
It might not look quite as elegant, but it would still produce an ok experience that allows access to the underlying content.&lt;br /&gt;
&lt;br /&gt;
====Selective JavaScript application====&lt;br /&gt;
&lt;br /&gt;
Modernizr also provides a nice easy JavaScript API to allow you to execute code selectively, depending on whether CSS/HTML/other features are supported by the browser. Each test is a simple method on the Modernizr object, which returns a boolean (true/false) result. For example, if you wanted to query whether the current browser supports 3D transforms in JavaScript, you would write &amp;lt;code&amp;gt;if(Modernizr.csstransforms3d)&amp;lt;/code&amp;gt;. So you could have a block of code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;if(Modernizr.csstransforms3d) {&lt;br /&gt;
  // run killer feature that relies on 3D transforms being available&lt;br /&gt;
} else {&lt;br /&gt;
  // run an alternative chunk of code that provides a graceful fallback&lt;br /&gt;
}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Problems with Modernizr====&lt;br /&gt;
&lt;br /&gt;
Modernizr, as with everything, isn't perfect. Two of the main problems are:&lt;br /&gt;
&lt;br /&gt;
# Not everything can be feature detected and therefore dealt with in this elegant manner.&lt;br /&gt;
# The full Modernizr library weighs in at 49KB, which is quite a lot of extra code to download for a few feature tests.&lt;br /&gt;
&lt;br /&gt;
However, you can customize Modernizr and create a version suitable for your site that only contains the tests you need, which cuts down on the file weight. And even though you can't feature detect everything, you will find it invaluable in many situations.&lt;br /&gt;
&lt;br /&gt;
===YepNope - load only what you need!===&lt;br /&gt;
&lt;br /&gt;
Now we've covered the feature detection side of things, lets cover what we can do to load resources like Polyfills only when you need them. To help you out with this, Modernizr comes packaged with a really smart, dandy little utility library called YepNope. This can do a lot, but in a nutshell, it allows you to specify a test of some kind, and then say what happens when the test is passed, and when it fails. Here's a simple example: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;yepnope({&lt;br /&gt;
  test : Modernizr.canvas,&lt;br /&gt;
  yep  : 'normal.js',&lt;br /&gt;
  nope : ['polyfill.js', 'normal.js']&lt;br /&gt;
});&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So basically, you are sating what the test is, then saying that if the test is passed, just load the normal script, but if the test fails, load the normal script and a polyfill to allow the code to work in an older browser.&lt;br /&gt;
&lt;br /&gt;
You can find a lot more details on how to use YepNope at &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;The YepNope homepage&amp;lt;/a&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
I hope that's helped you get all these ideas clear in your head — why browser sniffing is bad, why feature detection is a much better way to detect whether a browser will run your site features or not, and different strategies for providing different capability browsers with different but acceptable experiences.&lt;br /&gt;
&lt;br /&gt;
If you want to read more sources about the topics discussed above, please check out the following pages:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://css-tricks.com/browser-detection-is-bad/&amp;quot;&amp;gt;CSS Tricks: Browser detection is bad&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://webaim.org/blog/user-agent-string-history/&amp;quot;&amp;gt;WebAIM: History of the browser user-agent string&amp;lt;/a&amp;gt;. A great account of why user agent sniffing was responsible for so much evil, historically speaking.&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://www.mezzoblue.com/archives/2007/11/12/detect_this/&amp;quot;&amp;gt;Dave Shea: Detect This. A good concrete example of why browsing sniffing is so bad.&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://modernizr.com&amp;quot;&amp;gt;Modernizr homepage: find out all about how to use Modernizr, and download custom builds&amp;lt;/a&amp;gt;&lt;br /&gt;
* &amp;lt;a href=&amp;quot;http://yepnopejs.com/&amp;quot;&amp;gt;YepNope homepage: find out how to do more with it!&amp;lt;/a&amp;gt;&lt;/div&gt;</description>
			<pubDate>Sun, 20 May 2012 20:06:43 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Optimizing_content_for_different_browsers:_the_RIGHT_way</comments>		</item>
		<item>
			<title>Main Page</title>
			<link>http://www.w3.org/community/webed/wiki/Main_Page</link>
			<description>&lt;p&gt;Cmills:&amp;#32;/* Supplementary articles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Web Education Community Group Wiki! This page contains resources to help you teach or learn modern web development:&lt;br /&gt;
&lt;br /&gt;
* The first section — [http://www.w3.org/community/webed/wiki/Main_Page#Web_Standards_Curriculum_table_of_contents The web standards curriculum] — is a series of tutorial articles covering web design and development high level concepts, and essential technologies such as HTML, CSS and JavaScript. This is ideal for beginners wanting to learn the art of web design, or teachers looking for accurate material to use as the basis of teaching material.&lt;br /&gt;
* The second section — [http://www.w3.org/community/webed/wiki/Main_Page#References References] — is designed for looking up HTML and CSS language features.&lt;br /&gt;
* The third section — [http://www.w3.org/community/webed/wiki/Main_Page#Curriculum_structures Curriculum structures] — is a complete set of web design-related curricula for teachers to use to put together courses, which includes sample assignments, example questions, reading lists, assessment criteria, and more.&lt;br /&gt;
&lt;br /&gt;
Note: This is not a finalised site, but a development site for our material — it will be placed on a dedicated publishing platform in coming months, and a lot more material will be added. If you would like to contribute, please join the [http://www.w3.org/community/webed/ Web Education Community Group]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Web Standards Curriculum table of contents =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
What follows is a list of all the articles within the web standards curriculum, which will give you an essential grounding in Hypertext Markup Language (HTML), Cascading Stylesheets (CSS), JavaScript, accessibility, and the other topics you need to be a modern web developer/designer. Reading them in order makes the most sense, but they are written to work individually, so you can dip in and out as it suits you, if you need to hone individual skills.&lt;br /&gt;
&lt;br /&gt;
Note: This material was originally published as part of the Opera Web Standards Curriculum, available as [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur/#toc Introductory material], written by Chris Mills. Like the original, it is published under the [http://creativecommons.org/licenses/by-nc-sa/2.5/ Creative Commons Attribution, Non Commercial - Share Alike 2.5] license.&lt;br /&gt;
&lt;br /&gt;
Note #2: Many of the links below currently point to the [http://dev.opera.com dev.opera] versions, but we'll change these over to the W3C versions as we add more to the site. We are very happy to add these to the W3C pages, for a wider readership and more maintenance help.&lt;br /&gt;
&lt;br /&gt;
== The beginning ==&lt;br /&gt;
&lt;br /&gt;
[[Introduction to the Web Standards Curriculum]]&lt;br /&gt;
* [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-he/ Hebrew translation] | [http://dev.opera.com/articles/view/1-bevezeto-a-webes-szabvanyokba/ Hungarian translation] | [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-it/ Italian translation] | [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/ Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/ Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Introduction to the world of web standards ==&lt;br /&gt;
&lt;br /&gt;
# [[The history of the Web|The history of the Internet and the web, and the evolution of web standards]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-he/ Hebrew translation] | [http://dev.opera.com/articles/view/2-az-internet-es-a-web-tortenete/ Hungarian translation] | [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-it/ Italian translation] | [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/m1/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud1/index.html Spanish translation]&lt;br /&gt;
# [[How does the Internet work]]?&lt;br /&gt;
#* [http://dev.opera.com/articles/view/3-hogyan-mukodik-az-internet/ Hungarian translation] | [http://dev.opera.com/articles/view/3-how-does-the-internet-work-ja/ Japanese translation]| [http://mosaic.uoc.edu/ac/le/ca/m1/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud2/index.html Spanish translation]&lt;br /&gt;
# [[The web standards model - HTML CSS and JavaScript]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/4-a-webes-szabvanyok-modellje/ Hungarian translation] | [http://dev.opera.com/articles/view/4-the-web-standards-model-html-css-a-ja/ Japanese translation]| [http://mosaic.uoc.edu/ac/le/ca/m1/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/ca/m1/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud3/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Web Design Concepts ==&lt;br /&gt;
&lt;br /&gt;
This section won't go into any code or markup details, and will act as an introduction to the design process before you start to create any graphics or code, as well as concepts of web design such as IA, navigation, usability etc.&lt;br /&gt;
&lt;br /&gt;
# [[Information_Architecture_-_planning_out_a_web_site|Information Architecture - planning out a web site]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/6-informacios-architektura-egy-website-t/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud1/index.html Spanish translation]&lt;br /&gt;
# [[What_does_a_good_web_page_need|What does a good web page need?]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/7-mi-kell-egy-jo-weblaphoz/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud2/index.html Spanish translation]&lt;br /&gt;
# [[Colour_theory|Colour Theory]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/8-a-szinek-elmelete/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud3/index.html Spanish translation]&lt;br /&gt;
# [[Building up a site wireframe]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/9-egy-site-keretenek-felepitese/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud4/index.html Spanish translation] &lt;br /&gt;
# [[Colour schemes and design mockups]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/10-szinsemak-es-designtervek/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud5/index.html Spanish translation]&lt;br /&gt;
# [[Typography on the Web]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/11-tipografia-a-weben/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud6/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== HTML beginnings ==&lt;br /&gt;
&lt;br /&gt;
# [[The basics of HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/12-a-html-alapjai/ Hungarian translation] | [http://dev.opera.com/articles/view/12-the-basics-of-html-ja/ Japanese translation]&lt;br /&gt;
# [[Doctypes and markup styles]]&lt;br /&gt;
# [[The_HTML_head_element|The HTML &amp;amp;lt;head&amp;amp;gt; element]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/13-a-html-head-eleme/ Hungarian translation] | [http://dev.opera.com/articles/view/13-the-html-head-element-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/m3/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m3/ud1/index.html Spanish translation]&lt;br /&gt;
# [[More_about_the_document_head|More about the document &amp;amp;lt;head&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
== The HTML body ==&lt;br /&gt;
&lt;br /&gt;
# [[Marking up textual content in HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/15-szoveges-reszek-megjelolese/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud1/index.html Spanish translation]&lt;br /&gt;
# [[HTML lists|HTML Lists]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/16-html-listak/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud2/index.html Spanish translation]&lt;br /&gt;
# [[Images in HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/17-kepek-a-htmlben/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud3/index.html Spanish translation]&lt;br /&gt;
# [[HTML_links_-_lets_build_a_web|HTML links — let's build a web!]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/18-html-hivatkozasok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud4/index.html Spanish translation]&lt;br /&gt;
# [[HTML tables]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/19-html-tablazatok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud5/index.html Spanish translation]&lt;br /&gt;
# [[HTML forms - the basics]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/20-html-urlapok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud6/index.html Spanish translation]&lt;br /&gt;
# [[HTML5 form additions]]&lt;br /&gt;
# [[HTML structural elements]]&lt;br /&gt;
# [[Lesser - known semantic elements]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/21-kevesse-ismert/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud7/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud7/index.html Spanish translation]&lt;br /&gt;
# [[Creating multiple pages with navigation menus]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m4/ud9/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud9/index.html Spanish translation]&lt;br /&gt;
# [[Validating your HTML]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m4/ud10/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud10/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Accessibility ==&lt;br /&gt;
&lt;br /&gt;
# [[Accessibility basics]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m5/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m5/ud1/index.html Spanish translation]&lt;br /&gt;
# [[Accessibility testing]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m5/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m5/ud2/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== CSS ==&lt;br /&gt;
&lt;br /&gt;
# [[CSS_basics|CSS basics]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud1/index.html Spanish translation]&lt;br /&gt;
# [[Advanced CSS selectors]]&lt;br /&gt;
# [[Inheritance and cascade]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud2/index.html Spanish translation]&lt;br /&gt;
# [[CSS text styling part 1]]&lt;br /&gt;
# [[The_CSS_layout_model_-_boxes_borders_margins_padding|The CSS layout model - boxes, borders, margins, padding]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud4/index.html Spanish translation]&lt;br /&gt;
# [[CSS background images]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud5/index.html Spanish translation]&lt;br /&gt;
# [[Styling_lists_and_links|Styling lists and links]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud6/index.html Spanish translation]&lt;br /&gt;
# [[Styling tables]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud7/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud7/index.html Spanish translation]&lt;br /&gt;
# [[Styling forms]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud8/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud8/index.html Spanish translation]&lt;br /&gt;
# [[Floats and clearing]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud9/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud9/index.html Spanish translation]&lt;br /&gt;
# [[CSS static and relative positioning]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud10/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud10/index.html Spanish translation]&lt;br /&gt;
# [[CSS absolute and fixed positioning]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud11/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud11/index.html | Spanish translation]&lt;br /&gt;
# [[Debugging CSS]]&lt;br /&gt;
# [[CSS shorthand reference]]&lt;br /&gt;
&lt;br /&gt;
== Advanced CSS study ==&lt;br /&gt;
&lt;br /&gt;
# [[Headers_footers_columns_and_templates|Headers, footers, columns, and templates]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m7/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m7/ud1/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== JavaScript core skills ==&lt;br /&gt;
&lt;br /&gt;
# [[Programming_-_the_real_basics|Programming - the real basics!]]&lt;br /&gt;
# [[What can you do with JavaScript]]&lt;br /&gt;
# [[Your first look at JavaScript]]&lt;br /&gt;
# [[JavaScript best practices]]&lt;br /&gt;
# [[The principles of unobtrusive JavaScript]]&lt;br /&gt;
# [[JavaScript functions]]&lt;br /&gt;
# [[Objects in JavaScript]]&lt;br /&gt;
# [[Traversing the DOM]]&lt;br /&gt;
# [[Creating and modifying HTML]]&lt;br /&gt;
# [[Dynamic style - manipulating CSS with JavaScript]]&lt;br /&gt;
# [[Handling events with JavaScript]]&lt;br /&gt;
# [[JavaScript animation]]&lt;br /&gt;
# [[Graceful degredation versus progressive enhancement]]&lt;br /&gt;
&lt;br /&gt;
== Mobile web development ==&lt;br /&gt;
&lt;br /&gt;
# [[Introduction_to_mobile_web|Mobile 1: Introduction to mobile web]]&lt;br /&gt;
&lt;br /&gt;
== Supplementary articles ==&lt;br /&gt;
&lt;br /&gt;
* [[Getting your content online]]&lt;br /&gt;
* [[Common HTML entities used for typography]]&lt;br /&gt;
* [[The web standards curriculum glossary]]&lt;br /&gt;
* [[Optimizing content for different browsers: the RIGHT way]]&lt;br /&gt;
&lt;br /&gt;
== Proposed Updates and Additions to Web Standards Curriculum ==&lt;br /&gt;
&lt;br /&gt;
* [[WSC_proposed_updates|Web standards curriculum on W3C Wiki: plan for updates 2011]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:WSC]]&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
&lt;br /&gt;
* [[HTML]]&lt;br /&gt;
* [[CSS]]&lt;br /&gt;
&lt;br /&gt;
= Curriculum structures =&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact_Curriculum Overview of InterACT curriculum articles]&lt;br /&gt;
&lt;br /&gt;
== Basics and &amp;quot;soft&amp;quot; skills ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Internet_Fundamentals Internet Fundamentals]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Digital_Design_Production Digital Design Production]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Writing_for_the_Web Writing for the Web]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Project_Management Project Management]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Professional_Development Professional Development]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Independent_Study Independent Study]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Internship Internship]&lt;br /&gt;
&lt;br /&gt;
== Web design ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Web_Design_1 Web Design 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Web_Design_2 Web Design 2]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Accessibility Accessibility]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Usability_1 Usability 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Findability Findability]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Interaction_Design_1 Interaction Design 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Prototyping Prototyping]&lt;br /&gt;
&lt;br /&gt;
== Web development ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/DOM_Scripting_1 DOM Scripting 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Server-Side_Scripting_1 Server-side Scripting 1]&lt;br /&gt;
&lt;br /&gt;
= Teaching materials =&lt;br /&gt;
&lt;br /&gt;
Each page in this section includes teaching notes, examples, slidedecks and other materials for teachers to use for hands-on teaching of the curriculum structures outlined in the [[#Curriculum_structures|Curriculum structures]] section.&lt;br /&gt;
&lt;br /&gt;
* [[HTML Basics and Web Standards Concepts teaching materials]] (learning competency included in [http://www.w3.org/community/webed/wiki/Interact/Web_Design_1 Web Design 1])&lt;br /&gt;
&lt;br /&gt;
= Project activities =&lt;br /&gt;
&lt;br /&gt;
This section houses a record of all activities being undertaken in past, present or future by the Web Education Community Group, split into projects.&lt;br /&gt;
&lt;br /&gt;
IMPORTANT: Please don't pollute these pages with random stuff - if you just want to doodle or record random thoughts, put it in the [[ Ideas Playground ]].&lt;br /&gt;
&lt;br /&gt;
* [[Learning material]]&lt;br /&gt;
* [[Curriculum]]&lt;br /&gt;
* [[Outreach]]&lt;br /&gt;
* [[Training and certification]]&lt;br /&gt;
* [[Membership and policy]]&lt;br /&gt;
* International projects&lt;br /&gt;
** [[Croatian international project]]&lt;br /&gt;
** [[French international project]]&lt;br /&gt;
** [[Japanese international project]]&lt;br /&gt;
** [[fa/|Persian language international project]]&lt;br /&gt;
** [[Es/|Spanish international project]]&lt;br /&gt;
** [[Turkish international project]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other available resources are as follows:&lt;br /&gt;
&lt;br /&gt;
* [[ WEST | Web Education Supplementary Toolkit ]]&lt;br /&gt;
* [[ Web Education community group style guide ]]&lt;/div&gt;</description>
			<pubDate>Sun, 20 May 2012 20:06:20 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Main_Page</comments>		</item>
		<item>
			<title>Fa/</title>
			<link>http://www.w3.org/community/webed/wiki/Fa/</link>
			<description>&lt;p&gt;Cmills:&amp;#32;Created page with &amp;quot;Persian language page&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Persian language page&lt;/div&gt;</description>
			<pubDate>Mon, 14 May 2012 13:16:00 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Fa/</comments>		</item>
		<item>
			<title>Main Page</title>
			<link>http://www.w3.org/community/webed/wiki/Main_Page</link>
			<description>&lt;p&gt;Cmills:&amp;#32;/* Project activities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Web Education Community Group Wiki! This page contains resources to help you teach or learn modern web development:&lt;br /&gt;
&lt;br /&gt;
* The first section — [http://www.w3.org/community/webed/wiki/Main_Page#Web_Standards_Curriculum_table_of_contents The web standards curriculum] — is a series of tutorial articles covering web design and development high level concepts, and essential technologies such as HTML, CSS and JavaScript. This is ideal for beginners wanting to learn the art of web design, or teachers looking for accurate material to use as the basis of teaching material.&lt;br /&gt;
* The second section — [http://www.w3.org/community/webed/wiki/Main_Page#References References] — is designed for looking up HTML and CSS language features.&lt;br /&gt;
* The third section — [http://www.w3.org/community/webed/wiki/Main_Page#Curriculum_structures Curriculum structures] — is a complete set of web design-related curricula for teachers to use to put together courses, which includes sample assignments, example questions, reading lists, assessment criteria, and more.&lt;br /&gt;
&lt;br /&gt;
Note: This is not a finalised site, but a development site for our material — it will be placed on a dedicated publishing platform in coming months, and a lot more material will be added. If you would like to contribute, please join the [http://www.w3.org/community/webed/ Web Education Community Group]!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Web Standards Curriculum table of contents =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
What follows is a list of all the articles within the web standards curriculum, which will give you an essential grounding in Hypertext Markup Language (HTML), Cascading Stylesheets (CSS), JavaScript, accessibility, and the other topics you need to be a modern web developer/designer. Reading them in order makes the most sense, but they are written to work individually, so you can dip in and out as it suits you, if you need to hone individual skills.&lt;br /&gt;
&lt;br /&gt;
Note: This material was originally published as part of the Opera Web Standards Curriculum, available as [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur/#toc Introductory material], written by Chris Mills. Like the original, it is published under the [http://creativecommons.org/licenses/by-nc-sa/2.5/ Creative Commons Attribution, Non Commercial - Share Alike 2.5] license.&lt;br /&gt;
&lt;br /&gt;
Note #2: Many of the links below currently point to the [http://dev.opera.com dev.opera] versions, but we'll change these over to the W3C versions as we add more to the site. We are very happy to add these to the W3C pages, for a wider readership and more maintenance help.&lt;br /&gt;
&lt;br /&gt;
== The beginning ==&lt;br /&gt;
&lt;br /&gt;
[[Introduction to the Web Standards Curriculum]]&lt;br /&gt;
* [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-he/ Hebrew translation] | [http://dev.opera.com/articles/view/1-bevezeto-a-webes-szabvanyokba/ Hungarian translation] | [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-it/ Italian translation] | [http://dev.opera.com/articles/view/1-introduction-to-the-web-standards-cur-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/ Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/ Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Introduction to the world of web standards ==&lt;br /&gt;
&lt;br /&gt;
# [[The history of the Web|The history of the Internet and the web, and the evolution of web standards]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-he/ Hebrew translation] | [http://dev.opera.com/articles/view/2-az-internet-es-a-web-tortenete/ Hungarian translation] | [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-it/ Italian translation] | [http://dev.opera.com/articles/view/2-the-history-of-the-internet-and-the-w-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/m1/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud1/index.html Spanish translation]&lt;br /&gt;
# [[How does the Internet work]]?&lt;br /&gt;
#* [http://dev.opera.com/articles/view/3-hogyan-mukodik-az-internet/ Hungarian translation] | [http://dev.opera.com/articles/view/3-how-does-the-internet-work-ja/ Japanese translation]| [http://mosaic.uoc.edu/ac/le/ca/m1/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud2/index.html Spanish translation]&lt;br /&gt;
# [[The web standards model - HTML CSS and JavaScript]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/4-a-webes-szabvanyok-modellje/ Hungarian translation] | [http://dev.opera.com/articles/view/4-the-web-standards-model-html-css-a-ja/ Japanese translation]| [http://mosaic.uoc.edu/ac/le/ca/m1/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/ca/m1/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m1/ud3/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Web Design Concepts ==&lt;br /&gt;
&lt;br /&gt;
This section won't go into any code or markup details, and will act as an introduction to the design process before you start to create any graphics or code, as well as concepts of web design such as IA, navigation, usability etc.&lt;br /&gt;
&lt;br /&gt;
# [[Information_Architecture_-_planning_out_a_web_site|Information Architecture - planning out a web site]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/6-informacios-architektura-egy-website-t/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud1/index.html Spanish translation]&lt;br /&gt;
# [[What_does_a_good_web_page_need|What does a good web page need?]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/7-mi-kell-egy-jo-weblaphoz/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud2/index.html Spanish translation]&lt;br /&gt;
# [[Colour_theory|Colour Theory]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/8-a-szinek-elmelete/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud3/index.html Spanish translation]&lt;br /&gt;
# [[Building up a site wireframe]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/9-egy-site-keretenek-felepitese/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud4/index.html Spanish translation] &lt;br /&gt;
# [[Colour schemes and design mockups]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/10-szinsemak-es-designtervek/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud5/index.html Spanish translation]&lt;br /&gt;
# [[Typography on the Web]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/11-tipografia-a-weben/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m2/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m2/ud6/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== HTML beginnings ==&lt;br /&gt;
&lt;br /&gt;
# [[The basics of HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/12-a-html-alapjai/ Hungarian translation] | [http://dev.opera.com/articles/view/12-the-basics-of-html-ja/ Japanese translation]&lt;br /&gt;
# [[Doctypes and markup styles]]&lt;br /&gt;
# [[The_HTML_head_element|The HTML &amp;amp;lt;head&amp;amp;gt; element]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/13-a-html-head-eleme/ Hungarian translation] | [http://dev.opera.com/articles/view/13-the-html-head-element-ja/ Japanese translation] | [http://mosaic.uoc.edu/ac/le/ca/m3/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m3/ud1/index.html Spanish translation]&lt;br /&gt;
# [[More_about_the_document_head|More about the document &amp;amp;lt;head&amp;amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
== The HTML body ==&lt;br /&gt;
&lt;br /&gt;
# [[Marking up textual content in HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/15-szoveges-reszek-megjelolese/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud1/index.html Spanish translation]&lt;br /&gt;
# [[HTML lists|HTML Lists]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/16-html-listak/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud2/index.html Spanish translation]&lt;br /&gt;
# [[Images in HTML]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/17-kepek-a-htmlben/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud3/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud3/index.html Spanish translation]&lt;br /&gt;
# [[HTML_links_-_lets_build_a_web|HTML links — let's build a web!]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/18-html-hivatkozasok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud4/index.html Spanish translation]&lt;br /&gt;
# [[HTML tables]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/19-html-tablazatok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud5/index.html Spanish translation]&lt;br /&gt;
# [[HTML forms - the basics]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/20-html-urlapok/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud6/index.html Spanish translation]&lt;br /&gt;
# [[HTML5 form additions]]&lt;br /&gt;
# [[HTML structural elements]]&lt;br /&gt;
# [[Lesser - known semantic elements]]&lt;br /&gt;
#* [http://dev.opera.com/articles/view/21-kevesse-ismert/ Hungarian translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud7/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/ca/m4/ud7/index.html Spanish translation]&lt;br /&gt;
# [[Creating multiple pages with navigation menus]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m4/ud9/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud9/index.html Spanish translation]&lt;br /&gt;
# [[Validating your HTML]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m4/ud10/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m4/ud10/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== Accessibility ==&lt;br /&gt;
&lt;br /&gt;
# [[Accessibility basics]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m5/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m5/ud1/index.html Spanish translation]&lt;br /&gt;
# [[Accessibility testing]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m5/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m5/ud2/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== CSS ==&lt;br /&gt;
&lt;br /&gt;
# [[CSS_basics|CSS basics]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud1/index.html Spanish translation]&lt;br /&gt;
# [[Advanced CSS selectors]]&lt;br /&gt;
# [[Inheritance and cascade]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud2/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud2/index.html Spanish translation]&lt;br /&gt;
# [[CSS text styling part 1]]&lt;br /&gt;
# [[The_CSS_layout_model_-_boxes_borders_margins_padding|The CSS layout model - boxes, borders, margins, padding]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud4/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud4/index.html Spanish translation]&lt;br /&gt;
# [[CSS background images]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud5/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud5/index.html Spanish translation]&lt;br /&gt;
# [[Styling_lists_and_links|Styling lists and links]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud6/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud6/index.html Spanish translation]&lt;br /&gt;
# [[Styling tables]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud7/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud7/index.html Spanish translation]&lt;br /&gt;
# [[Styling forms]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud8/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud8/index.html Spanish translation]&lt;br /&gt;
# [[Floats and clearing]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud9/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud9/index.html Spanish translation]&lt;br /&gt;
# [[CSS static and relative positioning]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud10/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud10/index.html Spanish translation]&lt;br /&gt;
# [[CSS absolute and fixed positioning]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m6/ud11/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m6/ud11/index.html | Spanish translation]&lt;br /&gt;
# [[Debugging CSS]]&lt;br /&gt;
# [[CSS shorthand reference]]&lt;br /&gt;
&lt;br /&gt;
== Advanced CSS study ==&lt;br /&gt;
&lt;br /&gt;
# [[Headers_footers_columns_and_templates|Headers, footers, columns, and templates]]&lt;br /&gt;
#* [http://mosaic.uoc.edu/ac/le/ca/m7/ud1/index.html Catalan translation] | [http://mosaic.uoc.edu/ac/le/es/m7/ud1/index.html Spanish translation]&lt;br /&gt;
&lt;br /&gt;
== JavaScript core skills ==&lt;br /&gt;
&lt;br /&gt;
# [[Programming_-_the_real_basics|Programming - the real basics!]]&lt;br /&gt;
# [[What can you do with JavaScript]]&lt;br /&gt;
# [[Your first look at JavaScript]]&lt;br /&gt;
# [[JavaScript best practices]]&lt;br /&gt;
# [[The principles of unobtrusive JavaScript]]&lt;br /&gt;
# [[JavaScript functions]]&lt;br /&gt;
# [[Objects in JavaScript]]&lt;br /&gt;
# [[Traversing the DOM]]&lt;br /&gt;
# [[Creating and modifying HTML]]&lt;br /&gt;
# [[Dynamic style - manipulating CSS with JavaScript]]&lt;br /&gt;
# [[Handling events with JavaScript]]&lt;br /&gt;
# [[JavaScript animation]]&lt;br /&gt;
# [[Graceful degredation versus progressive enhancement]]&lt;br /&gt;
&lt;br /&gt;
== Mobile web development ==&lt;br /&gt;
&lt;br /&gt;
# [[Introduction_to_mobile_web|Mobile 1: Introduction to mobile web]]&lt;br /&gt;
&lt;br /&gt;
== Supplementary articles ==&lt;br /&gt;
&lt;br /&gt;
* [[Getting your content online]]&lt;br /&gt;
* [[Common HTML entities used for typography]]&lt;br /&gt;
* [[The web standards curriculum glossary]]&lt;br /&gt;
&lt;br /&gt;
== Proposed Updates and Additions to Web Standards Curriculum ==&lt;br /&gt;
&lt;br /&gt;
* [[WSC_proposed_updates|Web standards curriculum on W3C Wiki: plan for updates 2011]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
[[Category:WSC]]&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
&lt;br /&gt;
* [[HTML]]&lt;br /&gt;
* [[CSS]]&lt;br /&gt;
&lt;br /&gt;
= Curriculum structures =&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact_Curriculum Overview of InterACT curriculum articles]&lt;br /&gt;
&lt;br /&gt;
== Basics and &amp;quot;soft&amp;quot; skills ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Internet_Fundamentals Internet Fundamentals]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Digital_Design_Production Digital Design Production]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Writing_for_the_Web Writing for the Web]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Project_Management Project Management]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Professional_Development Professional Development]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Independent_Study Independent Study]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Internship Internship]&lt;br /&gt;
&lt;br /&gt;
== Web design ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Web_Design_1 Web Design 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Web_Design_2 Web Design 2]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Accessibility Accessibility]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Usability_1 Usability 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Findability Findability]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Interaction_Design_1 Interaction Design 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Prototyping Prototyping]&lt;br /&gt;
&lt;br /&gt;
== Web development ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/DOM_Scripting_1 DOM Scripting 1]&lt;br /&gt;
* [http://www.w3.org/community/webed/wiki/Interact/Server-Side_Scripting_1 Server-side Scripting 1]&lt;br /&gt;
&lt;br /&gt;
= Teaching materials =&lt;br /&gt;
&lt;br /&gt;
Each page in this section includes teaching notes, examples, slidedecks and other materials for teachers to use for hands-on teaching of the curriculum structures outlined in the [[#Curriculum_structures|Curriculum structures]] section.&lt;br /&gt;
&lt;br /&gt;
* [[HTML Basics and Web Standards Concepts teaching materials]] (learning competency included in [http://www.w3.org/community/webed/wiki/Interact/Web_Design_1 Web Design 1])&lt;br /&gt;
&lt;br /&gt;
= Project activities =&lt;br /&gt;
&lt;br /&gt;
This section houses a record of all activities being undertaken in past, present or future by the Web Education Community Group, split into projects.&lt;br /&gt;
&lt;br /&gt;
IMPORTANT: Please don't pollute these pages with random stuff - if you just want to doodle or record random thoughts, put it in the [[ Ideas Playground ]].&lt;br /&gt;
&lt;br /&gt;
* [[Learning material]]&lt;br /&gt;
* [[Curriculum]]&lt;br /&gt;
* [[Outreach]]&lt;br /&gt;
* [[Training and certification]]&lt;br /&gt;
* [[Membership and policy]]&lt;br /&gt;
* International projects&lt;br /&gt;
** [[Croatian international project]]&lt;br /&gt;
** [[French international project]]&lt;br /&gt;
** [[Japanese international project]]&lt;br /&gt;
** [[fa/|Persian language international project]]&lt;br /&gt;
** [[Es/|Spanish international project]]&lt;br /&gt;
** [[Turkish international project]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Other available resources are as follows:&lt;br /&gt;
&lt;br /&gt;
* [[ WEST | Web Education Supplementary Toolkit ]]&lt;br /&gt;
* [[ Web Education community group style guide ]]&lt;/div&gt;</description>
			<pubDate>Mon, 14 May 2012 13:13:25 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/Talk:Main_Page</comments>		</item>
		<item>
			<title>File:Tr dl01.png</title>
			<link>http://www.w3.org/community/webed/wiki/File:Tr_dl01.png</link>
			<description>&lt;p&gt;Cmills:&amp;#32;uploaded a new version of &amp;quot;File:Tr dl01.png&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</description>
			<pubDate>Tue, 01 May 2012 10:59:47 GMT</pubDate>			<dc:creator>Cmills</dc:creator>			<comments>http://www.w3.org/community/webed/wiki/File_talk:Tr_dl01.png</comments>		</item>
	</channel>
</rss>