<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Learning the World &#187; CSS</title>
	<atom:link href="http://learningtheworld.eu/tag/css/feed/" rel="self" type="application/rss+xml" />
	<link>http://learningtheworld.eu</link>
	<description></description>
	<lastBuildDate>Tue, 06 Nov 2012 00:17:33 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.1</generator>
	<item>
		<title>More CSS Drop Shadows For All Browsers</title>
		<link>http://learningtheworld.eu/2010/ms-box-shadow/</link>
		<comments>http://learningtheworld.eu/2010/ms-box-shadow/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 16:00:18 +0000</pubDate>
		<dc:creator><![CDATA[Martin Kliehm]]></dc:creator>
				<category><![CDATA[web development]]></category>
		<category><![CDATA[web standards]]></category>
		<category><![CDATA[blur]]></category>
		<category><![CDATA[box-shadow]]></category>
		<category><![CDATA[buttons]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[drop shadow]]></category>
		<category><![CDATA[eye-candy]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[ie6]]></category>
		<category><![CDATA[IE7]]></category>
		<category><![CDATA[ie8]]></category>
		<category><![CDATA[jumping-through-loops]]></category>
		<category><![CDATA[pseudo 3d]]></category>
		<category><![CDATA[shadow]]></category>
		<category><![CDATA[visual effects]]></category>

		<guid isPermaLink="false">http://learningtheworld.eu/?p=1021</guid>
		<description><![CDATA[Thanks to the unstoppable advancements of web standards aiding mankind to overcome the real burdens of the 21st century, adding drop shadows  to boxes became much easier in recent years! No more PNG background images! Leaving the question aside whether drop shadows are really progressive and appropriate for a flat medium (anybody remember the fad of “3D” bulging buttons in the 1990ies?), I&#160;was confronted with the challenge of adding box shadows in Internet Explorer for a client project.&#160;[&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Thanks to the unstoppable advancements of web standards aiding mankind to overcome the real burdens of the 21st century, adding <strong>drop shadows</strong> to boxes became much easier in recent years! No more PNG background images! Leaving the question aside whether drop shadows are really progressive and appropriate for a flat medium (anybody remember the fad of &ldquo;3D&rdquo; <a href="http://www.handson.nu/">bulging buttons</a> in the 1990ies?), I&nbsp;was confronted with the challenge of adding box shadows in Internet Explorer for a client project.</p>

<p><strong>Pro tip:</strong> communicate to the client that shadows are a <strong>bonus feature</strong>. Your designers may disagree, but the site will not suffer considerably when special effects like box shadows, text shadows, or rounded corners are regarded as enhancements for decent browsers. However, your client&rsquo;s budget will suffer when they are determined to provide the same visual effects on outdated browsers such as <acronym title="Internet Explorer 6">IE6</acronym>. That said, here is the well-known method in <acronym title="Cascading Style Sheets, 3rd Edition">CSS3</acronym>:</p>

<ol class="code" title="CSS">
<li><code><strong>.wrapper</strong> {</code></li>
<li class="indent"><code>background-color: #fff;</code></li>
<li class="indent"><code>border: 1px solid #d30d01;</code></li>
<li class="indent"><code><em>box-shadow:</em> 4px 4px 4px rgba(0, 0, 0, 0.2);</code></li>
<li class="indent"><code>float: left;</code></li>
<li class="indent"><code>height: 75px;</code></li>
<li class="indent"><code>margin: 15px;</code></li>
<li class="indent"><code>padding: 10px;</code></li>
<li class="indent"><code>width: 75px;</code></li>
<li class="indent"><code><em>-moz-box-shadow:</em> 4px 4px 4px rgba(0, 0, 0, 0.2);</code></li>
<li class="indent"><code><em>-o-box-shadow:</em> 4px 4px 4px rgba(0, 0, 0, 0.2);</code></li>
<li class="indent"><code><em>-webkit-box-shadow:</em> 4px 4px 4px rgba(0, 0, 0, 0.2);</code></li>
<li><code>}</code></li>
</ol>

<ol class="code" title="HTML code">
<li><code>&lt;div class=&quot;<em>wrapper</em>&quot;&gt;</code></li>
<li class="indent"><code>&lt;p&gt;CSS box-shadow&lt;/p&gt;</code></li>
<li><code>&lt;/div&gt;</code></li>
</ol>

<p>At the same time when we rolled out the website, Robert Nyman came to the conclusion that the proprietary Microsoft <code>filter</code> for <a href="http://robertnyman.com/2010/03/16/drop-shadow-with-css-for-all-web-browsers/"><code>Shadow</code> looks much prettier than <code>DropShadow</code></a>, so I forgot about blogging myself as his solution doesn&rsquo;t rely on unsemantic markup and is more elegant:</p>

<ol class="code" title="CSS">
<li><code><strong>.wrapper</strong> {</code></li>
<li class="indent">/* For IE 8 */</li>
<li class="indent"><code><em>-ms-filter: progid:DXImageTransform.Microsoft.Shadow</em>( Strength=5, Direction=135, Color='#999999' );</code></li>
<li class="indent">/* For IE 5.5 &#8211; 7 */</li>
<li class="indent"><code><em>filter: progid:DXImageTransform.Microsoft.Shadow</em>( Strength=5, Direction=135, Color='#999999' );</code></li>
<li><code>}</code></li>
</ol>

<p>Note that you get slightly better effects when you choose a dark gray instead of black as shadow color. If you can live with the rendering of the third box below, don&rsquo;t read any further. <img src="http://learningtheworld.eu/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </p>

<p>However, applying the filter had the side effect that text inside the box wasn&rsquo;t anti-aliased in <acronym>IE</acronym> 6-8 anymore, and the shadow still didn&rsquo;t look decent enough. So we added an extra <code>span</code> and applied the <code>blur</code> filter on it.</p>

<p><img src="/wp-content/uploads/2010/08/screenshot-box-shadow.png" alt="Screenshot comparing the solutions for CSS drop shadows side by side" width="481" height="103" class="fullsize" /></p>

<p>That led to a more complex code as we needed an inner wrapper where the border and background is applied to, while the outer wrapper merely acted as a&nbsp;&hellip; wrapper, where the styles were reset to defaults. <acronym title="Hypertext Markup Language">HTML</acronym> first:</p>

<ol class="code" title="HTML code">
<li><code>&lt;div class=&quot;<em>wrapper ms-box-shadow</em>&quot;&gt;</code></li>
<li class="indent"><code><strong>&lt;div class=&quot;inner&quot;&gt;</strong></code></li>
<li class="indent double"><code>&lt;p&gt;<acronym>Internet Explorer</acronym> with blur filter&lt;/p&gt;</code></li>
<li class="indent"><code><strong>&lt;/div&gt;</strong></code></li>
<li class="indent"><code><strong>&lt;span class=&quot;shadow&quot;&gt;&lt;/span&gt;</strong></code></li>
<li><code>&lt;/div&gt;</code></li>
</ol>

<p>And here&rsquo;s the <acronym>CSS</acronym> that&rsquo;s added with Conditional Comments for <acronym>IE</acronym> 6-8 only (as <acronym>IE9</acronym> supports native <acronym>CSS</acronym> <code>box-shadow</code>, <a href="http://caniuse.com/#feat=css-boxshadow">more or less</a>). The shadow element is absolutely positioned, set behind the inner content and blown up to 100%. Not original, but it works:</p>

<ol class="code" title="CSS">
<li><code><strong>.wrapper, .inner</strong> {</code></li>
<li class="indent"><code>background-color: #fff;</code></li>
<li class="indent"><code>border: 1px solid #d30d01;</code></li>
<li class="indent"><code>height: 75px;</code></li>
<li class="indent"><code>padding: 10px;</code></li>
<li class="indent"><code><em>position: relative;</em></code></li>
<li class="indent"><code>width: 75px;</code></li>
<li><code>}</code></li>
<li><code><strong>.wrapper</strong> {</code></li>
<li class="indent"><code>float: left;</code></li>
<li class="indent"><code>margin: 15px;</code></li>
<li><code>}</code></li>
<li>/* reset wrapper styles to defaults; work-around for screwed box-model */</li>
<li><code><strong>.ms-box-shadow</strong> {</code></li>
<li class="indent"><code>background-color: transparent;</code></li>
<li class="indent"><code>border: 0 none;</code></li>
<li class="indent"><code>height: 95px;</code></li>
<li class="indent"><code>padding: 0;</code></li>
<li class="indent"><code>width: 95px;</code></li>
<li><code>}</code></li>
<li>/* Move the inner wrapper to the foreground */</li>
<li><code><strong>.inner</strong> {</code></li>
<li class="indent"><code><em>z-index: 50;</em></code></li>
<li><code>}</code></li>
<li>/* The shadow element */</li>
<li><code><strong>.shadow</strong> {</code></li>
<li class="indent"><code>background-color: #000;</code></li>
<li class="indent"><code>display: block;</code></li>
<li class="indent"><code><em>filter: progid:DXImageTransform.Microsoft.Blur</em>( makeShadow='true', pixelRadius=4, shadowOpacity=0.30 );</code></li>
<li class="indent"><code>height: 100%;</code></li>
<li class="indent"><code>left: 0;</code></li>
<li class="indent"><code><em>position: absolute;</em></code></li>
<li class="indent"><code>top: 0;</code></li>
<li class="indent"><code>width: 100%;</code></li>
<li class="indent"><code><em>z-index: 0;</em></code></li>
<li><code>}</code></li>
</ol>

<p>For some reason I got a more similar result with the <code>shadowOpacity</code> set to 30% instead of 20%.</p>

<h3>Where&rsquo;s the crux?</h3>

<p>If we are willing to ignore lots of bloated <acronym>CSS</acronym>: <strong><acronym>IE6</acronym> only blows the shadow up to 100% when the wrapper has a fixed height</strong>. This sucks, but unless you want to add more bloated code in JavaScript I don&rsquo;t know of any solution for this problem. Still <acronym>IE</acronym> 7-8 handle a value of 100% right, and there are many cases where the height is known. Take for example photos where you&#8217;d like to apply shadows, some buttons, or horizontal shades lying above images, like the <a href="http://dekabank.de/db/en/company/social-responsibility/">shadow of the second level navigation on this site</a>. Beautiful, isn&rsquo;t it?</p>
]]></content:encoded>
			<wfw:commentRss>http://learningtheworld.eu/2010/ms-box-shadow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Please Provide Padding</title>
		<link>http://learningtheworld.eu/2009/please-provide-padding/</link>
		<comments>http://learningtheworld.eu/2009/please-provide-padding/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 18:00:09 +0000</pubDate>
		<dc:creator><![CDATA[Martin Kliehm]]></dc:creator>
				<category><![CDATA[accessibility]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[bahn.de]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Deutsche Bahn]]></category>
		<category><![CDATA[Fitt's Law]]></category>
		<category><![CDATA[padding]]></category>
		<category><![CDATA[relaunch]]></category>
		<category><![CDATA[website]]></category>

		<guid isPermaLink="false">http://learningtheworld.eu/?p=490</guid>
		<description><![CDATA[There are other websites were you can buy train tickets, but if you live in Germany it's most likely that you will book a ticket on the website of <strong lang="de" xml:lang="de">Deutsche Bahn</strong> (German railways). Much has been said about accessibility on that site, and sure there's room for improvements in future updates. But some things just work well&#160;[&#8230;]]]></description>
				<content:encoded><![CDATA[<p>There are other websites were you can buy train tickets, but if you live in Germany it&#8217;s most likely that you will book a ticket on the website of <strong lang="de" xml:lang="de"><a href="http://bahn.de">Deutsche Bahn</a></strong> (German railways). Much has been said about accessibility on that site, and sure there&#8217;s room for improvements in future updates. But some things just work well:</p>

<p>I was responsible for most of the programming beneath the navigation bar on the home page, and every time when I book a ticket there&#8217;s a small feature I enjoy so much I want to tell you about it: <strong>the buttons on the date selector</strong> are really, really tiny (16&nbsp;&times; 8px). As you know thanks to <a href="/2007/usability-analysis/">Fitt&lsquo;s Law</a>, there are even formulas to calculate how much better <em>big</em> buttons can be hit.</p>

<p><strong>So I just added some padding.</strong> And that makes a huge difference: try to click on the same buttons later on in the booking process where the padding is missing.</p>

<p><img src="/wp-content/uploads/2009/04/screenshot-bahn-datepicker-300x214.jpg" alt="Screenshot of the padding on datepicker buttons" width="300" height="214" class="book" /></p>

<p>If I could make one improvement I would add <strong>keyboard functionality</strong> to those buttons. Alas as the datepicker itself came from a third party, the assembled code was beyond my control. But I know that the <a href="http://vimeo.com/4153807"><span lang="de" xml:lang="de">Deutsche Bahn</span> is listening</a> to the needs of people with disabilities and their disability advisory board members are highly competent, so I trust these and other issues will be fixed soon&nbsp;&hellip;</p>
]]></content:encoded>
			<wfw:commentRss>http://learningtheworld.eu/2009/please-provide-padding/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Accessible Drop-Down Menus</title>
		<link>http://learningtheworld.eu/2008/accessible-drop-down-menus/</link>
		<comments>http://learningtheworld.eu/2008/accessible-drop-down-menus/#comments</comments>
		<pubDate>Mon, 11 Aug 2008 08:00:09 +0000</pubDate>
		<dc:creator><![CDATA[Martin Kliehm]]></dc:creator>
				<category><![CDATA[accessibility]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[ageing]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[aria]]></category>
		<category><![CDATA[arrow keys]]></category>
		<category><![CDATA[assistive technologies]]></category>
		<category><![CDATA[AT]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[blur]]></category>
		<category><![CDATA[buffer]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[DHTML]]></category>
		<category><![CDATA[drop-down]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[event delegation]]></category>
		<category><![CDATA[fly-out]]></category>
		<category><![CDATA[focus]]></category>
		<category><![CDATA[Hick's Law]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[image replacement]]></category>
		<category><![CDATA[internationalization]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[keyboard access]]></category>
		<category><![CDATA[menu]]></category>
		<category><![CDATA[menulist]]></category>
		<category><![CDATA[multi-level menus]]></category>
		<category><![CDATA[navigation]]></category>
		<category><![CDATA[pull-down]]></category>
		<category><![CDATA[role]]></category>
		<category><![CDATA[scalability]]></category>
		<category><![CDATA[screen reader]]></category>
		<category><![CDATA[screenreader]]></category>
		<category><![CDATA[sIFR]]></category>
		<category><![CDATA[tab order]]></category>
		<category><![CDATA[text resize]]></category>
		<category><![CDATA[WCAG]]></category>
		<category><![CDATA[web 2.0]]></category>

		<guid isPermaLink="false">http://learningtheworld.eu/?p=171</guid>
		<description><![CDATA[A few days ago a co-worker asked if <strong><acronym title="Dynamic HTML">DHTML</acronym> drop-down menus pose a problem with accessibility</strong>. Since the Web Content Accessibility Guidelines 1.0 (<acronym>WCAG</acronym>) declared all JavaScript <em>evil</em> in 1999, assistive technologies (<acronym>AT</acronym>) have made significant progress. So we cannot condemn pull-down menus altogether, but there are various reasons to keep an eye on them buggers.&#160;[&#8230;]]]></description>
				<content:encoded><![CDATA[<p>A few days ago a co-worker asked if <strong><acronym title="Dynamic HTML">DHTML</acronym> drop-down menus pose a problem with accessibility</strong>. Since the Web Content Accessibility Guidelines 1.0 (<acronym>WCAG</acronym>) declared all JavaScript <em>evil</em> in 1999, assistive technologies (<acronym>AT</acronym>) have made significant progress. So we cannot condemn pull-down menus altogether, but there are various reasons to keep an eye on them buggers:</p>

<ol>
<li id="ageing"><p><strong>Older people</strong> have difficulties with drop-down and <a href="http://www.w3.org/TR/wai-age-literature/">multi-level menus</a>, because their manual dexterity, eye-hand coordination and space perception decreases. Also some move the mouse when clicking, or tremble, hence it&#8217;s more likely they slip off the menu. Hell, that happens to <em>me</em> frequently!</p>
<p>However, did you notice the Windows Start Menu is more forgiving when you slip off an item? There&#8217;s a little delay before the secondary level is hidden. Perhaps we need an event-capturing script tolerating a slip from the menu rather than the immediate reaction of the <code>mouseout</code> event.</p></li>
<li id="hicks-law"><p>Nested menus are <strong>more complex</strong>. According to <a href="http://en.wikipedia.org/wiki/Hick%27s_law">Hick&#8217;s Law</a> orientation in a multi-level menu can take longer than multiple clicks in a flat menu with good information architecture. See an <a href="http://learningtheworld.eu/2007/usability-analysis/#hicks-law">earlier article</a> for the math.</p></li>
<li id="keyboard-access"><p>The navigation must be <strong>accessible by keyboard alone</strong>. The result should be the same, whether you hover over an item or tab to it. So check for the <code>focus</code> event and <acronym title="Cascading Style Sheets">CSS</acronym> pseudo-class. Don&#8217;t forget to test backwards tabbing (<kbd>shift tab</kbd>). By the way, mobile devices have no mouse either&hellip;</p>
<p>The <strong>tab order</strong> should be consistent and logical, <abbr>i.e.</abbr> not jumping around on a page. Also the focused item should be visible, for example highlighted with the default 1px dotted border some browsers draw around it. Some people think this is ugly and remove the default border. That is a no-no.</p>
<p>And if you <em>really</em> want desktop behavior, add support for the <strong>arrow keys</strong> (<code>event.keyCode</code> 37-40). Keep in mind though that screen readers have predefined functions for the arrow keys in combination with the <kbd>ctrl</kbd>, <kbd>shift</kbd>, or <kbd>alt</kbd> keys. In JavaScript those keys can be detected with the <code>event.ctrlKey</code>, <code>event.altKey</code>, and <code>event.shiftKey</code> properties. Also <strong>crossbrowser event delegation</strong> for <code>focus</code> or <code>blur</code> events can be a bitch, thankfully <a href="http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html"><acronym title="Peter-Paul Koch">PPK</acronym> has a solution</a>.</p></li>
<li id="skip-content"><p>Users of <acronym>AT</acronym> should have means to <strong>skip content</strong>. That&#8217;s possible with semantic markup: a menu as (nested) list(s) enables them to jump to the next block. Also there should be <em>a few</em> skip links at the beginning of the code pointing to important sections on the page, such as content, navigation, or search. Mobile users also profit from that technique (try surfing eBay with Opera Mini <img src="http://learningtheworld.eu/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" />  ).</p></li>
<li id="links"><p><strong>Pages never link to themselves.</strong> When I click on a link (the menu being no exception) I expect to land on a <em>different</em> page. Therefore it&#8217;s confusing to land on the same page. This happened to me recently when I was filling out a form on my mobile phone and got the same page with an error message. It took me a while to realize where I was. It&#8217;s the same whether you have a tiny screen or a low screen resolution to see things larger when you are visually impaired: you only see a small part of the page, so it&#8217;s hard to realize when something unexpected happens.</p></li>
<li id="aria"><p>You can add some semantic sugar with the <strong><acronym title="Accessible Rich Internet Applications">ARIA</acronym> <code>role</code></strong> property. In this case <code>&lt;ul role=&quot;navigation&quot;&gt;</code> would be appropriate. I strongly encourage you to use <acronym>ARIA</acronym> as it is widely supported by browsers and screen readers, enhances a disabled user&#8217;s experience, and doesn&#8217;t break old browsers. A most <a href="http://dev.opera.com/articles/view/introduction-to-wai-aria/">recent introduction</a> has been written by Gez Lemon for the Opera Developer Community.</p></li>
<li id="buffer"><p>If a second level navigation is initially hidden with <code>display:none</code> it won&#8217;t be in the <strong>screen reader buffer</strong>. Therefore off-screen positioning is a better idea, else you need to <a href="http://juicystudio.com/article/improving-ajax-applications-for-jaws-users.php">update the buffer</a> by writing random values into a hidden <code>input</code> field.</p></li>
<li id="scaling"><p>A common problem in menus is <strong>limited horizontal space</strong>. Text should be scalable, and it must not jut-out into other page elements when it is <strong>enlarged</strong>. Even normal text can break a narrow menu when you think of internationalization. In German there are many composite words. While building a website for a competing brand I came across a menu item on the Philips website for &ldquo;male grooming.&rdquo; The German word &bdquo;<span xml:lang="de" lang="de">Körperhaarpflegesystem</span>&rdquo; is guaranteed to blow every menu! <img src="http://learningtheworld.eu/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /> </p>
<p>Another common problem that prevents scaling in menus are <strong>text graphics</strong>. I know marketing just <em>loves</em> to see the corporate font in the main menu, but text in images can&#8217;t be scaled, people with visual impairments can&#8217;t change text and background colors for higher contrast, and <strong>Flash Image Replacement</strong> like sIFR still has <a href="http://virtuelvis.com/archives/2005/04/i-hate-sifr">accessibility issues</a>, is known to <a href="http://www.456bereastreet.com/archive/200712/choose_an_accessible_image_replacement_method/#comment26">distort fonts</a>, is <a href="http://www.mezzoblue.com/archives/2004/10/26/sifr/">CPU intensive and slow</a>. The bottom line is: don&#8217;t use text as images, make textual information text.</p></li>
</ol>

<p id="technical-issues">So much for accessibility. Besides there are a few <strong>technical issues</strong> to consider: mobile devices often have problems with JavaScript or with layers. Some proxies in large companies <a href="http://www.robertnyman.com/2006/04/25/an-important-lesson-learned-about-ajax-and-accessibility/">filter JavaScript</a> for security reasons, so you can&#8217;t rely on the ubiquitous availability, your script has to be unobtrusive, and you can&#8217;t rely on <code>noscript</code> either. Don&#8217;t even think of creating a menu from JavaScript arrays.</p>

<p>Moreover there&#8217;s a well-known bug in <acronym title="Internet Explorer">IE</acronym>6 responsible for showing <code>select</code> lists always in front of any layers (like your second level menu), regardless of a <code>z-index</code>. Thankfully there are plugins like <a href="http://brandonaaron.net/docs/bgiframe/">bgiframe</a> for jQuery to solve this. Multi-level menus can bloat the code, event handling can be CPU intensive (use <a href="http://icant.co.uk/sandbox/eventdelegation/">event delegation</a>). And if large amounts of menu code is at the beginning, the real content gets further behind and less relevant for search engines.</p>

<p>In <strong>conclusion</strong>, for an alleged quicker entry you pay with many disadvantages. Often drop-down menus just conceal a poorly planned information architecture. I would reconsider their usage.</p>

<p>Did I forget something? What&#8217;s your opinion on drop-down menus? Love them or hate them?</p>
]]></content:encoded>
			<wfw:commentRss>http://learningtheworld.eu/2008/accessible-drop-down-menus/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Better Foreground Sprites</title>
		<link>http://learningtheworld.eu/2008/better-foreground-sprites/</link>
		<comments>http://learningtheworld.eu/2008/better-foreground-sprites/#comments</comments>
		<pubDate>Thu, 26 Jun 2008 18:00:17 +0000</pubDate>
		<dc:creator><![CDATA[Martin Kliehm]]></dc:creator>
				<category><![CDATA[accessibility]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[downloads]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[background-image]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[css sprites]]></category>
		<category><![CDATA[foreground sprites]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[http-request]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[T.V. Raman]]></category>

		<guid isPermaLink="false">http://learningtheworld.eu/?p=106</guid>
		<description><![CDATA[A while ago I wrote about using <acronym title="Cascading Style Sheets">CSS</acronym> Sprites in <code>img</code> tags&#160;&#8212; <strong>Foreground Sprites</strong>. Thus you avoid HTTP requests, but the page turns really ugly when <acronym>CSS</acronym> is switched off because the sprite image will be displayed in its full size. Now Google&#8217;s accessibility specialist T.V. Raman explained their idea of using sprites for foreground images&#160;&#8212; a much better solution!]]></description>
				<content:encoded><![CDATA[<p>A while ago I wrote about using <a href="http://www.alistapart.com/articles/sprites/"><acronym title="Cascading Style Sheets">CSS</acronym> Sprites</a> in <code>img</code> tags, calling it <strong><a href="/2007/foreground-sprites/">Foreground Sprites</a></strong>. Thus you avoid performance-eating HTTP requests, but the page turns really ugly when <acronym>CSS</acronym> is switched off because the sprite image will be displayed in its full size. <img src="http://learningtheworld.eu/wp-includes/images/smilies/icon_sad.gif" alt=":(" class="wp-smiley" /> </p>

<p>What are the alternatives? Using background-images with off-screen text? Bad code:</p>

<ol class="code bad" title="HTML">
<li><code>&lt;a href=&quot;foo&quot; class=&quot;button&quot;&gt;</code></li>
<li class="indent"><code>&lt;span&gt;Alternative Text&lt;/span&gt;</code></li>
<li><code>&lt;/a&gt;</code></li>
</ol>

<ol class="code bad" title="CSS">
<li><code>a.button, button {</code></li>
<li class="indent"><code>background: url(foo.gif) 0 &minus;26px no-repeat;</code></li>
<li class="indent">display: block;</li>
<li class="indent">height: 52px;</li>
<li class="indent">overflow: hidden;</li>
<li class="indent">position: relative;</li>
<li class="indent">width: 150px;</li>
<li><code>}</code></li>
<li><code>span {</code></li>
<li class="indent"><code>left: &minus;9999px;</code></li>
<li class="indent"><code>position: absolute;</code></li>
<li class="indent"><code>top: auto;</code></li>
<li><code>}</code></li>
</ol>

<p><strong>That&rsquo;s a bad idea with accessibility issues.</strong> Screen readers will be able to read the text, but if somebody with low vision has high-contrast custom stylesheets, it is likely that the <code>background-image</code> won&rsquo;t be displayed. Still the alternative text will be invisible off-screen, so the link or <code>button</code> becomes unusable.</p>

<h3>A better solution</h3>

<p>Now Google&rsquo;s accessibility specialist <strong>T.V. Raman</strong> explained their idea for <a href="http://googlewebmastercentral.blogspot.com/2008/05/design-patterns-for-accessible.html">replacing  images with sprites</a>. Here are screenshots of Google search results with images, and with background images disabled:</p>

<p><img src="/wp-content/uploads/2008/06/screenshot-google-search-result-with-bgimage.png" width="400" height="84" alt="Screenshot displaying the Google logo" class="screenshot" />
<img src="/wp-content/uploads/2008/06/screenshot-google-search-result-wo-bgimage.png" width="400" height="84" alt="Screenshot with text visible instead of the logo" class="screenshot" /></p>

<p>Google puts the alternative text <strong><em>behind</em> the background image</strong> simply by attaching it on the <code>span</code> element, not the anchor. So when <acronym>CSS</acronym> or background images are turned off, the text just reappears.</p>

<ol class="code" title="XHTML">
<li><code>&lt;a id=&quot;logo&quot; title=&quot;Go to Google Home&quot; href=&quot;http://www.google.com/&quot;&gt;</code></li>
<li class="indent">Google</li>
<li class="indent"><code><strong>&lt;span&gt;<ins datetime="20080627T174700">&lt;/span&gt;</ins></strong></code></li>
<li><code>&lt;/a&gt;</code></li>
</ol>

<ol class="code" title="CSS">
<li><code>#logo {</code></li>
<li class="indent">display: block;</li>
<li class="indent">height: 52px;</li>
<li class="indent">overflow: hidden;</li>
<li class="indent">position: relative;</li>
<li class="indent">width: 150px;</li>
<li><code>}</code></li>
<li><code>#logo span {</code></li>
<li class="indent"><code>background: url(foo.gif) 0 &minus;26px no-repeat;</code></li>
<li class="indent"><code>height: 100%;</code></li>
<li class="indent"><code>left: 0;</code></li>
<li class="indent">position: absolute;</li>
<li class="indent">top: 0;</li>
<li class="indent"><code>width: 100%;</code></li>
<li><code>}</code></li>
</ol>

<p>There&rsquo;s only an issue if you have <em>a lot</em> of alternative text, perhaps combined with text zoom, so that it doesn&rsquo;t fit in the reserved space. But I can live with that.</p>

<p>Congratulations to Google for this ellegant solution, and it&rsquo;s <em>so</em> simple! Why didn&rsquo;t <em>I</em> think of it? <img src="http://learningtheworld.eu/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </p>
]]></content:encoded>
			<wfw:commentRss>http://learningtheworld.eu/2008/better-foreground-sprites/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>@media 2008</title>
		<link>http://learningtheworld.eu/2008/atmedia-2008/</link>
		<comments>http://learningtheworld.eu/2008/atmedia-2008/#comments</comments>
		<pubDate>Wed, 25 Jun 2008 20:00:18 +0000</pubDate>
		<dc:creator><![CDATA[Martin Kliehm]]></dc:creator>
				<category><![CDATA[accessibility]]></category>
		<category><![CDATA[conferences]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[W3C]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[web standards]]></category>
		<category><![CDATA[AMEE]]></category>
		<category><![CDATA[Andy Clarke]]></category>
		<category><![CDATA[atmedia]]></category>
		<category><![CDATA[atmedia2008]]></category>
		<category><![CDATA[BBC]]></category>
		<category><![CDATA[book:ean=9780596529307]]></category>
		<category><![CDATA[book:isbn=0596529309]]></category>
		<category><![CDATA[book:isbn=0975240293]]></category>
		<category><![CDATA[carbon footprint]]></category>
		<category><![CDATA[comics]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Dan Rubin]]></category>
		<category><![CDATA[Edenbee]]></category>
		<category><![CDATA[Frontend Engineering]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[James Graham]]></category>
		<category><![CDATA[jaws]]></category>
		<category><![CDATA[John Resig]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[Lachlan Hunt]]></category>
		<category><![CDATA[london]]></category>
		<category><![CDATA[Nate Koechley]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[Rich Schwerdtfeger]]></category>
		<category><![CDATA[Richard Schwerdtfeger]]></category>
		<category><![CDATA[upcoming:event=318308]]></category>
		<category><![CDATA[yahoo]]></category>

		<guid isPermaLink="false">http://learningtheworld.eu/?p=105</guid>
		<description><![CDATA[I had the chance to visit the <strong>@media conference in London</strong> again, for the third time. Again it was different than the last times. Perhaps less spectacular, a little less people, no real revelation. There were excellent talks inside the halls, but the best talks happened outside. Like speaking with Nate Koechley about&#160;[&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/martin-kliehm/2560737021/in/set-72157605494499216/"><img src="/wp-content/uploads/2008/06/panel" width="210" height="158" alt="@media Hot Topics Panel" class="floatleft" /></a> I had the chance to visit the <strong>@media conference in London</strong> again, for the third time. Again it was different than the last times. Perhaps less spectacular, a little less people, no real revelation. There were excellent talks inside the halls, but the best talks happened outside. Like speaking with <strong><a href="http://nate.koechley.com">Nate Koechley</a></strong> about accessible <a href="/2008/captioning-youtube-with-dfxp/">video captioning</a> with a <acronym title="World Wide Web Consortium">W3C</acronym> <acronym title="Extensible Markup Language">XML</acronym> standard that exists for exactly that purpose. There are video tutorials on the Yahoo! Developer Network that would be great test objects. Imagine the impact crowdsourced captioning for video content on flickr or YouTube could have on accessibility! Or I learned from <strong>David Storey</strong> that Opera is working on a curriculum together with the Web Standards Project. Interesting because there have been <a href="http://www.idcnet.info">similar approaches</a> financed by the European Commission, and it would be good to get them talk to each other. Meeting <strong>Steve Faulkner</strong> whose <a href="http://www.paciellogroup.com/resources/wat-ie-about.html">Accessibility Toolbar</a> I helped translating into German. Or just speaking with Antonia Hyde, Christian Heilmann, Fabio Carriere, Henny Swan, <a href="http://www.accessify.com">Ian Lloyd</a>, Lachlan Hunt, Patrick H. Lauke, Richard Ishida, and a few others about standards, accessibility, and internationalization. I admit it. I&rsquo;m a geek, I can&rsquo;t smalltalk.</p>

<p><a href="http://www.flickr.com/photos/martin-kliehm/2560723617/in/set-72157605494499216/"><img src="/wp-content/uploads/2008/06/ian-lloyd" width="210" height="158" alt="dir=rtl: Ian Lloyd, David Storey, Lachlan Hunt" class="floatleft" /></a> I started my conference program with a <strong>case study by the <acronym>BBC</acronym></strong>. They did a redesign and managed to squeeze formerly 60 images into 3 sliding doors and sprites. Their home page is now under 300<abbr title="Kilobyte">K</abbr> and 30 <acronym>HTTP</acronym> requests. Nice to see <a href="/2007/performance-2/">Yahoo&rsquo;s Exceptional Performance</a> guidelines go mainstream. About 5% of their users access the site without JavaScript. They don&rsquo;t get identical features, but they get identical care. For them accessibility isn&rsquo;t a buzzword, it&rsquo;s become a natural part of their daily work. So they were able to find out that <code>blur()</code> is not a friend with JAWS. Also the <acronym>BBC</acronym> plays well with the other kids: they joined the OpenID foundation, and with <a href="http://backstage.bbc.co.uk"><acronym>BBC</acronym> backstage</a> they open their content through an <acronym>API</acronym>. Another charming idea is their <strong>public beta</strong> where people can testdrive new features. About 60% have personalized their home page, although one of the speakers described the personalization features with &ldquo;my mom&rsquo;s head exploded.&rdquo; They used agile development with 2 week sprints, run the website in 12 languages, but don&rsquo;t have a <acronym title="Content Distribution Network">CDN</acronym> yet because of the license fees.</p>

<p>Another case study about the <acronym title="Lifestyle of Health and Sustainability">LOHAS</acronym> community <strong>Edenbee</strong> wasn&rsquo;t <em>that</em> exiting, mostly because I knew the platform <a href="http://edenbee.com/users/martin/">since beta</a> and didn&rsquo;t get quite why I should speak with other people about changing their lightbulbs. But it&rsquo;s nice to keep track of your carbon footprint, a feature that uses the <a href="http://www.amee.cc">AMEE</a> open <acronym>API</acronym>.</p>

<p>I was curious about <strong><a href="http://www.w3.org/html/wg/html5/"><acronym title="Hypertext Markup Language">HTML</acronym>&nbsp;5</a></strong>, so I went to the presentation of Lachlan Hunt and James Graham. Still I don&rsquo;t see any advantage of having a bunch of new elements that are incompatible with older browsers when I can achieve the same with <acronym title="Accessible Rich Internet Applications">ARIA</acronym> attributes. But I understand the rationale behind some of their decisions, although that doesn&rsquo;t mean I come to the same conclusions.</p>

<p>For example people use a lot of &ldquo;nav&rdquo; and &ldquo;menu&rdquo; classes. To make their live easier, the <acronym>WHATWG</acronym> came up with the idea to create a <code>nav</code> element. A block level element, so you wouldn&rsquo;t have to use those <code>&lt;div class=&quot;nav&quot;&gt;</code> any more. But every time I use something like <code>class=&quot;navigation&quot;</code> it will be an unordered list! I don&rsquo;t need another <code>div</code>, I&rsquo;m perfectly happy with my <code>ul</code> and <code>role=&quot;navigation&quot;</code>. It&rsquo;s truly backward compatible, it&rsquo;s semantic, I can use it today, and there isn&rsquo;t a steep learning curve.</p>

<p><a href="http://www.flickr.com/photos/martin-kliehm/2561565004/in/set-72157605494499216/"><img src="/wp-content/uploads/2008/06/comic-panel" width="210" height="153" alt="Concrete Comic Panel" class="floatleft" /></a><a href="http://www.flickr.com/photos/martin-kliehm/2560740717/in/set-72157605494499216/"><img src="/wp-content/uploads/2008/06/andy-clarke" width="210" height="171" alt="Andy Clarke&rsquo;s design" class="floatleft clear" /></a> Then I went to two <strong>design talks by Andy Clarke and Dan Rubin</strong>, and though their designs were beautiful, the code examples were not. Imagine the flexibility of a newspaper article and compare that with the inflexibility of absolutely positioned paragraphs with fixed heights. Exactly. Apart from that Andy&rsquo;s main inspiration came from comic books. It never hurts to throw in some colorful images.</p>

<p>Like in comic books, usability is not about <em>getting</em> from A to B, it&rsquo;s about the <em>experience</em> of getting from A to B. In comic books the size of a panel and the amount of text strongly influences the reading speed. So you can emphasize content and add dynamics in your web design. That doesn&rsquo;t mean necessarily that everything has to be in boxes. Emphasis can also be added by <em>removing</em> the boxes.</p>

<p><strong>Dan Rubin</strong> used a lot of effects on his designs, like a noise filter to add texture on monochrome surfaces. Nice idea, though that implies the designer explaining the rationale of such a feature to the front-end engineers. They would either ignore it because they overlooked the subtle texture or because they assumed it would be just noise. Some less intrusive hint I will readily adopt was using a letter-spacing of &minus;1 on headlines to prevent tiny rivers between letters. <img src="http://learningtheworld.eu/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </p>

<p>What slightly worries me is that Dan talked about re-using patterns for some effects in Photoshop. Re-using patterns is the same in <acronym title="Cascading Style Sheets">CSS</acronym>, but re-usable effects in Photoshop can mean an <em>un</em>usable amount of work in <acronym>CSS</acronym> and lots of pictures making the website slow. What I miss so far is a common understanding of effects and patterns that are both easy to work with in Photoshop <em>and</em> in frontend programming.</p>

<p><a href="http://www.flickr.com/photos/martin-kliehm/2611269470/in/set-72157605494499216/"><img src="/wp-content/uploads/2008/06/koechley-slide-frontend-knowledge-areas-thumb" width="210" height="158" alt="Slide: Knowledge Areas of Frontend Engineering" class="floatleft" /></a> The next day started with <strong>Nate Koechley&rsquo;s</strong> keynote about <strong><a href="http://nate.koechley.com/blog/2008/06/11/slides-professional-frontend-engineering/">professional frontend engineering</a></strong>. He chose the topic because he thinks this is critical to the advancement of the Internet, and I couldn&rsquo;t agree more. As Frontend Engineers we write <em>software</em> with <acronym title="Extensible Hypertext Markup Language">XHTML</acronym>, <acronym title="Cascading Style Sheets">CSS</acronym>, JavaScript, and quite some amount of <acronym>PHP</acronym>. Douglas Crockford calls this &ldquo;<cite>the most hostile software development environment imaginable</cite>,&rdquo; and if you take a look at this graphic from Nate&rsquo;s slides you will understand why. There are a number of knowledge areas that can be applied in a number of ways on three operating systems and half a dozen browsers in two rendering modes. If you ever wondered why you sometimes see little clouds of smoke coming out of your frontend engineering heads, that&rsquo;s why.</p>

<p>There are four <strong>guiding principles</strong>:</p>

<ol><li>Availability and accessibility for all users worldwide</li>
<li>Openness: share, learn, support, advocate</li>
<li>Richness: provide, but not too much</li>
<li>Stability</li></ol>

<p>Then there are three <strong>core techniques</strong>: <a href="http://developer.yahoo.com/yui/articles/gbs/">Graded Browser Support</a>, <a href="http://domscripting.com/blog/display/41">Progressive Enhancement</a>, and <a href="http://www.onlinetools.org/articles/unobtrusivejavascript/">Unobtrusive JavaScript</a>.If you haven&rsquo;t heard about those concepts, please read about them now.</p>

<p>At that point the presentation turned into giving advice for quite a number of best practices and tips, like using <a href="http://www.jslint.com">JSLint</a>, <a href="http://developer.yahoo.com/yui/yuitest/"><acronym title="Yahoo! User Interface Library">YUI</acronym> Unit Testing</a>, or <a href="http://developer.yahoo.com/yui/profiler/"><acronym>YUI</acronym> Profiler</a> to enhance the quality of your code. Or serving <strong>cacheable assets from cookie-free domains</strong>. Or <strong>anticipated preloads</strong>: sneak in your new JavaScript and <acronym>CSS</acronym> files a week <em>before</em> the relaunch. <img src="http://learningtheworld.eu/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" />  Or did you know that the <strong>iPhone</strong> 2G can keep only 19 assets in <strong>cache</strong>, and that it doesn&rsquo;t cache anything larger than 25K? Uncompressed 25K? Needless to say, Nate&rsquo;s presentation was one of the conference highlights.</p>

<p><a href="http://www.flickr.com/photos/martin-kliehm/2560732727/in/set-72157605494499216/"><img src="/wp-content/uploads/2008/06/john-resig" width="210" height="158" alt="John Resig" class="floatleft" /></a> Later I heard a few things about building applications with existing frameworks and <acronym title="Application Programming Interface">API</acronym>s, a timely comparison between <strong>JavaScript libraries</strong> held by no other than <strong><a href="http://jquery.com">jQuery</a>&rsquo;s John Resig</strong>, some tips on <strong>internationalization</strong> by <strong>Richard Ishida</strong>, and a panel about <strong>accessibility</strong>. The one sentence that stuck most in that panel was: &ldquo;Don&rsquo;t be the guy with the problems, be the guy with the solutions.&rdquo; In fact it&rsquo;s very hard to be passionate about your job while being pragmatic and providing solutions instead of just saying &ldquo;no.&rdquo; Something <a href="http://www.ibm.com/developerworks/blogs/page/schwer?entry=cynthia_ice_remembered">Richard Schwerdtfeger</a> wrote about in a different context:</p>

<blockquote cite="http://www.ibm.com/developerworks/blogs/page/schwer?entry=cynthia_ice_remembered"><p>Working in the accessibility field is extremely difficult. It requires very specialized skills&nbsp;&mdash; including incredible persistence. Accessibility is often viewed as additional work that is not always planned for. It requires a person who is tough, committed, patient, and caring to deliver an accessible solution that is usable to our customers. To do this you must have tremendous passion for your job as there is always someone or something to trip you up.</p></blockquote>

<p>Combining passion and diplomacy is a goal many web evangelists still have to work on&hellip; In the meantime remember that accessibility is most likely to have a sustainable impact when it is <a href="http://www.usbln.org/pdf/CRGAccessibilityStudy_v1%206.pdf" type="application/pdf">supported by senior management</a>, when there is an accessibility policy for a company, and when smart companies realize that <a href="/2007/accessibility-cost-effectiveness/">there is money to be made</a> by maximizing the target audience.</p>
]]></content:encoded>
			<wfw:commentRss>http://learningtheworld.eu/2008/atmedia-2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Foreground Sprites</title>
		<link>http://learningtheworld.eu/2007/foreground-sprites/</link>
		<comments>http://learningtheworld.eu/2007/foreground-sprites/#comments</comments>
		<pubDate>Thu, 26 Jul 2007 13:00:55 +0000</pubDate>
		<dc:creator><![CDATA[Martin Kliehm]]></dc:creator>
				<category><![CDATA[accessibility]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[css sprites]]></category>
		<category><![CDATA[DOM scripting]]></category>
		<category><![CDATA[foreground sprites]]></category>
		<category><![CDATA[hover]]></category>
		<category><![CDATA[image swapping]]></category>
		<category><![CDATA[img element]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[mouseover]]></category>
		<category><![CDATA[rollover]]></category>

		<guid isPermaLink="false">http://learningtheworld.eu/2007/foreground-sprites/</guid>
		<description><![CDATA[Most rollovers have become obsolete because they can be performed on background images with <strong><acronym title="Cascading Style Sheets">CSS</acronym> sprites</strong>. However, there are those rare cases when there is just an icon without text, like a &#8220;play&#8221; or &#8220;pause&#8221; button. This article discusses how to apply <acronym>CSS</acronym> sprites for foreground images.&#160;[&#8230;]]]></description>
				<content:encoded><![CDATA[<p class="alert"><ins datetime="20080626T200000">Please consider a better solution with <a href="/2008/better-foreground-sprites/">Better Foreground Sprites</a>.</ins></p>

<p>Most rollovers have become obsolete because they can be performed on background images with <strong><a href="http://www.alistapart.com/articles/sprites/"><acronym title="Cascading Style Sheets">CSS</acronym> sprites</a></strong>. If there are hover effects today, they usually come as text on a button background image, or as a text link with an icon next to it.</p>

<p>However, there are those rare cases when there is <strong>just an icon without text</strong>, like a &ldquo;play&rdquo; or &ldquo;pause&rdquo; button, or a magnification glass on an image to signal it can be enlarged. If you want to swap images when the element receives focus or on mouseover, traditionally you are stuck with two options:</p>

<ol>
<li>JavaScript to change the image source, or</li>
<li><acronym>CSS</acronym> sprites to change the position of a background image behind a transparent <code>gif</code> image.</li>
</ol>

<p>I like neither. Using JavaScript and two images with pre-loading seems like a waste of resources when it can be done with <acronym>CSS</acronym> and one image only. Transparent gifs are <em>so</em> 1998, besides the background usually doesn&rsquo;t get printed. So what we need on these occasions are <strong><acronym>CSS</acronym> sprites for foreground images</strong>.</p>

<p>Until recently I thought that can&rsquo;t be done, but then I stumbled upon some code for <a href="http://download.dojotoolkit.org/release-0.9.0beta/dojo-0.9.0beta/dijit/tests/form/test_Checkbox.html">checkbox widgets in Dojo</a>. Naturally they use a lot of JavaScript for the task. Anyway I like my default checkboxes and don&rsquo;t have any urge to make them prettier (I have no doubt our design overlords would enforce <em>aqua</em> icons everywhere), but that made me think. Here&rsquo;s a suggestion:</p>

<p>First a simple sprite which is 50px wide: <img src="/examples/img/icon-enlarge.gif" width="50" height="15" alt="Two icons of a magnification glass" class="example sprite" /></p>

<p>The <acronym title="Hypertext Markup Language">HTML</acronym> code uses the dimensions of a <em>single</em> icon for width and height to allow fast page rendering without reflow:</p>

<ol class="code">
<li><code>&lt;a href=&quot;/big/&quot; class="icon"&gt;</code></li>
<li class="indent"><code>&lt;img src=&quot;/img/icon-enlarge.gif&quot; id=&quot;magnifier&quot; <strong>width=&quot;19&quot; height=&quot;15&quot;</strong> alt=&quot;enlarge image&quot; /&gt;</code></li>
<li><code>&lt;/a&gt;</code></li>
</ol>

<p>The corresponding <acronym>CSS</acronym> sets the link to <code>display: block</code>, uses the single icon dimensions for the container, prevents overflow, and resets the image dimensions to <code>auto</code> to prevent distortion. The actual image swapping is achieved by a negative left margin on hover.</p>

<ol class="code">
<li><code>a.icon {</code></li>
<li class="indent"><code><strong>display: block;</strong></code></li>
<li class="indent"><code><strong>width: 19px;</strong></code></li>
<li class="indent"><code><strong>height: 15px;</strong></code></li>
<li class="indent"><code><strong>overflow: hidden;</strong></code></li>
<li><code>}</code></li>
<li><code>a.icon img {</code></li>
<li class="indent"><code><strong>width: auto;</strong></code></li>
<li class="indent"><code><strong>height: auto;</strong></code></li>
<li class="indent"><code>border: none;</code></li>
<li><code>}</code></li>
<li><code>a.icon:hover img, a.icon:focus img, a.icon img.hover {</code></li>
<li class="indent"><code><strong>margin-left: &minus;31px;</strong></code></li>
<li><code>}</code></li>
</ol>

<p>For the sake of simplicity I ignored how the link would be floated or positioned. Also borders, a background color, or padding to increase the clickable area can be added to the parent element.</p>

<p>For simplicity I chose a link in the example, but the same can be done with a <code>div</code> surrounding an <code>&lt;input type=&quot;image&quot;&nbsp;/&gt;</code>. Then of course you need to define <code>cursor: pointer</code>, and for anything below <acronym title="Internet Explorer">IE</acronym>7 bind the <acronym title="Document Object Model">DOM</acronym> event to the hovering element (<a href="/examples/js/foreground-sprites-ie6.js" type="text/javascript" title="JavaScript source code to fix Internet Explorer">get the source</a>):</p>

<ol class="code">
<li><code>&lt;!--[if lt IE 7]&gt;</code></li>
<li><code>&lt;script type=&quot;text/javascript&quot;&gt;</code></li>
<li><code>oIcon = {</code></li>
<li class="indent"><code>setHoverClass : function() {</code></li>
<li class="indent"><code><span class="indent"><strong>this.className = &#x27;hover&#x27;;</strong></span></code></li>
<li class="indent"><code>},</code></li>
<li class="indent"><code>resetHoverClass : function() {</code></li>
<li class="indent"><code><span class="indent"><strong>this.className = &#x27;&#x27;;</strong></span></code></li>
<li class="indent"><code>}</code></li>
<li><code>};</code></li>
<li><code>var elm = document.getElementById(&#x27;magnifier&#x27;);</code></li>
<li><code>if (elm) {</code></li>
<li class="indent"><code>elm.onmouseover = elm.onfocus = oIcon.setHoverClass;</code></li>
<li class="indent"><code>elm.onmouseout = elm.onblur = oIcon.resetHoverClass;</code></li>
<li><code>}</code></li>
<li><code>&lt;/script&gt;</code></li>
<li><code>&lt;![endif]--&gt;</code></li>
</ol>

<p><strong>Here is a working example</strong>. You know how to adjust the code if you need more than one class on the image.</p>

<p><a href="#" class="icon"><img src="/examples/img/icon-enlarge.gif" id="magnifier" width="19" height="15" alt="enlarge image" /></a></p>

<p>That was nice and easy. It&rsquo;s tested in Firefox&nbsp;2, Opera&nbsp;9, Internet Explorer 5+, and Safari&nbsp;2. Screen readers should be okay with the <code>alt</code> text.</p>

<h3>Discussion</h3>

<p>The trouble begins when people <strong>start turning off browser features</strong>.</p>

<p>People with <strong>disabled images</strong> won&rsquo;t be able to read the alternative text because the visible area is limited by the parent container. That can be detected by comparing the known sprite size with the <code>alt</code> text size. Then the class is set to anything but <code>icon</code> so that the parent container expands.</p>

<p>More severe is when people <strong>disable style sheets</strong> because then they will see a squeezed image with multiple icons. If you are hyper-correct, you could replace the crushed multi-icon image with the correct single icon (you could use the <code>class</code> or <code>rel</code> attribute to define the icon type), but nobody wants to slice images. As a compromise I would suggest to replace the icon with its <code>alt</code> text.</p>

<p>See the <a href="/examples/js/foreground-sprites-access.js" type="text/javascript" title="JavaScript source code for accessibility">script</a> to detect disabled images or <acronym>CSS</acronym>. (Note: it isn&rsquo;t implemented here because I couldn&rsquo;t test it properly on <acronym>IE</acronym>6 with stuff turned off.)</p>

<p>If JavaScript is unavailable, the user is stranded with what we gave him. Also <strong>icons without text are inherently evil</strong> because they can&rsquo;t be enlarged by zoom readers. Did I forget any politically correct disclaimer for obscure use scenarios?</p>

<p>So we ended up with a <acronym>CSS</acronym> only version, but still some JavaScript is needed for the extra effort to provide the same experience to users of <acronym>IE</acronym> 5-6, and some more for certain user scenarios. Wouldn&rsquo;t it be easier to slice and swap foreground images the old way? But then again slicing is a pain, and people already start using background images. <strong>Do people actually turn off <acronym>CSS</acronym> and images?</strong> Or is that another remnant of <acronym title="Web Content Accessibility Guidelines">WCAG</acronym> 1.0 from 1999?</p>
]]></content:encoded>
			<wfw:commentRss>http://learningtheworld.eu/2007/foreground-sprites/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Website Performance Tweaks, Part Two</title>
		<link>http://learningtheworld.eu/2007/performance-2/</link>
		<comments>http://learningtheworld.eu/2007/performance-2/#comments</comments>
		<pubDate>Sun, 24 Jun 2007 14:20:19 +0000</pubDate>
		<dc:creator><![CDATA[Martin Kliehm]]></dc:creator>
				<category><![CDATA[conferences]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[@media]]></category>
		<category><![CDATA[atmedia]]></category>
		<category><![CDATA[atmedia07]]></category>
		<category><![CDATA[atmedia2007]]></category>
		<category><![CDATA[book:ean=9780596529307]]></category>
		<category><![CDATA[book:isbn=0596529309]]></category>
		<category><![CDATA[cdn]]></category>
		<category><![CDATA[cpu]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[energy efficiency]]></category>
		<category><![CDATA[etag]]></category>
		<category><![CDATA[expires header]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[http-request]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Nate Koechley]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[steve souders]]></category>
		<category><![CDATA[tenni theurer]]></category>
		<category><![CDATA[yahoo]]></category>
		<category><![CDATA[yslow]]></category>
		<category><![CDATA[yui]]></category>

		<guid isPermaLink="false">http://learningtheworld.eu/2007/performance-2/</guid>
		<description><![CDATA[Nate Koechley presented the research results of the Yahoo! Exceptional Performance Team two weeks ago in London. The traditional focus of <strong>performance optimization</strong> has been on the backend, i.e. system efficiency. But comparing a number of high profile websites, the Yahoo! team found that frontend performance is responsible for 80-98% of the perceived response time. Therefore doubling the frontend performance gains more than doubling the backend performance. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p class="vcard"><a href="http://www.flickr.com/photos/drewm/538822354/in/set-72157600330136671/" title="See larger version on flickr"><img alt="Nate Koechley" src="/wp-content/uploads/2007/07/nate-koechley" width="240" height="160" class="floatleft photo" /></a> <strong><a href="http://nate.koechley.com" class="fn url" rel="co-worker met acquaintance">Nate Koechley</a></strong> presented the <a href="http://nate.koechley.com/blog/2007/06/12/high-performance-web-sites">research results</a> of the Yahoo! Exceptional Performance Team two weeks ago in London (<a href="http://www.htmldog.com/atmedia2007/highperformancewebpages.mp3" type="audio/mp3">podcast</a>). Like Yahoo! shares I would like to share that knowledge with you for those who couldn&rsquo;t attend.</p>

<p>The traditional focus of <strong>performance optimization</strong> has been on the backend, i.e. system efficiency. But comparing a number of high profile websites, the Yahoo! team found that frontend performance is responsible for 80-98% of the perceived response time. Therefore doubling the frontend performance gains more than doubling the backend performance. In case studies <em>Yahoo! Search</em> became 40-50% faster, the <em>Yahoo! Mail</em> web application gained 70-100%. Of course there are ways to increase backend performance without throwing in more hardware, but better frontend performance reduces traffic and saves resources.</p>

<p>Saving resources on the <em>client</em> side, particularly <strong>CPU usage</strong>, also pays off in speed. <a href="http://icant.co.uk/sandbox/eventdelegation/">Event delegation</a> is faster than a large number of event handlers. Likewise we know that <a href="/2007/performance/">reducing the number of HTTP requests</a> through techniques like CSS sprites, sliding doors, or file aggregation increases speed. The reason is the limit of two parallel requests <em>per host</em> imposed by HTTP 1.1. That results in a download queue of two requests at a time, increasing the perceived response time of a page. By configuring additional host aliases for your server you can <a href="http://yuiblog.com/blog/2007/04/11/performance-research-part-4/">increase the number of parallel requests</a>&nbsp;&mdash; but more than 2-4 also increase DNS lookups resulting in higher CPU usage and slower response times.</p>

<p>I wonder when Yahoo! will present us another impressive calculation <strong>how many gigawatts have been preserved</strong> by reducing CPU usage in client PCs and in their <a href="http://www.technewsworld.com/story/55792.html" title="Study: Data Center Power Usage Exploding">data</a> <a href="http://brand.yahoo.com/forgood/environment/energy_conservation.html" title="Yahoo! Energy Conservation Program">centers</a>, as one participant asked in the <acronym title="questions and answers">Q&amp;A</acronym> part. <a href="http://www.ecologee.net">Energy efficient servers</a> are the next big thing, but are there any concrete suggestions for <a href="http://www.addsimplicity.com/adding_simplicity_an_engi/2007/01/compute_power_i.html">greener programming</a>? Is <acronym title="Asynchronous JavaScript and XML">AJAX</acronym> destroying the ozone layer? <img src="http://learningtheworld.eu/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </p>

<p>Environmental issues aside, here&rsquo;s the <strong><a href="http://developer.yahoo.com/performance/rules.html">list of rules</a></strong>. I&rsquo;ll keep it short where I have written about it in <a href="/2007/performance/">my previous article</a>. See the <a href="http://stevesouders.com/hpws/">examples and testcases</a> by Steve Souders.</p>

<ol>
<li id="rule-1"><strong>Make <a href="/2007/performance/">fewer HTTP requests</a>:</strong> This also affects <a href="http://yuiblog.com/blog/2007/03/01/performance-research-part-3/">cookies</a>. Eliminate unnecessary cookies, keep them small, set them at granular domain levels (e.g. <code>finance.yahoo.com</code> instead of <code>.yahoo.com</code>), and set an appropriate Expires date.</li>
<li id="rule-2"><strong>Use a content distribution network (<acronym>CDN</acronym>)</strong> like <a href="http://www.akamai.com">Akamai</a> where your (static) content is served from distributed data centers located nearer to your client. Even if your website is not as big as Google you can profit from faster response times by using the <a href="http://yuiblog.com/blog/2007/02/22/free-yui-hosting"><acronym title="Yahoo! User Interface">YUI</acronym> library&rsquo;s own <acronym>CDN</acronym></a>.</li>
<li id="rule-3"><strong>Add an Expires header</strong> not just <a href="/2007/performance/#enforce-caching" title="Enforce image caching">for images</a>, but also for JavaScript and stylesheet files.</li>
<li id="rule-4"><strong>Enable gzip:</strong> 90%+ of browsers support compression, and <code>gzip</code> is better supported and compresses more than <code>deflate</code>. Gzip <acronym title="Hypertext Markup Language">HTML</acronym> files, <acronym title="Cascading Stylesheets">CSS</acronym>, scripts, <acronym title="Extensible Markup Language">XML</acronym>, <acronym title="JavaScript Object Literal Notation">JSON</acronym>&nbsp;&mdash; <em>no</em> images or <acronym title="Portable Data Format">PDF</acronym>s.</li>
<li id="rule-5"><strong>Put <acronym>CSS</acronym> at the top</strong>, avoid <code>@import</code> as it loads <em>last</em>, even <em>after</em> the images!</li>
<li id="rule-6"><strong>Move scripts to the bottom</strong> as they block parallel downloads even across hostnames and block rendering of any code below them.</li>
<li id="rule-7"><strong>Avoid <acronym>CSS</acronym> expressions</strong> as they execute many times and cost CPU.</li>
<li id="rule-8">
<p><strong>Use external JavaScript and <acronym>CSS</acronym> files.</strong> <a href="/2007/performance/#inline-css">Inline <acronym>CSS</acronym></a> is apparently faster for a user&rsquo;s start page, but not on subsequent pages. After the page has finished loading, use the time to <strong>preload scripts</strong> to speed up secondary pages.</p>
<ol class="code">
<li><code>window.onload = downloadComponents;</code></li>
<li><code>function downloadComponents() {</code></li>
<li class="indent"><code>var elem = document.createElement(&quot;script&quot;);</code></li>
<li class="indent"><code>elem.src = &quot;http://.../file1.js&quot;;</code></li>
<li class="indent"><code>document.body.appendChild(elem);</code></li>
<li><code>}</code></li>
</ol></li>
<li id="rule-9"><strong>Reduce <acronym title="Domain Name Server">DNS</acronym> lookups</strong> for the reasons stated above. Use 1-4 hosts and the <code>keep alive</code> setting.</li>
<li id="rule-10"><strong><a href="/2007/performance/#file-aggregation">Minify JavaScript</a></strong> with JSMin&nbsp;&mdash; inline scripts, too.</li>
<li id="rule-11"><strong>Avoid redirects</strong> as they are the worst form of blocking. Set Expires headers for redirects to enable caching.</li>
<li id="rule-12"><strong>Remove duplicate files:</strong> this is self-explanatory, but it can happen in large teams with many scripts and stylesheets.</li>
<li id="rule-13"><p><strong>Mind the <acronym title="Entity Tag">ETag</acronym>:</strong> Now this was something I never paid attention to. ETags are unique identifiers to distinguish files that share a <acronym title="Uniform Resource Identifier">URI</acronym>. They are transmitted in the HTTP header. The default server setting uses the <a href="http://en.wikipedia.org/wiki/Inode">INode</a>, the bytesize and the modification date of a file to calculate a unique ID. Unless servers in a cluster are identical, ETags differ, therefore the files are <strong>not cached</strong>. Fortunately <a href="http://httpd.apache.org/docs/2.0/mod/core.html#fileetag">ETags can be configured</a> in Apache, so it should be possible to match them across different servers.</p><ol class="code"><li><code>FileETag MTime Size</code></li></ol>
<p>Note that the ETag is also <strong>relevant for <acronym title="Really Simple Syndication">RSS</acronym> feeds</strong>. For example, currently the <a href="http://www.w3.org/2004/08/TalkFiles/Talks.rss" type="application/rss+xml"><acronym title="World Wide Web Consortium">W3C</acronym> talks feed</a> is more or less unusable: some feed readers and services apparently regard the ETag, the feed is mirrored on many servers, so the same news entry from a different server is shown as new and unread multiple times every day&hellip;</p>
</li>
<li id="rule-14"><strong>Make <acronym title="Asynchronous JavaScript and XML">AJAX</acronym> cacheable and small</strong>. Some data like a user&rsquo;s address book or buddy list change infrequently and should be requested via GET, cached, and set with a <code>Last-modified</code> timestamp and gzipped.</li>
</ol>

<p><img src="/wp-content/uploads/2007/06/book-high-performance-web-sites" alt="Book cover: High Performance Web Sites" width="120" height="158" class="floatleft book" /> These are a lot of rules, and they will be published in a O&rsquo;Reilly book by Steve Souders and Tenni Theurer in September 2007. Anyway, don&rsquo;t be overwhelmed by their mass, instead you can start with the easy things: <strong>&ldquo;<q>harvest the low hanging fruit</q>.&rdquo;</strong> Enable caching with the Expire date setting and reduce the number of HTTP requests. You can deal with the rest later.</p>

<p>Finally Nate Koechley announced a Yahoo! performance tool called <strong><a href="http://developer.yahoo.com/yslow/">YSlow</a></strong> as a plugin for the indespensible <a href="http://www.getfirebug.com">Firebug</a> extension. He also recommended the commercial <a href="http://alphaworks.ibm.com/tech/pagedetailer">IBM Page Detailer</a>, and <a href="http://livehttpheaders.mozdev.org">LiveHTTPHeaders</a> to visualize what&rsquo;s happening in your browser.</p>
]]></content:encoded>
			<wfw:commentRss>http://learningtheworld.eu/2007/performance-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
<enclosure url="http://www.htmldog.com/atmedia2007/highperformancewebpages.mp3" length="26276424" type="audio/mpeg" />
		</item>
		<item>
		<title>Best Practices in Web Development</title>
		<link>http://learningtheworld.eu/2006/best-practices/</link>
		<comments>http://learningtheworld.eu/2006/best-practices/#comments</comments>
		<pubDate>Mon, 10 Jul 2006 16:56:19 +0000</pubDate>
		<dc:creator><![CDATA[Martin Kliehm]]></dc:creator>
				<category><![CDATA[web development]]></category>
		<category><![CDATA[web standards]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[checklist]]></category>
		<category><![CDATA[common errors]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS reboot]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[new professionalism]]></category>
		<category><![CDATA[Roger Johansson]]></category>
		<category><![CDATA[Sean Fraser]]></category>
		<category><![CDATA[XHTML]]></category>

		<guid isPermaLink="false">http://learningtheworld.eu/2006/best-practices/</guid>
		<description><![CDATA[Roger Johansson and Sean Fraser recently reviewed websites which were submitted for the CSS Reboot Spring 2006, and they seemed to be quite shocked when 71.8% failed to validate. While this is sobering and to a degree surprising â€” one might expect better results from CSS aware developers on a relaunch â€” it confirmed my own results from reviewing a couple of high profile websites for clients.&#160;[&#8230;]]]></description>
				<content:encoded><![CDATA[<p id="intro"><strong><a href="http://www.456bereastreet.com/archive/200606/css_reboot_participants_far_from_standardsbased/" rel="colleague met" title="Roger Johansson about CSS reboot">Roger Johansson</a> and <a href="http://www.elementary-group-standards.com/web-standards/css-reboot-as-web-standards-validation-indicator.html" title="Sean Fraser about CSS reboot" rel="colleague">Sean Fraser</a> recently reviewed websites which were submitted for the <a href="http://www.cssreboot.com"><acronym title="Cascading Style Sheets">CSS</acronym> Reboot Spring 2006</a>, and they seemed to be quite shocked when 71.8% failed to validate.</strong> While this is sobering and to a degree surprising &mdash; one might expect better results from <acronym>CSS</acronym> aware developers on a relaunch &mdash; it confirmed my own results from reviewing a couple of high profile websites for clients.</p>

<h3 id="toc">In this article:</h3>

<ul class="toc">
    <li><a href="#case-study">Case study</a></li>
    <li><a href="#html">Best practices in <acronym title="Hypertext Markup Language">HTML</acronym></a></li>
    <li><a href="#css">Best practices in <acronym>CSS</acronym></a></li>
    <li><a href="#search-engines">Best practices for search engines</a></li>
</ul>

<h3 id="case-study">Case study</h3>

<p id="cs-intro">Over the years we made several <strong>technical analyses</strong> for the clients&rsquo; own websites and some of their competitors, including major German broadcasting companies, TV program journals, and a couple of large online travel sites.</p>

<p id="cs-scope">We were checking for overall performance like file sizes as well as best practices in <acronym title="Extensible Hypertext Markup Language">(X)HTML</acronym>, <acronym>CSS</acronym>, semantics, and some other aspects of friendliness to users and search engines. We mostly skipped accessibility because there were already severe errors in the other areas.</p>

<p id="cs-summary">It&rsquo;s not like these websites were made by some backstreet <del>crack houses</del> <ins>agencies</ins>. All have a well-known logo stuck to them, most of them get more than a million visits each month, some up to more than a hundred million. Still the reviews felt like a time-travel to 1998. In our elite circles we speak about a &ldquo;<a href="http://www.webstandards.org/2005/11/15/web-standards-and-the-new-professionalism/" title="Molly Holzschlag on the Web Standards Project (WaSP) website about new professionalism" rel="colleague met">new professionalism</a>,&rdquo; but <acronym>HTML</acronym> in the wild is <em>still</em> a <em>very</em> dark and ugly jungle.</p>

<p id="cs-common-errors"><strong>Most common errors</strong> were missing <code>alt</code>-attributes and unencoded <span class="nowrap"><code>&amp;</code>-characters</span> in <acronym title="Uniform Resource Locator">URL</acronym>s. Also quite common were <acronym title="Extensible Markup Language">XML</acronym> endslashes in <acronym>HTML</acronym> documents, or hacks from the nineties: proprietary attributes like <code>background</code> in table data, <code>height</code> in a table row, <code>marginwidth</code>, <code>marginheight</code>, <code>topmargin</code> and <code>leftmargin</code>, or missing <code>type</code> attributes in <code>style</code> and <code>script</code> tags.</p>

<p id="cs-proprietary-tags">Getting into the depths of old-school programming we found proprietary tags like <code>&lt;nobr&gt;</code>, <code>&lt;ilayer&gt;</code>, or <code>&lt;spacer&gt;</code>, misconceptions like <code>valign=&quot;center&quot;</code> instead of <code>&quot;middle&quot;</code>, forgotten closing tags, or tag soup like the classic <code>form</code> between table rows (to prevent top margins), block level elements inside of inline elements, <code>&lt;p&gt;</code> tags around everything (including tables and headlines!), or <code>script</code> tags before or after <code>&lt;html&gt; &lt;/html&gt;</code>. Especially ad servers and site statistics were infamous for their crappy stone-age code.</p>

<p id="cs-dtd">Only a few were missing a doctype declaration (DTD) altogether, most ran <acronym>HTML</acronym> transitional 4.01 in quirks mode, only one claimed to be <acronym>XHTML</acronym>&nbsp;1.1 (<em>gasp</em>). Seven out of ten had a charset encoding, but only the <acronym>XHTML</acronym> website did care to define the site&rsquo;s language. Almost all had no clue about <acronym>CSS</acronym> positioning and used table layout.</p>

<p id="cs-basics">Sometimes we encountered code where developers obviously hadn&rsquo;t understood even the most basic principles of <acronym>CSS</acronym>&nbsp;1. They used either <code>font</code> tags with <code>style</code> attributes, or other tags just <em>like</em> <code>font</code> tags with a lot of repeated inline <code>style</code>. Thus the advantages of <acronym>CSS</acronym> through central style sheets with classes and IDs were counteracted.</p>

<p id="cs-file-size">It didn&rsquo;t come as a surprise that the few websites using <acronym>CSS</acronym>&nbsp;2 for layout had <strong>significant smaller file sizes</strong>. Those with <acronym>CSS</acronym>&nbsp;2 had between 15-21&nbsp;<abbr title="Kilobyte">KB</abbr> of <acronym>HTML</acronym>, their competitors with table layout 55-95&nbsp;<abbr>KB</abbr>. Still you got to pay attention to the file size of images and rich media (including banners) as they frequently blow up the total amount. Be aware of <acronym title="Dynamic HTML">DHTML</acronym> menus, as they have a tendency to get out of control sizewise (<abbr title="40 kilobytes">40k</abbr> JavaScript in one case, <abbr title="85 kilobytes">85k</abbr> in another). Less than a total of <abbr title="100 kilobytes">100k</abbr> for the home page should be sufficient, even for sites with rich graphic interfaces.</p>

<p id="cs-checklist">I don&rsquo;t want to bore you with further rants about burning bandwidth with <abbr title="600 kilobytes">600k</abbr> large home pages (multiply <em>that</em> by a million), hence we thought positive and made a <strong>checklist of best practices</strong>. Although the checkpoints appear to be quite obvious and common sense when you read them, you might be surprised that the best website managed to fulfil 22 out of 29 checkpoints, the worst only 8, with an average of 12.</p>

<p id="cs-job-test">By the way, the <acronym>HTML</acronym> and <acronym>CSS</acronym> part of the checklist is more or less the same we use for testing the qualifications of <em>job applicants</em>. We associated a severity grade (<em>major</em>, <em>average</em>, <em>minor</em>) with each checkpoint, and for each error in the small task we give them we subtract 3, 2, or 1 point(s) respectively from a maximum of 100. Half the amount is subtracted when a checkpoint is partially fulfilled. We adopted that system from the German <a href="http://www.bitvtest.de" hreflang="de">accessibility test</a> &mdash; it&rsquo;s fair and a great way to compare test results.</p>

<p id="cs-checklist-intro">Here&rsquo;s the short version of our checklist. Feel free to make your own severity rating. Just be consistent in your own tests to get comparable results.</p>

<h3 id="html">Best practices in <acronym>HTML</acronym></h3>

<ol class="alpha">
    <li id="html-validation">The document <a href="http://validator.w3.org" title="External link to the World Wide Web Committee&rsquo;s validator">must validate</a> as <acronym>HTML</acronym> or <acronym>XHTML</acronym>.</li>
    <li id="html-dtd">The document must have a <strong><acronym title="Doctype Declaration">DTD</acronym></strong>.</li>
    <li id="html-character-encoding">The document must have a <a href="http://www.w3.org/TR/html401/charset.html#h-5.2.1" title="HTML 4.01 specification about character encoding">character encoding</a>, either through a <acronym title="Hypertext Transfer Protocol">HTTP</acronym> header or a <code>meta</code> tag.</li>
    <li id="html-language">
        <p>The document should have the <strong>language defined</strong> in the following ways:</p>
        <ul>
            <li><code>&lt;html lang=&quot;en&quot;&gt;</code></li>
            <li><code>&lt;html xml:lang=&quot;en&quot;&gt;</code></li>
            <li><code>&lt;meta name=&quot;content-language&quot; content=&quot;en&quot;&gt;</code></li>
        </ul>
    </li>
    <li id="html-quotes">All <strong>attribute values <a href="http://www.w3.org/TR/html4/intro/sgmltut.html#idx-attribute-6" title="HTML 4.01 Specification about quotes">should be quoted</a></strong>. In <acronym>XHTML</acronym>, <a href="http://www.w3.org/TR/xhtml1/#h-4.4" title="XHTML 1.0 Specification about quotes">quotes are mandatory</a>.</li>
    <li id="html-case">Element and attribute names should use a consistent case to enhance readability, preferred is <strong>lowercase</strong> for <acronym>XHTML</acronym> compability.</li>
    <li id="html-comments">Code should be well <code>&lt;!-- commented --></code> to help maintaining developers to get a fast grip of the basic structure and key concepts.</li>
    <li id="html-indention">Code should be consistently <strong>indented</strong>, tabs preferred over spaces.</li>
    <li id="html-alt">Images, image maps and scripted content must have an <a href="http://www.w3.org/TR/html4/struct/objects.html#adef-alt" title="HTML 4.01 specification about alternative text"><code>alt</code>-attribute</a> with an appropriate value.</li>
    <li id="html-width-height">Images should always <a href="http://www.w3.org/TR/html401/struct/objects.html#adef-width-IMG" title="HTML 4.01 specification about width and height">specify their <code>width</code> and <code>height</code></a> to allow browsers to continue rendering while waiting for the image data.</li>
    <li id="html-entities">Some special characters like <code>&amp;quot;</code>, <code>&amp;lt;</code>, <code>&amp;gt;</code>, and <a href="http://www.w3.org/TR/html401/appendix/notes.html#h-B.2.2" title="HTML 4.01 specification about ampersands in URI attribute values"><code>&amp;amp;</code></a> (especially within attributes like <code>href</code> or <code>src</code>) must always be replaced by their <strong>character entities</strong> or numeric character references (NCR). Also characters not included in the character set, like <code>&amp;euro;</code> in ISO 8859-1, must be replaced. The <acronym title="World Wide Web Consortium">W3C</acronym> <abbr title="Internationalization">I18N</abbr> activity group further <a href="http://www.w3.org/International/questions/qa-escapes" title="W3C: Using character entities and NCRs">recommends</a> to replace other special characters like <code>&amp;ndash;</code>, but <em>not</em> common characters like &ldquo;&uuml;&rdquo; in German texts or &ldquo;&eacute;&rdquo; in French to maintain code readability.</li>
    <li id="html-type"><code>script</code> and <code>style</code> tags must have a <a href="http://www.w3.org/TR/html401/interact/scripts.html#h-18.2.1" title="HTML 4.01 specification about the script type"><code>type</code></a> attribute.</li>
    <li id="html-js">
        <p><strong>JavaScript</strong> code should be included using <strong>external files</strong> for caching and better maintenance.</p>
        <p>Of course with <strong>Yahoo&rsquo;s performance research</strong> about <a href="http://yuiblog.com/blog/2007/01/04/performance-research-part-2/">browser cache</a> and <a href="http://yuiblog.com/blog/2006/11/28/performance-research-part-1/"><acronym>HTTP</acronym> requests</a> you could discuss if external files load faster with several server requests through <code>script src=&quot;foo.js&quot;</code> or just one request and internal <acronym>HTML</acronym> code, but either way you should use central, non-redundant files and include them in one way or another.</p>
    </li>
</ol>

<h3 id="css">Best practices in <acronym>CSS</acronym></h3>

<ol class="alpha">
    <li id="css-validation"><acronym>CSS</acronym> <a href="http://jigsaw.w3.org/css-validator/" title="External link to the World Wide Web Consortium&rsquo;s CSS validator">must validate</a>.</li>
    <li id="css-positioning">Elements should be <strong>positioned with <acronym>CSS</acronym>&nbsp;2</strong>, not tables.</li>
    <li id="css-decoration">All ornamental lines, borders, background colors and -images, underlines and other <strong>decorational elements</strong> should be rendered <strong>with <acronym>CSS</acronym>&nbsp;2</strong>.</li>
    <li id="css-formatting"><strong>Text</strong> should be <strong>formatted with <acronym>CSS</acronym>&nbsp;1</strong>, not with <code>font</code> tags.</li>
    <li id="css-external">All style sheets should be included in reusable, centrally maintainable, and cacheable <strong>external <acronym>CSS</acronym> files</strong>, not as redundant code within the <acronym>HTML</acronym> files.</li>
    <li id="css-mime-type">External <acronym>CSS</acronym> files should be sent with the <strong>correct MIME type</strong> (<code>text/css</code>).</li>
    <li id="css-naming-conventions"><strong><acronym>CSS</acronym> classes and IDs must be valid</strong>, <abbr title="that is">i.e.</abbr> <a href="http://www.w3.org/TR/html401/types.html#type-id">beginning with a letter</a>, not a number or an underscore. IDs must be unique. Their names should be <a href="http://www.w3.org/QA/Tips/goodclassnames" title="W3C Quality Assurance Tip: Use &quot;class&quot; with semantics in mind">generic</a>, describe functionality rather than appearance.</li>
</ol>

<h3 id="search-engines">Best practices for search engines</h3>

<ol class="alpha">
    <li id="se-title">Use a <strong>descriptive title</strong> with the name of the website and consistent separating characters in it.</li>
    <li id="se-keywords">Use <strong>keywords, keyphrases, and a description</strong> reflecting the page&rsquo;s content.</li>
    <li id="se-url-design">The <a href="http://www.w3.org/Provider/Style/URI" title="Tim Berners-Lee&rsquo;s article &ldquo;Cool URIs don&rsquo;t change&rdquo;"><acronym>URL</acronym> should be descriptive</a>, <a href="http://www.adaptivepath.com/publications/essays/archives/000058.php" title="Jesse James Garrett about &ldquo;User-Centered URL Design&rdquo;">human-readable</a>, easy to remember, to bookmark, and easy to spell on a phone. Don&rsquo;t bother the user with file extensions, thus you will be future compatible and independent from your current software.</li>
    <li id="se-robots-txt">Use the <a href="http://www.robotstxt.org">Robots Exclusion Standard</a>, <abbr>i.e.</abbr> <code>robots.txt</code>.</li>
    <li id="se-relevance">The <strong>content should be as high up</strong> in the code as possible as it gets more relevance there.</li>
    <li id="se-semantics">Use <strong>proper semantic code</strong>, like headlines, or list items for anything that resembles a list. Don&rsquo;t use list items to get bullet points or headlines to set bold text.</li>
    <li id="se-link">Use <a href="http://www.w3.org/TR/html401/types.html#type-links" title="HTML 4.01 specification about link types"><code>&lt;link&gt;</code> tags</a> to specify relations between pages, like <code>rel=&quot;start&quot;</code>, <code>chapter</code>, <code>prev</code>, or <code>next</code>, as search engines might value your start page more, or browsers could preload <code>next</code> pages.</li>
    <li id="se-favicon">Use a <a href="http://favicon.com">favorite icon</a> for bookmarking and to keep your error log clean.</li>
    <li id="se-pics">Use the <a href="http://www.w3.org/PICS/"><acronym title="Platform for Internet Content Selection">PICS</acronym></a> <a href="http://www.icra.org" title="Internet Content Rating Association, external link where you can label your website">standard</a> to signal search engines and filter programs that your website is safe for kids.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://learningtheworld.eu/2006/best-practices/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>My @media 2006 Day One</title>
		<link>http://learningtheworld.eu/2006/atmedia-day-one/</link>
		<comments>http://learningtheworld.eu/2006/atmedia-day-one/#comments</comments>
		<pubDate>Wed, 21 Jun 2006 10:22:05 +0000</pubDate>
		<dc:creator><![CDATA[Martin Kliehm]]></dc:creator>
				<category><![CDATA[conferences]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[web development]]></category>
		<category><![CDATA[web standards]]></category>
		<category><![CDATA[@media]]></category>
		<category><![CDATA[accessibility]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[atmedia]]></category>
		<category><![CDATA[atmedia2006]]></category>
		<category><![CDATA[book:isbn=0321472667]]></category>
		<category><![CDATA[book:isbn=0596527330]]></category>
		<category><![CDATA[Chris Wilson]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[DOM scripting]]></category>
		<category><![CDATA[Eric Meyer]]></category>
		<category><![CDATA[IE7]]></category>
		<category><![CDATA[Jan Eric Hellbusch]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Jeffrey Veen]]></category>
		<category><![CDATA[Jens Grochtdreis]]></category>
		<category><![CDATA[Jeremy Keith]]></category>
		<category><![CDATA[london]]></category>
		<category><![CDATA[Tomas Caspers]]></category>
		<category><![CDATA[uk]]></category>
		<category><![CDATA[WCAG 2.0]]></category>

		<guid isPermaLink="false">http://learningtheworld.eu/2006/atmedia-day-one/</guid>
		<description><![CDATA[@media is a web conference in London with a focus on web standards and accessibility, and impossible to google. I missed last year&#8217;s conference, thus I was looking forward to finally meet all the people whose articles, web publications and more recently blogs provided my literature and inspiration for the past seven years or so.&#160;[&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong><a href="http://www.vivabit.com/atmedia2006/">@media</a> is a web conference in London with a focus on web standards and accessibility, and impossible to google.</strong> I missed last year&rsqou;s conference, thus I was looking forward to finally meet all the people whose articles, web publications and more recently blogs provided my literature and inspiration for the past seven years or so.</p>

<h3>In this post:</h3>

<ul class="toc">
    <li><a href="#meyer">Eric Meyer: Keynote</a></li>
    <li><a href="#keith">Jeremy Keith: Using <acronym title="Document Object Model">DOM</acronym> scripting to plug the holes in <acronym>CSS</acronym></a></li>
    <li><a href="#wilson">Chris Wilson: <acronym title="Microsoft Internet Explorer">IE</acronym>: 7 and beyond</a></li>
    <li><a href="#wcag">The new accessibility guidelines: <acronym title="Web Content Accessibility Guidelines">WCAG</acronym>&nbsp;2.0</a></li>
    <li><a href="#veen">Jeffrey Veen: Designing the next generation of web <abbr title="Applications">apps</abbr></a></li>
</ul>

<h3 id="geek-life">Introducing geeks to a social life</h3>

<p><a href="http://flickr.com/photos/tomascaspers/168221986/in/set-72157594170010626/" title="Larger version of the Johansson/Caspers photo on flickr"><img class="floatleft photo" src="/wp-content/uploads/2006/06/2006-06-14-johansson-caspers" alt="Roger Johansson &amp; Tomas Caspers" width="200" height="110" /></a> There was some socializing the evening before the conference where I met with a couple of Germans, like <span class="vcard"><a href="http://blog.grochtdreis.de" class="url fn" hreflang="de">Jens Grochtdreis</a></span> who initiated the German web standardista group &ldquo;<a href="http://www.webkrauts.de" hreflang="de">Webkrauts</a>&rdquo;, <span class="vcard"><a href="http://www.barrierefreies-webdesign.de" class="url fn" hreflang="de"><span class="given-name">Jan Eric</span> <span class="family-name">Hellbusch</span></a></span> whose website I had noticed before for some master theses about accessibility, or <span class="vcard"><span class="fn">Tomas Caspers</span> who is a member of <acronym title="Web Standards Project">WaSP</acronym> and the mastermind behind the accessibility portal <a href="http://www.einfach-fuer-alle.de" class="url" hreflang="de" xml:lang="de" lang="de">Einfach für alle</a>. Actually I wasn&#8217;t the only one to notice he looks like the lost fifth member of the German punk band &ldquo;Die Toten Hosen&rdquo;?&hellip;</span> Also that&rsquo;s where I met <span class="vcard"><a href="http://www.456bereastreet.com" class="url fn">Roger Johansson</a></span>, whose technical blog <em>456&nbsp;Berea Street</em> is a must-read for <acronym title="Cascading Style Sheets">CSS</acronym> and accessibility aware coders.</p>

<p>So my <strong>first day on @media</strong> began with a walk through polluted London air along surveillance cameras and anti-tank barriers along the Houses of Parliament over to the queue in front of the Queen Elizabeth <abbr title="the second">II</abbr> Conference Center (QE2CC) where we got nice bags and name tags. I would suggest <em>shawls</em> with the @media logo for next year to stand a chance against the bloody cold air conditioning while it was 28&deg;&nbsp;<abbr title="Celsius">C</abbr> outside. <img src="http://learningtheworld.eu/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" /> </p>

<h3 id="meyer">Eric Meyer: Keynote</h3>

<p class="vcard"><a href="http://www.flickr.com/photos/chrisjennings/169037394/in/set-72157594168773966/" title="Larger version of the Eric Meyer photo on flickr"><img class="floatleft photo" src="/wp-content/uploads/2006/06/2006-06-15-eric-meyer" alt="Eric Meyer" width="200" height="150" /></a> The conference started with a keynote by <a href="http://meyerweb.com" class="url fn">Eric Meyer</a> with his personal impressions of the last ten years of the web. Quite interesting since I&rsquo;ve been reading his articles on <a href="http://meyerweb.com/eric/writing.html">Web Review</a>, where he published among other things the famous <acronym title="Cascading Style Sheets">CSS</acronym> browser compatibility chart, a great companion in my struggle with 4th generation browsers.</p>

<p>Looking back, he realized the following truths:</p>

<ol>
    <li>Small groups of <strong>dedicated experts <em>can</em> change a lot</strong> (<abbr title="for example">e.g.</abbr> the <a href="http://archive.webstandards.org/css/members.html"><acronym>CSS</acronym> Samurai</a>, or <a href="http://www.tantek.com">Tantek Çelik</a> who introduced doctype switching).</li>
    <li><strong>Free information</strong> is an essential part of any new web technology&rsquo;s adoption.</li>
    <li>You don&rsquo;t hear much anymore from people or companies who kept information as a &ldquo;personal advantage.&rdquo;</li>
    <li>You might be the first who thought about a certain solution. Savour this moment, and then <strong>share it</strong>.</li>
</ol>

<h3 id="keith">Using <acronym title="Document Object Model">DOM</acronym> scripting to plug the holes in <acronym>CSS</acronym></h3>

<p class="vcard"><a href="http://www.flickr.com/photos/martin-kliehm/171514731/in/set-72157594172244478/" title="Larger version of the Jeremy Keith photo on flickr"><img class="floatleft photo" src="/wp-content/uploads/2006/06/2006-06-15-jeremy-keith" alt="Jeremy Keith" width="200" height="150" /></a> As an example, <a href="http://adactio.com" class="url fn">Jeremy Keith</a> introduced the techniques of Buck Owens, the first musician to &ldquo;hack&rdquo; the tinny sound of early radios by replacing the bass with a regular guitar. So his tracks sounded better and got more airtime. Using <acronym>DOM</acronym> scripting to work around incomplete <acronym>CSS</acronym> implementations or to simulate <acronym>CSS</acronym>&nbsp;3 behavior is basically the same, as long as there aren&rsquo;t yet browsers with <q>&ldquo;great bass.&rdquo;</q></p>

<p>Okay, most of the stuff in his <cite><a href="http://domscripting.com/presentations/atmedia2006/slides/" title="Slides for Jeremy&rsquo;s DOM scripting presentation">presentation</a></cite> sounded familiar, and I&rsquo;d rather set zebra stripes on table row backgrounds server side. Still I got some inspiration how to do some things <em>better</em>. For example it never occurred to me to combine selectors like</p>

<ol class="code"><li><code>document.<strong>getElementById</strong>(&quot;id&quot;)<span class="codeSpace">&nbsp;</span>.<strong>getElementsByTagName</strong>(&quot;p&quot;)</code></li></ol>

<p>Or I never thought of using a universal selector in JavaScript:</p>

<p class="block"><code>document.getElementsByTagName(&quot;<strong>*</strong>&quot;)</code></p>

<p>Also the next time I&rsquo;m manipulating an object&rsquo;s class, I promise to do it by writing some reusable functions like</p>

<ol class="code">
    <li><code>document.<strong>getElementByClassName()</strong></code></li>
    <li><code>function <strong>addClass(</strong>element, className<strong>)</strong></code></li>
</ol>

<p>And after I <code>createElement</code> I should set more attributes by setting a <code>className</code> instead of adding each attribute separately.</p>

<p>When he mentioned <acronym>CSS</acronym>&nbsp;3, I learned that Safari is already capable of handling multiple background images. And I liked his introduction of the geeky Star Trek term of a <q>&ldquo;<a href="http://en.wikipedia.org/wiki/Kobayashi_Maru" title="Kobayashi Maru on Wikipedia">Kobayashi Maru scenario</a>&rdquo;</q> for a no-win situation, or his translation of object detection</p>

<ol class="code"><li><code>if (document.getElementById) { }</code></li></ol>

<p>with <q>&ldquo;you must be this high to ride.&rdquo;</q> Rather cool, and a very entertaining presentation.</p>

<h3 id="wilson"><acronym title="Microsoft Internet Explorer">IE</acronym>: 7 and beyond</h3>

<p class="vcard"><a href="http://www.flickr.com/photos/chrisjennings/169144799/in/set-72157594168773966/" title="Larger version of the Chris Wilson photo on flickr"><img class="floatleft photo" src="/wp-content/uploads/2006/06/2006-06-15-chris-wilson-s" alt="Chris Wilson" width="200" height="150" /></a> <cite><a class="url fn" href="http://blogs.msdn.com/cwilso/">Chris Wilson</a></cite> worked on the Mosaic browser (that&rsquo;s, like, <em>Netscape&nbsp;1</em> &mdash; scary, isn&rsquo;t it?) and on <acronym>IE</acronym> ever since version&nbsp;2. Praise him for first implementing <acronym>CSS</acronym> in <acronym>IE</acronym>3, blame him for some nasty bugs he&rsquo;s personally responsible for in <acronym>IE</acronym>6. Also he&rsquo;s the one who wrote <a href="http://blogs.msdn.com/cwilso/archive/2006/05/11/595536.aspx" title="Chris Wilson&rsquo;s blog &ldquo;Microsoft, IE and the Web Standards Project&rdquo;">he will quit</a> (and probably become a professional surfer) the day he loses his passion or <acronym>IE</acronym> gets mothballed again.</p>

<p>After some blatant promotion for all the outstanding new features and fixes in <acronym>IE7</acronym>, things you can read about in the <a href="http://blogs.msdn.com/ie/"><acronym>IE</acronym>Blog</a> if you haven&rsquo;t yet, he came to the interesting facts:</p>

<p>First of all, they are planning the <strong>next two releases</strong> now, and it won&rsquo;t take another five years until <acronym>IE8</acronym> will emerge. Also <a href="http://blogs.msdn.com/ie/archive/2006/05/26/608255.aspx"><acronym>IE7+</acronym></a> for Windows Vista is only marketing speak, what counts is that it has the same features as <acronym>IE7</acronym> for Windows <acronym>XP</acronym>, except for some vista-only security and parental control. <strong><acronym>IE7</acronym> will ship</strong> in <q>&ldquo;second half 2006.&rdquo;</q> More precisely, the Malaysian Vista developer Jabez Gan disclosed earlier that <a href="http://www.msblog.org/?p=692" title="More on MSBlog">December 6</a> will be the release date.</p>

<p>Because of the deep interaction with the operating system they can&rsquo;t push it as a critical <strong>Windows update</strong>, but they will <q>&ldquo;strongly encourage people to update.&rdquo;</q> The <strong>new fonts</strong> won&rsquo;t be deployed with the update, more likely in a separate package, simply because with Unicode support some are too large.</p>

<p>On a technical side they are aware of developer&rsquo;s problems to test on <strong>multiple versions of <acronym>IE</acronym></strong>. Though it is technically hard to have a friendly co-existence of multiple <acronym>IE</acronym>s because they provide the operating system, it should be possible to create side-by-side versions of <em>the browser</em> only. Yay, that&rsquo;s what we want!</p>

<p>Also they would like to support the <strong><acronym title="eXtensible Hypertext Markup Language">XHTML</acronym> <acronym title="Multipurpose Internet Mail Extensions">MIME</acronym> type</strong>, but want to do it right, later. Same is true for <strong>advanced <acronym>DOM</acronym> support</strong>, or passing the <strong>Acid2 test</strong>. What&rsquo;s next for the web? <strong>Mashups</strong>, <strong><acronym title="Really Simple Syndication">RSS</acronym></strong>, <a href="/2006/atmedia-day-two/#tantek" title="See Tantek &Ccedil;elik&rsquo;s session for more information on microformats">microformats</a>, and <strong>XMLHttpRequest</strong> (did you know there&rsquo;s a <a href="http://www.w3.org/TR/XMLHttpRequest/" title="XMLHttpRequest Working Draft"><acronym title="World Wide Web Consortium">W3C</acronym> working draft</a>?). <strong>XForms</strong> is on their radar, but they need to coordinate efforts with other browser vendors.</p>

<p>Besides Chris recommended some tools like an expression finder to spot <acronym>CSS</acronym> hacks, or an application compatibility toolkit, stuff you can download as part of the <a href="http://www.microsoft.com/downloads/details.aspx?familyid=D13EE10D-2718-47F1-AA86-1E32D526383D&#038;displaylang=en">Internet Explorer 7 Readiness Toolkit</a> from Microsoft with a genuine copy or from someplace else without.</p>

<h3 id="wcag">The new accessibility guidelines: <acronym title="Web Content Accessibility Guidelines">WCAG</acronym>&nbsp;2.0</h3>

<p>I had hoped that by visiting the panel about <acronym>WCAG</acronym> ['wu:k&aelig;g] I could avoid having to read <a href="http://www.w3.org/TR/2006/WD-WCAG20-20060427/" title="Working Draft: Web Content Accessibility Guidelines 2.0">the unreadable</a> myself, but I was disappointed. You will read in <a href="/2006/to-hell-with-joe-clark/" title="To Hell With Joe Clark">another post</a> about it. Not much else to tell about that panel, except <acronym>WCAG</acronym>&nbsp;2.0 is probably not <a href="http://www.alistapart.com/articles/tohellwithwcag2" title="Joe Clark&rsquo;s article about WCAG 2.0 in A List Apart">as bad</a> as we have thought. There are <a href="http://accessify.com/2006/06/notes-about-our-media-wcag-20.php" title="Notes about the WCAG 2.0 panel">notes</a> and the <a href="http://accessify.com/presentations/" title="The slides for the WCAG 2.0 panel">slides</a> available on accessify.com.</p>

<h3 id="veen">Designing the next generation of web <abbr title="Applications">apps</abbr></h3>

<p class="vcard"><a href="http://www.flickr.com/photos/chimchim/168820983/in/set-72157594167975089/" title="Larger version of the Jeffrey Veen photo on flickr"><img class="floatleft photo" src="/wp-content/uploads/2006/06/2006-06-15-jeffrey-veen" alt="Jeffrey Veen in s suit with a presentation slide in the background and the words &ldquo;Generation Web Apps&rdquo;" width="200" height="132" /></a> <cite><a href="http://www.veen.com" class="url fn">Jeffrey Veen</a></cite> is the partner of Jesse James Garrett who gets all the attention for coining the term &ldquo;<acronym title="Asynchronous JavaScript and XML"><strong>Ajax</strong></acronym>.&rdquo; Anyway, <acronym>Ajax</acronym> is <em>so</em> going to change our world. Like the automobile, or the Great Depression. Some will get more mobile, some will get greatly depressed when the web becomes inaccessible.</p>

<p>In another panel the speakers agreed that <strong><acronym>Ajax</acronym></strong> can make live easier <strong>as an enhancement</strong> (Jeremy Keith calls it &ldquo;<a href="http://domscripting.com/presentations/xtech2006/" title="Slides by Jeremy Keith about Hijax">Hijax</a>&rdquo;), but shouldn&rsquo;t be a world of pain for the others. Actually I can see some of <a href="http://www.veen.com/nextgen.pdf" title="Jeffrey Veen&rsquo;s slides as PDF" type="application/pdf">Jeff&rsquo;s examples</a> (use Stuart Colville&rsquo;s <a href="http://muffinresearch.co.uk/archives/2006/06/16/media2006-notes-jeffrey-veen-designing-the-next-generation-of-web-apps/" title="Notes about Jeffrey Veen&rsquo;s presentation">notes</a> to understand the slides) as an enhancement. Like giving immediate feedback when input fields in a form validate, while degrading gracefully by giving feedback after a regular submit.</p>

<p>You can enhance understanding by coloring and visualizing rainfall values in a nicely designed table, or you can further enhance it by making it interactive with a fader to choose cities on a map. But I can&rsquo;t imagine how to have both.</p>

<p>In another example he showed a mashup of Google Maps with a Chicago crime database. Nice, but how can that be made accessible? So that people without JavaScript, or screen reader and braille display users <em>with</em> JavaScript can access the raw data table that lies under the visualization?</p>

<p>There was a lot of talk how <strong>today&rsquo;s websites will be tomorrow&rsquo;s web applications</strong>, but like <a href="/2006/atmedia-day-two/#koechley">Nate Koechley</a> put it: You can&rsquo;t just copy one aspect of desktop applications while ignoring the accessible alternatives. Desktop applications are accessible with multiple input devices, like a mouse or a keyboard. Screen readers can get the content. Don&rsquo;t you forget it when developing the <q>&ldquo;next generation off apps.&rdquo;</q> There&rsquo;s more than just good looks.</p>
]]></content:encoded>
			<wfw:commentRss>http://learningtheworld.eu/2006/atmedia-day-one/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
