<?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>HTML Zen Garden</title>
	<atom:link href="http://www.htmlzengarden.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.htmlzengarden.com</link>
	<description>The beauty in HTML code</description>
	<lastBuildDate>Tue, 01 Dec 2009 21:06:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Le rythme vertical en CSS</title>
		<link>http://www.htmlzengarden.com/2009/11/le_rythme_vertical_en_css/</link>
		<comments>http://www.htmlzengarden.com/2009/11/le_rythme_vertical_en_css/#comments</comments>
		<pubDate>Tue, 17 Nov 2009 12:33:35 +0000</pubDate>
		<dc:creator>STPo</dc:creator>
				<category><![CDATA[Réflexions]]></category>
		<category><![CDATA[blueprint]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[navigateurs]]></category>
		<category><![CDATA[pixels]]></category>
		<category><![CDATA[rythme vertical]]></category>

		<guid isPermaLink="false">http://www.htmlzengarden.com/?p=789</guid>
		<description><![CDATA[   C&#8217;est au tour de Christophe Andrieu de prendre le clavier. Décidément, on n&#8217;est plus chez soi&#160;!

Même si sur le moment il ne m’avait pas frappé outre mesure, je repense assez fréquemment au coup de gueule de Gilles Vauvarin lors de sa conférence à Paris-web cette année&#160;: il était consterné que les intégrateurs [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_STOP --> <p><a class="read" onclick="readpage(this.href, 789);this.blur();return false;" href="http://wr.readspeaker.com/webreader/webreader.php?cid=18c69dd51a2bc0f4d305318e0fa39bc3&amp;t=wordpress&amp;url=http://www.htmlzengarden.com/2009/11/le_rythme_vertical_en_css/"><img src="http://graphics.readspeaker.com/images/wr/listen_fr_fr.gif" alt="Lis moi avec webReader" /></a></p><div class="read-bloc" id="WR_789"></div> <!-- RSPEAK_START --> <p><em>C&#8217;est au tour de <a href="http://stpo.fr/">Christophe Andrieu</a> de prendre le clavier. Décidément, on n&#8217;est plus chez soi&#160;!</em></p>

<p>Même si sur le moment il ne m’avait pas frappé outre mesure, je repense assez fréquemment au coup de gueule de <a href="http://www.pixenjoy.com/" title="Pixenjoy">Gilles Vauvarin</a> lors de <a href="http://www.paris-web.fr/2009/-Programme-#conf94" title="Webdesigner, l’homme qui parlait à l’oreille des intégrateurs">sa conférence à Paris-web</a> cette année&#160;: il était consterné que les intégrateurs ne respectent pas le rythme vertical de ses designs.</p>

<p>Ce fut l’occasion de me rappeler à quel point c’était super, le rythme vertical. Et à quel point j’en avais bavé à chaque fois que j’ai essayé de l’implémenter en <abbr>CSS</abbr>.</p>

<p><em>(C’est quoi le rythme vertical&#160;? Allez lire <a href="http://www.biologeek.com/ergonomie,informatique/l-importance-du-rythme-vertical-en-design-css/" title="L'importance du rythme vertical en design CSS">cet excellent article de David sur le sujet</a>)</em></p>

<h3><em>Blueprint</em> et les navigateurs sont dans un bateau</h3>

<p>Remotivé par le sujet, j’attaque donc mon nouveau design avec <a href="http://www.blueprintcss.org/" title="Blueprint">Blueprint</a>, framework <abbr>CSS</abbr> bien connu pour gérer intelligemment ce genre de problématiques délicates. On me l’a notamment conseillé pour éviter de me prendre la tête avec les calculs d’interlignages en <em>em</em>, qui donneraient des cauchemars à Pythagore en personne.</p>

<p>Hélas&#160;! J’ai déchanté assez vite. Conserver un rythme vertical avec un vrai design (même minimaliste) est excessivement complexe, Blueprint ou pas Blueprint.</p>

<p>J’ai notamment buté sur les arrondis générés par les moteurs de rendu des navigateurs, qui ne sont apparemment pas calculés de la même manière.</p>

<p>Comme tout est défini en <em>em</em>, on se retrouve assez rapidement avec des styles générés assez exotiques&#160;: si mon <em>line-height</em> est de 1.5 et ma <em>font-size</em> de base de 11&#160;<abbr title="pixels">px</abbr> (12&#160;<abbr title="pixels">px</abbr> c’était trop facile), mon <em>line-height</em> généré va être de 1.5 × 11 = 16.5&#160;<abbr title="pixels">px</abbr>&#8230; et les demi-pixels, les navigateurs, en gros, n’aiment pas.</p>

<p>Ou du moins, ils ne l’interprètent pas tous de la même façon (ou alors j’ai vraiment raté un train). Ce qui oblige à une certaine gymnastique pour retomber sur des calculs de pixels générés entiers – qui eux sont interprétés de la même manière partout. Par exemple là, pour avoir un <em>line-height</em> généré de 17&#160;<abbr title="pixels">px</abbr> (mettons), je vais devoir mettre <code>line-height:1.565</code>&#8230; et encore, ça reste un arrondi.</p>

<p>Imaginez maintenant qu’on rajoute des bordures <abbr>CSS</abbr>, des images, bref toutes sortes de contenus et de styles qui décalent tout au fur et à mesure avec toujours plus d’arrondis.</p>

<p>Je ne vous fais pas de dessin, c’est un enfer&#160;!</p>

<h3>Tout passer en pixels&#160;?</h3>

<p>Bref, j’ai été vite écœuré de cette mélasse d’<em>em</em> qu’on nous a pourtant appris à aimer dogmatiquement durant toutes ces années d’évangélisation aux bonnes pratiques.</p>

<p>D’où une question bien légitime&#160;: «&#160;mais pourquoi n&#8217;utilise-t-on pas tout simplement le pixel, unité native de notre medium&#160;?&#160;».</p>

<p>Évidemment, on sait qu’<abbr>IE</abbr> ne comprend pas grand-chose aux agrandissements de textes dès qu’on lui parle en pixels&#8230; et on entre alors dans des considérations plus philosophiques que techniques. Doit-on laisser <abbr>IE</abbr> sur le carreau&#160;? N’est-il de toute manière pas intéressant de conserver des unités relatives pour les marges entre paragraphes (par exemple), afin de conserver nativement des proportions harmonieuses&#160;?</p>

<p><a href="http://www.nota-bene.org/Are-pixel-font-sizes-still-so-bad" title="Are pixel font sizes still so bad?">Stéphane en parlait il y a deux ans de ça</a>, les choses n’ont pas évolué depuis, et c’est bien dommage.</p>

<p>Bref, une piste à oublier, probablement.</p>

<h3>Vers un mode de calcul normalisé pour tous les navigateurs&#160;?</h3>

<p>Revenons aux <em>em</em>&#160;: pourquoi les moteurs graphiques des navigateurs sont-ils infoutus de gérer les arrondis de décimales de pixels de la même manière&#160;?</p>

<p>Y a-t-il des groupes de travail là-dessus&#160;? Des ressources en ligne&#160;? Est-ce que j’ai loupé quelque chose en route&#160;?</p>

<p>Si vous avez des éléments de réponse je suis avide de les entendre&#8230;</p>

<p>Pour le moment, j’ai cette phrase de Stéphane qui me reste en travers de la gorge&#160;: «&#160;le rythme vertical pour moi, ne peut se tenir qu&#8217;avec des bricoles en <abbr>JS</abbr>&#160;: <abbr>CSS</abbr> n&#8217;est pas assez solide pour ça&#160;».</p>

<p>Dites-moi que c’est faux&#160;!</p>
 <!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://www.htmlzengarden.com/2009/11/le_rythme_vertical_en_css/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Survol des hyperliens</title>
		<link>http://www.htmlzengarden.com/2009/11/survol_des_hyperliens/</link>
		<comments>http://www.htmlzengarden.com/2009/11/survol_des_hyperliens/#comments</comments>
		<pubDate>Sat, 14 Nov 2009 19:08:23 +0000</pubDate>
		<dc:creator>Vincent</dc:creator>
				<category><![CDATA[Réflexions]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[ergonomie]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[Liens]]></category>
		<category><![CDATA[soulignement]]></category>

		<guid isPermaLink="false">http://www.htmlzengarden.com/?p=768</guid>
		<description><![CDATA[   Éric a récemment abordé le cas des boutons activés, je prends le relais et je m&#8217;interroge cette fois sur le survol des liens.

La convention veut que les liens soient identifiés par le soulignement de ceux-ci et je reste donc dans ce cas classique. Bien souvent ensuite (dans le but de signaler l&#8217;interaction) [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_STOP --> <p><a class="read" onclick="readpage(this.href, 768);this.blur();return false;" href="http://wr.readspeaker.com/webreader/webreader.php?cid=18c69dd51a2bc0f4d305318e0fa39bc3&amp;t=wordpress&amp;url=http://www.htmlzengarden.com/2009/11/survol_des_hyperliens/"><img src="http://graphics.readspeaker.com/images/wr/listen_fr_fr.gif" alt="Lis moi avec webReader" /></a></p><div class="read-bloc" id="WR_768"></div> <!-- RSPEAK_START --> <p>Éric a récemment abordé <a href="http://www.lesintegristes.net/2009/09/13/hover-vs-active/">le cas des boutons activés</a>, je prends le relais et je m&#8217;interroge cette fois sur le survol des liens.</p>

<p>La convention veut que les liens soient identifiés par le soulignement de ceux-ci et je reste donc dans ce cas classique. Bien souvent ensuite (dans le but de signaler l&#8217;interaction) ce soulignement sera retiré au survol.</p>

<pre><code>&lt;style type="text/css"&gt;
    a:focus,
    a:hover
    {
        text-decoration:none;
    }
    a:active
    {
        outline:none;
    }
&lt;/style&gt;
</code></pre>

<p>Remarquez au passage&#160;:</p>

<ul>
<li>que je complète mon sélecteur pour le cas d&#8217;une navigation au clavier (j&#8217;y reviendrai plus tard)&#160;;</li>
<li>la définition de l&#8217;état actif, trouvée via ce <a href="http://people.opera.com/patrickl/experiments/keyboard/test">très bon billet sur la suppression de l&#8217;<code>outline</code></a>.</li>
</ul>

<p>Je ne sais pas pour vous, mais j&#8217;ai tendance à trouver cette technique (pourtant répandue&#160;!) contre-intuitive. C&#8217;est comme si le lien &laquo;&nbsp;disparaissait&nbsp;&raquo; au survol, et que du coup il n&#8217;était plus possible (en apparence) de cliquer.</p>

<p>J&#8217;aurais tendance à préférer tout autre mise en forme au survol. Comme par exemple un changement de couleur. On pourrait même reprendre celle des liens visités tiens&#8230;</p>

<pre><code>&lt;style type="text/css"&gt;
    a
    {
        color:#1C6280;
        background-color:inherit;
    }
    a:hover,
    a:focus,
    a:visited
    {
        color:#1C6280;
        background-color:inherit;
    }
    a:active
    {
        outline:none;
    }
&lt;/style&gt;
</code></pre>

<p>J&#8217;aimerais lire vos avis et vos arguments, je n&#8217;arrive pas à trancher cette question.</p>

<p>Question bonus&#160;: les sélecteurs enrichis pour les navigations au clavier, ça ne pose pas de souci&#160;? Je pense notamment à une personne qui d&#8217;une part survol un lien à la souris, tant en tabulant sur un autre lien en parallèle&#160;: il se retrouve alors avec deux liens mis en évidence à la fois.</p>
 <!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://www.htmlzengarden.com/2009/11/survol_des_hyperliens/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Bordure entre deux colonnes</title>
		<link>http://www.htmlzengarden.com/2009/11/bordure_entre_deux_colonnes/</link>
		<comments>http://www.htmlzengarden.com/2009/11/bordure_entre_deux_colonnes/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 16:23:29 +0000</pubDate>
		<dc:creator>Vincent</dc:creator>
				<category><![CDATA[Réflexions]]></category>
		<category><![CDATA[bordures]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://www.htmlzengarden.com/?p=757</guid>
		<description><![CDATA[   Petite astuce de rien du tout pour créer une bordure d&#8217;un ou plusieurs pixels entre deux colonnes.

C&#8217;est difficile à faire&#160;?

Pas vraiment, mais ça se complique quand on souhaite que cette bordure soit toujours de la hauteur de la colonne le plus grande. Faut-il la placer sur le conteneur de gauche ou de [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_STOP --> <p><a class="read" onclick="readpage(this.href, 757);this.blur();return false;" href="http://wr.readspeaker.com/webreader/webreader.php?cid=18c69dd51a2bc0f4d305318e0fa39bc3&amp;t=wordpress&amp;url=http://www.htmlzengarden.com/2009/11/bordure_entre_deux_colonnes/"><img src="http://graphics.readspeaker.com/images/wr/listen_fr_fr.gif" alt="Lis moi avec webReader" /></a></p><div class="read-bloc" id="WR_757"></div> <!-- RSPEAK_START --> <p>Petite astuce de rien du tout pour créer une bordure d&#8217;un ou plusieurs pixels entre deux colonnes.</p>

<h3>C&#8217;est difficile à faire&#160;?</h3>

<p>Pas vraiment, mais ça se complique quand on souhaite que cette bordure soit toujours de la hauteur de la colonne le plus grande. Faut-il la placer sur le conteneur de gauche ou de droite&#160;?</p>

<h3>Solutions</h3>

<p>On peut dans un premier temps penser à utiliser la techniques des <a href="http://www.pompage.net/pompe/colonnesfactices/">colonnes factices</a> et placer un <code>background-image</code> sous les colonnes, mais cela présente deux petits soucis&#160;:</p>

<ul>
<li>la largeur des colonnes sera alors fixée&#160;;</li>
<li>on fait appel à une image alors qu&#8217;un simple style CSS pourrait suffire.</li>
</ul>

<p>Voici la méthode que j&#8217;utilise à la place&#160;:</p>

<pre><code>&lt;div style="overflow:hidden;height:1%;"&gt;
    &lt;div style="float:left;width:200px;border-right:5px solid #000;"&gt;
        &lt;p&gt;
            Colonne A.
        &lt;/p&gt;
    &lt;/div&gt;
    &lt;div style="float:left;width:200px;border-left:5px solid #000;margin-left:-5px;display:inline;"&gt;
        &lt;p&gt;
            Colonne B.
        &lt;/p&gt;
    &lt;/div&gt;
&lt;/div&gt;
</code></pre>

<p>L&#8217;astuce consiste donc à placer deux bordures et à les faire se superposer ensuite via une marge négative de la largeur de la bordure. Simple, mais efficace.</p>
 <!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://www.htmlzengarden.com/2009/11/bordure_entre_deux_colonnes/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>ARIA et validation&#160;: comment faire&#160;?</title>
		<link>http://www.htmlzengarden.com/2009/11/aria-et-validation-comment-faire/</link>
		<comments>http://www.htmlzengarden.com/2009/11/aria-et-validation-comment-faire/#comments</comments>
		<pubDate>Fri, 06 Nov 2009 15:29:25 +0000</pubDate>
		<dc:creator>Stéphane Deschamps</dc:creator>
				<category><![CDATA[Réflexions]]></category>
		<category><![CDATA[accessibilité]]></category>
		<category><![CDATA[aria]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[validation]]></category>

		<guid isPermaLink="false">http://www.htmlzengarden.com/?p=739</guid>
		<description><![CDATA[   Stéphane Deschamps me pique la plume. Le sujet se prête mieux au format de ce blog qu&#8217;au sien.

Un peu d’histoire

L’idée d’ARIA c’est de permettre de décrire des rôles et des états, pour améliorer l’accessibilité des clients riches. Ainsi on peut légalement avec ARIA faire une case à cocher en image, pourvu qu’on [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_STOP --> <p><a class="read" onclick="readpage(this.href, 739);this.blur();return false;" href="http://wr.readspeaker.com/webreader/webreader.php?cid=18c69dd51a2bc0f4d305318e0fa39bc3&amp;t=wordpress&amp;url=http://www.htmlzengarden.com/2009/11/aria-et-validation-comment-faire/"><img src="http://graphics.readspeaker.com/images/wr/listen_fr_fr.gif" alt="Lis moi avec webReader" /></a></p><div class="read-bloc" id="WR_739"></div> <!-- RSPEAK_START --> <p><em><a href="http://www.nota-bene.org/">Stéphane Deschamps</a> me pique la plume. Le sujet se prête mieux au format de ce blog qu&#8217;au sien.</em></p>

<h3 id="histoire">Un peu d’histoire</h3>

<p>L’idée d’<abbr title="Accessible Rich Interface Applications">ARIA</abbr> c’est de permettre de décrire des rôles et des états, pour améliorer l’accessibilité des clients riches. Ainsi on peut légalement avec <abbr title="Accessible Rich Interface Applications">ARIA</abbr> faire une case à cocher en image, pourvu qu’on la décrive comme <a hreflang="en" href="http://www.w3.org/TR/wai-aria/#checkbox">une case à cocher</a> (<code>role="checkbox"</code>) et qu’on indique son état, <a hreflang="en" href="http://www.w3.org/TR/wai-aria/#aria-checked">cochée</a> (<code>aria-checked</code>). C’est pratique pour faire des graphismes modernes, tout en permettant de ne pas sacrifier l’accessibilité au seul profit de ceux qui ont des yeux et une souris, pour résumer.</p>

<p>Quand <abbr title="Accessible Rich Interface Applications">ARIA</abbr> a été introduit, on ne parlait pas encore de <abbr title="Hypertext Markup Language">HTML</abbr> 5 au <abbr title="World Wide Web Consortium">W3C</abbr>&#160;: c’est <abbr title="eXtensible Hypertext Markup Language">XHTML</abbr> qui prévalait. Or en <abbr title="eXtensible Hypertext Markup Language">XHTML</abbr> une notion fondamentale est celle des espaces de nommage, permettant de rattacher au document courant (dont l’espace de nommage <abbr title="Hypertext Markup Language">HTML</abbr> est implicite) des extensions. <abbr title="Accessible Rich Interface Applications">ARIA</abbr> bénéficiait donc d’une déclaration dans le document pour permettre à chacun de ses attributs d’être déclaré avec le préfixe <code>aria:</code>. Par exemple le rôle d’un élément s’écrivait <code>aria:checkbox</code>. Facile.</p>

<p>Avec l’avènement de <abbr title="Hypertext Markup Language">HTML</abbr> 5 et ses choix différents en termes de formalisme, qui privilégient l’écriture de code avec la syntaxe <abbr title="Hypertext Markup Language">HTML</abbr>, <abbr title="Accessible Rich Interface Applications">ARIA</abbr> a dû faire machine arrière&#160;: tout a été renommé sans espace de nommage. Les deux points des propriétés spécifiques à <abbr title="Accessible Rich Interface Applications">ARIA</abbr> ont été remplacés par des tirets&#160;: <code>aria:checked</code> devient <code>aria-checked</code>. Certains attributs quant à eux, qui ont du sens même hors du contexte d’<abbr title="Accessible Rich Interface Applications">ARIA</abbr>, n’ont carrément pas de préfixe. C’est le cas de <code>role</code>, <a hreflang="en" href="http://www.w3.org/TR/xhtml2/mod-roleAttribute.html#s_roleAttributemodule">qui était prévu dans la spécification <abbr title="eXtensible Hypertext Markup Language">XHTML</abbr> 2</a>.</p>

<p>Pour l’accessibilité dans le monde réel, c’est presque une bonne chose&#160;: à ce jour, la revue d’écran la plus utilisée (Jaws) ne reconnaît pas les attributs préfixés. J’en ai fait la douloureuse expérience lorsque mon site est passé en <abbr title="eXtensible Hypertext Markup Language">XHTML</abbr>&#160;: Jaws ne comprenait pas les attributs <code>xml:lang</code> et les ignorait purement et simplement&#160;! (Il a fallu doubler tous ces attributs avec l’attribut <abbr title="Hypertext Markup Language">HTML</abbr> classique <code>lang</code>).</p>

<p>Oui mais voilà&#160;: et la validation dans tout ça&#160;?</p>

<p>À ce jour, le validateur du <abbr title="World Wide Web Consortium">W3C</abbr> s’appuie sur le <code>DOCTYPE</code> que vous déclarez dans votre code pour vérifier que vous respectez bien sa grammaire. Or dans une spécification ancienne (<abbr title="eXtensible Hypertext Markup Language">XHTML</abbr> 1.1 date de 2001), il n’était évidemment pas prévu d’intégrer des attributs dont on ignorait qu’ils existeraient un jour&#160;! Sans compter que la logique même d’extensibilité du <abbr title="eXtensible Hypertext Markup Language">XHTML</abbr> venait de l’idée qu’on intégrerait tout ça avec des espaces de nommage, donc l’extension était prévue, mais avec un formalisme que le brouillon courant de <abbr title="Hypertext Markup Language">HTML</abbr> 5 remet en cause. Bref, nous voilà au pied du mur&#160;: faut-il faire du code invalide, ou respecter maniaquement la spécification et trouver des contournements «&#160;légaux&#160;»&#160;?</p>

<h3 id="solution">Une solution&#160;: opter pour du code invalide</h3>

<p>La solution simple serait d’opter pour du code invalide. <a hreflang="en" href="http://www.meyerweb.com/">Eric Meyer</a> considère qu’on peut prôner les standards en étant fidèle à l’esprit mais pas toujours à la lettre&#160;: c’est ce qu’il appelle <em lang="en">standards-oriented</em>.</p>

<p>En l’occurrence, imaginons que j’aie écrit une page conforme et que j’y rajoute des attributs <abbr title="Accessible Rich Interface Applications">ARIA</abbr>. Elle devient non-valide, mais j’ignore les erreurs <strong>en connaissance de cause</strong> parce que je suis un développeur Web avisé, et que je sais que ça ne posera pas de souci aux navigateurs tout en améliorant l’accessibilité pour tous.</p>

<h3 id="attribut">Utiliser un attribut <abbr title="Hypertext Markup Language">HTML</abbr> existant et manipuler ses valeurs avec JavaScript</h3>

<p>La deuxième solution est plus sportive&#160;: je crée du code valide, et je profite de JavaScript pour ajouter les attributs qui me manquent.</p>

<p>Cas classique&#160;: je repère l’élément via son <code>id</code> (identifiant unique dans la page), et j’ajoute le ou les attributs dont j’ai besoin pour faire de l’<abbr title="Accessible Rich Interface Applications">ARIA</abbr>.</p>

<p>Oui mais&#160;: tous mes éléments ne sont pas forcément nommés, pourtant je risque d’avoir besoin de nombreux endroits auxquels me raccrocher pour ajouter des propriétés <abbr title="Accessible Rich Interface Applications">ARIA</abbr>.</p>

<p>Le plus simple sera alors d’utiliser un attribut <abbr title="Hypertext Markup Language">HTML</abbr>, d’en extraire le contenu et de générer les attribut <abbr title="Accessible Rich Interface Applications">ARIA</abbr> à partir de là.</p>

<h3 id="quel_attribut">Quel attribut choisir&#160;?</h3>

<p>J’ai déjà vu des gens utiliser l’attribut <code>rel</code> des liens, par exemple pour faire des <em>popins</em> (<code>rel="popin,450,300"</code> indique qu’à ce lien sera ajouté un comportement JavaScript d’affichage de la popin, et les dimensions de ladite <em>popin</em>). Pour ma part j’en suis très gêné, il me semble qu’il s’agit là d’un détournement assez osé de l’attribut. Par ailleurs, ça ne fonctionne que sur des liens&#160;; il faut donc trouver un attribut plus générique.</p>

<p>En revanche, la bonne idée depuis plusieurs années, c’est tout de même qu’on tente de ne pas mettre de comportement dans le code. On s’appuie sur le <abbr title="Document Object Model">DOM</abbr> pour inventorier les éléments auxquels affecter tel ou tel comportement, souvent en passant par l’attribut <code>class</code>. Pour revenir à notre exemple de <em>popins</em>, il y a quelques années on aurait fait la même chose en <em>popup</em>, en s’appuyant sur la classe&#160;: <code>class="popup"</code>.</p>

<p>Essayons donc de nous appuyer sur la classe&#160;: il nous semble moins nocif d’utiliser cet attribut plutôt qu’un autre.</p>

<h3 id="quelle_methode">Quelle méthode&#160;?</h3>

<p>Maintenant que nous avons choisi la classe, quelle convention d’écriture adopter pour tous ces attributs&#160;?</p>

<p>Première proposition, utiliser une notation héritée de <abbr title="JavaScript Object Notation">JSON</abbr>&#160;: <code>class="{role:contentinfo;}"</code>. Son intérêt c’est qu’elle est facile à interpréter, et qu’elle sera extensible si nous devons ajouter plusieurs attributs&#160;: <code>class="{role:checkbox;aria-checked:true;}"</code>. Son gros défaut c’est qu’elle a l’apparence d’une verrue dans le code, sans compter que cette notation ressemble suffisamment à la notation classique des paires propriété / valeur de <abbr title="Cascading Style Sheets">CSS</abbr> pour au mieux prêter à confusion chez le développeur moins au fait que vous, au pire faire tousser un navigateur dont le <em>parseur</em> de code y reconnaîtrait de la <abbr title="Cascading Style Sheets">CSS</abbr> (scénario catastrophe, me direz-vous&#160;; oui mais on a déjà vu pire dans certains navigateurs).</p>

<p>Deuxième proposition&#160;: utiliser une notation à base de tirets, <code>class="role-contentinfo"</code>, et manipuler la chaîne en l’explosant pour générer l’attribut et sa valeur.</p>

<h3 id="situations">Deux situations à différencier</h3>

<p>Attention cependant, <abbr title="Accessible Rich Interface Applications">ARIA</abbr> propose une approche deux-en-un&#160;:</p>

<ol>
<li><p>description d’éléments de structure de la page à travers le rôle (les <em lang="en">landmarks</em>)&#160;;</p></li>
<li><p>description d’éléments interactifs (typiquement les éléments de formulaire).</p></li>
</ol>

<p>Selon moi ces deux cas peuvent impliquer une approche différente&#160;: le premier cas doit tant qu’à faire fonctionner même sans JavaScript, le deuxième n’a souvent de sens que si JavaScript fonctionne (puisque le changement dynamique d’état ne peut se faire qu’avec JavaScript).</p>

<h3 id="conclusion">Conclusion</h3>

<p>Je serais enclin à faire du code invalide, en particulier dans le cas des <em lang="en">landmarks</em>, mais plus partagé sur les propriétés dynamiques (rôles et états des éléments interactifs).</p>

<p>À votre avis&#160;? Faut-il du code invalide, et si oui, quelle méthode choisiriez-vous&#160;?</p>
 <!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://www.htmlzengarden.com/2009/11/aria-et-validation-comment-faire/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Colonnes CSS fluides</title>
		<link>http://www.htmlzengarden.com/2009/10/colonnes_css_fluides/</link>
		<comments>http://www.htmlzengarden.com/2009/10/colonnes_css_fluides/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 14:30:41 +0000</pubDate>
		<dc:creator>Vincent</dc:creator>
				<category><![CDATA[Réflexions]]></category>
		<category><![CDATA[colonnes]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://www.htmlzengarden.com/?p=731</guid>
		<description><![CDATA[   Je découvre tout à fait par hasard ce billet de Nicole qui expose une solution très intéressante pour faire des colonnages.

L&#8217;astuce consiste à placer la propriété overflow sur le contenu, pour que celui-ci puisse s&#8217;adapter en fonction de son contexte&#160;: il n&#8217;est alors plus besoin de lui préciser une largeur. On peut [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_STOP --> <p><a class="read" onclick="readpage(this.href, 731);this.blur();return false;" href="http://wr.readspeaker.com/webreader/webreader.php?cid=18c69dd51a2bc0f4d305318e0fa39bc3&amp;t=wordpress&amp;url=http://www.htmlzengarden.com/2009/10/colonnes_css_fluides/"><img src="http://graphics.readspeaker.com/images/wr/listen_fr_fr.gif" alt="Lis moi avec webReader" /></a></p><div class="read-bloc" id="WR_731"></div> <!-- RSPEAK_START --> <p>Je découvre tout à fait par hasard <a href="http://www.stubbornella.org/content/2009/07/23/overflow-a-secret-benefit/">ce billet de Nicole qui expose une solution très intéressante pour faire des colonnages</a>.</p>

<p>L&#8217;astuce consiste à placer la propriété <code>overflow</code> sur le contenu, pour que celui-ci puisse s&#8217;adapter en fonction de son contexte&#160;: il n&#8217;est alors plus besoin de lui préciser une largeur. On peut alors, modifier la largeur de la colonne, en ajouter, en supprimer&#160;: le contenu s&#8217;adaptera toujours.</p>

<p>Elle utilise d&#8217;ailleurs cette technique sur <a href="http://oocss.org/template.html">son projet Object-Oriented CSS</a>.</p>

<p>Seules précautions à prendre pour IE 6&#160;:</p>

<ul>
<li>appliquer un <code>hasLayout</code> (via un <code>zoom:1</code> ou un <code>height:1%</code> au contenu&#160;;</li>
<li>ne pas oublier de corriger le &laquo;&nbsp;<a href="http://www.positioniseverything.net/explorer/threepxtest.html">Three Pixel Text Jog</a>&nbsp;&raquo; (via un <code>margin-left:-3px</code> ou <code>margin-right:-3px;</code>).</li>
</ul>

<p>Seuls inconvénients trouvés&#160;:</p>

<ul>
<li>l&#8217;impossibilité de &laquo;&nbsp;faire sortir&nbsp;&raquo; un élément en dehors du cadre contenu, celui-ci ayant un <code>overflow</code>&#160;;</li>
<li>l&#8217;ordre du contenu qui se trouve inversé par rapport à l&#8217;affichage lorsqu&#8217;on utilise une colonne placée à droite.</li>
</ul>

<p><a href="http://www.htmlzengarden.com/colonnes.html">Mon petit fichier de tests est ici si vous le souhaitez</a>.</p>
 <!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://www.htmlzengarden.com/2009/10/colonnes_css_fluides/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Pré-remplir les champs textes (suite)</title>
		<link>http://www.htmlzengarden.com/2009/10/pre-remplir_les_champs_textes_suite/</link>
		<comments>http://www.htmlzengarden.com/2009/10/pre-remplir_les_champs_textes_suite/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 12:37:03 +0000</pubDate>
		<dc:creator>Vincent</dc:creator>
				<category><![CDATA[Réflexions]]></category>
		<category><![CDATA[accessibilité]]></category>
		<category><![CDATA[formulaires]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[sémantique]]></category>

		<guid isPermaLink="false">http://www.htmlzengarden.com/?p=707</guid>
		<description><![CDATA[   Je déterre ce vieux billet sur les champs textes car il était plein de bonnes idées dans les commentaires.

Tac, tac, tac&#160;! Reprenons svp&#160;!

Je laisse de côté le placeholder qui pour l&#8217;instant n&#8217;est pas envisageable (mais qui à terme viendra remplacer tout ça).

Yves poussait une idée intéressante avec le kbd. Ça pourrait donner [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_STOP --> <p><a class="read" onclick="readpage(this.href, 707);this.blur();return false;" href="http://wr.readspeaker.com/webreader/webreader.php?cid=18c69dd51a2bc0f4d305318e0fa39bc3&amp;t=wordpress&amp;url=http://www.htmlzengarden.com/2009/10/pre-remplir_les_champs_textes_suite/"><img src="http://graphics.readspeaker.com/images/wr/listen_fr_fr.gif" alt="Lis moi avec webReader" /></a></p><div class="read-bloc" id="WR_707"></div> <!-- RSPEAK_START --> <p>Je déterre <a href="http://www.htmlzengarden.com/2008/12/pre-remplir_les_champs_textes/">ce vieux billet sur les champs textes</a> car il était plein de bonnes idées dans les commentaires.</p>

<p>Tac, tac, tac&#160;! Reprenons <abbr title="s'il vous plaît">svp</abbr>&#160;!</p>

<p>Je laisse de côté le <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/forms.html#attr-input-placeholder"><code>placeholder</code></a> qui pour l&#8217;instant n&#8217;est pas envisageable (mais qui à terme viendra remplacer tout ça).</p>

<p><a href="http://yves.vg">Yves</a> poussait une idée intéressante avec le <a href="http://www.w3.org/TR/html401/struct/text.html#h-9.2.1"><code>kbd</code></a>. Ça pourrait donner ça&#160;:</p>

<pre><code>&lt;p&gt;
   &lt;label for="courriel"&gt;Courriel&lt;/label&gt;
   &lt;input type="text" id="courriel" name="courriel" value="" class="exemple" /&gt;
   &lt;kbd&gt;courriel@exemple.com&lt;/kbd&gt;
&lt;/p&gt;
</code></pre>

<p>Reste à savoir si c&#8217;est une bonne interprétation de la spécification&#160;:</p>

<blockquote>
  <dl>
  <dt>KBD</dt>
  <dd>Indicates text to be entered by the user.</dd>
  </dl>
</blockquote>

<p>Je met de côté <a href="http://www.w3.org/TR/html401/struct/text.html#h-9.2.1"><code>samp</code></a> qui semble plus indiqué pour des <strong>résultats.</strong></p>

<p>Couplé à un petit <abbr title="JavaScript">JS</abbr> ça pourrait le faire non&#160;?</p>

<p><strong><abbr title="JavaScript">JS</abbr></strong></p>

<pre><code>jQuery(champs).each(function(){
    var exemple = 'ex';
    var that = jQuery(this);
    var papa = 'p';
    var fiston = 'kbd';
    var key = that.parent(papa).children(fiston);
    key.hide();
    that.addClass(exemple).val(key.text());
    that.focus(function(){
       if(that.val()==key.text())
          that.removeClass(exemple).val('');
    });
    that.blur(function(){
       if(that.val()=='')
          that.addClass(exemple).val(key.text());
    });
});
champs('input.exemple');
</code></pre>

<p><strong><abbr>CSS</abbr></strong></p>

<pre><code>.ex
{
    color:#DDD;
    background-color:inherit;
}
</code></pre>

<p>Ou encore mieux si on a la place&#160;:</p>

<ul>
<li>ne pas ajouter de script&#160;;</li>
<li>laisser l&#8217;exemple à côté&#160;;</li>
<li>et se servir de <code>value=""</code> pour les cas d&#8217;erreur (à corriger sans tout avoir à re-saisir).</li>
</ul>

<p>Ainsi&#160;:</p>

<p><strong><abbr>HTML</abbr></strong></p>

<pre><code>&lt;p&gt;
   &lt;label for="courriel"&gt;Courriel&lt;/label&gt;
   &lt;input type="text" id="courriel" name="courriel" value="vincentàhtmlzengarden.com" class="erreur" /&gt;
   &lt;kbd&gt;courriel@exemple.com&lt;/kbd&gt;
&lt;/p&gt;
</code></pre>

<p><strong><abbr>CSS</abbr></strong></p>

<pre><code>.erreur
{
    font-weight:bold;
    color:#F00;
    background-color:inherit;
}
</code></pre>

<p>Reste une question&#160;: faut-il placer le <code>kbd</code> <strong>avant</strong> le champs pour des soucis d&#8217;accessibilité&#160;?</p>

<p><strong><abbr>HTML</abbr></strong></p>

<pre><code>&lt;p&gt;
   &lt;label for="courriel"&gt;Courriel&lt;/label&gt;
   (&lt;kbd&gt;courriel@exemple.com&lt;/kbd&gt;)
   &lt;input type="text" id="courriel" name="courriel" value="vincentàhtmlzengarden.com" class="erreur" /&gt;
&lt;/p&gt;
</code></pre>

<p>ou</p>

<pre><code>&lt;p&gt;
   &lt;label for="courriel"&gt;Courriel (&lt;kbd&gt;courriel@exemple.com&lt;/kbd&gt;)&lt;/label&gt;
   &lt;input type="text" id="courriel" name="courriel" value="vincentàhtmlzengarden.com" class="erreur" /&gt;
&lt;/p&gt;
</code></pre>

<p>Ou encore lui placer également un label&#160;?</p>

<p><strong><abbr>HTML</abbr></strong></p>

<pre><code>&lt;p&gt;
   &lt;label for="courriel"&gt;Courriel&lt;/label&gt;
   &lt;input type="text" id="courriel" name="courriel" value="vincentàhtmlzengarden.com" class="erreur" /&gt;
   &lt;label for="courriel"&gt;&lt;kbd&gt;courriel@exemple.com&lt;/kbd&gt;&lt;/label&gt;
&lt;/p&gt;
</code></pre>

<p>À vos claviers&#160;!</p>

<p><abbr>PS</abbr>&#160;: <a href="/champs.html">l&#8217;exemple est ligne</a> est ici.</p>
 <!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://www.htmlzengarden.com/2009/10/pre-remplir_les_champs_textes_suite/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Où placer les cases à cocher et les boutons radios&#160;?</title>
		<link>http://www.htmlzengarden.com/2009/10/ou_placer_les_cases_a_cocher_et_les_boutons_radios/</link>
		<comments>http://www.htmlzengarden.com/2009/10/ou_placer_les_cases_a_cocher_et_les_boutons_radios/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 10:30:15 +0000</pubDate>
		<dc:creator>Vincent</dc:creator>
				<category><![CDATA[Réflexions]]></category>
		<category><![CDATA[ergonomie]]></category>
		<category><![CDATA[formulaires]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://www.htmlzengarden.com/?p=687</guid>
		<description><![CDATA[   Je traine quelques questions récurrentes (d&#8217;ordre technique ou ergonomique) depuis que je fais des formulaires.
Et vu que je suis sympa, je partage un peu avec vous.

Habituellement on fait ça&#160;:


    
            Civilit&#233;
        [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_STOP --> <p><a class="read" onclick="readpage(this.href, 687);this.blur();return false;" href="http://wr.readspeaker.com/webreader/webreader.php?cid=18c69dd51a2bc0f4d305318e0fa39bc3&amp;t=wordpress&amp;url=http://www.htmlzengarden.com/2009/10/ou_placer_les_cases_a_cocher_et_les_boutons_radios/"><img src="http://graphics.readspeaker.com/images/wr/listen_fr_fr.gif" alt="Lis moi avec webReader" /></a></p><div class="read-bloc" id="WR_687"></div> <!-- RSPEAK_START --> <p>Je traine quelques questions récurrentes (d&#8217;ordre technique ou ergonomique) depuis que je fais des formulaires.
Et vu que je suis sympa, je partage un peu avec vous.</p>

<p>Habituellement on fait ça&#160;:</p>

<form action="#" style="background-color:#FFF;color:inherit;">
    <fieldset style="padding:1em;margin-bottom:1em;">
            <legend style="padding:0 0.5em;">Civilit&eacute;</legend>
        <p style="clear:both;">
            <label style="float:left;width:140px;text-align:right;margin-right:10px;" class="intitule" for="nom">Nom&#160;: </label><input id="nom" name="nom" type="text" value="" class="text" />
        </p>
        <p style="clear:both;">
            <label style="float:left;width:140px;text-align:right;margin-right:10px;" class="intitule" for="prenom">Pr&eacute;nom&#160;: </label><input id="prenom" name="prenom" type="text" value="" class="text" />
        </p>
        <p style="clear:both;">
                <span style="float:left;width:140px;text-align:right;margin-right:10px;" class="intitule"><input class="checkbox" type="checkbox" name="majeur" id="majeur" /></span>
                <label for="majeur">Majeur</label>
            </p>
        <fieldset style="padding:1em 1em 1em 0;">
                <legend style="padding:0 0.5em;">Sexe</legend>
                <p style="clear:both;">
                        <span style="float:left;width:140px;text-align:right;margin-right:10px;" class="intitule"><input class="radio" type="radio" name="sexe" id="homme" /></span>
                    <label for="homme">Homme</label>
            </p>
                <p style="clear:both;">
                        <span style="float:left;width:140px;text-align:right;margin-right:10px;" class="intitule"><input class="radio" type="radio" name="sexe" id="femme" /></span>
                    <label for="femme">Femme</label>
            </p>
            </fieldset>
    </fieldset>
</form>

<p>Et moi, j&#8217;ai tendance à proposer cette solution (qui est généralement refusée)&#160;:</p>

<form action="#" style="background-color:#FFF;color:inherit;">
    <fieldset style="padding:1em;margin-bottom:1em;">
            <legend style="padding:0 0.5em;">Civilit&eacute;</legend>
        <p style="clear:both;">
            <label style="float:left;width:140px;text-align:right;margin-right:10px;" class="intitule" for="nom2">Nom&#160;: </label><input id="nom2" name="nom2" type="text" value="" class="text" />
        </p>
        <p style="clear:both;">
            <label style="float:left;width:140px;text-align:right;margin-right:10px;" class="intitule" for="prenom2">Pr&eacute;nom&#160;: </label><input id="prenom2" name="prenom2" type="text" value="" class="text" />
        </p>
        <p style="clear:both;">
                <label style="float:left;width:140px;text-align:right;margin-right:10px;" class="intitule" for="majeur2">Majeur&#160;:</label>
                <input class="checkbox" type="checkbox" name="majeur2" id="majeur2" />
        </p>
            <fieldset style="padding:1em 1em 1em 0;">
            <legend style="padding:0 0.5em;">Sexe</legend>
                <p style="clear:both;">
                        <label style="float:left;width:140px;text-align:right;margin-right:10px;" class="intitule" for="homme2">Homme&#160;:</label>
                        <input class="radio" type="radio" name="sexe2" id="homme2" />
                </p>
                <p style="clear:both;">
                        <label style="float:left;width:140px;text-align:right;margin-right:10px;" class="intitule" for="femme2">Femme&#160;:</label>
                        <input class="radio" type="radio" name="sexe2" id="femme2" />
                </p>
            </fieldset>
    </fieldset>
</form>

<p>Alors, boutons radios et cases à cocher&#160;: à droite ou à gauche&#160;?</p>
 <!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://www.htmlzengarden.com/2009/10/ou_placer_les_cases_a_cocher_et_les_boutons_radios/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Font-face est-il mûr&#160;?</title>
		<link>http://www.htmlzengarden.com/2009/10/font-face_est-il_mur/</link>
		<comments>http://www.htmlzengarden.com/2009/10/font-face_est-il_mur/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 14:37:16 +0000</pubDate>
		<dc:creator>Vincent</dc:creator>
				<category><![CDATA[Réflexions]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[font-face]]></category>
		<category><![CDATA[typographie]]></category>

		<guid isPermaLink="false">http://www.htmlzengarden.com/?p=664</guid>
		<description><![CDATA[   Depuis quelques temps, il existe enfin une alternative robuste pour obtenir des «&#160;titres images&#160;».
Oubliez les images, sIFR, typeface ou autre Cufón car font-face est là et il l&#8217;est presque partout&#160;!

En effet il est supporté par&#160;:


Opera 10+&#160;;
Safari 3.1+&#160;;
Firefox 3.5+&#160;;
Internet Explorer 5.0+ (avec un format particulier certes).


Reste sur le bord de la route&#160;:


les anciennes [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_STOP --> <p><a class="read" onclick="readpage(this.href, 664);this.blur();return false;" href="http://wr.readspeaker.com/webreader/webreader.php?cid=18c69dd51a2bc0f4d305318e0fa39bc3&amp;t=wordpress&amp;url=http://www.htmlzengarden.com/2009/10/font-face_est-il_mur/"><img src="http://graphics.readspeaker.com/images/wr/listen_fr_fr.gif" alt="Lis moi avec webReader" /></a></p><div class="read-bloc" id="WR_664"></div> <!-- RSPEAK_START --> <p>Depuis quelques temps, il existe enfin une alternative robuste pour obtenir des «&#160;titres images&#160;».
Oubliez les images, <a href="http://wiki.novemberborn.net/sifr3/">sIFR</a>, <a href="http://typeface.neocracy.org/">typeface</a> ou autre <a href="http://cufon.shoqolate.com/generate/">Cufón</a> car <strong><a href="http://www.w3.org/TR/css3-fonts/#the-font-face-rule"><code>font-face</code></a> est là et il l&#8217;est presque partout&#160;!</strong></p>

<p>En effet il est supporté par&#160;:</p>

<ul>
<li>Opera 10+&#160;;</li>
<li>Safari 3.1+&#160;;</li>
<li>Firefox 3.5+&#160;;</li>
<li>Internet Explorer 5.0+ (avec un format particulier certes).</li>
</ul>

<p>Reste sur le bord de la route&#160;:</p>

<ul>
<li>les anciennes versions d&#8217;Opera&#160;;</li>
<li>les anciennes versions de Firefox&#160;;</li>
<li>les anciennes versions de Safari&#160;;</li>
<li>Google Chrome (<a href="http://paulirish.com/2009/chrome-and-font-face-a-summary/">mais ça arrive pour bientôt</a>).</li>
</ul>

<p>Pour ces navigateurs, il suffira alors de se servir de l&#8217;ordre de priorité des polices définies dans <a href="http://www.yoyodesign.org/doc/w3c/css2/fonts.html#font-family-prop"><code>font-family</code></a> pour obtenir une dégradation gracieuse.</p>

<p>Seule contrainte donc, fournir deux formats de police pour satisfaire Internet Explorer. Cet <a href="http://code.google.com/p/ttf2eot/">outil de convertion</a> vous aidera à produire la version <abbr title="Embedded OpenType">EOT</abbr> de votre <abbr title="TrueType Fonts">TTF</abbr> favorite.</p>

<p>Reste à <strong>ne pas abuser de l&#8217;effet afin de ne pas surcharger le poids de vos pages,</strong> et à <strong>bien respecter les législations</strong> en utilisant des polices libres de droits.</p>

<p>Dans le cas contraire, je vous recommande chaudement <a href="http://www.codestyle.org/css/font-family/">ce site, qui liste le support (par pourcentage) des polices sur les principaux OS</a>.</p>

<pre><code>@font-face
{
    font-family:'Scrogglet';  
    src:url(Scrogglet.eot);
    src:local('Scrogglet'),url(Scrogglet.ttf) format('truetype');
}
h1
{
    font-family:Scrogglet,Monaco,'Palatino Linotype',sans-serif;
}
</code></pre>

<p>Un bon exemple est disponible chez <a href="http://yves.vg/">Yves Van Goethem</a> dans le titre de sa page&#160;: c&#8217;est lui qui m&#8217;a soufflé cette idée d&#8217;article&#160;!</p>

<p>Et en plus c&#8217;est son anniversaire aujourd&#8217;hui&#160;!</p>

<p>Sources&#160;:</p>

<ul>
<li><a href="http://randsco.com/index.php/2009/07/04/p680">xBrowser Fonts</a></li>
<li><a href="http://www.alsacreations.com/astuce/lire/630-fonte-personnalisee-site-web.html">Comment utiliser une fonte «non-standard» sur un site Web&#160;?</a></li>
</ul>
 <!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://www.htmlzengarden.com/2009/10/font-face_est-il_mur/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Ancres et déplacement progressif de l&#8217;ascenseur</title>
		<link>http://www.htmlzengarden.com/2009/10/ancres_et_deplacement_progressif_de_l_ascenseur/</link>
		<comments>http://www.htmlzengarden.com/2009/10/ancres_et_deplacement_progressif_de_l_ascenseur/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 10:12:56 +0000</pubDate>
		<dc:creator>Vincent</dc:creator>
				<category><![CDATA[Réflexions]]></category>
		<category><![CDATA[accessibilité]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.htmlzengarden.com/?p=652</guid>
		<description><![CDATA[   Une fois n&#8217;est pas coutume, voici un petit script jQuery.

NB&#160;: Stéphane soulève un problème d&#8217;accessibilité dans les commentaires, ne passez pas outre.

Il permet lors de l&#8217;activation d&#8217;une ancre de déplacer progressivement l&#8217;ascenseur de la page en fonction. J&#8217;aime personnellement beaucoup cet effet car je trouve qu&#8217;il rend plus compréhensible l&#8217;utilisation des ancres.

var [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_STOP --> <p><a class="read" onclick="readpage(this.href, 652);this.blur();return false;" href="http://wr.readspeaker.com/webreader/webreader.php?cid=18c69dd51a2bc0f4d305318e0fa39bc3&amp;t=wordpress&amp;url=http://www.htmlzengarden.com/2009/10/ancres_et_deplacement_progressif_de_l_ascenseur/"><img src="http://graphics.readspeaker.com/images/wr/listen_fr_fr.gif" alt="Lis moi avec webReader" /></a></p><div class="read-bloc" id="WR_652"></div> <!-- RSPEAK_START --> <p>Une fois n&#8217;est pas coutume, voici un petit script jQuery.</p>

<p><strong><abbr title="Nota-bene">NB</abbr>&#160;:</strong> <a href="http://www.nota-bene.org/">Stéphane</a> soulève un problème d&#8217;accessibilité dans les commentaires, ne passez pas outre.</p>

<p>Il permet lors de l&#8217;activation d&#8217;une ancre de déplacer progressivement l&#8217;ascenseur de la page en fonction. J&#8217;aime personnellement beaucoup cet effet car je trouve qu&#8217;il rend plus compréhensible l&#8217;utilisation des ancres.</p>

<pre><code>var scrolling = function(){
    var speed     = 1000;
    jQuery('a[href^="#"]').bind('click',function(){
        var id = jQuery(this).attr('href');
        if(id == '#')
            goTo('body');
        else
            goTo(id);
        return(false);
    });
    function goTo(ancre){jQuery('html,body').animate({scrollTop:jQuery(ancre).offset().top},speed,'swing',function(){
            if(ancre != 'body')
                window.location.hash = ancre;
            else
                window.location.hash = '#';
            jQuery(ancre).attr('tabindex','-1');
            jQuery(ancre).focus();
            jQuery(ancre).removeAttr('tabindex');
        });
    }
};
</code></pre>

<p>Point par point, cela donne&#160;:</p>

<pre><code>var scrolling = function(){
</code></pre>

<p>Déclaration de la fonction, qui sera à déclencher au chargement de la page.</p>

<pre><code>    var speed     = 1000;
</code></pre>

<p>On choisi une vitesse pour l&#8217;effet. Ce paramètre peut être modifié à loisir.</p>

<pre><code>    jQuery('a[href^="#"]').bind('click',function(){
</code></pre>

<p>On intercepte le <code>click</code> sur les liens qui renvoient vers des ancres&#8230;</p>

<pre><code>        var id = jQuery(this).attr('href');
        if(id == '#')
            goTo('body');
        else
            goTo(id);
        return(false);
</code></pre>

<p>Et on déclenche la fonction d&#8217;animation en fonction de la destination (haut de page ou ancre). On annule ensuite le comportement par défaut du lien.</p>

<pre><code>    function goTo(ancre){jQuery('html,body').animate({scrollTop:jQuery(ancre).offset().top},speed,'swing',function(){
</code></pre>

<p>L&#8217;astuce repose sur l&#8217;utilisation de la fonction <code>animate</code>, qui pour le coup simplifie bien le code.</p>

<pre><code>            if(ancre != 'body')
                window.location.hash = ancre;
            else
                window.location.hash = '#';
</code></pre>

<p>En <code>callback</code>, on prend soin de changer le <code>hash</code> dans la barre d&#8217;adresse pour ne pas différer du comportement normal.</p>

<pre><code>            jQuery(ancre).attr('tabindex','-1');
            jQuery(ancre).focus();
            jQuery(ancre).removeAttr('tabindex');
        });
    }
};
</code></pre>

<p>On place enfin un <code>tabindex</code> négatif sur l&#8217;ancre, afin de pouvoir ensuite forcer le <code>focus</code> dessus. Ainsi, logiquement, même les lecteurs d&#8217;écrans devraient s&#8217;y retrouver.</p>

<p>On termine enfin par un peu de ménage.</p>

<p>N&#8217;hésitez pas à critiquer le tout&#160;! La <a href="/scrolling.html">démo est disponible ici</a>.</p>
 <!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://www.htmlzengarden.com/2009/10/ancres_et_deplacement_progressif_de_l_ascenseur/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Attributs summary et alt vides</title>
		<link>http://www.htmlzengarden.com/2009/09/attributs_summary_et_alt_vides/</link>
		<comments>http://www.htmlzengarden.com/2009/09/attributs_summary_et_alt_vides/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 08:35:10 +0000</pubDate>
		<dc:creator>Vincent</dc:creator>
				<category><![CDATA[Réflexions]]></category>
		<category><![CDATA[accessiblité]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://www.htmlzengarden.com/?p=640</guid>
		<description><![CDATA[   J&#8217;ai tendance à trouver équivalents l&#8217;attribut alt (que l&#8217;on place sur les images pour l&#8217;alternative texte) et l&#8217;attribut summary (que l&#8217;on place sur les tableaux pour le résumé du tableaux).

Aussi s&#8217;il me semble logique de placer un alt vide sur une image destinée à la présentation&#160;:

    &#60;img src="ornement.jpg" alt="" [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_STOP --> <p><a class="read" onclick="readpage(this.href, 640);this.blur();return false;" href="http://wr.readspeaker.com/webreader/webreader.php?cid=18c69dd51a2bc0f4d305318e0fa39bc3&amp;t=wordpress&amp;url=http://www.htmlzengarden.com/2009/09/attributs_summary_et_alt_vides/"><img src="http://graphics.readspeaker.com/images/wr/listen_fr_fr.gif" alt="Lis moi avec webReader" /></a></p><div class="read-bloc" id="WR_640"></div> <!-- RSPEAK_START --> <p>J&#8217;ai tendance à trouver équivalents l&#8217;attribut <code>alt</code> (que l&#8217;on place sur les images pour l&#8217;alternative texte) et l&#8217;attribut <code>summary</code> (que l&#8217;on place sur les tableaux pour le résumé du tableaux).</p>

<p>Aussi s&#8217;il me semble logique de placer un <code>alt</code> vide sur une image destinée à la présentation&#160;:</p>

<pre><code>    &lt;img src="ornement.jpg" alt="" title="" width="10" height="100" /&gt;
</code></pre>

<p>À l&#8217;inverse de cette solution qui n&#8217;est évidemment pas conseillée&#160;:</p>

<pre><code>    &lt;img src="ornement.jpg" alt="Image de présentation" title="" width="10" height="100" /&gt;
</code></pre>

<p>Il me semble donc logique de placer un <code>summary</code> vide sur un tableau destiné à la présentation&#160;:</p>

<pre><code>    &lt;table summary=""&gt;
        &lt;tr&gt;
            &lt;td&gt;Colonne A&lt;/td&gt;
            &lt;td&gt;Colonne B&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/table&gt;
</code></pre>

<p>Je crois avoir vu le conseil inverse ailleurs&#8230; je sollicite donc vos avis avisés&#160;!</p>
 <!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://www.htmlzengarden.com/2009/09/attributs_summary_et_alt_vides/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
