<?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 Jun 2010 22:12:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Coder plus rapidement avec Zen-coding</title>
		<link>http://www.htmlzengarden.com/2010/06/coder_plus_rapidement_avec_zen-coding/</link>
		<comments>http://www.htmlzengarden.com/2010/06/coder_plus_rapidement_avec_zen-coding/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 22:10:39 +0000</pubDate>
		<dc:creator>Vincent</dc:creator>
				<category><![CDATA[Bonnes pratiques]]></category>
		<category><![CDATA[zen coding html css éditeur]]></category>

		<guid isPermaLink="false">http://www.htmlzengarden.com/?p=892</guid>
		<description><![CDATA[Zen-coding&#160;: Smashing Magazine a consacré récemment un tutoriel sur le sujet&#160;; quelques curieux s&#8217;y essayent en ce moment sur Twitter. Suffisamment d&#8217;éléments pour donner envie d&#8217;en parler un peu ici. Il faut dire aussi que je suis plutôt convaincu par les possibilités offertes. De quoi s&#8217;agit-il exactement&#160;? Zen-coding propose simplement quelques automatisations qui viennent se [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_STOP --> <p><a class="read" onclick="readpage(this.href, 892);this.blur();return false;" href="http://wr.readspeaker.com/webreader/webreader.php?cid=18c69dd51a2bc0f4d305318e0fa39bc3&amp;t=wordpress&amp;url=http://www.htmlzengarden.com/2010/06/coder_plus_rapidement_avec_zen-coding/"><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_892"></div> <!-- RSPEAK_START --> <p><a href="http://code.google.com/p/zen-coding/">Zen-coding</a>&#160;:</p>

<ul>
<li><a href="http://www.smashingmagazine.com/2009/11/21/zen-coding-a-new-way-to-write-html-code/">Smashing Magazine a consacré récemment un tutoriel sur le sujet</a>&#160;;</li>
<li><a href="http://search.twitter.com/search?q=%22zen+coding%22+OR+zencoding">quelques curieux s&#8217;y essayent en ce moment sur Twitter</a>.</li>
</ul>

<p>Suffisamment d&#8217;éléments pour donner envie d&#8217;en parler un peu ici. Il faut dire aussi que je suis plutôt convaincu par les possibilités offertes.</p>

<h3>De quoi s&#8217;agit-il exactement&#160;?</h3>

<p>Zen-coding propose simplement quelques <strong>automatisations</strong> qui viennent se greffer sur votre éditeur habituel.</p>

<p>La fonctionnalité principale (implémentée en premier sur les éditeurs) est basée sur la syntaxe des sélecteurs <abbr>CSS</abbr>&#160;: idéal pour ne pas être dérouté.</p>

<p>Par exemple si j&#8217;entre&#160;:</p>

<pre><code>div#content&gt;p.intro+ul&gt;li*3&gt;a
</code></pre>

<p>J&#8217;obtiens immédiatement&#160;:</p>

<pre><code>&lt;div id="content"&gt;
    &lt;p class="intro"&gt;&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;a href=""&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=""&gt;&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href=""&gt;&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;
</code></pre>

<p>On joue donc entre les <strong>sélecteurs enfants et adjacents</strong> pour construire sa structure d&#8217;une ligne.</p>

<p>Les &laquo;&nbsp;abréviations&nbsp;&raquo; permettent également donc de générer <a href="http://code.google.com/p/zen-coding/wiki/ZenHTMLSelectorsEn">un grand nombre d&#8217;éléments <abbr>HTML</abbr> pré-construits</a> ainsi que <a href="http://code.google.com/p/zen-coding/wiki/ZenHTMLSelectorsEn">des propriétés <abbr>CSS</abbr></a>.</p>

<p>Tout cela est très efficace, d&#8217;autant qu&#8217;une fois le code généré, il suffira de <strong>tabuler</strong> pour que l&#8217;éditeur fasse passer votre curseur sur les endroits où du contenu doit être ajouté.</p>

<p>Sur l&#8217;exemple précédent, c&#8217;est&#160;:</p>

<pre><code>&lt;div id="content"&gt;
    &lt;p class="intro"&gt;ici,&lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;&lt;a href="ici,"&gt;ici,&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="ici,"&gt;ici,&lt;/a&gt;&lt;/li&gt;
        &lt;li&gt;&lt;a href="ici,"&gt;et ici.&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;
</code></pre>

<p>Autre fonctionnalité intéressante&#160;: la possibilité de <strong>sélectionner</strong> de manière progressive des portions de code. Toujours en reprenant l&#8217;exemple précédent, et en supposant que je place mon curseur entre &laquo;&nbsp;et&nbsp;&raquo; et &laquo;&nbsp;ici.&nbsp;&raquo;, à chaque fois que je déclenche la fonctionnalité je sélectionne&#160;:</p>

<ul>
<li><code>et ici.</code>&#160;;</li>
<li><code>&lt;a href="ici,"&gt;et ici.&lt;/a&gt;</code>&#160;;</li>
<li><code>&lt;li&gt;&lt;a href="ici,"&gt;et ici.&lt;/a&gt;&lt;/li&gt;</code>&#160;;</li>
<li><abbr title="et cætera">etc.</abbr></li>
</ul>

<p>Et bien sûr la sélection est faite de manière à pouvoir supprimer le bloc proprement d&#8217;un coup.</p>

<p>Arrive également la possibilité d&#8217;ajouter <strong>autour</strong> de la structure sélectionnée une nouvelle abréviation.</p>

<p>Je peux par exemple facilement produire en quelques raccourcis claviers&#160;:</p>

<pre><code>&lt;div id="content"&gt;
    &lt;p class="intro"&gt;ici,&lt;/p&gt;
    &lt;div class="blocs ajoutes par la suite"&gt;
        &lt;div class="blocs"&gt;
            &lt;ul&gt;
                &lt;li&gt;&lt;a href="ici"&gt;ici,&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href="ici"&gt;ici,&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href="ici"&gt;et ici.&lt;/a&gt;&lt;/li&gt;
            &lt;/ul&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
</code></pre>

<p>Tout cela sans devoir à aucun moment revoir mes indentations.</p>

<p>Pour les utilisateurs avancés, il est également possible de (re)définir finement de nouveaux modèles, en précisant syntaxes, positions du curseurs, <abbr title="et cætera">etc.</abbr></p>

<p>Plongez-vous également dans <a href="http://code.google.com/p/zen-coding/wiki/Filters">les filtres de sortie</a> qui semblent eux aussi très puissants.</p>

<h3>Parfait&#160;?</h3>

<p>Pratique en tout cas. Il faudra cependant prendre le temps d&#8217;appendre les <strong>raccourcis clavier</strong> propres à votre éditeur pour en profiter pleinement. Et surtout croiser les doigts pour que <a href="http://code.google.com/p/zen-coding/downloads/list">votre éditeur favori supporte le plugin convenablement</a>.</p>

<p>Difficile de se défaire de nos petites habitudes acquises au jour le jour pour en adopter d&#8217;autres… mais il semblerait que ça vaille le coup d&#8217;essayer.</p>
 <!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://www.htmlzengarden.com/2010/06/coder_plus_rapidement_avec_zen-coding/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>La check-list du développeur web client</title>
		<link>http://www.htmlzengarden.com/2010/05/la_check-list_du_developpeur_web_client/</link>
		<comments>http://www.htmlzengarden.com/2010/05/la_check-list_du_developpeur_web_client/#comments</comments>
		<pubDate>Sat, 29 May 2010 21:09:40 +0000</pubDate>
		<dc:creator>Vincent</dc:creator>
				<category><![CDATA[Bonnes pratiques]]></category>
		<category><![CDATA[checklist]]></category>
		<category><![CDATA[intégration]]></category>
		<category><![CDATA[méthodologies]]></category>

		<guid isPermaLink="false">http://www.htmlzengarden.com/?p=865</guid>
		<description><![CDATA[Les objectifs Bien qu&#8217;en apparence très basique, le travail du développeur web client requiert de s&#8217;assurer d&#8217;une multitude de choses (non, nous ne nous occupons pas que du rendu visuel). Pour de ne rien oublier, j&#8217;utilise une check-list qui répond aux besoins habituels. Ce document (à adapter à fonction des besoins du projet) permet une [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_STOP --> <p><a class="read" onclick="readpage(this.href, 865);this.blur();return false;" href="http://wr.readspeaker.com/webreader/webreader.php?cid=18c69dd51a2bc0f4d305318e0fa39bc3&amp;t=wordpress&amp;url=http://www.htmlzengarden.com/2010/05/la_check-list_du_developpeur_web_client/"><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_865"></div> <!-- RSPEAK_START --> <h3>Les objectifs</h3>

<p>Bien qu&#8217;en apparence très basique, le travail du développeur web client requiert de s&#8217;assurer d&#8217;une multitude de choses (non, nous ne nous occupons pas <strong>que</strong> du rendu visuel). Pour de ne rien oublier, j&#8217;utilise une check-list qui répond aux besoins habituels.</p>

<p>Ce document (à adapter à fonction des besoins du projet) permet une bonne vision d&#8217;ensemble sur l&#8217;avancement et les éventuels oublis lors de la phase d&#8217;intégration.</p>

<p>Je la fournis aussi au format &laquo;&nbsp;Markdown&nbsp;&raquo; pour plusieurs raisons&#160;:</p>

<ul>
<li>ce format en texte brut est facilement compréhensible et modifiable par n&#8217;importe qui&#160;;</li>
<li><a href="http://michelf.com/projets/php-markdown/">il peut être aisément convertit au format HTML</a> et être placé à la racine du projet&#160;;</li>
<li>c&#8217;est un format que j&#8217;ai adopté dans mes processus avec lequel j&#8217;ai l&#8217;habitude de travailler.</li>
</ul>

<p>En pratique, il s&#8217;agit au cours du développement d&#8217;annoter le document, et de compléter chaque ligne par un OK / <abbr title="Non OK">NOK</abbr> / <abbr title="Non applicable">N/A</abbr>.</p>

<p>La première partie concernant des résultats attendus pour chaque page, elle servira aussi aisément d&#8217;index.</p>

<p>Comme précisé dans le document, je ne suis pas l&#8217;auteur de cette liste&#160;: je n&#8217;ai fait que reprendre et combiner plusieurs existants.</p>

<h3>La checklist</h3>

<p>Voici donc&#160;:</p>

<ul>
<li><a href="http://www.htmlzengarden.com/checklist.markdown">le fichier markdown</a>&#160;;</li>
<li><a href="http://www.htmlzengarden.com/checklist.php">sa transformation en HTML</a>.</li>
</ul>

<p>Si vous travaillez en PHP le code de transformation est simpliste&#160;:</p>

<pre><code>&lt;?php
    include_once('markdown.php');
    include_once('smartypants.php');
    echo(SmartyPants(Markdown(file_get_contents('checklist.markdown'))));
?&gt;
</code></pre>

<p>Et vous trouverez les sources nécessaires dans le lien donné plus haut.</p>

<pre><code>Checklist
=========

Conformité et affichage {#conformite}
-------------------------------------

Maquette                     | Validation XHTML                | Validation CSS                  | Safari | Fx   | IE 6 | IE 7 | IE 8 | Opera | Chrome | Lynx [^1] | Impression | iPhone | YSlow
-----------------------------|---------------------------------|---------------------------------|--------|------|------|------|------|-------|--------|-----------|------------|--------|-------
[Accueil](accueil.html)      |   erreur(s),   avertissement(s) |   erreur(s),   avertissement(s) |        |      |      |      |      |       |        |           |            |        |
[Contact](contact.html)      |   erreur(s),   avertissement(s) |   erreur(s),   avertissement(s) |        |      |      |      |      |       |        |           |            |        |
[Rechercher](recherche.html) |   erreur(s),   avertissement(s) |   erreur(s),   avertissement(s) |        |      |      |      |      |       |        |           |            |        |
[...](#)                     |   erreur(s),   avertissement(s) |   erreur(s),   avertissement(s) |        |      |      |      |      |       |        |           |            |        |


[^1]: L’affichage Lynx est proche de la restitution faite par un lecteur d'écran ou de ce qui est perçu par un moteur de recherche.

Sur l'ensemble des maquettes [^2]
---------------------------------

Contenu et style                                                                                                                             | Validité
---------------------------------------------------------------------------------------------------------------------------------------------|----------
Vérifier la ponctuation : particulièrement les apostrophes, les guillemets, les marques de citations, les traits d’union et les tirets       |
Ne faire ni d'faute d'orthographe ni de grammaire                                                                                            |
La capitalisation doit être uniforme et traitée par CSS                                                                                      |
Proscrire les phrases passe-partout ou récurrentes ("En savoir plus...")                                                                     |
Éviter les variations dans les mots ("email" vs "e-mail" vs "courriel")                                                                      |
Traitement des listes (points, virgules, ou point-virgules à la chaque fin d’élément)                                                        |
S’assurer qu’aucun contenu de test ne subsiste ("lorem ipsum...")                                                                            |
Vérifier tous les textes cachés (les `alt`, retranscriptions, les textes dans les fonctions JS)                                              |

Visibilité moteur de recherche                                                                                                               | Validité
---------------------------------------------------------------------------------------------------------------------------------------------|----------
Les titres (`title`) des pages sont importants, s’assurer qu’ils aient un sens et soient représentatifs des mots clefs présents dans la page |
Créer des `metadata description` pour les pages importantes                                                                                  |
S’assurer que le marquage du contenu respecte la sémantique HTML (`h1`, `p`,...)                                                             |
Vérifier le format des urls (urls simples à retenir pour les utilisateurs et les moteurs de recherche)                                       |

Conformité                                                                                                                                   | Validité
---------------------------------------------------------------------------------------------------------------------------------------------|----------
Voir [tableau ci-dessus](#conformite)                                                                                                        |


Accessibilité                                                                                                                                | Validité
---------------------------------------------------------------------------------------------------------------------------------------------|----------
Indiquer le langage humain principal du document en utilisant l'attribut lang au sein de la balise `&lt;html&gt;`                                  |
Indiquer les passages en langage secondaire dans d'autres balises encadrant le passage concerné                                              |
Proposer des liens de navigation dès le début du balisage lorsque les pages contiennent beaucoup de contenu avant le contenu principal       |
Indiquer des en-têtes dans les tableaux de données avec des balises `&lt;th&gt;`, et associer toutes les cellules de données à leurs en-têtes      |
S'assurer que l'ordre des tabulations est logique, en utilisant tabindex au besoin                                                           |
S'assurer que la page fonctionne toujours quand les images sont désactivées                                                                  |
S'assurer que les pages restent utilisables quand les utilisateurs agrandissent le texte au double de sa taille originale                    |
Vérifier que chaque élément de la page est accessible et manipulable au clavier                                                              |
Rédiger des textes d'appel de liens qui puissent être compris hors contexte (pas de liens titrés "cliquez ici")                              |
Pour les daltoniens ou les malvoyants, s'assurer de proposer un contraste suffisant entre le contenu et le fond de la page                   |
N'utiliser aucun contenu qui clignote plus de trois fois par seconde                                                                         |
Ne pas cacher l'indicateur de focus. Quand un utilisateur navigue au clavier, il doit toujours savoir où ces éléments se trouvent            |
Ne pas attendre des utilisateurs qu'ils perçoivent du sens grâce aux polices, aux couleurs ou à d'autres modifications de style              |
Être brefs dans les textes alternatifs, mais donner du détail dès lors qu'il y a du sens à transmettre                                       |
Fournir un script, des sous-titres, et/ou une traduction en langue des signes pour toutes les vidéos ou les sons contenant du discours       |
Fournir une version "descriptive" d'une vidéo lorsqu'il est essentiel d'en comprendre le contenu pour des utilisateurs non-voyants           |
S'assurer que toutes les vidéos, si elles ne se lancent pas automatiquement, offrent au minimum une touche de lecture accessible             |
Quand du texte peut être interprété visuellement par le navigateur aussi bien que s'il s'agissait d'une image, éviter d'utiliser des images  |
Éviter les CAPTCHAs (questionnaires de test visuels anti-robots)                                                                             |
Marquer tous les champs de formulaire avec la balise d'étiquetage `&lt;label&gt;`                                                                  |
Utiliser les regroupements de champs (`&lt;fieldset&gt;`) avec des balises de titrage (`&lt;legend&gt;`) pour associer des demandes de saisie            |
Recenser toutes les erreurs de saisie au format texte, et placer le message à côté du champ concerné ou à un emplacement bien repérable      |
Offrir des liens d'aide ou des instructions en ligne pour remplir les champs si nécessaire                                                   |
Ne pas laisser les utilisateurs effectuer des actions importantes sans leur proposer une confirmation ou un moyen d'annuler                  |

Tests fonctionnels                                                                                                                           | Validité
---------------------------------------------------------------------------------------------------------------------------------------------|----------
Vérifier toutes les fonctionnalités complexes                                                                                                |
Tester avec différentes configurations de résolutions d’écran                                                                                |
Tester tous les formulaires, incluant les filtres anti-spam, les réponses aux formulaires et emails, etc.                                    |
Tester sans JS, Flash et tous les autres plugins                                                                                             |
Vérifier que tous les liens externes sont valides                                                                                            |

Performances                                                                                                                                 | Validité
---------------------------------------------------------------------------------------------------------------------------------------------|----------
Vérifier l’optimisation des images                                                                                                           |
Vérifier et mettre en place le cache quand nécessaire                                                                                        |
Vérifier le temps de chargement et le poids des pages                                                                                        |
Minimiser/compresser les fichiers statiques une fois les développements terminés (JS/CSS)                                                    |
Optimiser votre CSS : utiliser des chemins courts vers les images, utiliser la nature du CSS c’est à dire l’héritage, etc.                   |

Touches finales                                                                                                                              | Validité
---------------------------------------------------------------------------------------------------------------------------------------------|----------
Créer des pages d’erreur / 404                                                                                                               |
Créer un favicon                                                                                                                             |

[^2]: Fortement inspiré de
      "[The Ultimate Website Launch Checklist](http://www.boxuk.com/blog/the-ultimate-website-launch-checklist)" et de
      "[La checklist d’accessibilité que je m’étais juré de ne pas rédiger](http://www.pompage.net/pompe/checklistaccessibilite)".

*[vs]: Versus
*[IE]: Internet Explorer
*[Fx]: Firefox
*[JS]: JavaScript
*[etc]: Et cætera
*[NOK]: Non OK
*[N/A]: Non applicable
*[CSS]: Cascading Style Sheets
*[AJAX]: Asynchronous JavaScript and XML
*[ARIA]: Accessible Rich Internet Applications
*[XHTML]: eXtensible HyperText Markup Language
</code></pre>
 <!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://www.htmlzengarden.com/2010/05/la_check-list_du_developpeur_web_client/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Tests sur quelques pseudos-sélecteurs</title>
		<link>http://www.htmlzengarden.com/2010/04/tests_sur_quelques_pseudos-selecteurs/</link>
		<comments>http://www.htmlzengarden.com/2010/04/tests_sur_quelques_pseudos-selecteurs/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 15:40:19 +0000</pubDate>
		<dc:creator>Vincent</dc:creator>
				<category><![CDATA[Réflexions]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[pseudo-sélecteurs]]></category>

		<guid isPermaLink="false">http://www.htmlzengarden.com/?p=841</guid>
		<description><![CDATA[Pour rebondir sur l&#8217;article précédent de STPo et ses nombreux commentaires, j&#8217;ai voulu tester plusieurs choses&#160;: le support des pseudo-selecteurs version selecteur::pseudo-selecteur&#160;; le support du pseudo-selecteur :first-line&#160;; notamment quand on effectue un zoom-texte associé&#160;; la prise en compte (ou non) des caractères typographiques combinés avec first-letter (ici le guillemet suivi ou non d&#8217;un espace et [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_STOP --> <p><a class="read" onclick="readpage(this.href, 841);this.blur();return false;" href="http://wr.readspeaker.com/webreader/webreader.php?cid=18c69dd51a2bc0f4d305318e0fa39bc3&amp;t=wordpress&amp;url=http://www.htmlzengarden.com/2010/04/tests_sur_quelques_pseudos-selecteurs/"><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_841"></div> <!-- RSPEAK_START --> <p>Pour rebondir sur <a href="http://www.htmlzengarden.com/2010/04/first-letter_et_lettrine/">l&#8217;article précédent de STPo et ses nombreux commentaires</a>, j&#8217;ai voulu tester plusieurs choses&#160;:</p>

<ul>
<li>le support des pseudo-selecteurs version <code>selecteur::pseudo-selecteur</code>&#160;;</li>
<li>le support du pseudo-selecteur <code>:first-line</code>&#160;; notamment quand on effectue un zoom-texte associé&#160;;</li>
<li>la prise en compte (ou non) des caractères typographiques combinés avec <code>first-letter</code> (ici le guillemet suivi ou non d&#8217;un espace et <a href="http://www.htmlzengarden.com/2009/04/l_apostrophe/">l&#8217;apostrophe</a>).</li>
</ul>

<h3>Support</h3>

<p><code>:first-letter</code> et <code>:first-line</code> sont supportés sur tous les navigateurs habituels&#160;:</p>

<ul>
<li><abbr title="Internet Explorer">IE</abbr> 6&#160;;</li>
<li><abbr title="Internet Explorer">IE</abbr> 7&#160;;</li>
<li><abbr title="Internet Explorer">IE</abbr> 8&#160;;</li>
<li>Firefox&#160;;</li>
<li>Opera&#160;;</li>
<li>Safari&#160;;</li>
<li>Chrome.</li>
</ul>

<p>Assez étonnement <code>::first-letter</code> et <code>::first-line</code> ne sont pas pris en compte par <abbr title="Internet Explorer">IE</abbr> 7 et <abbr title="Internet Explorer">IE</abbr> 8 alors qu&#8217;ils marchent partout ailleurs (<abbr title="Internet Explorer">IE</abbr> 6 compris).</p>

<p>Le comportement de <code>first-line</code> correspond bien au comportement attendu&#160;: la sélection varie en fonction du zoom effectué sur la page et il s&#8217;agit bien en permanence de la première ligne qui est sélectionnée.</p>

<h3>Subtilités typographiques</h3>

<p>En théorie devrait <a href="http://www.yoyodesign.org/doc/w3c/css2/selector.html#first-letter"><code>first-letter</code> s&#8217;appliquer à la première <strong>lettre</strong></a> et donc à la ponctuation qui l&#8217;accompagne.</p>

<blockquote>
  <p>Les caractères de ponctuation […] qui précèdent la première lettre devraient également être pris en compte</p>
</blockquote>

<p>En pratique on constate un rendu plus ou moins correct de&#160;:</p>

<ul>
<li>Chrome (hormis un petit bug avec les espaces insécables encodés <code>&amp;nbsp;</code>)&#160;;</li>
<li>Safari (avec le même petit bug)&#160;;</li>
<li>Firefox (mais sans le support des espaces)&#160;;</li>
<li>Opera (mais uniquement avec des guillemets droits et sans le support des espaces)&#160;;</li>
<li>IE6 et <abbr title="Internet Explorer">IE</abbr> 7 (mais uniquement avec des guillemets droits, exit donc les guillemets à la française)&#160;;</li>
<li>et <abbr title="Internet Explorer">IE</abbr> 8 (mais sans le support des espaces, ce qui est fortement pénalisant là encore).</li>
</ul>

<p>En une phrase&#160;: <strong>seul le moteur de rendu WebKit s&#8217;en sort correctement.</strong></p>

<p>Voici <a href="http://www.htmlzengarden.com/first.html">le fichier qui m&#8217;a permis de faire mes tests</a>, si vous voulez compléter mon analyse ou tester à votre tour. Vous pouvez également regarder le <a href="http://www.webdevout.net/browser-support-css?IE6=on&amp;IE7=on&amp;IE8=on&amp;FX2=on&amp;FX3=on&amp;OP9=on&amp;SF2=on&amp;uas=CUSTOM#css2pseudoelements">support navigateur proposé sur Web Devout</a>.</p>
 <!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://www.htmlzengarden.com/2010/04/tests_sur_quelques_pseudos-selecteurs/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>First-letter et lettrine</title>
		<link>http://www.htmlzengarden.com/2010/04/first-letter_et_lettrine/</link>
		<comments>http://www.htmlzengarden.com/2010/04/first-letter_et_lettrine/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 12:36:18 +0000</pubDate>
		<dc:creator>STPo</dc:creator>
				<category><![CDATA[Réflexions]]></category>
		<category><![CDATA[lettrines]]></category>
		<category><![CDATA[typographie]]></category>

		<guid isPermaLink="false">http://www.htmlzengarden.com/?p=816</guid>
		<description><![CDATA[Non, ce blog n&#8217;est pas mort&#160;! Bien que ce soit encore STPo qui s&#8217;y colle&#8230; La lettrine, c’est la première lettre d’un paragraphe mise en exergue. Le plus souvent, elle est sublimée grâce à un corps de texte plus important et parfois à l’aide d’ornements graphiques. Je m’intéresserai ici au cas d’une lettrine simple en [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_STOP --> <p><a class="read" onclick="readpage(this.href, 816);this.blur();return false;" href="http://wr.readspeaker.com/webreader/webreader.php?cid=18c69dd51a2bc0f4d305318e0fa39bc3&amp;t=wordpress&amp;url=http://www.htmlzengarden.com/2010/04/first-letter_et_lettrine/"><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_816"></div> <!-- RSPEAK_START --> <p><em>Non, ce blog n&#8217;est pas mort&#160;! Bien que ce soit encore <a href="http://stpo.fr">STPo</a> qui s&#8217;y colle&#8230;</em></p>

<p>La lettrine, c’est la première lettre d’un paragraphe mise en exergue. Le plus souvent, elle est sublimée grâce à un corps de texte plus important et parfois à l’aide d’ornements graphiques.</p>

<p>Je m’intéresserai ici au cas d’une lettrine simple en utilisant la pseudo-classe <abbr>CSS</abbr> <code>first-letter</code>, a priori toute indiquée pour un contenu en <abbr>HTML</abbr>.</p>

<h3>Quelques règles typographiques</h3>

<p>En fouinant sur le web, je suis tombé sur ce vieil <a href="http://www.tutoweb.be/typo-lettrine.htm">article qui rappelle les règles à suivre concernant les lettrines</a>. Je les reproduis honteusement ici&#160;:</p>

<ol>
<li>La lettrine porte généralement sur deux lignes, parfois plus&#160;;</li>
<li>Elle ne doit pas être découverte&#160;; au moins une ligne doit doubler sous la lettrine&#160;;</li>
<li>L’espace du premier mot doit être adapté en fonction de la lettrine&#160;;</li>
<li>La fin du premier mot s’écrit en petites capitales&#160;;</li>
<li>Le sommet de la lettrine doit être visuellement aligné avec les ascendantes des lettres de la première ligne du texte.</li>
</ol>

<p>C’est le point 5 qui va nous poser problème ici, à cause des différences d’interprétation par les moteurs graphiques des navigateurs (une fois n’est pas coutume)…</p>

<h3>Un peu de code</h3>

<p>Le code, ici, est enfantin. Le <abbr>CSS</abbr>&#160;:</p>

<pre><code>/* font-size à 1em et line-height à 1.5 */
p{ 
    font-size: 1em;
    line-height: 1.5;
    width: 30em;
    margin: 3em auto;
}

/* font-size à 3em et line-height à 1, ce qui correspond en théorie à la hauteur de 2 lignes de texte courant
    et float pour laisser courir le texte */
p:first-letter{
    float: left;
    font-size: 3em;
    line-height: 1;
    margin-right: 0.2em;
}

/* juste pour mettre le premier mots en petites capitales */
p span{ font-variant: small-caps; }
</code></pre>

<p>Et le <abbr>HTML</abbr>&#160;:</p>

<pre><code>    &lt;p&gt;
        &lt;span&gt;Lorem&lt;/span&gt;
        ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    &lt;/p&gt;
</code></pre>

<p>Et maintenant, la partie désagréable…</p>

<h3>Firefox le pénible</h3>

<p>Voici les résultats des interprétations de <a href="http://www.htmlzengarden.com/first-letter.html">la démo</a> par les navigateurs&#160;:</p>

<p><img src="http://www.htmlzengarden.com/wp-content/uploads/2010/04/first-letter1.png" alt="Il faut afficher les images, sinon le rendu a zéro intérêt évidemment" title="" /></p>

<p>On constatera que c’est globalement homogène chez Internet Explorer (versions «&#160;modernes&#160;»), Webkit et Opera, mais que Firefox 3.6 décale inexplicablement la lettrine vers le haut. Même Firefox 2&#160;s’en sortait mieux (bon, il sautait une ligne supplémentaire mais au moins c’était aligné).</p>

<p>En tant qu’<a href="http://www.htmlzengarden.com/2009/11/le_rythme_vertical_en_css/">ayatollah affiché du rythme vertical</a>, tout cela me chiffonne un brin. Non pas que j’utilise les lettrines très souvent (c’est même plutôt rare), mais j’aimerais bien comprendre d’où vient ce défaut.</p>

<p>J’ai trouvé <a href="http://www.zonecss.fr/exemple_css/exemple_css29.html">cet article qui en parle</a> mais n’aborde pas le point qui me gêne ici et se contente d’affirmer que la lettre ne passe pas en type <code>block</code> (malgré le <code>float</code>).</p>

<p>J’en appelle donc aux fans de prises de tête. À vos plumes, à vos idées, à votre bon cœur&#160;!</p>

<p><em>STPo</em></p>
 <!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://www.htmlzengarden.com/2010/04/first-letter_et_lettrine/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Paris-Web 2010&#160;: appel à orateurs</title>
		<link>http://www.htmlzengarden.com/2010/03/paris-web_2010_appel_a_orateurs/</link>
		<comments>http://www.htmlzengarden.com/2010/03/paris-web_2010_appel_a_orateurs/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 21:00:55 +0000</pubDate>
		<dc:creator>Vincent</dc:creator>
				<category><![CDATA[Bonnes pratiques]]></category>
		<category><![CDATA[paris-web]]></category>

		<guid isPermaLink="false">http://www.htmlzengarden.com/?p=811</guid>
		<description><![CDATA[(english version below) Bonjour à tous, Paris Web est une conférence française organisée chaque année autour des questions d&#8217;accessibilité, de qualité et de design web. Pour sa cinquième édition, la conférence veut élargir son sujet et vous propose de réfléchir sur la question suivante&#160;: &#171;&#160;Améliorer l&#8217;expérience utilisateur à travers un design et des contenus appropriés&#160;&#187; [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_STOP --> <p><a class="read" onclick="readpage(this.href, 811);this.blur();return false;" href="http://wr.readspeaker.com/webreader/webreader.php?cid=18c69dd51a2bc0f4d305318e0fa39bc3&amp;t=wordpress&amp;url=http://www.htmlzengarden.com/2010/03/paris-web_2010_appel_a_orateurs/"><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_811"></div> <!-- RSPEAK_START --> <p lang="en" style="font-style:italic">(<a href="#callforspeakers">english version below</a>)</p>

<div lang="fr" id="appelorateurs">
<p>Bonjour à tous,</p>
<p>Paris Web est une conférence française organisée chaque année autour
des questions d&#8217;accessibilité, de qualité et de design web. Pour sa
cinquième édition, la conférence veut élargir son sujet et vous propose
de réfléchir sur la question suivante&#160;: &laquo;&nbsp;Améliorer l&#8217;expérience
utilisateur à travers un design et des contenus appropriés&nbsp;&raquo; (question
non limitative).</p>
<p><a href="http://www.paris-web.fr/" hreflang="en">Paris Web 2010</a> se tiendra du 14 au 16 octobre 2010, et nous invitons
tous les orateurs potentiels à se manifester par un email à l&#8217;adresse
<a href="mailto:propositions@paris-web.fr">propositions@paris-web.fr</a>.</p>
<p>Vous pouvez proposer un ou plusieurs sujets dans&nbsp;les formats
suivants&#160;:</p>

<ol>
  <li>Conférence&#160;: 50 minutes, questions comprises.</li>
  <li>Mini-conférence&#160;: 15 minutes, sans questions du public.</li>
  <li>Atelier&#160;: 1 heure 30 (ou 3 heures pour un atelier double).</li>
</ol>

<p>Les conférences et mini-conférences auront lieu dans les
amphithéâtres les jeudi et vendredi. Les ateliers auront lieu dans des
salles de 40 à 60 personnes le samedi. Ils sont l&#8217;occasion d&#8217;une grande
interactivité, et peuvent être soit sous une forme théorique, soit sous
une forme pratique (le cas échéant, des salles équipées d&#8217;ordinateurs
seront prévues).</p>
<p><strong>La date limite de dépôt des propositions
de contributions est fixée au 31 mai 2010.</strong></p>
<p>Idéalement, merci de présenter votre proposition de la façon
suivante&#160;:</p>

<ol>
    <li><strong>Vous, en quelques lignes</strong>
    <br />Qui êtes-vous&#160;? Quel est votre parcours&#160;? Votre spécialité&#160;?</li>
    <li><strong>Votre sujet</strong>
    <br />En dix lignes maximum, un titre (qui n&#8217;a pas besoin d&#8217;être définitif)
    et un résumé de ce que vous allez traiter. Merci d&#8217;indiquer le niveau
    du public estimé.</li>
    <li><strong>La forme de votre intervention</strong>
    <br />Selon vous, cette intervention sera-t-elle plutôt une conférence, une
    mini-conférence, un atelier&#160;? (nous pouvons en rediscuter ensemble)</li>
</ol>

<p>Les personnes qui ont fait une proposition seront avisées
personnellement de la suite donnée, que leur proposition soit retenue
ou non.</p>
<p>Si vous êtes retenu, vous aurez la possibilité d&#8217;être défrayé pour vos transports et
logé à l&#8217;hôtel par nos soins. Pour rappel, vous serez filmé et les
vidéos seront mises à disposition gratuitement sur internet (sous
licence CC-By-NC).</p>
<p>Vivement octobre&#160;!</p>

</div>

<!-- /fr -->

<div lang="en" id="callforspeakers">
<p>Hello all,</p>
<p>Paris Web is a French conference organised each year and revolving
around questions of web accessibility, quality and design. For its
fifth edition, the conference wants to broaden its subject base and
suggests that you think of this question: &#8220;Improve the user experience
through appropriate design and contents&#8221; (non-limiting question).</p>
<p><a href="http://www.paris-web.fr/" hreflang="en">Paris Web 2010</a> will take place on the 14-16th of October 2010, and
we invite all the potential speakers to speak out and get in touch with
us at <a href="mailto:propositions@paris-web.fr">propositions@paris-web.fr</a>.</p>
<p>You can submit one or more topics under the following formats:</p><ol><li>Conference:&nbsp; 50 minutes, Q&amp;A included</li><li>Mini-conference: 15 minutes, without Q&amp;A</li><li>Workshop: 1 hour 30 (or 3 hours for a double-length workshop)</li></ol>
<p>Conferences and mini-conferences will take place in amphitheaters on
Thursday and Friday. Workshops will take place in 40 to 60 people rooms
on Saturday. They are a moment of intense interactivity, and can be
either theoretical or practical (rooms with computers will be provided
if necessary).</p>
<p><strong>The deadline for proposals is set to the 31st of May 2010.</strong></p>
<p>Ideally, here is the form your proposal should have:</p>
<ol><li><strong>You, in a few lines</strong><br />Who are you? What is your experience? Your specialty?</li><li><strong>Your subject</strong><br />In up to ten lines, a title (doesn&#8217;t need to be the definitive choice)
and a summary of what you wish to deal with. Please indicate the
estimated level of the audience.</li><li><strong>The form of your intervention</strong><br />According to you, will this be better suited for a conference, a
mini-conference, or a workshop? (We can talk about it.)</li></ol>
<p>People who have submitted a subject will be notified personally,
whether their subject is selected or not.</p>
<p>If you are selected, you will be able to have your travel expenses and
hotel paid. Please bear in mind that videos will be recorded and will
be made available for free on the internet (under the CC-By-NC licence).</p>
<p>We can&#8217;t wait for October!</p>
</div>
 <!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://www.htmlzengarden.com/2010/03/paris-web_2010_appel_a_orateurs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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 ne respectent [...]]]></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>22</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) ce soulignement [...]]]></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 droite&#160;? [...]]]></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 la [...]]]></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 alors, modifier [...]]]></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>
	</channel>
</rss>
