<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:webfeeds="http://webfeeds.org/rss/1.0" version="2.0">
  <channel>
    <atom:link href="http://pubsubhubbub.appspot.com/" rel="hub"/>
    <atom:link href="https://f43.me/pompage.xml" rel="self" type="application/rss+xml"/>
    <title>Pompage</title>
    <description>le web design puisé à la source</description>
    <link>http://www.pompage.net</link>
    <webfeeds:icon>https://s2.googleusercontent.com/s2/favicons?alt=feed&amp;domain=www.pompage.net</webfeeds:icon>
    <generator>f43.me</generator>
    <lastBuildDate>Sun, 19 Apr 2026 16:52:31 +0200</lastBuildDate>
    <item>
      <title><![CDATA[Traduit ailleurs : Travailler avec les icônes SVG]]></title>
      <description><![CDATA[<body class="post-template tag-svg tag-css tag-intermediaire tag-design nav-closed"> <p class="site-wrapper"><meta>
<header class="main-header post-head no-cover">
<nav class="main-nav clearfix">
<a class="blog-logo" href="https://la-cascade.io/"><img src="https://la-cascade.io/content/images/2015/03/optimised.svg" alt="Blog Logo"></a>
<a class="menu-button" href="https://la-cascade.io/comment-travailler-avec-des-icones-en-svg/#"><span class="burger">&#x2630;</span><span class="word">Menu</span></a>
</nav>
</header>
<main class="content">
<article class="post tag-svg tag-css tag-intermediaire tag-design">
<header class="post-header"> <section class="post-meta">
<time class="post-date">03 April 2016</time> <span> on <a href="https://la-cascade.io/tag/svg/">SVG</a>, <a href="https://la-cascade.io/tag/css/">CSS</a>, <a href="https://la-cascade.io/tag/intermediaire/">Interm&#xE9;diaire</a>, <a href="https://la-cascade.io/tag/design/">Design</a></span>
</section>
</header>
<section class="post-content">
<section class="post-description">
<p><span>Un bel article de notre frenchie Florens Verschelde qui a fait le buzz et a &#xE9;t&#xE9; repris par l&apos;excellent CSS-Tricks. Explications claires du process et r&#xE9;flexions pour aller plus loin.</span></p>
</section>
<p><em>Par <span><span>Florens Verschelde</span></span></em></p>
<p>Il existe bien des fa&#xE7;ons d&#x2019;utiliser les ic&#xF4;nes <span><a href="https://la-cascade.io/tag/svg/">SVG</a></span> en <span>HTML</span> et en <span>CSS</span>, et je ne les ai pas toutes essay&#xE9;es. Ce qui suit correspond &#xE0; la fa&#xE7;on de travailler de la petite &#xE9;quipe front-end de <a href="http://www.kaliop.com/">Kaliop</a>. Elle r&#xE9;pond &#xE0; nos besoins, qui comprennent&#xA0;:</p>
<p>Des sites web de communication et de contenu, souvent bas&#xE9;s sur de gros CMS, plut&#xF4;t que des applications full-JavaScript. Des ic&#xF4;nes qui sont souvent de simples ic&#xF4;nes monochromes &#x2014;&#xA0;chacune pouvant &#xEA;tre utilis&#xE9;e en diff&#xE9;rentes couleurs, selon le contexte et les interactions utilisateur&#xA0;&#x2014; mais possibilit&#xE9; d&#x2019;avoir des ic&#xF4;nes en bichromie. </p><p>
Compatibilit&#xE9; navigateurs IE9+.</p></section></article></main></p>
<p>Table des mati&#xE8;res</p> <h2 id="preparer" class="softTitleBlue">Pr&#xE9;parer vos ic&#xF4;nes</h2>
<p>Lorsque vous recevez une ic&#xF4;ne SVG, con&#xE7;ue par un designer ou livr&#xE9;e avec un outil graphique (Illustrator, Adobe Assets, <a href="https://la-cascade.io/tag/sketch/">Sketch</a>, Inkscape, etc.), il peut &#xEA;tre tentant de l&#x2019;inclure directement dans votre projet. Cependant, une petite r&#xE9;vision dans votre outil favori peut vous &#xE9;pargner quelques maux de t&#xEA;te et am&#xE9;liorer significativement le r&#xE9;sultat.</p>
<figure>
<img src="https://la-cascade.io/content/images/2016/04/example-1.png" alt="">
<figcaption>Une ic&#xF4;ne simple sur un plan de travail Illustrator (&#xE0; gauche) et sur un artboard Sketch (&#xE0; droite)</figcaption></figure>
<h3 class="softTitleBlue">Travailler avec un nouveau document ou artboard</h3>
<p>Cr&#xE9;ez un nouveau document ou un nouvel artboard (plan de travail) dans votre outil favori et copiez-collez votre ic&#xF4;ne au centre. C&#x2019;est une excellente fa&#xE7;on de vous assurer que votre ic&#xF4;ne soit propre et ne contienne pas une tonne de chemins cach&#xE9;s.</p>
<h3 class="softTitleBlue">La coupe au carr&#xE9; c&#x2019;est plus facile</h3>
<p>Votre ic&#xF4;ne ne doit pas n&#xE9;cessairement &#xEA;tre un carr&#xE9;, mais les ic&#xF4;nes carr&#xE9;es sont plus faciles &#xE0; traiter (sauf si votre graphique est vraiment tr&#xE8;s haut ou tr&#xE8;s large).</p>
<p>Les dimensions exactes importent seulement si vous voulez g&#xE9;rer au pixel pr&#xE8;s pour obtenir les r&#xE9;sultats les plus nets possible sur les &#xE9;crans &#xE0; faible densit&#xE9;. Par exemple, si toutes vos ic&#xF4;nes tiennent sur une grille de 15px&#xA0;&#xD7;&#xA0;15px, et si elles sont utilis&#xE9;es le plus souvent avec ces dimensions exactes, vous pouvez y aller et continuer &#xE0; travailler avec des artboards ou des documents de 15&#xA0;&#xD7;&#xA0;15. Quand je ne suis pas s&#xFB;r, je pr&#xE9;f&#xE8;re utiliser un artboard de 20&#xA0;&#xD7;&#xA0;20.</p>
<h3 class="softTitleBlue">Bien d&#xE9;gag&#xE9; autour des oreilles</h3>
<p>Laissez un peu de marge autour de la forme, surtout si elle est arrondie. Les navigateurs utilisent <a href="https://fr.wikipedia.org/wiki/Anticr%C3%A9nelage">l&#x2019;anticr&#xE9;nelage</a> (<em>anti-aliasing</em>) pour rendre les formes SVG mais parfois les pixels suppl&#xE9;mentaires de l&#x2019;anticr&#xE9;nelage sont rendus en dehors de la <a href="https://la-cascade.io/comprendre-svg-viewbox-et-viewport/">viewBox</a> et sont coup&#xE9;s.</p>
<figure>
<img src="https://la-cascade.io/content/images/2016/04/example-2.png" alt="">
<figcaption>Nous n&#x2019;avons pas laiss&#xE9; d&#x2019;espace autour de l&#x2019;ic&#xF4;ne, donc il y a des chances qu&#x2019;elle soit rendue avec des c&#xF4;t&#xE9;s l&#xE9;g&#xE8;rement carr&#xE9;s. Et si le navigateur ne rend pas le SVG &#xE0; la perfection, &#xE7;a peut &#xEA;tre encore pire.</figcaption></figure>
<p>Une bonne r&#xE8;gle g&#xE9;n&#xE9;rale, pour une ic&#xF4;ne de 16 ou 20px, serait de laisser un espace de 0.5 ou 1px de chaque c&#xF4;t&#xE9;. De plus, n&#x2019;oubliez pas d&#x2019;exporter tout l&#x2019;artboard, pas seulement les chemins s&#xE9;lectionn&#xE9;s, sinon vous perdriez l&#x2019;espace autour de la forme.</p>
<h3 class="softTitleBlue">Exporter en SVG</h3>
<ul>
<li>dans Illustrator, j&#x2019;utilise simplement &#x201C;Save as&#x201D; et je choisis le format &#x201C;SVG&#x201D;.</li>
<li>dans Inkscape, vous pouvez faire &#x201C;Save as&#x201D; et choisir &#x201C;Optimized SVG&#x201D;.</li>
<li>dans Sketch, vous pouvez s&#xE9;lectionner un artboard, cliquer sur &#x201C;Make exportable&#x201D; en bas &#xE0; droite et choisir le format &#x201C;SVG&#x201D;.</li>
</ul>
<h3 class="softTitleBlue">Apprendre un peu de SVG</h3>
<p>Il est vraiment utile de conna&#xEE;tre <a href="https://la-cascade.io/tag/bases-svg/">les bases de SVG</a> pour pouvoir lire et comprendre la structure de fichiers SVG simples. Au minimum, vous devriez conna&#xEE;tre&#xA0;:</p>
<ul>
<li>Elements: <code>&lt;svg&gt;</code>, <code>&lt;symbol&gt;</code>, <code>&lt;g&gt;</code>, <code>&lt;path&gt;</code>.</li>
<li>Attributes: d, fill, stroke, stroke-width.</li>
</ul>
<p>Remarque : quand vous exportez un SVG depuis un outil de design, il comprendra souvent du <span>markup</span> et des <span>m&#xE9;tadonn&#xE9;es</span> inutiles, ainsi que des donn&#xE9;es excessivement pr&#xE9;cises pour le chemin (dans l&#x2019;attribut <code>d</code>). Essayez l&#x2019;outil <a href="https://jakearchibald.github.io/svgomg/">SVGOMG</a> and comparez le code avant et apr&#xE8;s pour voir ce qui est supprim&#xE9; ou simplifi&#xE9;.</p>
<h3 class="softTitleBlue">Supprimer les donn&#xE9;es de couleurs</h3>
<p>Pour les ic&#xF4;nes monochromes, assurez-vous que&#xA0;:</p>
<ol>
<li>dans votre fichier source, les chemins sont noirs (<code>#000000</code>) </li>
<li>dans le code export&#xE9;, il n&#x2019;y a pas d&#x2019;attribut <code>fill</code>.</li>
</ol>
<p>Si nous avons des <code>fill</code> dans le code SVG, nous ne pourrons pas remplacer ces couleurs &#xE0; partir de notre code CSS. Il est donc pr&#xE9;f&#xE9;rable de les supprimer, du moins pour les ic&#xF4;nes monochromes.</p>
<p>Illustrator ne produit pas d&#x2019;attributs <code>fill</code> pour les chemins qui sont enti&#xE8;rement noirs (<code>#000000</code>). Par contre, Sketch cr&#xE9;e ces attributs, donc il vous faudra sans doute supprimer manuellement les attributs <code>fill=&quot;#000000&quot;</code>. </p>
<h2 class="softTitleBlue" id="creer">Cr&#xE9;er un sprite SVG</h2>
<p>Cette partie comprend pas mal de code mais il n&#x2019;est pas compliqu&#xE9; du tout. Nous voulons cr&#xE9;er un document SVG contenant des &#xE9;l&#xE9;ments <code>&lt;symbol&gt;</code>. Chaque <code>&lt;symbol&gt;</code> doit avoir un attribut <code>id</code> et un attribut <code>viewBox</code>, et contiendra les &#xE9;l&#xE9;ments <code>&lt;path/&gt;</code> de l&#x2019;ic&#xF4;ne (ou d&#x2019;autres &#xE9;l&#xE9;ments graphiques).</p>
<p>J&#x2019;appelle <em>sprite</em> ce document SVG en r&#xE9;f&#xE9;rence aux sprites dans les jeux vid&#xE9;os et CSS, mais on pourrait aussi bien l&#x2019;appeler <em>sprite sheet</em> (feuille de sprites) ou <em>symbol store</em> (entrep&#xF4;t de symboles).</p>
<p>Voici un sprite contenant une seule ic&#xF4;ne&#xA0;: </p>
<pre><code>&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt; &lt;symbol id=&quot;cross&quot; viewBox=&quot;0 0 20 20&quot;&gt; &lt;path d=&quot;M17.1 5.2l-2.6-2.6-4.6 4.7-4.7-4.7-2.5 2.6 4.7 4.7-4.7 4.7 2.5 2.5 4.7-4.7 4.6 4.7 2.6-2.5-4.7-4.7&quot;/&gt; &lt;/symbol&gt;
&lt;/svg&gt; </code></pre>
<h3 class="softTitleBlue">Ajouter une ic&#xF4;ne &#xE0; notre sprite</h3>
<p>Imaginons qu&#x2019;Illustrator nous ait donn&#xE9; ce code pour une nouvelle ic&#xF4;ne&#xA0;: </p>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;!-- Generator: Adobe Illustrator 19.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --&gt; &lt;svg version=&quot;1.1&quot; id=&quot;Layer_1&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; x=&quot;0px&quot; y=&quot;0px&quot; viewBox=&quot;0 0 15 15&quot; style=&quot;enable-background:new 0 0 15 15;&quot; xml:space=&quot;preserve&quot;&gt; &lt;path id=&quot;ARROW&quot; d=&quot;M7.5,0.5c3.9,0,7,3.1,7,7c0,3.9-3.1,7-7,7c-3.9,0-7-3.1-7-7l0,0C0.5,3.6,3.6,0.5,7.5,0.5 C7.5,0.5,7.5,0.5,7.5,0.5L7.5,0.5L7.5,0.5z M6.1,4.7v5.6l4.2-2.8L6.1,4.7z&quot;/&gt;
&lt;/svg&gt; </code></pre>
<p>Nous pouvons la simplifier (manuellement ou via <a href="https://jakearchibald.github.io/svgomg/">SVGOMG</a>), en ne conservant que l&#x2019;attribut <code>viewBox</code> et les donn&#xE9;es essentielles&#xA0;: </p>
<pre><code>&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 15 15&quot;&gt; &lt;path d=&quot;M7.5,0.5c3.9,0,7,3.1,7,7c0,3.9-3.1,7-7,7c-3.9,0-7-3.1-7-7l0,0C0.5,3.6,3.6,0.5,7.5,0.5 C7.5,0.5,7.5,0.5,7.5,0.5L7.5,0.5L7.5,0.5z M6.1,4.7v5.6l4.2-2.8L6.1,4.7z&quot;/&gt;
&lt;/svg&gt; </code></pre>
<p>Nous pouvons maintenant la copier/coller dans notre sprite. Nous devons transformer l&#x2019;&#xE9;l&#xE9;ment <code>&lt;svg viewBox=&quot;&#x2026;&quot;&gt;</code> en &#xE9;l&#xE9;ment <code>&lt;symbol id=&quot;&#x2026;&quot; viewBox=&quot;&#x2026;&quot;&gt;</code> et l&#x2019;ins&#xE9;rer manuellement dans notre sprite&#xA0;: </p>
<pre><code>&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt; &lt;symbol id=&quot;cross&quot; viewBox=&quot;0 0 20 20&quot;&gt; &lt;path d=&quot;M17.1 5.2l-2.6-2.6-4.6 4.7-4.7-4.7-2.5 2.6 4.7 4.7-4.7 4.7 2.5 2.5 4.7-4.7 4.6 4.7 2.6-2.5-4.7-4.7&quot;/&gt; &lt;/symbol&gt; &lt;symbol id=&quot;play&quot; viewBox=&quot;0 0 15 15&quot;&gt; &lt;path d=&quot;M7.5,0.5c3.9,0,7,3.1,7,7c0,3.9-3.1,7-7,7c-3.9,0-7-3.1-7-7l0,0C0.5,3.6,3.6,0.5,7.5,0.5 C7.5,0.5,7.5,0.5,7.5,0.5L7.5,0.5L7.5,0.5z M6.1,4.7v5.6l4.2-2.8L6.1,4.7z&quot;/&gt; &lt;/symbol&gt;
&lt;/svg&gt; </code></pre>
<p>On peut le faire &#xE0; la main pour chaque ic&#xF4;ne, mais il existe des outils permettant d&#x2019;automatiser le processus. Nous utilisons <a href="https://github.com/jkphl/gulp-svg-sprite">gulg-svg-sprite</a> (voici un exemple r&#xE9;el de fichier <a href="https://gist.github.com/fvsch/8a407c04156093c5f661">gulpfile.js</a> si vous &#xEA;tes curieux), mais il y a d&#x2019;autres outils graphiques ou en ligne qui exportent les sprites de symboles SVG, dont <a href="https://icomoon.io/">Icomoon</a>.</p>
<h3 class="softTitleBlue">Astuce : Cr&#xE9;ez un dossier pour vos ic&#xF4;nes sources</h3>
<p>Si vous r&#xE9;alisez vos sprites manuellement, je vous recommande de cr&#xE9;er un dossier contenant chaque ic&#xF4;ne&#xA0;: </p>
<pre><code>assets/ icons/ cross.svg play.svg search.svg ...
public/ sprite/ icons.svg
</code></pre>
<p>Par la suite, si vous devez reconstruire le <code>icons.svg</code> ou modifier une ic&#xF4;ne individuelle, vous avez les sources pour travailler. Veillez &#xE0; ne pas laisser votre sprite et votre dossier source d&#xE9;synchronis&#xE9;s.</p>
<p>&#xC9;videmment, si vous utilisez un build process (avec <a href="https://la-cascade.io/grunt-pour-ceux-qui-pensent-que-grunt-est-complique/">Grunt</a> ou <a href="https://la-cascade.io/gulp-pour-les-debutants/">Gulp</a> ou autre), vous pouvez lui donner votre dossier source et le laisser cr&#xE9;er le sprite directement.</p>
<h2 class="softTitleBlue" id="ajouter">Ajouter les ic&#xF4;nes &#xE0; votre page</h2>
<p>La mauvaise nouvelle est que si nous voulons utiliser nos ic&#xF4;nes SVG, nous devons les int&#xE9;grer au HTML. Pas de backgrounds CSS, pas de pseudo-&#xE9;l&#xE9;ments <code>::before</code>. La bonne nouvelle, c&#x2019;est que ce n&#x2019;est pas du tout verbeux&#xA0;: </p>
<pre><code>&lt;svg&gt;&lt;use xlink:href=&quot;/path/to/icons.svg#play&quot;&gt;&lt;/use&gt;&lt;/svg&gt; </code></pre>
<figure>
<img src="https://la-cascade.io/content/images/2016/04/simple-play-icon.jpg" alt="une icone play simple, triangle blanc sur disque noir">
</figure>
<h3 class="softTitleBlue">Fournir un texte alternatif</h3>
<p>Il existe plusieurs fa&#xE7;ons d&#x2019;ajouter un texte alternatif &#xE0; une ic&#xF4;ne. Sur la base de nos test de <span>lecteurs d&#x2019;&#xE9;cran</span>, voici celle que nous utilisons pour une meilleure <span><a href="https://la-cascade.io/tag/accessibilite/">accessibilit&#xE9;</a></span>.</p>
<p>Tout d&#x2019;abord, si nous ne voulons pas ajouter de texte alternatif (en g&#xE9;n&#xE9;ral parce qu&#x2019;il y a d&#xE9;j&#xE0; un texte suffisant dans le contexte), nous utilisons <code>aria-hidden=&quot;true&quot;</code> pour garantir que les lecteurs d&#x2019;&#xE9;cran ne liront pas l&#x2019;ic&#xF4;ne &#xE0; haute voix&#xA0;: </p>
<pre><code>&lt;a href=&quot;/news/&quot;&gt; &lt;svg aria-hidden=&quot;true&quot;&gt; &lt;use xlink:href=&quot;/path/to/icons.svg#newspaper&quot;&gt;&lt;/use&gt; &lt;/svg&gt; Latest News
&lt;/a&gt; </code></pre>
<p>Le second cas d&#x2019;usage ressemble &#xE0; ceci&#xA0;: nous avons un lien ou un bouton dont le seul contenu est une ic&#xF4;ne. Dans ce cas, nous utilisons <code>aria-label</code>, de pr&#xE9;f&#xE9;rence sur l&#x2019;&#xE9;l&#xE9;ment <code>&lt;a&gt;</code> ou <code>&lt;button&gt;</code>&#xA0;: </p>
<pre><code>&lt;a href=&quot;/news/&quot; aria-label=&quot;Latest News&quot;&gt; &lt;svg aria-hidden=&quot;true&quot;&gt; &lt;use xlink:href=&quot;/path/to/icons.svg#newspaper&quot;&gt;&lt;/use&gt; &lt;/svg&gt;
&lt;/a&gt; </code></pre>
<p>Une autre option consiste &#xE0; utiliser l&#x2019;&#xE9;l&#xE9;ment <code>&lt;title&gt;</code>. Il est particuli&#xE8;rement utile en dehors des &#xE9;l&#xE9;ments interactifs (o&#xF9; <code>aria-label</code> pourrait ne pas &#xEA;tre lu par les lecteurs d&#x2019;&#xE9;cran). Par exemple, si vous montrez des marqueurs oui/non (type &#x201C;hirondelle&#x201D; ou croix) dans une colonne de tableau, vous pourriez avoir&#xA0;: </p>
<pre><code>&lt;td&gt; &lt;svg&gt; &lt;title&gt;Yes&lt;/title&gt; &lt;use xlink:href=&quot;/path/to/icons.svg#tick&quot;&gt;&lt;/use&gt; &lt;/svg&gt;
&lt;/td&gt; </code></pre>
<p>Enfin, n&#x2019;oubliez pas que&#xA0;:</p>
<ul>
<li>votre texte accessible <em>peut</em> changer selon le contexte (une ic&#xF4;ne &#x201C;loupe&#x201D; peut signifier &#x201C;montrer le formulaire de recherche&#x201D; dans un contexte, et &#x201C;envoyer ma requ&#xEA;te&#x201D; dans un autre).</li>
<li>votre texte accessible <em>doit</em> changer lorsque la langue de votre page est modifi&#xE9;e.</li>
</ul>
<p>C&#x2019;est pourquoi votre texte alternatif doit &#xEA;tre situ&#xE9; <em>dans le HTML o&#xF9; est ins&#xE9;r&#xE9; votre ic&#xF4;ne</em>. Certains articles recommandent de mettre les &#xE9;l&#xE9;ments <code>&lt;title&gt;</code> dans votre sprite, mais en pratique &#xE7;a ne fonctionne pas &#x2014;&#xA0;et de plus la plupart des lecteurs d&#x2019;&#xE9;cran les ignoreront.</p>
<h3 class="softTitleBlue">Sprites externes et en ligne</h3>
<p>Jusqu&#x2019;&#xE0; pr&#xE9;sent nous avons montr&#xE9; des exemples de sprite <em>externe</em>. Mais certains navigateurs anciens &#x2014;&#xA0;en particulier les WebKits anciens et toutes les versions d&#x2019;Internet Explorer (avant Edge 13)&#xA0;&#x2014; ne supportent les r&#xE9;f&#xE9;rences en ligne que pour <code>&lt;use xlink:href=&quot;#some-id&quot;/&gt;</code>.</p>
<p>On peut utiliser un <a href="https://la-cascade.io/html5-comprendre-les-polyfills-shivs-et-shims/">polyfill</a> pour cela (<a href="https://github.com/jonathantneal/svg4everybody">svg4everybody</a>, <a href="https://github.com/Keyamoon/svgxuse">svgxuse</a>). Ou bien, vous pouvez choisir d&#x2019;inclure votre sprite <em>dans le code HTML de chaque page</em>. </p>
<pre><code>&lt;body&gt; &lt;!-- Donn&#xE9;es cach&#xE9;es --&gt; &lt;svg aria-hidden=&quot;true&quot; style=&quot;display:none&quot;&gt; &lt;symbol id=&quot;icon-play&quot;&gt;&#x2026;&lt;/symbol&gt; &lt;symbol id=&quot;icon-cross&quot;&gt;&#x2026;&lt;/symbol&gt; &lt;symbol id=&quot;icon-search&quot;&gt;&#x2026;&lt;/symbol&gt; &lt;/svg&gt; &lt;!-- Une ic&#xF4;ne visible : --&gt; &lt;button aria-label=&quot;Start playback&quot;&gt; &lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use xlink:href=&quot;#icon-play&quot;/&gt;&lt;/svg&gt; &lt;/button&gt;
&lt;/body&gt; </code></pre>
<p>Chaque m&#xE9;thode a ses pour et ses contre&#xA0;:</p>
<table class="specificTable"><thead class="resp-remove"><tr><th></th>
<th>Sprite en ligne</th>
<th>Sprite externe</th>
</tr></thead><tbody class="resp-linear"><tr><th>
Support navigateur
</th>
<td>
<p>Support natif in IE9+.</p>
<p>Safari/WebKit ancien <a href="http://fvsch.com/code/svg-icons/symbol-sprite/">mettre le sprite au d&#xE9;but de la page</a> (avant toute r&#xE9;f&#xE9;rence).</p>
</td>
<td>
<p>Support natif dans Edge 13+, Safari 9+.</p>
<p>IE Safari/WebKit anciens, utiliser un polyfill comme <a href="https://github.com/jonathantneal/svg4everybody">svg4everybody</a> or <a href="https://github.com/Keyamoon/svgxuse">svgxuse</a>.</p>
<p>Chargement d&#x2019;un sprite externe depuis un domaine diff&#xE9;rent impossible (m&#xEA;me avec CORS, voir <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=470601">Chromium bug</a> p.ex.). <span>Polyfill</span> possible avec svgxuse.</p>
</td>
</tr><tr><th>
Cache
</th>
<td>
<p>Pas de cache.</p>
<p>Le poids de votre sprite (5KB, 15KB, 50KB&#x2026;) est ajout&#xE9; &#xE0; chaque page.</p>
</td>
<td>
<p>Le sprite est un fichier s&#xE9;par&#xE9; et peut &#xEA;tre mise en cache par le navigateur.</p>
<p>De plus il ne gonfle pas votre cache HTTP c&#xF4;t&#xE9; serveur.</p>
</td>
</tr><tr><th>
Vitesse de rendu
</th>
<td>
<p>Rendu instantan&#xE9; des ic&#xF4;nes.</p>
<p>Sur les r&#xE9;seaux lents, le rendu de la structure et du contenu de la page peut &#xEA;tre retard&#xE9; si vous avez un sprite SVG lourd ins&#xE9;r&#xE9; avant votre contenu.</p>
</td>
<td>
<p>Attention au FONSI! (Flash of No SVG Icons, mais bon, cet acronyme est une blague, &#xE0; ne pas r&#xE9;utiliser ok ?)</p>
<p>Les ic&#xF4;nes peuvent appara&#xEE;tre avec un petit retard parce que (a) elles requi&#xE8;rent une requ&#xEA;te HTTP s&#xE9;par&#xE9;e et (b) le navigateur n&#x2019;a pas consid&#xE9;r&#xE9; le chargement de ce fichier comme une priorit&#xE9; (via son <a href="http://andydavies.me/blog/2013/10/22/how-the-browser-pre-loader-makes-pages-load-faster/">look-ahead pre-parser</a>).</p>
</td>
</tr><tr><th>Mises &#xE0; jour</th>
<td>
<p>Quand vous mettez &#xE0; jour votre sprite, vous devez vous assurer qu&#x2019;il est ajout&#xE9; &#xE0; chaque page. Soit en r&#xE9;g&#xE9;n&#xE9;rant toutes les pages HTML si vous utilisez un g&#xE9;n&#xE9;rateur statique, soit en invalidant tous les caches.</p>
</td>
<td>
<p>Seul un fichier public est modifi&#xE9;, donc la gestion des mises &#xE0; jour et du cache c&#xF4;t&#xE9;-client est plus facile.</p>
</td>
</tr></tbody></table>
<p>J&#x2019;aime bien combiner les deux m&#xE9;thodes, en cr&#xE9;ant deux sprites&#xA0;:</p>
<ol>
<li>un petit, contenant les ic&#xF4;nes essentielles (p.ex. les ic&#xF4;nes principales utilis&#xE9;es dans le header), &#xE0; ins&#xE9;rer en ligne dans chaque page. Taille cible&#xA0;: 5KB ou moins. </li>
<li>un plus grand, contenant toutes les ic&#xF4;nes du projet, et conserv&#xE9; comme un fichier externe. Taille cible&#xA0;: 50KB ou moins.</li>
</ol>
<p>Sur de plus gros projets, on pourrait ajouter d&#x2019;autres sprites externes lorsque certaines ic&#xF4;nes peuvent &#xEA;tre regroup&#xE9;es et ne sont utilis&#xE9;es que dans une partie du site pour des fonctionnalit&#xE9;s sp&#xE9;cifiques.</p>
<h2 class="softTitleBlue" id="appliquer">Appliquer des styles CSS aux ic&#xF4;nes</h2>
<p>OK, nous avons nos ic&#xF4;nes et nos sprites SVG, nous savons comment ajouter des ic&#xF4;nes &#xE0; notre HTML et <em>&#xE7;a nous a pris un bon bout de temps</em>, pouvons-nous enfin passer au style&#xA0;?</p>
<h3 class="softTitleBlue">Bien s&#xFB;r, je vous mets juste une ou deux classes d&#x2019;abord</h3>
<p>Vous pourriez s&#xE9;lectionner tous les &#xE9;l&#xE9;ments <code>&lt;svg&gt;</code> dans CSS mais ce n&#x2019;est pas id&#xE9;al si vous utilisez SVG pour plusieurs ic&#xF4;nes. De plus, il y a un bug connu de Firefox qui pourrait vous jouer des tours si faisions comme cela (<a href="https://la-cascade.io/comment-travailler-avec-des-icones-en-svg/#firefox">voir plus bas</a>), donc &#xE9;vitons.</p>
<p>&#xC0; la place, je recommande d&#x2019;ajouter deux classes pour chaque ic&#xF4;ne&#xA0;: une g&#xE9;n&#xE9;rique et une portant le nom de l&#x2019;ic&#xF4;ne.</p>
<pre><code>&lt;svg class=&quot;Icon Icon--arrow&quot; aria-hidden=&quot;true&quot;&gt; &lt;use xlink:href=&quot;/path/to/icons.svg#arrow&quot;&gt;&lt;/use&gt;
&lt;/svg&gt; </code></pre>
<p>Nous utilisons les <a href="https://github.com/suitcss/suit/blob/master/doc/naming-conventions.md">conventions de nommage SUIT CSS</a>, mais vous pouvez utiliser un style diff&#xE9;rent (par exemple <code>class=&quot;icon-arrow&quot;</code> est plus court et il peut &#xEA;tre cibl&#xE9; sur toutes les ic&#xF4;nes via un s&#xE9;lecteur comme <code>svg[class*=&quot;icon-&quot;]</code>). <span></span>&#xA0;<em>NdT&#xA0;: pour plus d&#x2019;infos sur le ciblage via les s&#xE9;lecteurs ou les attributs, voir l&#x2019;article <a href="https://la-cascade.io/attribut/">Attribut</a> du <a href="https://la-cascade.io/dico-css/">Dico CSS</a></em>.</p>
<h3 class="softTitleBlue">Style d&#x2019;ic&#xF4;ne par d&#xE9;faut</h3>
<p>Je recommande ce style par d&#xE9;faut pour vos ic&#xF4;nes&#xA0;: </p>
<pre><code>.Icon { /* Permet de redimensionner en changeant la font-size de l&#x2019;ic&#xF4;ne */ width: 1em; height: 1em; /* Bel alignement visuel des ic&#xF4;nes avec le texte */ vertical-align: -0.15em; /* fill par d&#xE9;faut = valeur de la propri&#xE9;t&#xE9; couleur de son &#xE9;l&#xE9;ment parent */ fill: currentColor; /* Les paths et les strokes qui d&#xE9;passent de la viewBox peuvent appara&#xEE;tre dans IE. Si vous utilisez normalize.css, inutile de l&#x2019;ajouter. */ overflow: hidden;
}
</code></pre>
<figure>
<img src="https://la-cascade.io/content/images/2016/04/styled-icons.jpg" alt="">
<figcaption>Ic&#xF4;nes avec notre style par d&#xE9;faut. la seule diff&#xE9;rence entre la rang&#xE9;e du haut et celle du bas est la font-size et la couleur du container.</figcaption></figure>
<p>Ensuite, si vous voulez personnaliser une ic&#xF4;ne dans un contexte sp&#xE9;cifique, vous pouvez ajouter des styles comme ceux-ci&#xA0;: </p>
<pre><code>.MyComponent-button .Icon { /* Modifier la largeur et la hauteur */ font-size: 40px; /* Changer la couleur de remplissage (fill) */ color: purple; /* Changer l&#x2019;alignement vertical si vous avez besoin de plus de pr&#xE9;cision (parfois n&#xE9;cessaire pour un rendu parfait au pixel pr&#xE8;s) */ vertical-align: top;
}
</code></pre>
<p>Avec ce code, vos ic&#xF4;nes SVG devraient &#xEA;tre petites par d&#xE9;faut et <a href="https://la-cascade.io/la-premiere-variable-css-currentcolor/">utiliser la couleur du texte de l&#x2019;&#xE9;l&#xE9;ment parent</a>.</p>
<p>Si les formes de l&#x2019;ic&#xF4;ne n&#x2019;h&#xE9;ritent pas de la couleur du texte de l&#x2019;&#xE9;l&#xE9;ment parent (<code>currentColor</code>), v&#xE9;rifiez que vous n&#x2019;avez pas des attributs <code>fill</code> dans le code de votre ic&#xF4;ne.</p>
<h3 class="softTitleBlue">Styles SVG h&#xE9;rit&#xE9;s</h3>
<p>De nombreuses propri&#xE9;t&#xE9;s de style SVG sont h&#xE9;rit&#xE9;es. Par exemple lorsque nous fixons la propri&#xE9;t&#xE9; CSS <code>fill</code> sur notre &#xE9;l&#xE9;ment <code>&lt;svg&gt;</code> conteneur, elle se propage &#xE0; notre <code>&lt;path&gt;</code>, <code>&lt;circle&gt;</code> et autres &#xE9;l&#xE9;ments graphiques.</p>
<p>Nous pouvons utiliser cette technique pour d&#x2019;autres propri&#xE9;t&#xE9;s CSS SVG, par exemple les propri&#xE9;t&#xE9;s stroke&#xA0;: </p>
<pre><code>.Icon--goldstar { fill: gold; stroke: coral; stroke-width: 5%; stroke-linejoin: round;
}
</code></pre>
<figure>
<img src="https://la-cascade.io/content/images/2016/04/star-icon.jpg" alt="">
<figcaption>Ic&#xF4;ne d&#x2019;&#xE9;toile, avec les styles par d&#xE9;faut et personnalis&#xE9;.</figcaption></figure>
<p>La plupart du temps nous ne changerons pas grand chose&#xA0;: uniquement la propri&#xE9;t&#xE9; <code>fill</code> pour la couleur principale et parfois nous ajouterons ou modifierons une <code>stroke</code> (un peu comme une bordure).</p>
<h3 class="softTitleBlue">Deux couleurs de remplissage par ic&#xF4;ne</h3>
<p>Voici une technique assez simple pour permettre &#xE0; une ic&#xF4;ne d&#x2019;avoir deux chemins avec deux valeurs de <code>fill</code> (autrement dit deux couleurs). </p>
<pre><code>&lt;symbol id=&quot;check&quot; viewBox=&quot;0 0 20 20&quot;&gt; &lt;!-- h&#xE9;ritera de la valeur de la propri&#xE9;t&#xE9; CSS fill --&gt; &lt;path d=&quot;&#x2026;&quot; /&gt; &lt;!-- h&#xE9;ritera de la valeur de la propri&#xE9;t&#xE9; CSS color --&gt; &lt;path fill=&quot;currentColor&quot; d=&quot;&#x2026;&quot; /&gt;
&lt;/symbol&gt; </code></pre>
<p>...et le CSS :</p>
<pre><code>.Icon--twoColors { fill: rebeccapurple; color: mediumturquoise;
}
</code></pre>
<figure>
<img src="https://la-cascade.io/content/images/2016/04/check-icons.jpg" alt="">
<figcaption>Des ic&#xF4;nes en deux couleurs.</figcaption></figure>
<h3 class="softTitleBlue">Laisser un peu d&#x2019;espace pour les traits</h3>
<p>Vous vous rappelez ce que nous disions &#xE0; propos de l&#x2019;espace &#xE0; laisser autour de nos formes&#xA0;? C&#x2019;est d&#x2019;autant plus important si vous utilisez les strokes (les traits, dont on peut r&#xE9;gler l&#x2019;&#xE9;paisseur). </p>
<pre><code>.Icon--strokespace { fill: none; stroke: currentColor; stroke-width: 5%;
}
</code></pre>
<p>Dans SVG, les strokes sont peints des deux c&#xF4;t&#xE9;s du chemin. Si votre chemin touche les limites du viewport, la moiti&#xE9; du chemin sera coup&#xE9;e, faute d&#x2019;avoir laiss&#xE9; un espace autour de la forme.</p>
<figure>
<img src="https://la-cascade.io/content/images/2016/04/play-icons.jpg" alt="">
<figcaption>Dans cet exemple, la premi&#xE8;re ic&#xF4;ne n&#x2019;a pas d&#x2019;espace r&#xE9;serv&#xE9; sur les c&#xF4;t&#xE9;s, la seconde en a un peu (0.5px pour un viewport de 15px).</figcaption></figure>
<h3 class="softTitleBlue">Utiliser des pourcentages pour stroke-width</h3>
<p>Donner l&#x2019;&#xE9;paisseur correcte &#xE0; un trait peut relever du d&#xE9;fi. Regardez ces deux exemples dans lesquels nous utilisons <code>stroke-width:1px</code> sur l&#x2019;&#xE9;l&#xE9;ment <code>&lt;svg&gt;</code>&#xA0;:</p>
<figure>
<img src="https://la-cascade.io/content/images/2016/04/stroke-width.jpg" alt="Deux ic&#xF4;nes en forme de coeur avec deux traits d&#x2019;&#xE9;paisseur diff&#xE9;rente">
</figure>
<p>Que se passe-t-il ? La propri&#xE9;t&#xE9; <code>stroke-width</code> accepte une valeur de &quot;longueur&quot; mais cette valeur est relative aux <em>coordonn&#xE9;es locales</em> de votre ic&#xF4;ne. Dans les exemples ci-dessus&#xA0;:</p>
<ol>
<li>la premi&#xE8;re ic&#xF4;ne a une <code>viewBox</code> de 20px&#xA0;&#xD7;&#xA0;20px. Donc un trait de 1px a une &#xE9;paisseur de 1/20e de la taille de l&#x2019;ic&#xF4;ne, c&#x2019;est important mais pas trop grand. </li>
<li>la deuxi&#xE8;me ic&#xF4;ne a une <code>viewBox</code> de 500px&#xA0;&#xD7;&#xA0;500px, et donc un stroke de 1px a une &#xE9;paisseur de 1/500e de la taille de l&#x2019;ic&#xF4;ne, et c&#x2019;est vraiment tr&#xE8;s petit.</li>
</ol>
<p>Si toutes nos ic&#xF4;nes utilisent une <code>viewbox</code> identique, ce n&#x2019;est pas un probl&#xE8;me. Par contre, si elles diff&#xE8;rent grandement, qu&#x2019;elles utilisent des pixels ou des valeurs sans unit&#xE9; (<code>stroke-width:1</code>), on est mal. Que faire&#xA0;?</p>
<p>Les pourcentages peuvent nous aider. Le m&#xEA;me exemple avec <code>stroke-width:5%</code>.</p>
<figure>
<img src="https://la-cascade.io/content/images/2016/04/stroke-width-2.jpg" alt="Deux ic&#xF4;nes en forme de coeur avec des traits de m&#xEA;me &#xE9;paisseur">
</figure>
<p>Voil&#xE0; qui est mieux. Pour les ic&#xF4;nes carr&#xE9;es, <code>stroke-width:N%</code> marchera parfaitement, mais remarquez qu&#x2019;il peut se comporter diff&#xE9;remment pour les &#xE9;l&#xE9;ments SVG larges ou hauts, <a href="https://la-cascade.io/comment-travailler-avec-des-icones-en-svg/#pourcentages">voyez la partie avanc&#xE9;e ci-dessous</a>.</p>
<h3 class="softTitleBlue">Tout n&#x2019;est pas ic&#xF4;ne</h3>
<p>Ce n&#x2019;est pas parce que vous avez un SVG qu&#x2019;il doit obligatoirement se retrouver dans un sprite. Par exemple&#xA0;:</p>
<ul>
<li>les illustrations que vous n&#x2019;avez pas besoin de styler&#xA0;: utilisez plut&#xF4;t l&#x2019;&#xE9;l&#xE9;ment <code>&lt;img&gt;</code></li>
<li>les illustrations que vous voulez animer&#xA0;: ins&#xE9;rez plut&#xF4;t le <code>&lt;svg&gt;</code> en ligne dans votre page, de fa&#xE7;on &#xE0; pouvoir s&#xE9;lectionner et styler des groupes sp&#xE9;cifiques ou des chemins ou des formes, animer certaines parties, etc.</li>
</ul>
<p>Une bonne r&#xE8;gle g&#xE9;n&#xE9;rale pourrait &#xEA;tre que si c&#x2019;est une grande illustration que vous devez afficher &#xE0; 100px&#xA0;&#xD7;&#xA0;100px ou plus, ou si elle contient des dizaines d&#x2019;&#xE9;l&#xE9;ments, ce n&#x2019;est pas une &#x201C;ic&#xF4;ne&#x201D;.</p>
<h2 class="softTitleBlue" id="avancer">Sujets avanc&#xE9;s et astuces</h2>
<p>Nous avons vu dans la section pr&#xE9;c&#xE9;dente tout ce dont vous avez besoin pour utiliser les ic&#xF4;nes SVG. Cette section avanc&#xE9;e ajoute des informations plus complexes.</p>
<h3 class="softTitleBlue">&#xC9;viter les grandes ic&#xF4;nes non styl&#xE9;es</h3>
<p>Que se passe-t-il si votre feuille de style principale ne se charge pas parce que l&#x2019;utilisateur a une connexion peu fiable, par exemple dans un train (&#xE7;a m&#x2019;arrive tout le temps)&#xA0;? La page peut toujours s&#x2019;afficher sans styles. Si vous avez une structure HTML correcte, la page sera lisible mais vos ic&#xF4;nes appara&#xEE;tront vraiment trop grandes.</p>
<figure>
<img src="https://la-cascade.io/content/images/2016/04/unstyled.png" alt="">
<figcaption>Les navigateurs r&#xE9;cents dimensionnent l&#x2019;&#xE9;l&#xE9;ment svg &#xE0; 300px par 150px par d&#xE9;faut. D&#x2019;autres navigateurs peuvent leur donner une largeur g&#xE9;ante de 100%&#xA0;!</figcaption></figure>
<p>Je recommande d&#x2019;ins&#xE9;rer ceci dans la partie <code>&lt;head&gt;</code> de vos pages&#xA0;: </p>
<pre><code>&lt;style&gt;.Icon{width:1em;height:1em}&lt;/style&gt; </code></pre>
<p>Bref &amp; concis.</p>
<h3 class="softTitleBlue">Pr&#xE9;charger les sprites externes</h3>
<p>Dans la section <a href="https://la-cascade.io/comment-travailler-avec-des-icones-en-svg/#ajouter">Ajouter des ic&#xF4;nes &#xE0; vos pages</a>, nous avons dit que les ic&#xF4;nes charg&#xE9;es depuis un sprite externe peuvent appara&#xEE;tre avec un temps de retard, entre autres parce que le scan de pr&#xE9;chargement du navigateur (ou <em>look-ahead</em> ou <em>pre-parser</em>) ne comprend pas que <code>&lt;use xlink:href=&quot;/path/to/icons.svg#something&quot;&gt;&lt;/use&gt;</code> signifie que nous avons un fichier important &#xE0; charger le plus t&#xF4;t possible.</p>
<p>Que faire pour y rem&#xE9;dier ?</p>
<ul>
<li>solution standard (et future) : ajoutez <code>&lt;link rel=&quot;preload&quot; href=&quot;/path/to/icons.svg&quot; as=&quot;image&quot;&gt;</code> dans la partie <code>&lt;head&gt;</code> de la page (d&#xE9;tails sur preload, compatible bient&#xF4;t dans tous les bons Chromes proches de chez vous et esp&#xE9;rons-le dans les autres navigateurs par la suite).</li>
<li>solution vieille &#xE9;cole : ajoutez <code>&lt;img style=&quot;display:none&quot; alt=&quot;&quot; src=&quot;/path/to/icons.svg&quot;&gt;</code> au d&#xE9;but de votre <code>&lt;body&gt;</code>.</li>
</ul>
<p>Je n&#x2019;ai pas test&#xE9; ces solutions, en g&#xE9;n&#xE9;ral le compromis &#x201C;en ligne&#xA0;+&#xA0;externe&#x201D; donne des performances suffisamment bonnes pour qu&#x2019;on n&#x2019;ait pas &#xE0; recourir au pr&#xE9;chargement. Mais &#xE7;a vaudrait de le coup d&#x2019;y regarder de plus pr&#xE8;s.</p>
<h3 class="softTitleBlue">S&#xE9;lectionner les formes et chemins individuels</h3>
<p>Nous avons vu comment personnaliser les <em>fills</em> et les <em>strokes</em> pour tous les chemins d&#x2019;un <code>&lt;symbol&gt;</code> et deux ou plus de couleurs de diff&#xE9;rents chemins. Mais il serait int&#xE9;ressant de pouvoir s&#xE9;lectionner des chemins sp&#xE9;cifiques (en utilisant des classes, peut-&#xEA;tre&#xA0;?) directement dans l&#x2019;<em>instance</em> du <code>&lt;symbol&gt;</code>. Est-ce possible&#xA0;?</p>
<p>L&#xE0;, maintenant, la r&#xE9;ponse est : oui et non.</p>
<ol>
<li>Si vous utilisez des sprites externes, vous ne pouvez pas s&#xE9;lectionner de chemins individuels (ou d&#x2019;autres &#xE9;l&#xE9;ments) &#xE0; l&#x2019;int&#xE9;rieur d&#x2019;un <code>&lt;symbol&gt;</code> utilis&#xE9;. </li>
<li>Si votre sprite est en ligne, vous pouvez s&#xE9;lectionner et styler des &#xE9;l&#xE9;ments &#xE0; l&#x2019;int&#xE9;rieur du sprite, mais ces styles s&#x2019;appliqueront &#xE0; <em>toutes les instances</em> des symboles.</li>
</ol>
<p>Donc, m&#xEA;me avec un sprite en ligne, vous pourriez faire ceci&#xA0;: </p>
<pre><code>#my-symbol .style1 { /* Styles pour un groupe de chemins */
}
#my-symbol .style2 { /* Styles pour un autre groupe */
}
</code></pre>
<p>Mais pas cela : </p>
<pre><code>.MyComponent-button .Icon .style1 { /* Pour 1 groupe de chemins pour cette ic&#xF4;ne dans ce contexte */
}
.MyComponent-button .Icon .style2 { /* Styles pour un autre groupe */
}
</code></pre>
<p>Sauf dans Firefox ! Il se trouve que dans Firefox la s&#xE9;lection &#xE0; l&#x2019;int&#xE9;rieur d&#x2019;une <em>instance</em> du symbole fonctionne parfaitement. Le seul probl&#xE8;me est que c&#x2019;est un comportement non standard, donc il n&#x2019;y a aucune chance que les autres navigateurs s&#x2019;alignent. En fait, il serait m&#xEA;me souhaitable que FF corrige ce bug.</p>
<p>&#xC0; l&#x2019;avenir, il y aura peut-&#xEA;tre une fa&#xE7;on standard de s&#xE9;lectionner via le <em>shadow DOM</em>, mais ce n&#x2019;est pas s&#xFB;r du tout (il existait un combinateur <code>/deep/</code> mais il a &#xE9;t&#xE9; supprim&#xE9;).</p>
<h3 class="softTitleBlue">Plus de deux couleurs avec des propri&#xE9;t&#xE9;s CSS personnalis&#xE9;es</h3>
<p>Comme nous l&#x2019;avons vu, nous pouvons facilement changer les couleurs de nos ic&#xF4;nes SVG &#xE0; partir de CSS pour des ic&#xF4;nes monochromes (c&#x2019;est facile) et en bichromie (&#xE7;a demande une petite pr&#xE9;paration). Existe-t-il une fa&#xE7;on de r&#xE9;aliser des ic&#xF4;nes multicolores <em>avec plus de deux couleurs personnalisables</em>&#xA0;?</p>
<p>Nous pourrions y parvenir avec les <a href="https://developer.mozilla.org/fr/docs/Web/CSS/Les_variables_CSS">propri&#xE9;t&#xE9;s CSS personnalis&#xE9;es</a> (&#xE9;galement connues comme Variables CSS). Cela demande une petite pr&#xE9;paration du c&#xF4;t&#xE9; de notre SVG&#xA0;: </p>
<pre><code>&lt;symbol id=&quot;iconic-aperture&quot; viewBox=&quot;0 0 128 128&quot;&gt; &lt;path fill=&quot;var(--icon-color1)&quot; d=&quot;&#x2026;&quot; /&gt; &lt;path fill=&quot;var(--icon-color2)&quot; d=&quot;&#x2026;&quot; /&gt; &lt;path fill=&quot;var(--icon-color3)&quot; d=&quot;&#x2026;&quot; /&gt; &lt;path fill=&quot;var(--icon-color4)&quot; d=&quot;&#x2026;&quot; /&gt; &lt;path fill=&quot;var(--icon-color5)&quot; d=&quot;&#x2026;&quot; /&gt; &lt;path fill=&quot;var(--icon-color6)&quot; d=&quot;&#x2026;&quot; /&gt;
&lt;/symbol&gt; </code></pre>
<p>Pour cette d&#xE9;mo, j&#x2019;ai emprunt&#xE9; une ic&#xF4;ne de l&#x2019;excellent <a href="https://useiconic.com/">Iconic</a>, qui offre des ic&#xF4;nes SVG responsives et multicolores (aliment&#xE9;es par CSS et du JavaScript, si je comprends bien). J&#x2019;ai essay&#xE9; d&#x2019;imiter leur exemple multicolore pour cette ic&#xF4;ne, j&#x2019;esp&#xE8;re qu&#x2019;ils ne m&#x2019;en voudront pas.</p>
<figure>
<img src="https://la-cascade.io/content/images/2016/04/shutter-icons.jpg" alt="">
<figcaption>Un symbole utilisant six propri&#xE9;t&#xE9;s CSS personnalis&#xE9;es. Fonctionne avec Firefox, Chrome ou Safari 9.1+</figcaption></figure>
<p>Cela fonctionne assez bien avec <a href="http://caniuse.com/#feat=css-variables">les navigateurs compatibles</a>. Il n&#x2019;y a qu&#x2019;une seule ic&#xF4;ne&#xA0;: la premi&#xE8;re instance ne d&#xE9;clare pas les variables attendues, donc elle se r&#xE9;soud en <code>currentColor</code>. Les deux instances suivantes d&#xE9;clarent chacune un ensemble de valeurs d&#xE9;clar&#xE9;es comme variables.</p>
<h3 class="softTitleBlue" id="pourcentages">Comment sont calcul&#xE9;s les pourcentages de stroke-with?</h3>
<p>&#xC0; quoi correspond le pourcentage dans <code>stroke-width:N%</code>&#xA0;? Est-ce la largeur, la hauteur de l&#x2019;ic&#xF4;ne&#xA0;? En fait, c&#x2019;est la diagonale, mais avec <a href="https://svgwg.org/svg2-draft/coords.html#Units">une formule funky (spec)</a>&#xA0;: la diagonale est divis&#xE9;e par la racine carr&#xE9;e de 2, &#xE0; peu pr&#xE8;s 1,4.</p>
<p>Qu&#x2019;est-ce que cela signifie ? Eh bien pour les ic&#xF4;nes carr&#xE9;es, le r&#xE9;sultat de cette formule est le c&#xF4;t&#xE9; du carr&#xE9;. Donc 1% signifie &#x201C;un pourcent de la largeur ou un pourcent de la hauteur&#x201D;. Simple et clair.</p>
<p>Pour les ic&#xF4;nes plus larges ou plus hautes cependant le r&#xE9;sultat peut &#xEA;tre variable&#xA0;:</p>
<figure>
<img src="https://la-cascade.io/content/images/2016/04/stroke-width-3.jpg" alt="">
<figcaption>Dans la seconde ic&#xF4;ne (ratio d&#x2019;aspect de 2:1, montr&#xE9; avec la m&#xEA;me hauteur et une largeur double), le stroke-width:5% nous donne un stroke de 7,91% de la hauteur et 3,95% de la largeur.</figcaption></figure>
<p>Toutes choses bien consid&#xE9;r&#xE9;es, je recommande quand m&#xEA;me d&#x2019;utiliser les valeurs de pourcentage pour <code>stroke-width</code>. Si vous vous en tenez &#xE0; des ic&#xF4;nes carr&#xE9;es, vous pouvez utiliser les valeurs en pourcentage en sachant que <em>grosso modo</em> elles signifient &#x201C;pourcentage de la largeur de l&#x2019;ic&#xF4;ne&#x201D;.</p>
<h3 class="softTitleBlue">D&#xE9;sol&#xE9;, pas de remplissage d&#xE9;grad&#xE9;</h3>
<p>Avec toutes ces possibilit&#xE9;s de couleurs de remplissage, nous pouvons certainement r&#xE9;aliser des choses aussi simples qu&#x2019;utiliser un d&#xE9;grad&#xE9; comme <code>fill</code>&#xA0;?</p>
<p>Malheureusement non. La propri&#xE9;t&#xE9; <code>fill</code> n&#x2019;accepte pas les valeurs d&#x2019;image, et la fonction CSS <code>linear-gradient()</code> g&#xE9;n&#xE8;re une valeur d&#x2019;image.</p>
<p>SVG a sa propre syntaxe pour coder et utiliser les d&#xE9;grad&#xE9;s. Mais son utilisation nous entra&#xEE;nerait assez loin des ic&#xF4;nes SVG simples, donc je dirais juste que cela pourrait se faire, mais &#xE7;a demanderait du travail et vous auriez &#xE0; coder au moins quelques param&#xE8;tres. Essayez si vous voulez :)</p>
<h2 class="softTitleBlue">Conventions inspir&#xE9;es par les bugs des navigateurs</h2>
<h3 class="softTitleBlue">Safari : &#xE9;vitez les attributs de largeur et hauteur</h3>
<p>Pour &#xE9;viter les ic&#xF4;nes g&#xE9;antes dans les pages non styl&#xE9;es, nous nous sommes d&#x2019;abord appuy&#xE9;s sur les attributs <code>width</code> et <code>height</code> de l&#x2019;&#xE9;l&#xE9;ment <code>&lt;svg&gt;</code>&#xA0;: </p>
<pre><code>&lt;svg width=&quot;20&quot; height=&quot;20&quot;&gt; &lt;use xlink:href=&quot;&#x2026;&quot;&gt;&lt;/use&gt;
&lt;/svg&gt; </code></pre>
<p>Puis nous avons test&#xE9; nos premiers sites web &#x201C;bas&#xE9;s sur les ic&#xF4;nes SVG&#x201D; dans Safari et iOS, et la moiti&#xE9; des ic&#xF4;nes &#xE9;taient corrompues&#xA0;! Pourquoi&#xA0;?!??</p>
<p>Il se trouve que Safari/WebKit n&#x2019;appr&#xE9;cie pas d&#x2019;avoir des attributs <code>width</code> et <code>height</code> avec une seule dimension, et le code CSS qui essaie de modifier cette dimension par la suite. En particulier lorsqu&#x2019;on diminue la taille de l&#x2019;ic&#xF4;ne, celle-ci rapetisse mais pas le contenu&#xA0;!</p>
<p>Notre solution a &#xE9;t&#xE9; de laisser tomber ces attributs et de nous appuyer sur le seul CSS pour dimensionner les ic&#xF4;nes.</p>
<p>Remarquez que ce bug a peut-&#xEA;tre &#xE9;t&#xE9; corrig&#xE9; dans les derni&#xE8;res livraisons de Safari (9.1 pour le desktop, iOS 9.3).</p>
<h3 class="softTitleBlue">Safari : &#xE9;vitez le padding sur le conteneur svg</h3>
<p>Si vous voulez une couleur de background, des bordures, du padding, etc., vous devriez essayer de styler l&#x2019;&#xE9;l&#xE9;ment contenant l&#x2019;ic&#xF4;ne et non l&#x2019;&#xE9;l&#xE9;ment <code>&lt;svg&gt;</code> lui-m&#xEA;me. Bien que cela semble fonctionner dans les derniers navigateurs, il existe des probl&#xE8;mes connus de rendu dans les versions anciennes de navigateurs WebKit, donc je recommande de styler un &#xE9;l&#xE9;ment enveloppant (<em>wrapper</em>, comme <code>&lt;span&gt;</code>, <code>&lt;button&gt;</code>, <code>&lt;a&gt;</code>, etc.).</p>
<figure>
<img src="https://la-cascade.io/content/images/2016/04/twitter-icon.jpg" alt="">
<figcaption>Styles de bo&#xEE;tes appliqu&#xE9;s sur l&#x2019;&#xE9;l&#xE9;ment svg directement ou sur un &#xE9;l&#xE9;ment wrapper. La plupart des navigateurs devraient rendre l&#x2019;&#xE9;l&#xE9;ment de la m&#xEA;me fa&#xE7;on, mais les versions anciennes de WebKit risquent de se f&#xE2;cher.</figcaption></figure>
<p><span></span>&#xA0;<em>NdT&#xA0;: pour inspecter le code, vous pouvez vous reporter &#xE0; l&#x2019;<a href="http://fvsch.com/code/svg-icons/how-to/">article original</a>, que vous pouvez &#xE9;galement consulter en <a href="http://fvsch.com/code/svg-icons/how-to/article.txt">version txt</a></em>.</p>
<h3 class="softTitleBlue" id="firefox">Firefox : &#xE9;vitez de cibler l&#x2019;&#xE9;l&#xE9;ment svg</h3>
<p>Cela cr&#xE9;era des probl&#xE8;mes dans Firefox. Pourquoi&#xA0;? Lorsque nous utilisons l&#x2019;&#xE9;l&#xE9;ment <code>&lt;use&gt;</code>, les navigateurs cr&#xE9;ent un <em>shadow DOM</em> (un DOM fant&#xF4;me) o&#xF9; ils dupliquent les contenus des <code>&lt;symbol&gt;</code> que nous utilisons. Sch&#xE9;matiquement, &#xE7;a ressemble &#xE0; ceci&#xA0;: </p>
<pre><code>&lt;svg class=&quot;Icon Icon--something&quot; aria-hidden=&quot;true&quot;&gt; &lt;use xlink:href=&quot;#something&quot;&gt; &lt;svg viewBox=&quot;0 0 20 20&quot;&gt; &lt;path d=&quot;&#x2026;&quot; /&gt; &lt;/svg&gt; &lt;/use&gt;
&lt;/svg&gt; </code></pre>
<p>Comme expliqu&#xE9; dans la section pr&#xE9;c&#xE9;dente, Firefox permet actuellement la s&#xE9;lection dans le shadow DOM cr&#xE9;&#xE9; par l&#x2019;&#xE9;l&#xE9;ment <code>&lt;use&gt;</code>. Donc si vous avez ce CSS&#xA0;... </p>
<pre><code>svg { fill: red;
}
.Icon--something { fill: green;
}
</code></pre>
<p>...dans Firefox les styles seront :</p>
<pre><code>&lt;svg class=&quot;Icon Icon--something&quot; aria-hidden=&quot;true&quot; fill=&quot;green;&quot;&gt; &lt;use xlink:href=&quot;#something&quot;&gt; &lt;svg viewBox=&quot;0 0 20 20&quot; fill=&quot;red;&quot;&gt; &lt;path d=&quot;&#x2026;&quot; /&gt; &lt;/svg&gt; &lt;/use&gt;
&lt;/svg&gt; </code></pre>
<p>Dans d&#x2019;autres navigateurs, l&#x2019;ic&#xF4;ne sera verte (comme attendu), mais dans Firefox elle sera rouge car l&#x2019;&#xE9;l&#xE9;ment <code>&lt;svg&gt;</code> int&#xE9;rieur prendra les styles du premier ensemble de r&#xE8;gles (<code>fill: red</code>).</p>
<p>Une autre fa&#xE7;on d&#x2019;&#xE9;viter ce bug est d&#x2019;utiliser ce s&#xE9;lecteur&#xA0;: </p>
<pre><code>:not(use) &gt; svg { &#x2026; }
</code></pre> <p><span class="interesse"><strong>Int&#xE9;ress&#xE9; par SVG ?</strong> Retrouvez une liste des meilleurs <a href="https://la-cascade.io/articles/#svg"><strong>articles</strong></a> et <strong><a href="https://la-cascade.io/ressources/#svg">ressources</a></strong> du web</span>.</p>
<p><span class="toutlire"><span> </span><strong><a href="https://la-cascade.io/tag/svg/">Tous les articles sur SVG</a></strong> parus dans la Cascade</span>.</p>
<p><span class="toutlire"><span> </span><strong><a href="https://la-cascade.io/tag/bases-svg/">Tous les articles sur les bases SVG</a></strong> parus dans la Cascade</span>.</p>
<p><span class="toutlire"><span> </span><strong><a href="https://la-cascade.io/tag/sketch/">Tous les articles sur Sketch3</a></strong> parus dans la Cascade</span>.</p>
<p><span class="ressourcesComplementaires"><strong>Articles sur les m&#xEA;mes th&#xE8;mes</strong> dans la Cascade</span> :</p>
<p><a href="https://la-cascade.io/utiliser-svg/">Utiliser SVG</a>, par Chris Coyier <br>
<a href="https://la-cascade.io/svg-style-et-anime-avec-css/">SVG, style et animation</a>, par Sara Soueidan <br>
<a href="https://la-cascade.io/grunt-pour-ceux-qui-pensent-que-grunt-est-complique/">Grunt pour ceux qui pensent que Grunt est compliqu&#xE9;</a>, par Chris Coyier <br>
<a href="https://la-cascade.io/gulp-pour-les-debutants/">Gulp pour les d&#xE9;butants</a>, par Zell Liew</p> <p><em><a href="http://fvsch.com/code/svg-icons/how-to/">Article</a> original paru le <meta>26 mars 2016 dans <a href="http://fvsch.com/code/">le blog de Florens Verschelde</a>. Vous pouvez consulter <a href="http://fvsch.com/code/svg-icons/how-to/article.txt">les sources du texte ici</a></em>.</p>
<p><em>Sur l&#x2019;auteur</em> : <span><span><a href="https://twitter.com/fvsch" class="authorLink">Florens Verschelde</a></span></span> <em>est un professionnel du web, auteur et photographe. On peut le suivre sur <a href="https://twitter.com/fvsch">twitter</a> et sur son <a href="http://fvsch.com/">blog</a></em>.</p>
<p>Traduit avec l&#x2019;aimable autorisation de l&#x2019;auteur. <br>
Copyright <span>Florens Verschelde</span> &#xA9; <span>2016</span>.</p> <footer class="post-footer">
<figure class="author-image">
<a class="img" href="https://la-cascade.io/author/pierre-choffe/"><p class="hidden">pierre choff&#xE9;&apos;s Picture</p></a>
</figure>
<section class="author"> <p>Manager d&#x2019;ensembles musicaux, Traducteur, en route vers la Plan&#xE8;te SemanticWeb &#xE0; bord du vaisseau FRBRoo, pour la description, le partage et l&apos;enrichissement des donn&#xE9;es musicales.</p> </section>
<section class="share"> <a class="icon-twitter" href="https://twitter.com/share?text=Comment%20travailler%20avec%20des%20ic%C3%B4nes%20en%20SVG&amp;url=https://la-cascade.io/comment-travailler-avec-des-icones-en-svg/">
<p class="hidden">Twitter</p>
</a>
<a class="icon-facebook" href="https://www.facebook.com/sharer/sharer.php?u=https://la-cascade.io/comment-travailler-avec-des-icones-en-svg/">
<p class="hidden">Facebook</p>
</a>
<a class="icon-google-plus" href="https://plus.google.com/share?url=https://la-cascade.io/comment-travailler-avec-des-icones-en-svg/">
<p class="hidden">Google+</p>
</a>
</section>
</footer> <aside class="read-next">
<a class="read-next-story no-cover" href="https://la-cascade.io/css-grid-et-le-saint-graal/">
<section class="post"> <p>Un premier article sur la nouvelle sp&#xE9;cification CSS Grid Layout. Ire Aderinokun s&apos;attaque au Saint Graal et nous initie&#x2026;</p>
</section>
</a>
<a class="read-next-story prev no-cover" href="https://la-cascade.io/sur-not-et-la-specifite/">
<section class="post"> <p>Ire Aderinokun va toujours fouiller au fond des choses. Elle revisite ici la pseudo-classe de n&#xE9;gation, nous montre l&apos;envers&#x2026;</p>
</section>
</a>
</aside>
<footer class="site-footer clearfix">
<section class="copyright"><a href="https://la-cascade.io/">LA CASCADE</a> Traductions <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a></section>
<section class="poweredby">Proudly published with <a href="https://ghost.org/">Ghost</a></section>
</footer> </body>]]></description>
      <link>https://la-cascade.io/comment-travailler-avec-des-icones-en-svg/</link>
      <guid>https://la-cascade.io/comment-travailler-avec-des-icones-en-svg/</guid>
      <pubDate>Tue, 30 Aug 2016 03:08:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Traduit ailleurs : Traitement de texte multicanal]]></title>
      <description><![CDATA[<div class="post"> <span class="post-date"> 28 ao&#xFB;t 2016 </span> <span class="post-read-time">&#xB7; <svg class="icon icon-clock"><use/></svg> 23 minutes </span> <p>Comme je l&#x2019;expliquais dans <a href="https://frank.taillandier.me/2016/03/08/les-gestionnaires-de-contenu-statique/">la mouvance statique</a>, il est important de bien choisir le format de fichier dans lesquels nous allons stocker nos &#xE9;crits. C&#x2019;est souvent la solution la plus simple qui est aussi la plus efficace : du texte brut mise en forme &#xE0; l&#x2019;aide d&#x2019;une syntaxe elle aussi en texte brut. Markdown est de ce fait un format de fichier de plus en plus populaire car il assure une p&#xE9;rennit&#xE9; et une compatibilit&#xE9; &#xE0; nos documents, tout en pr&#xE9;servant une mise en forme au format texte. Markdown est le format par d&#xE9;faut des contenus dans la plupart des g&#xE9;n&#xE9;rateurs de site statique et il devrait devenir aussi le format par d&#xE9;faut dans lequel vous r&#xE9;digez vos notes, vos rapports, vos articles de blog ou vos livres.</p> <p>Il existe de nombreux &#xE9;diteurs de Markdown, j&#x2019;utilise personnellement selon le contexte l&#x2019;&#xE9;diteur <a href="https://atom.io/">Atom</a> et <a href="https://github.com/zhuochun/md-writer">quelques</a> <a href="https://github.com/lloeki/linter-markdownlint">plugins</a> ou <a href="https://ia.net/writer">iA Writer</a> pour m&#x2019;y aider.</p> <p>Les concepteurs d&#x2019;iA Writer ont r&#xE9;dig&#xE9; un essai sur l&#x2019;importance d&#x2019;utiliser des formats texte comme Markdown. Markdown n&#x2019;est pas le seul, il y en a d&#x2019;autres comme reStructuredText, Textile ou Asciidoc mais la popularit&#xE9; de Markdown est grandissante depuis quelques ann&#xE9;es.</p> <figure> <img src="https://frank.taillandier.me/assets/img/2016/08/tendance-markdown.png" alt=""> <figcaption><small></small><p>Tendance des recherches du terme Markdown dans Google</p>
</figcaption> </figure> <p>Aussi ai-je pens&#xE9; que la lecture instructive de cet essai, qui revient sur les enjeux et les probl&#xE9;matiques auxquels nous sommes tous confront&#xE9;s quand il s&#x2019;agit de migrer des contenus textuels devrait vous int&#xE9;resser.</p> <p>J&#x2019;esp&#xE8;re que ce texte vous donnera envie de tester et d&#x2019;adopter Markdown, de trouver les outils d&#x2019;&#xE9;dition qui vous conviennent le mieux et surtout que vos &#xE9;crits ne d&#xE9;pendront plus de formats qui les emprisonnent.</p> <h2 id="traduction-de-lessai-multichannel-text-processing-paru-chez-information-architects">Traduction de l&#x2019;essai <a href="https://ia.net/know-how/multichannel-text-processing">Multichannel Text Processing</a> paru chez <a href="https://ia.net/">Information Architects</a>.</h2> <p><strong>Du bon vieux temps des traitements de texte, le texte prenait vie entre MS Word et une imprimante. Aujourd&#x2019;hui, le texte est &#xE9;crit et &#xE9;dit&#xE9; sur diff&#xE9;rents appareils et applications, puis envoy&#xE9; par mail, imprim&#xE9;, copi&#xE9;, coll&#xE9;, annot&#xE9;, publi&#xE9;, index&#xE9; dans des flux RSS, partag&#xE9; et re-partag&#xE9; &#xE0; l&#x2019;aide de tout un tas d&#x2019;outils et de plateformes. Les formats de fichiers propri&#xE9;taires rigides sont vou&#xE9;s &#xE0; l&#x2019;&#xE9;chec dans ce nouvel environnement fr&#xE9;n&#xE9;tique. Le texte brut s&#x2019;en sort mieux, mais il n&#x2019;offre pas les possibilit&#xE9;s de mise en forme du texte enrichi. Markdown pourrait bien &#xEA;tre notre rem&#xE8;de miracle. Si seulement, il avait l&#x2019;air un peu plus attractif !</strong>.</p> <h3 id="1-le-texte-enrichi">1. Le texte enrichi</h3> <p>Le texte enrichi comme MS Word ou le format <code class="highlighter-rouge">.rtf</code> sont devenus populaires en faisant la promesse du WYSIWYG (What You See Is What You Get). Nous pouvons utiliser le gras, l&#x2019;italique, diff&#xE9;rentes polices ou mises en forme et nous voyons imm&#xE9;diatement le r&#xE9;sultat sur notre &#xE9;cran ! Lors de son apparition ce fut une v&#xE9;ritable r&#xE9;volution compar&#xE9; aux encombrants &#xE9;diteurs qui affichaient des fen&#xEA;tres de formatage de code ou &#xE0; ceux qui ne proposaient pas de mise en forme du tout. Cependant, il y a quelques inconv&#xE9;nients.</p> <figure> <img src="https://ia.net/content/4-know-how/20160610-multichannel-text-processing/plain-text-vs-rich-text-plain-text.png" alt=""> <figcaption><small></small><p>Comparaison des deux formats de fichier</p>
</figcaption> </figure> <p>Au format texte brut, le texte <em>est</em> la source. Avec le texte enrichi, ce que nous voyons est une simulation. Ce que nous voyons peut nous plaire, mais sous la surface, notre traitement de texte g&#xE9;n&#xE8;re en secret un texte encod&#xE9; bien plus complexe. Vous pouvez visiter ce monde enfoui en cr&#xE9;ant un document Pages ou Word, tapez &#x201C;Bonjour monde&#x201D; et sauvegardez, puis changez l&#x2019;extension de fichier en <code class="highlighter-rouge">.zip</code> et d&#xE9;compressez l&#x2019;archive. Bienvenue en 1979 !<sup id="fnref:2"><a href="https://frank.taillandier.me/2016/08/28/traitement-de-texte-multicanal/#fn:2" class="footnote">1</a></sup></p> <figure> <img src="https://ia.net/content/4-know-how/20160610-multichannel-text-processing/hello-world.png" alt=""> <figcaption><small></small><p>Contenu d&#x2019;un fichier Word</p>
</figcaption> </figure> <p>Si vous &#xEA;tes assez t&#xE9;m&#xE9;raires pour aller inspecter le contenu du dossier g&#xE9;n&#xE9;r&#xE9;, vous allez peut-&#xEA;tre commencer &#xE0; vous demander si vous avez tap&#xE9; &#x201C;Bonjour monde&#x201D; ou &#x201C;Bonjour l&#x2019;enfer&#x201D; :</p> <p><img src="https://ia.net/content/4-know-how/20160610-multichannel-text-processing/hello-hell.png" alt="fen&#xEA;tres montrant du code source de fichiers texte au format XML"></p> <p>Les formats personnalis&#xE9;s sont plus lourds que les formats en texte brut. Le souci majeur de ces formats personnalis&#xE9;s est que la relation entre le code source et le texte &#x2014; entre ce que nous voyons et ce que nous ne voyons pas &#x2014; est fantasque. Voici ce que vous obtenez vraiment quand vous travaillez avec ces formats en 2016 :</p> <p><strong>Des bugs et des probl&#xE8;mes d&#x2019;ergonomie</strong> Comment sortir d&#x2019;une liste ou supprimer une indentation ? Comment supprimer un lien ? Comment supprimer cette mise en gras, cet espacement de ligne ou cette taille de titre ? Et comment diable placer deux images c&#xF4;te &#xE0; c&#xF4;te ? Parfois on ne sait plus tr&#xE8;s bien si nous sommes face &#xE0; une anomalie ou une erreur d&#x2019;ergonomie du logiciel.</p> <p><strong>Spaghettis de copier-coller</strong> Le principal souci avec les formats personnalis&#xE9;s dans un environnement de publication multicanal est qu&#x2019;ils emp&#xEA;chent le copier-coller. Nous copions un simple paragraphe &#xE0; partir d&#x2019;un fichier PDF et quand on le colle dans notre email, le texte en fran&#xE7;ais se transforme en Western spaghetti italien dramatique avec tout un tas d&#x2019;espaces et de retours &#xE0; la ligne. Et cela ne concerne pas que le PDF. Avec le texte format&#xE9; nous ne savons jamais ce que nous obtiendrons lorsque nous allons coller notre texte.</p> <p><strong>Compatibilit&#xE9;</strong> Bien que le <code class="highlighter-rouge">.rtf</code> soit un format assez &#xE9;tabli et que la plupart des traitements de texte lisent les <code class="highlighter-rouge">.docx</code>, des applications diverses interpr&#xE9;teront ces formats diff&#xE9;remment. Vous ne pouvez pas ajouter de texte au format RTF ou Docx de mani&#xE8;re fiable dans votre CMS. Et n&#x2019;imaginez m&#xEA;me pas pouvoir aller et venir &#xE0; votre aise d&#x2019;un CMS &#xE0; un document Word.</p> <p><strong>Versions</strong> Exporter se fait peut &#xEA;tre <em>en un clic</em>, mais d&#xE9;cliner votre texte en plusieurs versions complique votre processus de travail. Les retours ou les propositions de modification ne peuvent pas &#xEA;tre incorpor&#xE9;s facilement dans un fichier principal. G&#xE9;rer ces versions devient rapidement un cauchemar.</p> <p><strong>Accessibilit&#xE9;</strong> Le format texte enrichi ne vous permet pas de toucher &#xE0; la source de votre document. Peut-&#xEA;tre que le texte est dans un dossier qui pr&#xE9;tend &#xEA;tre un fichier ou cach&#xE9; quelque part &#x201C;&#xE0; l&#x2019;abri de l&#x2019;utilisateur&#x201D;, enfoui dans les profondeurs de dossiers de code spaghetti ou chiffr&#xE9; dans le Fort Know d&#x2019;une base de donn&#xE9;es secr&#xE8;te.</p> <p>Bien entendu, en tant qu&#x2019;homme d&#x2019;affaires vous aimez les cha&#xEE;nes dor&#xE9;es des formats personnalis&#xE9;s. En tant que personne qui &#xE9;crit du texte en 2016, en utilisant diff&#xE9;rents appareils, applications, plateformes et formats, vous ne les aimez pas du tout. Apr&#xE8;s tout, qui sait quel sera notre ressenti vis &#xE0; vis des <code class="highlighter-rouge">.docx</code> dans 10 ans ? Et dans 30 ans ?</p> <blockquote> <p>M&#xEA;me si les logiciels de traitement de texte modernes peuvent faire des trucs super &#x2014; comme ajouter des graphiques, des tableaux et des images, en appliquant des styles sophistiqu&#xE9;s &#x2014; il y a une chose qu&#x2019;ils ne savent pas faire : garantir que les mots que j&#x2019;&#xE9;cris aujourd&#x2019;hui seront encore lisibles dans dix ans. C&#x2019;est une des raisons pour lesquelles je pr&#xE9;f&#xE8;re travailler en texte brut : c&#x2019;est &#xE9;ternel. Mes petits-enfants pourront lire un fichier texte que j&#x2019;ai &#xE9;crit aujourd&#x2019;hui, longtemps apr&#xE8;s que quelqu&#x2019;un se souvienne ce que diable est un fichier <code class="highlighter-rouge">.dotx</code> <sup id="fnref:3"><a href="https://frank.taillandier.me/2016/08/28/traitement-de-texte-multicanal/#fn:3" class="footnote">2</a></sup></p>
</blockquote> <p>Dans l&#x2019;environnement de texte multicanal d&#x2019;aujourd&#x2019;hui le format de fichier texte enrichi cr&#xE9;e plus de barri&#xE8;res qu&#x2019;&#xE0; l&#x2019;&#xE9;poque o&#xF9; les choses &#xE9;taient plus simples. Le fait de devoir installer une certaine version d&#x2019;une application sur une certaine version d&#x2019;un syst&#xE8;me d&#x2019;exploitation pour ouvrir un fichier est une vaste fumisterie. Pour pouvoir &#xEA;tre partag&#xE9; entre diff&#xE9;rentes applications et plateformes, le texte lui-m&#xEA;me doit &#xEA;tre lib&#xE9;r&#xE9; des carcans d&#x2019;une application, d&#x2019;une plateforme ou d&#x2019;un appareil.</p> <h2 id="2-le-texte-brut">2. Le texte brut</h2> <p>Le seul format de fichier qui fonctionne partout comme pr&#xE9;vu, c&#x2019;est pas de format du tout, en d&#x2019;autres termes : du texte brut. Et c&#x2019;est de tout ce dont nous avons besoin pour &#xE9;crire nos premiers brouillons.</p> <blockquote> <p>Le texte brut d&#xE9;signe des mots s&#xE9;par&#xE9;s par des espaces, des phrases s&#xE9;par&#xE9;es par des points, des paragraphes s&#xE9;par&#xE9;s en g&#xE9;n&#xE9;ral par une seul retour &#xE0; la ligne. Si vous travaillez dans l&#x2019;&#xE9;dition ou m&#xEA;me dans l&#x2019;&#xE9;dition en ligne, c&#x2019;est souvent tout ce dont vous avez besoin.<sup id="fnref:4"><a href="https://frank.taillandier.me/2016/08/28/traitement-de-texte-multicanal/#fn:4" class="footnote">3</a></sup></p>
</blockquote> <p>Le texte brut est simple. Il vous aide &#xE0; vous concentrer ce que vous voulez dire.</p> <p>Le texte brut est gratuit. TextPad, TextEdit, Vim, votre t&#xE9;l&#xE9;phone cellulaire, l&#x2019;application AOL Mail 1997 de votre oncle&#x2026; pas besoin de sortir le porte-monnaie.</p> <p>Le texte brut est l&#xE9;ger.</p> <p>Le texte brut s&#x2019;&#xE9;coule comme de l&#x2019;eau. Mais contrairement &#xE0; l&#x2019;eau, il n&#x2019;&#xE9;tanche pas toutes les soifs. Que ce soit pour l&#x2019;impression, un article de blog, un PDF, un email ou m&#xEA;me un fax, &#xE0; un moment ou &#xE0; un autre, le texte va devoir prendre forme sur un m&#xE9;dium appropri&#xE9; pour &#xEA;tre lu. Comme nos mots prennent forme &#xE0; l&#x2019;int&#xE9;rieur d&#x2019;un medium, ils exigent une structure visuelle. Les documents d&#x2019;entreprise ont besoin d&#x2019;en-t&#xEA;tes, de pieds de page et de pages de couverture. Certains textes ne prennent vie que lorsque ils sont illustr&#xE9;s et enrichis avec des photos, des vid&#xE9;os ou des tableaux. Nous voulons des liens quand nous &#xE9;crivons en ligne. Nous avons besoin de notes de bas de page dans un livre blanc.</p> <p>La transition du texte brut au texte format&#xE9; est g&#xE9;n&#xE9;ralement brusque et irr&#xE9;versible. Vous &#xE9;crivez dans TextEdit ou Notepad, mais une fois que vous vous passez en RTF, docx ou HTML il n&#x2019;y a plus de retour en arri&#xE8;re possible. Mais le texte veut naturellement et lentement se transformer &#xE0; partir de simples mots en de la prose format&#xE9;e . C&#x2019;est l&#xE0; que Markdown entre en sc&#xE8;ne.</p> <h2 id="3-markdown">3. Markdown</h2> <p>Les langages de balisage, comme Markdown, MediaWiki ou LaTeX, vous permettent de structurer vos mots sans construire un royaume invisible sous le text brut. H&#xE9;las&#x2026;</p> <h3 id="31-markdown-&#xE7;a-craint-">3.1 Markdown &#xE7;a craint !</h3> <p>Vous avez peut &#xEA;tre essay&#xE9; d&#x2019;&#xE9;crire du Markdown ou de modifier une entr&#xE9;e dans Wikip&#xE9;dia et vous avez d&#xE9;test&#xE9; &#xE7;a, parce que vous vous demandiez &#x201C;Mais pourquoi devrais-je apprendre une nouvelle &#x2018;syntaxe&#x2019; pour formater du texte quand j&#x2019;ai un outil qui fait &#xE7;a en appuyant sur un bouton et qui me montre exactement ce que j&#x2019;obtiendrais ?&#x201D;<sup id="fnref:5"><a href="https://frank.taillandier.me/2016/08/28/traitement-de-texte-multicanal/#fn:5" class="footnote">4</a></sup> Et vous avez raison :</p> <ul> <li>Baliser du texte peut vous &#xE9;viter des probl&#xE8;mes de copier-coller mais le Markdown brut a toujours l&#x2019;air compliqu&#xE9;,</li> <li>Bien que Markdown soit plus simple que le HTML, vous devez toujours vous souvenir de la syntaxe et rechercher &#xE0; chaque fois comment ajouter un lien vous sort de votre flux,</li> <li>Balisage, Markdown, MultiMachin&#x2026; ces formats ont leur propres probl&#xE8;mes de compatibilit&#xE9;.</li>
</ul> <p>Markdown n&#x2019;est pas la solution parfaite pour tous les types de r&#xE9;dacteurs ou toutes les formes et les &#xE9;tapes d&#x2019;&#xE9;criture. Mais si vous tout fa&#xEE;tes vous-m&#xEA;me, de la prise de notes &#xE0; la publication, c&#x2019;est la solution la plus efficace &#xE0; ce jour. Si votre &#xE9;diteur vous impose des outils de r&#xE9;daction, Markdown est une option moins &#xE9;vidente. Mais encore une fois, la possibilit&#xE9; de pouvoir partager plus simplement qu&#x2019;avec les formats de fichier traditionnels rend la collaboration consid&#xE9;rablement plus fluide&#x2026;</p> <h3 id="32-un-plaidoyer-pour-markdown">3.2 Un plaidoyer pour Markdown</h3> <p>Consid&#xE9;rations esth&#xE9;tiques mises &#xE0; part, Markdown est imbattable quand vous n&#x2019;avez besoin que de <strong>mise en gras</strong> ou d&#x2019;<em>italique</em>. Taper #, ## ou ### pour les diff&#xE9;rents niveaux de titre peut para&#xEE;tre un peu bizarre au d&#xE9;but. Mais une fois appris, taper des di&#xE8;ses est plus simple et plus rapide que de retirer les mains de votre clavier, rep&#xE9;rer le pointeur de la souris, s&#xE9;lectionner un morceau de texte et cliquer sur le menu d&#xE9;roulant WYSIWYG des styles pour choisir le bon niveau de titre. Et contrairement &#xE0; ses satan&#xE9;s formats de styles, les di&#xE8;ses se comportent toujours comment ils le devraient.</p> <p>Si vous connaissez ces trois choses, *, ** et #, vous en savez assez sur Markdown pour vous lancer. Et plus vous serez &#xE0; l&#x2019;aise avec Markdown, moins il y aura de friction dans votre proc&#xE9;d&#xE9; global d&#x2019;&#xE9;criture. Voyons ensemble quelques d&#xE9;fis plus difficiles :</p> <h4 id="les-liens">Les liens</h4> <p>Les liens Markdown peuvent compl&#xE8;tement ruiner l&#x2019;aspect de votre texte. C&#x2019;est utile de voir les liens dans le texte et pouvoir se passer de clics droits et de fen&#xEA;tres intrusives, mais si vous utilisez beaucoup trop de liens dans un texte, c&#x2019;est affreux. Une mani&#xE8;re de contourner le probl&#xE8;me est d&#x2019;utiliser le format des liens de r&#xE9;f&#xE9;rences. Un autre pourrait &#xEA;tre de masquer les liens dans l&#x2019;&#xE9;diteur, mais cela reviendrait &#xE0; reproduire les probl&#xE8;mes du texte enrichi.</p> <p>Avoir plus de libert&#xE9;s avec les images dans le texte est cool. Si vous voulez un logiciel qui permet de parfaitement mettre en page les images, utilisez InDesign, ou faites-le dans votre CMS. N&#x2019;essayez pas avec Word et n&#x2019;allez pas croire que votre &#xE9;diteur de Markdown fera tout aussi bien qu&#x2019;il vous aide &#xE0; trouver vos mots. Oui, vous pouvez utiliser Markdown dans InDesign.<sup id="fnref:6"><a href="https://frank.taillandier.me/2016/08/28/traitement-de-texte-multicanal/#fn:6" class="footnote">5</a></sup></p> <p>Les tableaux en texte brut ont mauvaise r&#xE9;putation. S&#x2019;ils sont complexes, c&#x2019;est vrai qu&#x2019;ils ont l&#x2019;air affreux. Mais pour quelques lignes et colonnes ils marchent bien : contrairement &#xE0; Word, vous voyez exactement ce qui se passe. (Si vous faites des tableaux avanc&#xE9;s Word est votre ennemi, utilisez toujours un tableur comme Excel ou Numbers). Ils sont p&#xE9;nibles &#xE0; cr&#xE9;er, mais avec un peu de magie&#x2026;</p> <iframe src="https://player.vimeo.com/video/160875330" class=""></iframe> <h4 id="automatisation">Automatisation</h4> <p>Avec le format MultiMarkdown<sup id="fnref:7"><a href="https://frank.taillandier.me/2016/08/28/traitement-de-texte-multicanal/#fn:7" class="footnote">6</a></sup> (une version am&#xE9;lior&#xE9;e de Markdown) vous pouvez cr&#xE9;er des tables des mati&#xE8;res automatiquement et &#xE0; l&#x2019;aide des variables de m&#xE9;tadonn&#xE9;es vous pouvez m&#xEA;me cr&#xE9;er des mod&#xE8;les de lettres. Okay, &#xE7;a a l&#x2019;air hardcore. Et <em>c&#x2019;est</em> hardcore. Mais vous devriez <a href="http://vimeo.com/158324329">essayer</a>. Vous n&#x2019;avez pas besoin d&#x2019;&#xEA;tre un hacker ninja rockstar pour comprendre les bases. Et une fois que vous comprenez les bases, cela devient plus facile de <a href="https://vimeo.com/158311378">g&#xE9;n&#xE9;rer une table des mati&#xE8;res en MultiMarkdown</a> que dans MS Word.</p> <h4 id="notes-de-bas-de-page">Notes de bas de page</h4> <p>MultiMarkdown g&#xE8;re aussi les notes de bas de page. La syntaxe est un petit peu lourdingue comme pour les liens mais c&#x2019;est aussi abscond dans les &#xE9;diteurs de texte enrichi. Avec <a href="https://vimeo.com/158933545">un &#xE9;diteur de Markdown qui propose un fonction aper&#xE7;u</a> vous pouvez apprendre la syntaxe tout en <del>&#xE9;crivant</del> cliquant.</p> <p>Plus vous ma&#xEE;triserez Markdown, plus vous passerez rapidement et facilement du texte brut au texte format&#xE9;. C&#x2019;est l&#xE0; o&#xF9; Markdown excelle : en comblant le foss&#xE9; entre le texte brut et le texte enrichi, il vous permet de constamment modeler le texte &#x2014; de la premi&#xE8;re note prise au hasard jusqu&#x2019;&#xE0; la publication multicanale.</p> <h4 id="rendu-en-temps-r&#xE9;el">Rendu en temps r&#xE9;el</h4> <p>Il existe diff&#xE9;rentes mani&#xE8;res d&#x2019;am&#xE9;liorer le rendu de Markdown, comme en en masquant certaines parties, mais si vous g&#xE9;n&#xE9;rez le rendu du Markdown dans le texte, WYSIWYG, vous r&#xE9;introduisez tous les probl&#xE8;mes qui rendent les &#xE9;diteurs de texte enrichi obsol&#xE8;tes et vous en ajoutez de nouveaux. Si vous essayez de faire tout ce que sait faire Word avec Markdown, vous allez cr&#xE9;er un nouveau Word avec un langage qui n&#x2019;est pas fait pour le WYSIWYG. C&#x2019;est pour cette raison qu&#x2019;iA Writer ne masque aucun caract&#xE8;re Markdown.</p> <h2 id="4-un-processus-de-publication-moderne">4. Un processus de publication moderne</h2> <p>Nous pouvons imaginer que les diff&#xE9;rentes &#xE9;tapes d&#x2019;un proc&#xE9;d&#xE9; d&#x2019;&#xE9;criture comme &#xE9;tant compos&#xE9;es de phases distinctes que nous pouvons contr&#xF4;ler et classer par ordre chronologique. En r&#xE9;alit&#xE9;, nous prenons des notes en amont de l&#x2019;&#xE9;criture et nous continuons d&#x2019;assembler des mat&#xE9;riaux jusqu&#x2019;&#xE0; la publication. L&#x2019;&#xE9;dition commence avec le premier brouillon et &#x2014; pas seulement dans les m&#xE9;dias num&#xE9;riques &#x2014; se poursuit bien apr&#xE8;s la publication.<sup id="fnref:8"><a href="https://frank.taillandier.me/2016/08/28/traitement-de-texte-multicanal/#fn:8" class="footnote">7</a></sup></p> <p>Distinguer les &#xE9;tapes d&#x2019;un proc&#xE9;d&#xE9; cr&#xE9;atif est n&#xE9;cessaire mais les processus de travail agiles ne ressemblent pas &#xE0; une cascade : ils se chevauchent, interagissent, s&#x2019;influencent mutuellement et notre &#xE9;criture et nos outils de publication devraient nous permettre d&#x2019;aller et venir comme nous le souhaitons.<sup id="fnref:9"><a href="https://frank.taillandier.me/2016/08/28/traitement-de-texte-multicanal/#fn:9" class="footnote">8</a></sup> L&#x2019;&#xE9;criture est espi&#xE8;gle par nature.</p> <figure> <img src="https://ia.net/content/4-know-how/20160610-multichannel-text-processing/workflow-note-draft-edit-publish.png" alt=""> <figcaption><small>
</small></figcaption> </figure> <p>&#xC9;crire en &#xE9;tant concentr&#xE9; ne veut pas dire &#xE9;crire avec des &#x153;ill&#xE8;res, cela signifie que votre attention est principalement dirig&#xE9;e sur un seul aspect du proc&#xE9;d&#xE9; global. Il peut &#xEA;tre m&#xEA;me utile d&#x2019;aller et venir consciemment entre deux &#xE9;tapes voisines. Markdown vous permet de ne pas vous soucier de ces transitions.</p> <h2 id="41-&#xC9;crire-et-pr&#xE9;visualiser">4.1 &#xC9;crire et pr&#xE9;visualiser</h2> <p>Aller et venir entre les diff&#xE9;rentes &#xE9;tapes d&#x2019;un proc&#xE9;d&#xE9; est n&#xE9;cessaire et rafra&#xEE;chissant. Si vous aimez travaillez dans un &#xE9;diteur WYSIWYG ou imprimer votre texte de temps en temps, ou regarder l&#x2019;aper&#xE7;u sur votre blog avant de publier, vous savez d&#xE9;j&#xE0; que : un formatage d&#xE9;fini nous aide &#xE0; nous mettre &#xE0; la place du lecteur du texte. Voir notre texte imprim&#xE9; change la perception que nous avons de lui. Vous obtenez le m&#xEA;me effet quand vous sortez du Markdown pour aller regarder l&#x2019;aper&#xE7;u du rendu de votre texte en HTML.</p> <figure> <img src="https://ia.net/content/4-know-how/20160610-multichannel-text-processing/markdown-with-preview-plain-text.png" alt=""> <figcaption><small></small><p>&#xC9;crire et pr&#xE9;visualiser</p>
</figcaption> </figure> <p>L&#x2019;effet n&#x2019;est peut &#xEA;tre pas aussi frappant que le passage de l&#x2019;&#xE9;cran au papier, mais il laisse entrevoir la forme du texte &#xE0; venir. Avec le sentiment de la fa&#xE7;on dont un lecteur verra votre texte, vous pouvez revenir &#xE0; votre texte avec des yeux neufs. C&#x2019;est plus rapide car cela &#xE9;vite l&#x2019;exercice chronophage de devoir retaper les corrections manuscrites.</p> <p>Le passage conscient entre le texte brut et le texte format&#xE9; vous laisse imaginer comment le texte sera lu par une personne externe.</p> <h3 id="42-modifier-et-publier">4.2 Modifier et publier</h3> <p>Le m&#xEA;me changement de perspective se produit quand vous passez de la vue back-end de votre texte &#xE0; la vue front-end &#x2014; apr&#xE8;s avoir migr&#xE9; le contenu dans votre CMS.</p> <p>Si vous &#xE9;crivez d&#xE9;j&#xE0; vos textes en Markdown, assurez vous que vos outils de publication vous permettent d&#x2019;&#xE9;diter le texte brut sans perdre toute la mise en forme. Vous n&#x2019;avez pas besoin de passer &#xE0; un CMS bas&#xE9; sur des fichiers Markdown. Si vous utilisez Wordpress, vous pouvez utiliser un plugin Markdown pour l&#x2019;&#xE9;diteur. &#xC7;a aide si les applications que vous utilisez permettent la publication sur diff&#xE9;rentes plateformes tout de go. C&#x2019;est pour cela qu&#x2019;<a href="https://ia.net/writer">iA Writer</a> vous permet de publier directement sur Wordpress et Medium :</p> <iframe src="https://player.vimeo.com/video/164238502" class=""></iframe> <p>Publier directement depuis votre application d&#x2019;&#xE9;criture est cool. Mais l&#x2019;important c&#x2019;est de pouvoir copier-coller votre texte ici et l&#xE0; sans perdre votre travail. &#xC0; moins que vous ne soyez un g&#xE9;nie du proc&#xE9;d&#xE9; de travail, vous aurez toujours besoin d&#x2019;ajouter quelques touches finales dans Indesign, Wordpress ou Pages. &#xC0; quoi bon utiliser un outil de publication qui ne vous laisse pas faire les choses qu&#x2019;un traitement de texte ne sait pas faire ?</p> <h2 id="conclusion">Conclusion</h2> <p>Nous utilisons diff&#xE9;rents appareils pour prendre des notes, diff&#xE9;rentes applications pour cr&#xE9;er des brouillons et faire des modifications, nous envoyons du texte &#xE0; d&#x2019;autres personnes et nous utilisons diff&#xE9;rentes plateformes pour mettre en forme et publier nos textes. Le proc&#xE9;d&#xE9; de production et la forme finale de notre texte sont plus difficiles &#xE0; anticiper. Nous avons besoin de quelque chose de mieux que les formats de texte traditionnels, qui nous enferment dans un cadre format/application/plateforme/appareil d&#xE9;fini, pour faire face &#xE0; la r&#xE9;alit&#xE9; complexe d&#x2019;aujourd&#x2019;hui pour ce qui est de la mise en forme et de la publication.</p> <p>De par son universalit&#xE9; et sa simplicit&#xE9;, le texte brut nous emm&#xE8;ne plus loin que tout autre type de format. Et pourtant, les &#xE9;diteurs de texte brut ne sont pas fait pour visualiser la structure du texte, optimiser des mises en page complexes, batailler avec des d&#xE9;tails typographiques ou lier entre eux des corps de texte. Ils sont g&#xE9;niaux pour vous aider &#xE0; trouver les bons mots, mais ont du mal lorsque le texte devient plus long. Un proc&#xE9;d&#xE9; d&#x2019;&#xE9;criture contemporain doit nous permettre d&#x2019;aller et venir librement entre le text brut et le texte mis en forme, gr&#xE2;ce &#xE0; des processus de travail automatis&#xE9;s ou du copier-coller.</p> <p>Pour le moment les langages de balisage l&#xE9;gers comme Markdown sont les seuls &#xE0; permettre cela. Markdown peut avoir l&#x2019;air un peu brouillon et oui, tout un tas d&#x2019;am&#xE9;liorations sont possibles et n&#xE9;cessaires. Malgr&#xE9; ces lacunes, il r&#xE9;sout des probl&#xE8;mes m&#xE9;thodiques complexes, l&#xE0; o&#xF9; la s&#xE9;paration entre le texte brut et le texte mis en forme &#xE9;choue. Cela nous permet de pouvoir utiliser notre texte et le fichier qui le contient partout, ind&#xE9;pendamment de l&#x2019;appareil, de la plateforme ou de l&#x2019;application. Le moment o&#xF9; vous passez du texte &#xE0; la mise en forme, du conditionnement au contenu, du corps de texte &#xE0; la mise en page, doit &#xEA;tre une phase o&#xF9; vous pouvez aller et venir &#xE0; votre guise. Markdown rend cela possible.</p> <p>Si vous vous voulez des mises en forme plus complexes comme les liens, les images, les notes de bas de page et une table des mati&#xE8;res, utilisez l&#x2019;interface ou les raccourcis clavier. Pour am&#xE9;liorer vos comp&#xE9;tences en Markdown avec la syntaxe plus avanc&#xE9;e, faites vous aider par un &#xE9;diteur qui propose un aper&#xE7;u en temps r&#xE9;el. Cela vous donne aussi un aper&#xE7;u de la mise en forme tr&#xE8;s t&#xF4;t et vous permet d&#x2019;utiliser un balisage plus complexe car vous pouvez identifier rapidement n&#x2019;importe quelle erreur.</p> <p>L&#x2019;automatisation entre un service en ligne, une application de prise de notes, un &#xE9;diteur de texte et un environnement de publication est cool, mais pas essentiel. Ce qui est fondamental, c&#x2019;est la capacit&#xE9; de pouvoir copier-coller votre texte &#xE0; loisir sans perdre de mise en forme ou d&#x2019;information. Seul le format texte brut garantie cela. Configurez vos plateformes de publication pour interpr&#xE9;ter le Markdown, de mani&#xE8;re &#xE0; pouvoir vous balader librement entre l&#x2019;&#xE9;criture, la modification et la publication. Il y a plusieurs mani&#xE8;res et plusieurs applications pour y parvenir. Et c&#x2019;est pr&#xE9;cis&#xE9;ment l&#x2019;id&#xE9;e. Le texte brut est l&#xE9;ger et gratuit et doit le rester. &#xC9;vitez les applications qui veulent vous encha&#xEE;ner.</p> <figure> <img src="https://ia.net/content/4-know-how/20160610-multichannel-text-processing/appleiigsandimagewriterii.png" alt=""> <figcaption><small>
</small></figcaption> </figure> <footer> <p>Une correction &#xE0; apporter ? <a href="https://github.com/DirtyF/frank.taillandier.me/edit/master/_posts/2016-08-28-traitement-de-texte-multicanal.md">&#xC9;ditez le contenu</a>.</p> </footer> </div>]]></description>
      <link>https://frank.taillandier.me/2016/08/28/traitement-de-texte-multicanal/</link>
      <guid>https://frank.taillandier.me/2016/08/28/traitement-de-texte-multicanal/</guid>
      <pubDate>Tue, 30 Aug 2016 03:08:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[De l'audit de contenu aux idées de design : : Comment un audit de contenu facilite le processus de décision et influence la stratégie de design]]></title>
      <description><![CDATA[<div id="article"><p class="signature">Par
<a href="http://chrisdetzi.com/">Christopher Detzi</a></p><p>Tout au long de ma carri&#xE8;re, j&#x2019;ai g&#xE9;n&#xE9;ralement compris la valeur apport&#xE9;e par un audit de contenu (qu&#x2019;on le fasse ou qu&#x2019;on en b&#xE9;n&#xE9;ficie) dans le cadre du redesign d&#x2019;un site web. Un audit de contenu est une &#xE9;valuation du contenu d&#x2019;un site, &#xE0; la fois, d&#x2019;un point de vue quantitatif (par exemple &#x201C;Combien de contenu est pr&#xE9;sent&#xA0;?&#x201D;) et qualitatif (par exemple &#x201C;Est-ce qu&#x2019;il est bon&#xA0;?&#x201D;). Par contre, ce qui n&#x2019;est souvent pas bien discut&#xE9; ou compris &#xE0; propos des audits de contenu ce sont les b&#xE9;n&#xE9;fices significatifs qu&#x2019;ils procurent au del&#xE0; de la simple &#xE9;valuation de quantit&#xE9; et de qualit&#xE9;.</p><p>Dans un projet r&#xE9;cent sur lequel j&#x2019;ai travaill&#xE9;, l&#x2019;audit de contenu a &#xE9;t&#xE9; crucial pour faciliter les discussions strat&#xE9;giques sur la direction du design. Ces conversations auraient &#xE9;t&#xE9; beaucoup plus difficiles sans avoir l&#x2019;audit de contenu complet. Nous avons utiliser l&#x2019;audit de plusieurs fa&#xE7;ons, chacune tr&#xE8;s importante pour guider nos efforts&#xA0;:</p><ul class="spip"><li> R&#xE9;v&#xE9;ler la vraie ampleur du contenu du site (il y en avait moins que nous le pensions)</li><li> Clarifier et affiner la port&#xE9;e du projet (le point cl&#xE9; a &#xE9;t&#xE9; diff&#xE9;rent de celui auquel nous nous attendions)</li><li> Faciliter les discussions strat&#xE9;giques sur les objectifs de design et la direction (qui &#xE9;taient diff&#xE9;rents de ceux que les parties prenantes avaient imagin&#xE9;es)</li><li> &#xC9;tablir un langage commun &#xE0; toute l&#x2019;&#xE9;quipe pour la dur&#xE9;e du projet (cela s&#x2019;est r&#xE9;v&#xE9;l&#xE9; plus compliqu&#xE9; que nous l&#x2019;avions anticip&#xE9;)</li></ul><p>Je vais utiliser ce projet comme mod&#xE8;le pour mettre en &#xE9;vidence comment mener et utiliser les audits de contenu dans le contexte d&#x2019;un projet de redesign de site web.</p><h2>Le Projet</h2><p>La t&#xE2;che &#xE9;tait immense&#xA0;: revigorer et rendre pertinent un intranet poussi&#xE9;reux pour les employ&#xE9;s qui avait &#xE9;t&#xE9; une d&#xE9;charge &#xE0; contenus sans r&#xE9;glementation pendant dix ans. La n&#xE9;gligence de longue date avait fait des ravages et les utilisateurs du site avaient tout simplement arr&#xEA;t&#xE9; de l&#x2019;utiliser. Les probl&#xE8;mes &#xE9;taient &#xE9;vidents&#xA0;:</p><ul class="spip"><li> Les employ&#xE9;s ne pouvaient pas trouver les informations dont ils avaient besoin,</li><li> Les informations qu&#x2019;ils trouvaient n&#x2019;&#xE9;taient pas &#xE0; jour ou pas pertinentes,</li><li> Le contenu &#xE9;tait cat&#xE9;goris&#xE9;, structur&#xE9; et affich&#xE9; de fa&#xE7;on incoh&#xE9;rente,</li><li> Les employ&#xE9;s allaient ailleurs pour trouver ce dont ils avaient besoin.</li></ul><h2>Le processus</h2><p>Un audit de contenu commence avec un catalogue (ou un inventaire) du contenu du site. Cela peut &#xEA;tre un processus laborieux et chronophage suivant le volume de contenu qui se trouve sur la site. Beaucoup de designers avec lesquels j&#x2019;ai travaill&#xE9; admettent &#xE0; contrec&#x153;ur la valeur de cette activit&#xE9; mais elle se retrouve mise de c&#xF4;t&#xE9; parce qu&#x2019;elle est per&#xE7;ue comme un investissement en temps trop important par rapport &#xE0; sa valeur. D&#x2019;une mani&#xE8;re ou d&#x2019;une autre, cette perception est exacte. Un inventaire du contenu du site sur un tableur n&#x2019;est qu&#x2019;un amas de donn&#xE9;es brutes. Il n&#x2019;indique pas grand chose sur le contenu au del&#xE0; de ce qui s&#x2019;y trouve. Le travail difficile et, finalement, le b&#xE9;n&#xE9;fice d&#xE9;pendent de la d&#xE9;couverte de p&#xE9;pites de sagesse qui se trouvent dans les donn&#xE9;es brutes.</p><p>Nous pouvons faire cela en utilisant l&#x2019;audit de contenu comme plate-forme pour faciliter des conversations souvent difficiles avec les parties prenantes sur la mission du site, les priorit&#xE9;s des utilisateurs et les contraintes et opportunit&#xE9;s op&#xE9;rationnelles.</p><p>Il existe de nombreuses fa&#xE7;ons de d&#xE9;couper et analyser le contenu d&#x2019;un site web pour faciliter ces discussions et &#xE9;clairer les d&#xE9;cisions de design. Voici les domaines que je consid&#xE8;re &#xEA;tre les plus efficaces dans le contexte d&#x2019;un redesign de site web&#xA0;:</p><h4>Identifier et documenter le volume et le type des contenus</h4><p>Au d&#xE9;but de tout redesign, il y a souvent de grandes exag&#xE9;rations par rapport au volume de contenu dont il faudra s&#x2019;occuper. Ces opinions ont tendance &#xE0; provoquer de l&#x2019;anxi&#xE9;t&#xE9;, &#xE0; accabler les membres de l&#x2019;&#xE9;quipe et elles sont souvent la raison pour laquelle la perspective de finir des audits de contenu est tr&#xE8;s rapidement &#xE9;cart&#xE9;e. Avoir des donn&#xE9;es sur le volume r&#xE9;el de contenu donne un nombre r&#xE9;el que tous les membres de l&#x2019;&#xE9;quipe peuvent consid&#xE9;rer objectivement et utiliser pour la planification.</p><p><span class="spip_document_470 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/png/volume_602_fr.png" alt=""></span></p><p>Sur ce projet d&#x2019;intranet, nous avons imm&#xE9;diatement r&#xE9;alis&#xE9; que les chiffres avaient &#xE9;t&#xE9; grandement surestim&#xE9;s. Le site &#xE9;tait gros mais pas aussi gros que tout le monde le pensait. Plus de 60% des &#x201C;pages&#x201D; &#xE9;taient, en fait, des fichiers PDF ou Microsoft Office, dont une grande partie &#xE9;taient des duplicatas de pages HTML existantes. Cette d&#xE9;couverte a aid&#xE9; &#xE0; clarifier l&#x2019;ampleur de notre t&#xE2;che.</p><p>Une fois que nous avons tri&#xE9; et r&#xE9;colt&#xE9; le contenu du site, l&#x2019;&#xE9;tape suivante &#xE9;tait de l&#x2019;utiliser pour faciliter les discussions sur les plans futurs pour le contenu&#xA0;:</p><ul class="spip"><li> Tout ce contenu est-il encore pertinent&#xA0;? Quels besoins d&#x2019;affaire, de client ou d&#x2019;employ&#xE9; aide-t-il &#xE0; r&#xE9;soudre&#xA0;?</li><li> Quels nouveaux contenus devront &#xEA;tre cr&#xE9;&#xE9;s dans les prochains mois&#xA0;? D&#x2019;o&#xF9; viennent ces besoins&#xA0;?</li><li> Qu&#x2019;est-ce qui motive les d&#xE9;cisions sur les types de fichiers et/ou les variations existantes de format&#xA0;? Est-ce que ces d&#xE9;cisions sont encore d&#x2019;actualit&#xE9;&#xA0;?</li></ul><h4>Identifier et documenter la structure actuelle du contenu</h4><p>Il y a toujours un semblant de structure, m&#xEA;me sur les sites mal con&#xE7;us. Cr&#xE9;er des repr&#xE9;sentations visuelles de ces structures et de leurs principes d&#x2019;organisation r&#xE9;v&#xE8;le souvent des probl&#xE8;mes ou des bizarreries qui pourront aider &#xE0; orienter vers la solution de conception.</p><p><span class="spip_document_471 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/png/structure_602_fr.png" alt=""></span></p><p>Sur le projet d&#x2019;intranet, nous avons d&#xE9;couverts que l&#x2019;organisation du contenu avait &#xE9;t&#xE9; mal con&#xE7;ue et n&#x2019;&#xE9;tait pas adapt&#xE9;e aux r&#xE9;alit&#xE9;s op&#xE9;rationnelles. Par exemple, il y avait neuf aires de contenu, par ailleurs, plus de 50% du contenu &#xE9;tait dans une seule de ces aires. Cette distribution d&#xE9;s&#xE9;quilibr&#xE9;e cr&#xE9;ait trop de couches de navigation et contribuait &#xE0; une mauvaise exp&#xE9;rience de d&#xE9;couverte et de retour vers les contenus.</p><p>Une fois que vous avez une repr&#xE9;sentation visuelle de la fa&#xE7;on dont le contenu est structur&#xE9; et organis&#xE9;, vous pouvez l&#x2019;utiliser pour faciliter les discussions suivantes&#xA0;:</p><ul class="spip"><li> Pourquoi le contenu a-t-il &#xE9;t&#xE9; organis&#xE9; de cette fa&#xE7;on&#xA0;? Qu&#x2019;est-ce qui a initialement conduit &#xE0; prendre ces d&#xE9;cisions&#xA0;?</li><li> Quelles informations ont &#xE9;t&#xE9; difficiles &#xE0; classer et &#xE0; organiser dans ce syst&#xE8;me&#xA0;?</li><li> Quels sont les types de contenu les plus importants par rapport aux objectifs commerciaux&#xA0;?</li><li> Qu&#x2019;est-ce que les gens vous ont dit &#xE0; propos de l&#x2019;organisation actuelle du contenu&#xA0;?</li></ul><h4>D&#xE9;terminer si le contenu est utilis&#xE9;</h4><p>Avoir l&#x2019;inventaire de contenu (URLs de production incluses) donnent une carte et un point de r&#xE9;f&#xE9;rence pour les statistiques du site. M&#xEA;me si ces rapports peuvent parfois &#xEA;tre mal interpr&#xE9;t&#xE9;s, ils donnent une id&#xE9;e g&#xE9;n&#xE9;rale de l&#x2019;utilisation ou de la non-utilisation actuelle du site et indique les contenus les plus souvent utilis&#xE9;s.</p><p><span class="spip_document_472 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/png/traffic_602_fr.png" alt=""></span></p><p>Dans le projet d&#x2019;intranet, nous avons utilis&#xE9; ces rapports pour am&#xE9;liorer les r&#xE9;sultats de nos entretiens avec les utilisateurs. Par exemple. les utilisateurs n&#x2019;ont pas exprim&#xE9;s le d&#xE9;sir de comprendre l&#x2019;organisation hi&#xE9;rarchique ou la structure de pr&#xE9;sentation des r&#xE9;sultats, pourtant, les vues et les t&#xE9;l&#xE9;chargements d&#x2019;organigrammes &#xE9;taient &#xE9;lev&#xE9;es. Ce sont des donn&#xE9;es importantes &#xE0; prendre en compte pour le design.</p><p>Ces donn&#xE9;es peuvent &#xEA;tre utilis&#xE9;es pour avoir des discussions franches &#xE0; propos de ce qui est utile et de ce qui ne l&#x2019;est pas sur le site.</p><ul class="spip"><li> Quels contenus sont rarement utilis&#xE9;s&#xA0;? Peut-on en tirer des conclusions d&#xE9;finitives&#xA0;?</li><li> Que nous apprend la popularit&#xE9; de certains contenus sur les personnes qui utilisent le site&#xA0;? Peut-on &#xE9;tendre et am&#xE9;liorer ces contenus pour leur en donner encore plus&#xA0;?</li><li> Comment peut-on structurer le design pour faciliter l&#x2019;acc&#xE8;s aux informations que l&#x2019;on sait importantes&#xA0;?</li><li> Y-a-t-il des mani&#xE8;res de r&#xE9;v&#xE9;ler la pertinence du contenu qui n&#x2019;est pas utilis&#xE9; pour le moment&#xA0;?</li></ul><h4>Documenter la pr&#xE9;sentation incoh&#xE9;rente du contenu</h4><p>Un probl&#xE8;me commun avec les sites n&#xE9;glig&#xE9;s ou mal g&#xE9;r&#xE9;s est le niveau d&#x2019;incoh&#xE9;rence dans le design et la pr&#xE9;sentation du contenu. Faire des copies d&#x2019;&#xE9;cran d&#x2019;une large palette de pages et de types de pr&#xE9;sentation pendant votre audit est une tr&#xE8;s bonne mani&#xE8;re de rendre compte des incoh&#xE9;rences et d&#x2019;identifier des opportunit&#xE9;s de consolidation.</p><p>Dans le projet d&#x2019;intranet, nous avons montr&#xE9; une large s&#xE9;lection de captures d&#x2019;&#xE9;cran et ensuite montr&#xE9; comment la structure de contenu pouvait &#xEA;tre normalis&#xE9;e au niveau de la pr&#xE9;sentation, &#xE9;liminant les incoh&#xE9;rences et les variations inutiles. Nous avons fait cela en identifiant les attributs communs des contenus, m&#xEA;me si leur pr&#xE9;sentation variait grandement.</p><p>Passer du temps &#xE0; capturer et annoter les captures d&#x2019;&#xE9;cran t&#xF4;t dans le projet est essentiel pour des discussions productives &#xE0; propos des r&#xE9;alit&#xE9;s op&#xE9;rationnelles et la future direction de design. Utiliser ces outils pour r&#xE9;pondre aux questions suivantes&#xA0;:</p><ul class="spip"><li> Y-a-t-il une raison pour que des contenus similaires soient pr&#xE9;sent&#xE9;s diff&#xE9;remment&#xA0;? Parfois, il existe des raisons commerciales l&#xE9;gitimes, telles que s&#x2019;aligner sur du mat&#xE9;riel de communication hors ligne.</li><li> O&#xF9; les efforts de consolidations ont-ils mal tourn&#xE9;&#xA0;? Qu&#x2019;est-ce qui cause ces incoh&#xE9;rences en dehors du manque de sensibilisation&#xA0;?</li></ul><h2>Les r&#xE9;sultats</h2><p>Dans le projet d&#x2019;intranet, ce processus a permis de nombreuses r&#xE9;alisations qui ont men&#xE9; directement &#xE0; des d&#xE9;cisions de design, parmi les plus notables&#xA0;:</p><h4>Une conscience aigu&#xEB; des priorit&#xE9;s</h4><p>Savoir quels sont les contenus qui sont sur le site, pourquoi, et lesquels sont vraiment utilis&#xE9;s est essentiel pour comprendre les priorit&#xE9;s. L&#x2019;audit a facilit&#xE9; les conversations et donner forme aux questions &#xE0; propos de l&#x2019;utilit&#xE9; et l&#x2019;utilisation du contenu qui n&#x2019;auraient pas &#xE9;t&#xE9; aussi fructueuses ou r&#xE9;v&#xE9;latrices.</p><h4>Contraintes op&#xE9;rationnelles et commerciales</h4><p>Les contraintes op&#xE9;rationnelles et d&#x2019;affaires sont souvent r&#xE9;v&#xE9;l&#xE9;es au travers du processus d&#x2019;audit. Dans ce projet, il y avait clairement des contraintes op&#xE9;rationnelles qui limitaient les solutions de design que nous pouvions proposer. Par exemple, alors que les parties prenantes appr&#xE9;ciaient le concept d&#x2019;une page d&#x2019;accueil orient&#xE9;e sur les nouvelles fra&#xEE;ches, ils n&#x2019;avaient pas les capacit&#xE9;s de faire des mises &#xE0; jour r&#xE9;guli&#xE8;res. Les &#xE9;valuations et discussions de suivi ont r&#xE9;v&#xE9;l&#xE9; ces contraintes plus clairement que si nous n&#x2019;avions pas entrepris l&#x2019;audit. Et ces discussions ont form&#xE9; notre approche du design, nous assurant ainsi que nos recommandations n&#x2019;entraient pas en conflit avec les r&#xE9;alit&#xE9;s op&#xE9;rationnelles.</p><h4>Un langage commun</h4><p>Les audits peuvent r&#xE9;v&#xE9;ler un langage et une terminologie sp&#xE9;cifiques &#xE0; l&#x2019;organisation qui seront peu familiers pour les personnes de l&#x2019;ext&#xE9;rieur. Dans ce projet, le contenu &#xE9;tait herm&#xE9;tique pour de multiples raisons et l&#x2019;audit nous a aid&#xE9; &#xE0; d&#xE9;coder le contenu et &#xE0; &#xE9;tablir une compr&#xE9;hension commune des concepts. Ainsi, les revues de design &#xE9;taient moins abstraites et s&#x2019;alignaient plus pr&#xE9;cis&#xE9;ment avec la mani&#xE8;re dont les &#xE9;quipes internes pensaient et parlaient du contenu. De plus, nous avons &#xE9;t&#xE9; en mesure de r&#xE9;utiliser du contenu existant dans nos prototypes pour r&#xE9;v&#xE9;ler des d&#xE9;cisions structurelles et, o&#xF9; cela s&#x2019;est av&#xE9;r&#xE9; n&#xE9;cessaire, &#xE9;crire de la copie repr&#xE9;sentative destin&#xE9;e &#xE0; servir de guide dans les futurs d&#xE9;veloppement de contenu.</p><h4>Un <i>vrai</i> sens de l&#x2019;&#xE9;chelle</h4><p>Le site &#xE9;tait certainement gros, mais pas de la fa&#xE7;on dont tout le monde ou nous le pensions. Nous avons acquis une perspective nuanc&#xE9;e du contenu, comprenant que nous ne parlions pas d&#x2019;un site de 10 000 pages. Cela a chang&#xE9; la mani&#xE8;re dont nous avons pens&#xE9; au design, au nombre de pages, et aux variations de design des types de contenus dont nous devions tenir compte. Cette prise de conscience a aussi apport&#xE9; une saine dose d&#x2019;objectivit&#xE9; aux conversations et calm&#xE9; un grand nombre d&#x2019;anxi&#xE9;t&#xE9;s caus&#xE9;es (en grande partie) par nos incertitudes.</p><p>Si on les aborde correctement, les audits de contenu sont des outils d&#x2019;une puissance exceptionnelle. Au del&#xE0; de l&#x2019;&#xE9;valuation de la quantit&#xE9; et de la qualit&#xE9; du contenu, ils aident les concepteurs &#xE0; comprendre l&#x2019;environnement informationnel, facilitent les discussions strat&#xE9;giques et permettent la d&#xE9;couverte d&#x2019;informations qui ont directement influenc&#xE9;s la direction du design et la strat&#xE9;gie. En r&#xE9;sum&#xE9;, nous avons augment&#xE9; les chances de succ&#xE8;s de notre redesign en approchant les audits en gardant ces buts &#xE0; l&#x2019;esprit.</p></div>]]></description>
      <link>http://www.pompage.net/traduction/de-l-audit-de-contenu-aux-idees-de-design</link>
      <guid>http://www.pompage.net/traduction/de-l-audit-de-contenu-aux-idees-de-design</guid>
      <pubDate>Wed, 21 Oct 2015 08:10:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[De l'audit de contenu aux idées de design : : Comment un audit de contenu facilite le processus de décision et influence la stratégie de design]]></title>
      <description><![CDATA[<div><div id="article"> <p class="signature">Par <a href="http://chrisdetzi.com/">Christopher Detzi</a> </p> <p>Tout au long de ma carri&#xE8;re, j&#x2019;ai g&#xE9;n&#xE9;ralement compris la valeur apport&#xE9;e par un audit de contenu (qu&#x2019;on le fasse ou qu&#x2019;on en b&#xE9;n&#xE9;ficie) dans le cadre du redesign d&#x2019;un site web. Un audit de contenu est une &#xE9;valuation du contenu d&#x2019;un site, &#xE0; la fois, d&#x2019;un point de vue quantitatif (par exemple &#x201C;Combien de contenu est pr&#xE9;sent&#xA0;?&#x201D;) et qualitatif (par exemple &#x201C;Est-ce qu&#x2019;il est bon&#xA0;?&#x201D;). Par contre, ce qui n&#x2019;est souvent pas bien discut&#xE9; ou compris &#xE0; propos des audits de contenu ce sont les b&#xE9;n&#xE9;fices significatifs qu&#x2019;ils procurent au del&#xE0; de la simple &#xE9;valuation de quantit&#xE9; et de qualit&#xE9;.</p>
<p>Dans un projet r&#xE9;cent sur lequel j&#x2019;ai travaill&#xE9;, l&#x2019;audit de contenu a &#xE9;t&#xE9; crucial pour faciliter les discussions strat&#xE9;giques sur la direction du design. Ces conversations auraient &#xE9;t&#xE9; beaucoup plus difficiles sans avoir l&#x2019;audit de contenu complet. Nous avons utiliser l&#x2019;audit de plusieurs fa&#xE7;ons, chacune tr&#xE8;s importante pour guider nos efforts&#xA0;:</p>
<ul class="spip"><li> R&#xE9;v&#xE9;ler la vraie ampleur du contenu du site (il y en avait moins que nous le pensions)</li><li> Clarifier et affiner la port&#xE9;e du projet (le point cl&#xE9; a &#xE9;t&#xE9; diff&#xE9;rent de celui auquel nous nous attendions)</li><li> Faciliter les discussions strat&#xE9;giques sur les objectifs de design et la direction (qui &#xE9;taient diff&#xE9;rents de ceux que les parties prenantes avaient imagin&#xE9;es)</li><li> &#xC9;tablir un langage commun &#xE0; toute l&#x2019;&#xE9;quipe pour la dur&#xE9;e du projet (cela s&#x2019;est r&#xE9;v&#xE9;l&#xE9; plus compliqu&#xE9; que nous l&#x2019;avions anticip&#xE9;)</li></ul>
<p>Je vais utiliser ce projet comme mod&#xE8;le pour mettre en &#xE9;vidence comment mener et utiliser les audits de contenu dans le contexte d&#x2019;un projet de redesign de site web.</p>
<h2>Le Projet</h2>
<p>La t&#xE2;che &#xE9;tait immense&#xA0;: revigorer et rendre pertinent un intranet poussi&#xE9;reux pour les employ&#xE9;s qui avait &#xE9;t&#xE9; une d&#xE9;charge &#xE0; contenus sans r&#xE9;glementation pendant dix ans. La n&#xE9;gligence de longue date avait fait des ravages et les utilisateurs du site avaient tout simplement arr&#xEA;t&#xE9; de l&#x2019;utiliser. Les probl&#xE8;mes &#xE9;taient &#xE9;vidents&#xA0;:</p>
<ul class="spip"><li> Les employ&#xE9;s ne pouvaient pas trouver les informations dont ils avaient besoin,</li><li> Les informations qu&#x2019;ils trouvaient n&#x2019;&#xE9;taient pas &#xE0; jour ou pas pertinentes,</li><li> Le contenu &#xE9;tait cat&#xE9;goris&#xE9;, structur&#xE9; et affich&#xE9; de fa&#xE7;on incoh&#xE9;rente,</li><li> Les employ&#xE9;s allaient ailleurs pour trouver ce dont ils avaient besoin.</li></ul><h2>Le processus</h2>
<p>Un audit de contenu commence avec un catalogue (ou un inventaire) du contenu du site. Cela peut &#xEA;tre un processus laborieux et chronophage suivant le volume de contenu qui se trouve sur la site. Beaucoup de designers avec lesquels j&#x2019;ai travaill&#xE9; admettent &#xE0; contrec&#x153;ur la valeur de cette activit&#xE9; mais elle se retrouve mise de c&#xF4;t&#xE9; parce qu&#x2019;elle est per&#xE7;ue comme un investissement en temps trop important par rapport &#xE0; sa valeur. D&#x2019;une mani&#xE8;re ou d&#x2019;une autre, cette perception est exacte. Un inventaire du contenu du site sur un tableur n&#x2019;est qu&#x2019;un amas de donn&#xE9;es brutes. Il n&#x2019;indique pas grand chose sur le contenu au del&#xE0; de ce qui s&#x2019;y trouve. Le travail difficile et, finalement, le b&#xE9;n&#xE9;fice d&#xE9;pendent de la d&#xE9;couverte de p&#xE9;pites de sagesse qui se trouvent dans les donn&#xE9;es brutes.</p>
<p>Nous pouvons faire cela en utilisant l&#x2019;audit de contenu comme plate-forme pour faciliter des conversations souvent difficiles avec les parties prenantes sur la mission du site, les priorit&#xE9;s des utilisateurs et les contraintes et opportunit&#xE9;s op&#xE9;rationnelles.</p>
<p>Il existe de nombreuses fa&#xE7;ons de d&#xE9;couper et analyser le contenu d&#x2019;un site web pour faciliter ces discussions et &#xE9;clairer les d&#xE9;cisions de design. Voici les domaines que je consid&#xE8;re &#xEA;tre les plus efficaces dans le contexte d&#x2019;un redesign de site web&#xA0;:</p>
<h4>Identifier et documenter le volume et le type des contenus</h4>
<p>Au d&#xE9;but de tout redesign, il y a souvent de grandes exag&#xE9;rations par rapport au volume de contenu dont il faudra s&#x2019;occuper. Ces opinions ont tendance &#xE0; provoquer de l&#x2019;anxi&#xE9;t&#xE9;, &#xE0; accabler les membres de l&#x2019;&#xE9;quipe et elles sont souvent la raison pour laquelle la perspective de finir des audits de contenu est tr&#xE8;s rapidement &#xE9;cart&#xE9;e. Avoir des donn&#xE9;es sur le volume r&#xE9;el de contenu donne un nombre r&#xE9;el que tous les membres de l&#x2019;&#xE9;quipe peuvent consid&#xE9;rer objectivement et utiliser pour la planification.</p>
<p><span class="spip_document_470 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/png/volume_602_fr.png" width="602" alt=""></span></p>
<p>Sur ce projet d&#x2019;intranet, nous avons imm&#xE9;diatement r&#xE9;alis&#xE9; que les chiffres avaient &#xE9;t&#xE9; grandement surestim&#xE9;s. Le site &#xE9;tait gros mais pas aussi gros que tout le monde le pensait. Plus de 60% des &#x201C;pages&#x201D; &#xE9;taient, en fait, des fichiers PDF ou Microsoft Office, dont une grande partie &#xE9;taient des duplicatas de pages HTML existantes. Cette d&#xE9;couverte a aid&#xE9; &#xE0; clarifier l&#x2019;ampleur de notre t&#xE2;che.</p>
<p>Une fois que nous avons tri&#xE9; et r&#xE9;colt&#xE9; le contenu du site, l&#x2019;&#xE9;tape suivante &#xE9;tait de l&#x2019;utiliser pour faciliter les discussions sur les plans futurs pour le contenu&#xA0;:</p>
<ul class="spip"><li> Tout ce contenu est-il encore pertinent&#xA0;? Quels besoins d&#x2019;affaire, de client ou d&#x2019;employ&#xE9; aide-t-il &#xE0; r&#xE9;soudre&#xA0;?</li><li> Quels nouveaux contenus devront &#xEA;tre cr&#xE9;&#xE9;s dans les prochains mois&#xA0;? D&#x2019;o&#xF9; viennent ces besoins&#xA0;?</li><li> Qu&#x2019;est-ce qui motive les d&#xE9;cisions sur les types de fichiers et/ou les variations existantes de format&#xA0;? Est-ce que ces d&#xE9;cisions sont encore d&#x2019;actualit&#xE9;&#xA0;?</li></ul><h4>Identifier et documenter la structure actuelle du contenu</h4>
<p>Il y a toujours un semblant de structure, m&#xEA;me sur les sites mal con&#xE7;us. Cr&#xE9;er des repr&#xE9;sentations visuelles de ces structures et de leurs principes d&#x2019;organisation r&#xE9;v&#xE8;le souvent des probl&#xE8;mes ou des bizarreries qui pourront aider &#xE0; orienter vers la solution de conception.</p>
<p><span class="spip_document_471 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/png/structure_602_fr.png" width="602" alt=""></span></p>
<p>Sur le projet d&#x2019;intranet, nous avons d&#xE9;couverts que l&#x2019;organisation du contenu avait &#xE9;t&#xE9; mal con&#xE7;ue et n&#x2019;&#xE9;tait pas adapt&#xE9;e aux r&#xE9;alit&#xE9;s op&#xE9;rationnelles. Par exemple, il y avait neuf aires de contenu, par ailleurs, plus de 50% du contenu &#xE9;tait dans une seule de ces aires. Cette distribution d&#xE9;s&#xE9;quilibr&#xE9;e cr&#xE9;ait trop de couches de navigation et contribuait &#xE0; une mauvaise exp&#xE9;rience de d&#xE9;couverte et de retour vers les contenus.</p>
<p>Une fois que vous avez une repr&#xE9;sentation visuelle de la fa&#xE7;on dont le contenu est structur&#xE9; et organis&#xE9;, vous pouvez l&#x2019;utiliser pour faciliter les discussions suivantes&#xA0;:</p>
<ul class="spip"><li> Pourquoi le contenu a-t-il &#xE9;t&#xE9; organis&#xE9; de cette fa&#xE7;on&#xA0;? Qu&#x2019;est-ce qui a initialement conduit &#xE0; prendre ces d&#xE9;cisions&#xA0;?</li><li> Quelles informations ont &#xE9;t&#xE9; difficiles &#xE0; classer et &#xE0; organiser dans ce syst&#xE8;me&#xA0;?</li><li> Quels sont les types de contenu les plus importants par rapport aux objectifs commerciaux&#xA0;?</li><li> Qu&#x2019;est-ce que les gens vous ont dit &#xE0; propos de l&#x2019;organisation actuelle du contenu&#xA0;?</li></ul><h4>D&#xE9;terminer si le contenu est utilis&#xE9;</h4>
<p>Avoir l&#x2019;inventaire de contenu (URLs de production incluses) donnent une carte et un point de r&#xE9;f&#xE9;rence pour les statistiques du site. M&#xEA;me si ces rapports peuvent parfois &#xEA;tre mal interpr&#xE9;t&#xE9;s, ils donnent une id&#xE9;e g&#xE9;n&#xE9;rale de l&#x2019;utilisation ou de la non-utilisation actuelle du site et indique les contenus les plus souvent utilis&#xE9;s.</p>
<p><span class="spip_document_472 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/png/traffic_602_fr.png" width="602" alt=""></span></p>
<p>Dans le projet d&#x2019;intranet, nous avons utilis&#xE9; ces rapports pour am&#xE9;liorer les r&#xE9;sultats de nos entretiens avec les utilisateurs. Par exemple. les utilisateurs n&#x2019;ont pas exprim&#xE9;s le d&#xE9;sir de comprendre l&#x2019;organisation hi&#xE9;rarchique ou la structure de pr&#xE9;sentation des r&#xE9;sultats, pourtant, les vues et les t&#xE9;l&#xE9;chargements d&#x2019;organigrammes &#xE9;taient &#xE9;lev&#xE9;es. Ce sont des donn&#xE9;es importantes &#xE0; prendre en compte pour le design.</p>
<p>Ces donn&#xE9;es peuvent &#xEA;tre utilis&#xE9;es pour avoir des discussions franches &#xE0; propos de ce qui est utile et de ce qui ne l&#x2019;est pas sur le site.</p>
<ul class="spip"><li> Quels contenus sont rarement utilis&#xE9;s&#xA0;? Peut-on en tirer des conclusions d&#xE9;finitives&#xA0;?</li><li> Que nous apprend la popularit&#xE9; de certains contenus sur les personnes qui utilisent le site&#xA0;? Peut-on &#xE9;tendre et am&#xE9;liorer ces contenus pour leur en donner encore plus&#xA0;?</li><li> Comment peut-on structurer le design pour faciliter l&#x2019;acc&#xE8;s aux informations que l&#x2019;on sait importantes&#xA0;?</li><li> Y-a-t-il des mani&#xE8;res de r&#xE9;v&#xE9;ler la pertinence du contenu qui n&#x2019;est pas utilis&#xE9; pour le moment&#xA0;?</li></ul><h4>Documenter la pr&#xE9;sentation incoh&#xE9;rente du contenu</h4>
<p>Un probl&#xE8;me commun avec les sites n&#xE9;glig&#xE9;s ou mal g&#xE9;r&#xE9;s est le niveau d&#x2019;incoh&#xE9;rence dans le design et la pr&#xE9;sentation du contenu. Faire des copies d&#x2019;&#xE9;cran d&#x2019;une large palette de pages et de types de pr&#xE9;sentation pendant votre audit est une tr&#xE8;s bonne mani&#xE8;re de rendre compte des incoh&#xE9;rences et d&#x2019;identifier des opportunit&#xE9;s de consolidation.</p>
<p>Dans le projet d&#x2019;intranet, nous avons montr&#xE9; une large s&#xE9;lection de captures d&#x2019;&#xE9;cran et ensuite montr&#xE9; comment la structure de contenu pouvait &#xEA;tre normalis&#xE9;e au niveau de la pr&#xE9;sentation, &#xE9;liminant les incoh&#xE9;rences et les variations inutiles. Nous avons fait cela en identifiant les attributs communs des contenus, m&#xEA;me si leur pr&#xE9;sentation variait grandement.</p>
<p>Passer du temps &#xE0; capturer et annoter les captures d&#x2019;&#xE9;cran t&#xF4;t dans le projet est essentiel pour des discussions productives &#xE0; propos des r&#xE9;alit&#xE9;s op&#xE9;rationnelles et la future direction de design. Utiliser ces outils pour r&#xE9;pondre aux questions suivantes&#xA0;:</p>
<ul class="spip"><li> Y-a-t-il une raison pour que des contenus similaires soient pr&#xE9;sent&#xE9;s diff&#xE9;remment&#xA0;? Parfois, il existe des raisons commerciales l&#xE9;gitimes, telles que s&#x2019;aligner sur du mat&#xE9;riel de communication hors ligne.</li><li> O&#xF9; les efforts de consolidations ont-ils mal tourn&#xE9;&#xA0;? Qu&#x2019;est-ce qui cause ces incoh&#xE9;rences en dehors du manque de sensibilisation&#xA0;?</li></ul><h2>Les r&#xE9;sultats</h2>
<p>Dans le projet d&#x2019;intranet, ce processus a permis de nombreuses r&#xE9;alisations qui ont men&#xE9; directement &#xE0; des d&#xE9;cisions de design, parmi les plus notables&#xA0;:</p>
<h4>Une conscience aigu&#xEB; des priorit&#xE9;s</h4>
<p>Savoir quels sont les contenus qui sont sur le site, pourquoi, et lesquels sont vraiment utilis&#xE9;s est essentiel pour comprendre les priorit&#xE9;s. L&#x2019;audit a facilit&#xE9; les conversations et donner forme aux questions &#xE0; propos de l&#x2019;utilit&#xE9; et l&#x2019;utilisation du contenu qui n&#x2019;auraient pas &#xE9;t&#xE9; aussi fructueuses ou r&#xE9;v&#xE9;latrices.</p>
<h4>Contraintes op&#xE9;rationnelles et commerciales</h4>
<p>Les contraintes op&#xE9;rationnelles et d&#x2019;affaires sont souvent r&#xE9;v&#xE9;l&#xE9;es au travers du processus d&#x2019;audit. Dans ce projet, il y avait clairement des contraintes op&#xE9;rationnelles qui limitaient les solutions de design que nous pouvions proposer. Par exemple, alors que les parties prenantes appr&#xE9;ciaient le concept d&#x2019;une page d&#x2019;accueil orient&#xE9;e sur les nouvelles fra&#xEE;ches, ils n&#x2019;avaient pas les capacit&#xE9;s de faire des mises &#xE0; jour r&#xE9;guli&#xE8;res. Les &#xE9;valuations et discussions de suivi ont r&#xE9;v&#xE9;l&#xE9; ces contraintes plus clairement que si nous n&#x2019;avions pas entrepris l&#x2019;audit. Et ces discussions ont form&#xE9; notre approche du design, nous assurant ainsi que nos recommandations n&#x2019;entraient pas en conflit avec les r&#xE9;alit&#xE9;s op&#xE9;rationnelles.</p>
<h4>Un langage commun</h4>
<p>Les audits peuvent r&#xE9;v&#xE9;ler un langage et une terminologie sp&#xE9;cifiques &#xE0; l&#x2019;organisation qui seront peu familiers pour les personnes de l&#x2019;ext&#xE9;rieur. Dans ce projet, le contenu &#xE9;tait herm&#xE9;tique pour de multiples raisons et l&#x2019;audit nous a aid&#xE9; &#xE0; d&#xE9;coder le contenu et &#xE0; &#xE9;tablir une compr&#xE9;hension commune des concepts. Ainsi, les revues de design &#xE9;taient moins abstraites et s&#x2019;alignaient plus pr&#xE9;cis&#xE9;ment avec la mani&#xE8;re dont les &#xE9;quipes internes pensaient et parlaient du contenu. De plus, nous avons &#xE9;t&#xE9; en mesure de r&#xE9;utiliser du contenu existant dans nos prototypes pour r&#xE9;v&#xE9;ler des d&#xE9;cisions structurelles et, o&#xF9; cela s&#x2019;est av&#xE9;r&#xE9; n&#xE9;cessaire, &#xE9;crire de la copie repr&#xE9;sentative destin&#xE9;e &#xE0; servir de guide dans les futurs d&#xE9;veloppement de contenu.</p>
<h4>Un <i>vrai</i> sens de l&#x2019;&#xE9;chelle</h4>
<p>Le site &#xE9;tait certainement gros, mais pas de la fa&#xE7;on dont tout le monde ou nous le pensions. Nous avons acquis une perspective nuanc&#xE9;e du contenu, comprenant que nous ne parlions pas d&#x2019;un site de 10 000 pages. Cela a chang&#xE9; la mani&#xE8;re dont nous avons pens&#xE9; au design, au nombre de pages, et aux variations de design des types de contenus dont nous devions tenir compte. Cette prise de conscience a aussi apport&#xE9; une saine dose d&#x2019;objectivit&#xE9; aux conversations et calm&#xE9; un grand nombre d&#x2019;anxi&#xE9;t&#xE9;s caus&#xE9;es (en grande partie) par nos incertitudes.</p> <p>Si on les aborde correctement, les audits de contenu sont des outils d&#x2019;une puissance exceptionnelle. Au del&#xE0; de l&#x2019;&#xE9;valuation de la quantit&#xE9; et de la qualit&#xE9; du contenu, ils aident les concepteurs &#xE0; comprendre l&#x2019;environnement informationnel, facilitent les discussions strat&#xE9;giques et permettent la d&#xE9;couverte d&#x2019;informations qui ont directement influenc&#xE9;s la direction du design et la strat&#xE9;gie. En r&#xE9;sum&#xE9;, nous avons augment&#xE9; les chances de succ&#xE8;s de notre redesign en approchant les audits en gardant ces buts &#xE0; l&#x2019;esprit.</p> </div></div>]]></description>
      <link>http://www.pompage.net/traduction/de-l-audit-de-contenu-aux-idees-de-design</link>
      <guid>http://www.pompage.net/traduction/de-l-audit-de-contenu-aux-idees-de-design</guid>
      <pubDate>Wed, 21 Oct 2015 08:10:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[De l'audit de contenu aux idées de design : : Comment un audit de contenu facilite le processus de décision et influence la stratégie de design]]></title>
      <description><![CDATA[<div><div id="article"> <p class="signature">Par <a href="http://chrisdetzi.com/">Christopher Detzi</a> </p> <p>Tout au long de ma carri&#xE8;re, j&#x2019;ai g&#xE9;n&#xE9;ralement compris la valeur apport&#xE9;e par un audit de contenu (qu&#x2019;on le fasse ou qu&#x2019;on en b&#xE9;n&#xE9;ficie) dans le cadre du redesign d&#x2019;un site web. Un audit de contenu est une &#xE9;valuation du contenu d&#x2019;un site, &#xE0; la fois, d&#x2019;un point de vue quantitatif (par exemple &#x201C;Combien de contenu est pr&#xE9;sent&#xA0;?&#x201D;) et qualitatif (par exemple &#x201C;Est-ce qu&#x2019;il est bon&#xA0;?&#x201D;). Par contre, ce qui n&#x2019;est souvent pas bien discut&#xE9; ou compris &#xE0; propos des audits de contenu ce sont les b&#xE9;n&#xE9;fices significatifs qu&#x2019;ils procurent au del&#xE0; de la simple &#xE9;valuation de quantit&#xE9; et de qualit&#xE9;.</p>
<p>Dans un projet r&#xE9;cent sur lequel j&#x2019;ai travaill&#xE9;, l&#x2019;audit de contenu a &#xE9;t&#xE9; crucial pour faciliter les discussions strat&#xE9;giques sur la direction du design. Ces conversations auraient &#xE9;t&#xE9; beaucoup plus difficiles sans avoir l&#x2019;audit de contenu complet. Nous avons utiliser l&#x2019;audit de plusieurs fa&#xE7;ons, chacune tr&#xE8;s importante pour guider nos efforts&#xA0;:</p>
<ul class="spip"><li> R&#xE9;v&#xE9;ler la vraie ampleur du contenu du site (il y en avait moins que nous le pensions)</li><li> Clarifier et affiner la port&#xE9;e du projet (le point cl&#xE9; a &#xE9;t&#xE9; diff&#xE9;rent de celui auquel nous nous attendions)</li><li> Faciliter les discussions strat&#xE9;giques sur les objectifs de design et la direction (qui &#xE9;taient diff&#xE9;rents de ceux que les parties prenantes avaient imagin&#xE9;es)</li><li> &#xC9;tablir un langage commun &#xE0; toute l&#x2019;&#xE9;quipe pour la dur&#xE9;e du projet (cela s&#x2019;est r&#xE9;v&#xE9;l&#xE9; plus compliqu&#xE9; que nous l&#x2019;avions anticip&#xE9;)</li></ul>
<p>Je vais utiliser ce projet comme mod&#xE8;le pour mettre en &#xE9;vidence comment mener et utiliser les audits de contenu dans le contexte d&#x2019;un projet de redesign de site web.</p>
<h2>Le Projet</h2>
<p>La t&#xE2;che &#xE9;tait immense&#xA0;: revigorer et rendre pertinent un intranet poussi&#xE9;reux pour les employ&#xE9;s qui avait &#xE9;t&#xE9; une d&#xE9;charge &#xE0; contenus sans r&#xE9;glementation pendant dix ans. La n&#xE9;gligence de longue date avait fait des ravages et les utilisateurs du site avaient tout simplement arr&#xEA;t&#xE9; de l&#x2019;utiliser. Les probl&#xE8;mes &#xE9;taient &#xE9;vidents&#xA0;:</p>
<ul class="spip"><li> Les employ&#xE9;s ne pouvaient pas trouver les informations dont ils avaient besoin,</li><li> Les informations qu&#x2019;ils trouvaient n&#x2019;&#xE9;taient pas &#xE0; jour ou pas pertinentes,</li><li> Le contenu &#xE9;tait cat&#xE9;goris&#xE9;, structur&#xE9; et affich&#xE9; de fa&#xE7;on incoh&#xE9;rente,</li><li> Les employ&#xE9;s allaient ailleurs pour trouver ce dont ils avaient besoin.</li></ul><h2>Le processus</h2>
<p>Un audit de contenu commence avec un catalogue (ou un inventaire) du contenu du site. Cela peut &#xEA;tre un processus laborieux et chronophage suivant le volume de contenu qui se trouve sur la site. Beaucoup de designers avec lesquels j&#x2019;ai travaill&#xE9; admettent &#xE0; contrec&#x153;ur la valeur de cette activit&#xE9; mais elle se retrouve mise de c&#xF4;t&#xE9; parce qu&#x2019;elle est per&#xE7;ue comme un investissement en temps trop important par rapport &#xE0; sa valeur. D&#x2019;une mani&#xE8;re ou d&#x2019;une autre, cette perception est exacte. Un inventaire du contenu du site sur un tableur n&#x2019;est qu&#x2019;un amas de donn&#xE9;es brutes. Il n&#x2019;indique pas grand chose sur le contenu au del&#xE0; de ce qui s&#x2019;y trouve. Le travail difficile et, finalement, le b&#xE9;n&#xE9;fice d&#xE9;pendent de la d&#xE9;couverte de p&#xE9;pites de sagesse qui se trouvent dans les donn&#xE9;es brutes.</p>
<p>Nous pouvons faire cela en utilisant l&#x2019;audit de contenu comme plate-forme pour faciliter des conversations souvent difficiles avec les parties prenantes sur la mission du site, les priorit&#xE9;s des utilisateurs et les contraintes et opportunit&#xE9;s op&#xE9;rationnelles.</p>
<p>Il existe de nombreuses fa&#xE7;ons de d&#xE9;couper et analyser le contenu d&#x2019;un site web pour faciliter ces discussions et &#xE9;clairer les d&#xE9;cisions de design. Voici les domaines que je consid&#xE8;re &#xEA;tre les plus efficaces dans le contexte d&#x2019;un redesign de site web&#xA0;:</p>
<h4>Identifier et documenter le volume et le type des contenus</h4>
<p>Au d&#xE9;but de tout redesign, il y a souvent de grandes exag&#xE9;rations par rapport au volume de contenu dont il faudra s&#x2019;occuper. Ces opinions ont tendance &#xE0; provoquer de l&#x2019;anxi&#xE9;t&#xE9;, &#xE0; accabler les membres de l&#x2019;&#xE9;quipe et elles sont souvent la raison pour laquelle la perspective de finir des audits de contenu est tr&#xE8;s rapidement &#xE9;cart&#xE9;e. Avoir des donn&#xE9;es sur le volume r&#xE9;el de contenu donne un nombre r&#xE9;el que tous les membres de l&#x2019;&#xE9;quipe peuvent consid&#xE9;rer objectivement et utiliser pour la planification.</p>
<p><span class="spip_document_470 spip_documents spip_documents_center">
<img src="https://www.pompage.net/traduction/IMG/png/volume_602_fr.png" width="602" alt=""></span></p>
<p>Sur ce projet d&#x2019;intranet, nous avons imm&#xE9;diatement r&#xE9;alis&#xE9; que les chiffres avaient &#xE9;t&#xE9; grandement surestim&#xE9;s. Le site &#xE9;tait gros mais pas aussi gros que tout le monde le pensait. Plus de 60% des &#x201C;pages&#x201D; &#xE9;taient, en fait, des fichiers PDF ou Microsoft Office, dont une grande partie &#xE9;taient des duplicatas de pages HTML existantes. Cette d&#xE9;couverte a aid&#xE9; &#xE0; clarifier l&#x2019;ampleur de notre t&#xE2;che.</p>
<p>Une fois que nous avons tri&#xE9; et r&#xE9;colt&#xE9; le contenu du site, l&#x2019;&#xE9;tape suivante &#xE9;tait de l&#x2019;utiliser pour faciliter les discussions sur les plans futurs pour le contenu&#xA0;:</p>
<ul class="spip"><li> Tout ce contenu est-il encore pertinent&#xA0;? Quels besoins d&#x2019;affaire, de client ou d&#x2019;employ&#xE9; aide-t-il &#xE0; r&#xE9;soudre&#xA0;?</li><li> Quels nouveaux contenus devront &#xEA;tre cr&#xE9;&#xE9;s dans les prochains mois&#xA0;? D&#x2019;o&#xF9; viennent ces besoins&#xA0;?</li><li> Qu&#x2019;est-ce qui motive les d&#xE9;cisions sur les types de fichiers et/ou les variations existantes de format&#xA0;? Est-ce que ces d&#xE9;cisions sont encore d&#x2019;actualit&#xE9;&#xA0;?</li></ul><h4>Identifier et documenter la structure actuelle du contenu</h4>
<p>Il y a toujours un semblant de structure, m&#xEA;me sur les sites mal con&#xE7;us. Cr&#xE9;er des repr&#xE9;sentations visuelles de ces structures et de leurs principes d&#x2019;organisation r&#xE9;v&#xE8;le souvent des probl&#xE8;mes ou des bizarreries qui pourront aider &#xE0; orienter vers la solution de conception.</p>
<p><span class="spip_document_471 spip_documents spip_documents_center">
<img src="https://www.pompage.net/traduction/IMG/png/structure_602_fr.png" width="602" alt=""></span></p>
<p>Sur le projet d&#x2019;intranet, nous avons d&#xE9;couverts que l&#x2019;organisation du contenu avait &#xE9;t&#xE9; mal con&#xE7;ue et n&#x2019;&#xE9;tait pas adapt&#xE9;e aux r&#xE9;alit&#xE9;s op&#xE9;rationnelles. Par exemple, il y avait neuf aires de contenu, par ailleurs, plus de 50% du contenu &#xE9;tait dans une seule de ces aires. Cette distribution d&#xE9;s&#xE9;quilibr&#xE9;e cr&#xE9;ait trop de couches de navigation et contribuait &#xE0; une mauvaise exp&#xE9;rience de d&#xE9;couverte et de retour vers les contenus.</p>
<p>Une fois que vous avez une repr&#xE9;sentation visuelle de la fa&#xE7;on dont le contenu est structur&#xE9; et organis&#xE9;, vous pouvez l&#x2019;utiliser pour faciliter les discussions suivantes&#xA0;:</p>
<ul class="spip"><li> Pourquoi le contenu a-t-il &#xE9;t&#xE9; organis&#xE9; de cette fa&#xE7;on&#xA0;? Qu&#x2019;est-ce qui a initialement conduit &#xE0; prendre ces d&#xE9;cisions&#xA0;?</li><li> Quelles informations ont &#xE9;t&#xE9; difficiles &#xE0; classer et &#xE0; organiser dans ce syst&#xE8;me&#xA0;?</li><li> Quels sont les types de contenu les plus importants par rapport aux objectifs commerciaux&#xA0;?</li><li> Qu&#x2019;est-ce que les gens vous ont dit &#xE0; propos de l&#x2019;organisation actuelle du contenu&#xA0;?</li></ul><h4>D&#xE9;terminer si le contenu est utilis&#xE9;</h4>
<p>Avoir l&#x2019;inventaire de contenu (URLs de production incluses) donnent une carte et un point de r&#xE9;f&#xE9;rence pour les statistiques du site. M&#xEA;me si ces rapports peuvent parfois &#xEA;tre mal interpr&#xE9;t&#xE9;s, ils donnent une id&#xE9;e g&#xE9;n&#xE9;rale de l&#x2019;utilisation ou de la non-utilisation actuelle du site et indique les contenus les plus souvent utilis&#xE9;s.</p>
<p><span class="spip_document_472 spip_documents spip_documents_center">
<img src="https://www.pompage.net/traduction/IMG/png/traffic_602_fr.png" width="602" alt=""></span></p>
<p>Dans le projet d&#x2019;intranet, nous avons utilis&#xE9; ces rapports pour am&#xE9;liorer les r&#xE9;sultats de nos entretiens avec les utilisateurs. Par exemple. les utilisateurs n&#x2019;ont pas exprim&#xE9;s le d&#xE9;sir de comprendre l&#x2019;organisation hi&#xE9;rarchique ou la structure de pr&#xE9;sentation des r&#xE9;sultats, pourtant, les vues et les t&#xE9;l&#xE9;chargements d&#x2019;organigrammes &#xE9;taient &#xE9;lev&#xE9;es. Ce sont des donn&#xE9;es importantes &#xE0; prendre en compte pour le design.</p>
<p>Ces donn&#xE9;es peuvent &#xEA;tre utilis&#xE9;es pour avoir des discussions franches &#xE0; propos de ce qui est utile et de ce qui ne l&#x2019;est pas sur le site.</p>
<ul class="spip"><li> Quels contenus sont rarement utilis&#xE9;s&#xA0;? Peut-on en tirer des conclusions d&#xE9;finitives&#xA0;?</li><li> Que nous apprend la popularit&#xE9; de certains contenus sur les personnes qui utilisent le site&#xA0;? Peut-on &#xE9;tendre et am&#xE9;liorer ces contenus pour leur en donner encore plus&#xA0;?</li><li> Comment peut-on structurer le design pour faciliter l&#x2019;acc&#xE8;s aux informations que l&#x2019;on sait importantes&#xA0;?</li><li> Y-a-t-il des mani&#xE8;res de r&#xE9;v&#xE9;ler la pertinence du contenu qui n&#x2019;est pas utilis&#xE9; pour le moment&#xA0;?</li></ul><h4>Documenter la pr&#xE9;sentation incoh&#xE9;rente du contenu</h4>
<p>Un probl&#xE8;me commun avec les sites n&#xE9;glig&#xE9;s ou mal g&#xE9;r&#xE9;s est le niveau d&#x2019;incoh&#xE9;rence dans le design et la pr&#xE9;sentation du contenu. Faire des copies d&#x2019;&#xE9;cran d&#x2019;une large palette de pages et de types de pr&#xE9;sentation pendant votre audit est une tr&#xE8;s bonne mani&#xE8;re de rendre compte des incoh&#xE9;rences et d&#x2019;identifier des opportunit&#xE9;s de consolidation.</p>
<p>Dans le projet d&#x2019;intranet, nous avons montr&#xE9; une large s&#xE9;lection de captures d&#x2019;&#xE9;cran et ensuite montr&#xE9; comment la structure de contenu pouvait &#xEA;tre normalis&#xE9;e au niveau de la pr&#xE9;sentation, &#xE9;liminant les incoh&#xE9;rences et les variations inutiles. Nous avons fait cela en identifiant les attributs communs des contenus, m&#xEA;me si leur pr&#xE9;sentation variait grandement.</p>
<p>Passer du temps &#xE0; capturer et annoter les captures d&#x2019;&#xE9;cran t&#xF4;t dans le projet est essentiel pour des discussions productives &#xE0; propos des r&#xE9;alit&#xE9;s op&#xE9;rationnelles et la future direction de design. Utiliser ces outils pour r&#xE9;pondre aux questions suivantes&#xA0;:</p>
<ul class="spip"><li> Y-a-t-il une raison pour que des contenus similaires soient pr&#xE9;sent&#xE9;s diff&#xE9;remment&#xA0;? Parfois, il existe des raisons commerciales l&#xE9;gitimes, telles que s&#x2019;aligner sur du mat&#xE9;riel de communication hors ligne.</li><li> O&#xF9; les efforts de consolidations ont-ils mal tourn&#xE9;&#xA0;? Qu&#x2019;est-ce qui cause ces incoh&#xE9;rences en dehors du manque de sensibilisation&#xA0;?</li></ul><h2>Les r&#xE9;sultats</h2>
<p>Dans le projet d&#x2019;intranet, ce processus a permis de nombreuses r&#xE9;alisations qui ont men&#xE9; directement &#xE0; des d&#xE9;cisions de design, parmi les plus notables&#xA0;:</p>
<h4>Une conscience aigu&#xEB; des priorit&#xE9;s</h4>
<p>Savoir quels sont les contenus qui sont sur le site, pourquoi, et lesquels sont vraiment utilis&#xE9;s est essentiel pour comprendre les priorit&#xE9;s. L&#x2019;audit a facilit&#xE9; les conversations et donner forme aux questions &#xE0; propos de l&#x2019;utilit&#xE9; et l&#x2019;utilisation du contenu qui n&#x2019;auraient pas &#xE9;t&#xE9; aussi fructueuses ou r&#xE9;v&#xE9;latrices.</p>
<h4>Contraintes op&#xE9;rationnelles et commerciales</h4>
<p>Les contraintes op&#xE9;rationnelles et d&#x2019;affaires sont souvent r&#xE9;v&#xE9;l&#xE9;es au travers du processus d&#x2019;audit. Dans ce projet, il y avait clairement des contraintes op&#xE9;rationnelles qui limitaient les solutions de design que nous pouvions proposer. Par exemple, alors que les parties prenantes appr&#xE9;ciaient le concept d&#x2019;une page d&#x2019;accueil orient&#xE9;e sur les nouvelles fra&#xEE;ches, ils n&#x2019;avaient pas les capacit&#xE9;s de faire des mises &#xE0; jour r&#xE9;guli&#xE8;res. Les &#xE9;valuations et discussions de suivi ont r&#xE9;v&#xE9;l&#xE9; ces contraintes plus clairement que si nous n&#x2019;avions pas entrepris l&#x2019;audit. Et ces discussions ont form&#xE9; notre approche du design, nous assurant ainsi que nos recommandations n&#x2019;entraient pas en conflit avec les r&#xE9;alit&#xE9;s op&#xE9;rationnelles.</p>
<h4>Un langage commun</h4>
<p>Les audits peuvent r&#xE9;v&#xE9;ler un langage et une terminologie sp&#xE9;cifiques &#xE0; l&#x2019;organisation qui seront peu familiers pour les personnes de l&#x2019;ext&#xE9;rieur. Dans ce projet, le contenu &#xE9;tait herm&#xE9;tique pour de multiples raisons et l&#x2019;audit nous a aid&#xE9; &#xE0; d&#xE9;coder le contenu et &#xE0; &#xE9;tablir une compr&#xE9;hension commune des concepts. Ainsi, les revues de design &#xE9;taient moins abstraites et s&#x2019;alignaient plus pr&#xE9;cis&#xE9;ment avec la mani&#xE8;re dont les &#xE9;quipes internes pensaient et parlaient du contenu. De plus, nous avons &#xE9;t&#xE9; en mesure de r&#xE9;utiliser du contenu existant dans nos prototypes pour r&#xE9;v&#xE9;ler des d&#xE9;cisions structurelles et, o&#xF9; cela s&#x2019;est av&#xE9;r&#xE9; n&#xE9;cessaire, &#xE9;crire de la copie repr&#xE9;sentative destin&#xE9;e &#xE0; servir de guide dans les futurs d&#xE9;veloppement de contenu.</p>
<h4>Un <i>vrai</i> sens de l&#x2019;&#xE9;chelle</h4>
<p>Le site &#xE9;tait certainement gros, mais pas de la fa&#xE7;on dont tout le monde ou nous le pensions. Nous avons acquis une perspective nuanc&#xE9;e du contenu, comprenant que nous ne parlions pas d&#x2019;un site de 10 000 pages. Cela a chang&#xE9; la mani&#xE8;re dont nous avons pens&#xE9; au design, au nombre de pages, et aux variations de design des types de contenus dont nous devions tenir compte. Cette prise de conscience a aussi apport&#xE9; une saine dose d&#x2019;objectivit&#xE9; aux conversations et calm&#xE9; un grand nombre d&#x2019;anxi&#xE9;t&#xE9;s caus&#xE9;es (en grande partie) par nos incertitudes.</p> <p>Si on les aborde correctement, les audits de contenu sont des outils d&#x2019;une puissance exceptionnelle. Au del&#xE0; de l&#x2019;&#xE9;valuation de la quantit&#xE9; et de la qualit&#xE9; du contenu, ils aident les concepteurs &#xE0; comprendre l&#x2019;environnement informationnel, facilitent les discussions strat&#xE9;giques et permettent la d&#xE9;couverte d&#x2019;informations qui ont directement influenc&#xE9;s la direction du design et la strat&#xE9;gie. En r&#xE9;sum&#xE9;, nous avons augment&#xE9; les chances de succ&#xE8;s de notre redesign en approchant les audits en gardant ces buts &#xE0; l&#x2019;esprit.</p> </div></div>]]></description>
      <link>https://www.pompage.net/traduction/de-l-audit-de-contenu-aux-idees-de-design</link>
      <guid>https://www.pompage.net/traduction/de-l-audit-de-contenu-aux-idees-de-design</guid>
      <pubDate>Wed, 21 Oct 2015 08:10:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Concevoir un design sans la couleur]]></title>
      <description><![CDATA[<div id="article"><p class="signature">Par
<a href="http://markboulton.co.uk/">Mark Boulton</a></p><p class="moreInfo">
La conception d&apos;un design efficace est une affaire d&#xE9;licate, et souvent rendue plus difficile encore par les choix de couleurs. Pourquoi ne pas imaginer un mode initial de conception qui s&apos;affranchisse totalement de la couleur au profit d&apos;un travail sur les tons?</p><p>Faire un design en travaillant sur la couleur, c&#x2019;est peut-&#xEA;tre l&#x2019;une des choses les plus difficiles &#xE0; faire dans le domaine du design graphique. Pourquoi&#xA0;? Parce qu&#x2019;il n&#x2019;y a rien de plus subjectif. Certains trouveront g&#xE9;nial de choisir une palette de gris sombre avec quelques touches de rose vif, tandis que d&#x2019;autres trouveront &#xE7;a tr&#xE8;s laid. On voit trop souvent des designers prendre des d&#xE9;cisions arbitraires sur cette question, qu&#x2019;ils soient ou non form&#xE9;s &#xE0; la th&#xE9;orie chromatique, et c&#x2019;est au moment o&#xF9; ils tentent de justifier ces choix aupr&#xE8;s de leurs clients que tout se complique. Dans ce premier article, je vais m&#x2019;int&#xE9;resser aux tons et &#xE0; l&#x2019;avantage qu&#x2019;on trouvera &#xE0; limiter l&#x2019;&#xE9;tendue de sa palette.</p><h2>On baisse d&#x2019;un ton</h2><p>Il y a quelques ann&#xE9;es (houl&#xE0;, &#xE7;a fait m&#xEA;me une bonne quinzaine d&#x2019;ann&#xE9;es&#x2026;) j&#x2019;&#xE9;tais en premi&#xE8;re ann&#xE9;e aux Beaux-Arts, ici &#xE0; Stockport au Royaume-Uni. Je voulais devenir peintre, ou plus exactement illustrateur. D&#xE8;s la premi&#xE8;re semaine, on nous a demand&#xE9; de nous d&#xE9;barrasser de tous les beaux pinceaux qu&#x2019;on venait de s&#x2019;acheter pour les cours. Nous avons donc d&#xFB; laisser notre mat&#xE9;riel tout neuf &#xE0; la maison, puis aller dehors r&#xE9;colter des brindilles et d&#xE9;nicher de l&#x2019;encre noire. Je n&#x2019;&#xE9;tais vraiment pas enthousiaste. Comment imaginer qu&#x2019;un artiste puisse cr&#xE9;er &#xE0; l&#x2019;aide d&#x2019;outils aussi primitifs&#xA0;?
Nos professeurs nous ont donc fait peindre avec des brindilles, puis avec nos pieds, puis les yeux band&#xE9;s&#xA0;: bref, la totale. &#xC0; l&#x2019;&#xE9;poque j&#x2019;ai trouv&#xE9; &#xE7;a nul, et je ne comprenais pas o&#xF9; ils voulaient en venir. Maintenant que j&#x2019;ai pris du recul, je per&#xE7;ois bien l&#x2019;int&#xE9;r&#xEA;t de cet horrible d&#xE9;marrage. Ils nous apprenaient &#xE0; observer et &#xE0; produire des &#x153;uvres qui n&#x2019;&#xE9;taient pas dict&#xE9;es par nos outils. En d&#x2019;autres termes, si nous avions dispos&#xE9; de couleurs vari&#xE9;es et de beaux pinceaux, la tentation de les exploiter aurait &#xE9;t&#xE9; trop grande. Faute de pinceaux et de couleurs, nous avons &#xE9;t&#xE9; contraints de communiquer la notion de couleur uniquement avec des effets de ton.<p>
C&#x2019;est par cela que je voudrais commencer.</p></p><h2>Faisons sans la couleur</h2><p>L&#x2019;une des choses que j&#x2019;appr&#xE9;cie dans le design &#xE9;ditorial, et en particulier dans le design typographique, c&#x2019;est l&#x2019;importance du noir et blanc. Bien s&#xFB;r, la couleur constitue une &#xE9;tape tr&#xE8;s importante de tout travail typographique, mais je m&#x2019;int&#xE9;resse avant tout au ton et &#xE0; la forme. Je crois qu&#x2019;il y a tout &#xE0; gagner &#xE0; retirer compl&#xE8;tement la couleur de l&#x2019;&#xE9;quation afin de focaliser sur les questions de tonalit&#xE9; d&#x2019;un design, avant d&#x2019;y appliquer des couleurs.
Quelques exemples notables suffiront &#xE0; montrer qu&#x2019;un design bas&#xE9; seulement sur du noir peut &#xEA;tre original et attirant.<p>
On ne saurait parler du design web en noir et blanc sans &#xE9;voquer le site de Khoi Vinh, <a href="http://www.subtraction.com/" class="spip_out">Subtraction.com</a>. Khoi travaille avec du noir et de l&#x2019;orange pour correspondre au style suisse du design (ou style typographique international, <i><abbr>NdT</abbr></i>).</p></p><p><span class="spip_document_464 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/jpg/fss_colour_01.jpg" alt=""></span><br class="autobr">
<i>Le site Substraction.com par Khoi Vinh</i></p><p><a href="http://www.form.de/" class="spip_out">Form</a>, un magazine de design allemand, utilise une typographie en noir et blanc (bas&#xE9;e sur une grille rigoureuse) pour transmettre son concept de marque aux utilisateurs du site. On voit l&#x2019;effet qui est atteint avec ce noir et blanc&#xA0;: l&#x2019;ouvrage qui est mis en lumi&#xE8;re, avec sa couleur vive, se d&#xE9;tache tr&#xE8;s nettement du cadre noir et blanc.</p><p><span class="spip_document_465 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/jpg/fss_colour_02.jpg" alt=""></span><br class="autobr">
<i>Le magazine allemand de design Form</i></p><h2>D&#x2019;abord du gris</h2><p>Faites donc le test pour votre prochain design. Comme indiqu&#xE9; dans le titre, contentez-vous de le d&#xE9;marrer avec du gris en diff&#xE9;rentes nuances. N&#x2019;ajoutez aucune couleur tant que vous n&#x2019;&#xEA;tes pas satisfait du design en noir et blanc. Il y a de grandes chances que les d&#xE9;cisions de palette et de couleurs que vous prendrez seront ensuite beaucoup plus simples, parce que le design ne d&#xE9;pendra plus de la couleur pour fonctionner. C&#x2019;est particuli&#xE8;rement pertinent si on cherche &#xE0; cr&#xE9;er un design avec une bonne accessibilit&#xE9;. Ce n&#x2019;est pas le sujet de cet article, puisque je me concentre ici sur le design graphique, mais l&#x2019;accessibilit&#xE9; reste n&#xE9;anmoins une question qui ne doit pas &#xEA;tre n&#xE9;glig&#xE9;e. En basant votre design sur le noir et blanc, vous vous assurez que la solution retenue ne d&#xE9;pendra jamais de la couleur.<br class="autobr">
J&#x2019;utilise souvent la couleur pour mettre des &#xE9;l&#xE9;ments du design en avant, mais en g&#xE9;n&#xE9;ral ils ont d&#xE9;j&#xE0; un r&#xF4;le dans le graphisme retenu, comme par exemple les lignes horizontales du site ci-dessous. On peut aussi imaginer mettre en valeur un bouton de recherche, ou bien les &#xE9;l&#xE9;ments d&#x2019;une barre de navigation. La couleur sert alors &#xE0; faire ressortir des &#xE9;l&#xE9;ments fonctionnels cruciaux de l&#x2019;interface.</p><p><span class="spip_document_466 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/jpg/fss_colour_03.jpg" alt=""></span><br class="autobr">
<i>On r&#xE9;sout d&#x2019;abord les questions de tons avant d&#x2019;appliquer de la couleur</i></p><h2>Vers des palettes mono- et duo-tonales</h2><p>Dans mon prochain billet, je vais aller un peu plus loin avec mes gris.<br class="autobr">
On a quand m&#xEA;me de la chance, nous les designers du web. On peut employer pratiquement n&#x2019;importe quelle couleur. Les designers papier, eux, sont confront&#xE9;s &#xE0; des limites sur l&#x2019;usage des couleurs depuis l&#x2019;origine de l&#x2019;imprimerie. Du coup, cela les a rendus tr&#xE8;s attentifs &#xE0; ces questions du design en couleur. Je trouve qu&#x2019;il n&#x2019;y a rien de plus formateur que de cr&#xE9;er des projets &#xE0; une ou deux couleurs, mais appliqu&#xE9;es &#xE0; un grand nombre de situations, afin de mieux r&#xE9;fl&#xE9;chir &#xE0; la fa&#xE7;on dont la couleur est employ&#xE9;e. Je vais essayer d&#x2019;&#xE9;voquer cet axe de r&#xE9;flexion (et cette contrainte) dans mon prochain billet.</p></div>]]></description>
      <link>http://www.pompage.net/traduction/concevoir-un-design-sans-la-couleur</link>
      <guid>http://www.pompage.net/traduction/concevoir-un-design-sans-la-couleur</guid>
      <pubDate>Tue, 09 Sep 2014 10:09:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Concevoir un design sans la couleur]]></title>
      <description><![CDATA[<div id="article"> <p class="signature">Par <a href="http://markboulton.co.uk/">Mark Boulton</a> </p> <p class="moreInfo"> La conception d&apos;un design efficace est une affaire d&#xE9;licate, et souvent rendue plus difficile encore par les choix de couleurs. Pourquoi ne pas imaginer un mode initial de conception qui s&apos;affranchisse totalement de la couleur au profit d&apos;un travail sur les tons? </p> <p>Faire un design en travaillant sur la couleur, c&#x2019;est peut-&#xEA;tre l&#x2019;une des choses les plus difficiles &#xE0; faire dans le domaine du design graphique. Pourquoi&#xA0;? Parce qu&#x2019;il n&#x2019;y a rien de plus subjectif. Certains trouveront g&#xE9;nial de choisir une palette de gris sombre avec quelques touches de rose vif, tandis que d&#x2019;autres trouveront &#xE7;a tr&#xE8;s laid. On voit trop souvent des designers prendre des d&#xE9;cisions arbitraires sur cette question, qu&#x2019;ils soient ou non form&#xE9;s &#xE0; la th&#xE9;orie chromatique, et c&#x2019;est au moment o&#xF9; ils tentent de justifier ces choix aupr&#xE8;s de leurs clients que tout se complique. Dans ce premier article, je vais m&#x2019;int&#xE9;resser aux tons et &#xE0; l&#x2019;avantage qu&#x2019;on trouvera &#xE0; limiter l&#x2019;&#xE9;tendue de sa palette.</p>
<h2>On baisse d&#x2019;un ton</h2>
<p>Il y a quelques ann&#xE9;es (houl&#xE0;, &#xE7;a fait m&#xEA;me une bonne quinzaine d&#x2019;ann&#xE9;es&#x2026;) j&#x2019;&#xE9;tais en premi&#xE8;re ann&#xE9;e aux Beaux-Arts, ici &#xE0; Stockport au Royaume-Uni. Je voulais devenir peintre, ou plus exactement illustrateur. D&#xE8;s la premi&#xE8;re semaine, on nous a demand&#xE9; de nous d&#xE9;barrasser de tous les beaux pinceaux qu&#x2019;on venait de s&#x2019;acheter pour les cours. Nous avons donc d&#xFB; laisser notre mat&#xE9;riel tout neuf &#xE0; la maison, puis aller dehors r&#xE9;colter des brindilles et d&#xE9;nicher de l&#x2019;encre noire. Je n&#x2019;&#xE9;tais vraiment pas enthousiaste. Comment imaginer qu&#x2019;un artiste puisse cr&#xE9;er &#xE0; l&#x2019;aide d&#x2019;outils aussi primitifs&#xA0;?
Nos professeurs nous ont donc fait peindre avec des brindilles, puis avec nos pieds, puis les yeux band&#xE9;s&#xA0;: bref, la totale. &#xC0; l&#x2019;&#xE9;poque j&#x2019;ai trouv&#xE9; &#xE7;a nul, et je ne comprenais pas o&#xF9; ils voulaient en venir. Maintenant que j&#x2019;ai pris du recul, je per&#xE7;ois bien l&#x2019;int&#xE9;r&#xEA;t de cet horrible d&#xE9;marrage. Ils nous apprenaient &#xE0; observer et &#xE0; produire des &#x153;uvres qui n&#x2019;&#xE9;taient pas dict&#xE9;es par nos outils. En d&#x2019;autres termes, si nous avions dispos&#xE9; de couleurs vari&#xE9;es et de beaux pinceaux, la tentation de les exploiter aurait &#xE9;t&#xE9; trop grande. Faute de pinceaux et de couleurs, nous avons &#xE9;t&#xE9; contraints de communiquer la notion de couleur uniquement avec des effets de ton.<p>
C&#x2019;est par cela que je voudrais commencer.</p></p>
<h2>Faisons sans la couleur</h2>
<p>L&#x2019;une des choses que j&#x2019;appr&#xE9;cie dans le design &#xE9;ditorial, et en particulier dans le design typographique, c&#x2019;est l&#x2019;importance du noir et blanc. Bien s&#xFB;r, la couleur constitue une &#xE9;tape tr&#xE8;s importante de tout travail typographique, mais je m&#x2019;int&#xE9;resse avant tout au ton et &#xE0; la forme. Je crois qu&#x2019;il y a tout &#xE0; gagner &#xE0; retirer compl&#xE8;tement la couleur de l&#x2019;&#xE9;quation afin de focaliser sur les questions de tonalit&#xE9; d&#x2019;un design, avant d&#x2019;y appliquer des couleurs.
Quelques exemples notables suffiront &#xE0; montrer qu&#x2019;un design bas&#xE9; seulement sur du noir peut &#xEA;tre original et attirant.<p>
On ne saurait parler du design web en noir et blanc sans &#xE9;voquer le site de Khoi Vinh, <a href="http://www.subtraction.com/" class="spip_out">Subtraction.com</a>. Khoi travaille avec du noir et de l&#x2019;orange pour correspondre au style suisse du design (ou style typographique international, <i><abbr>NdT</abbr></i>).</p></p>
<p><span class="spip_document_464 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/jpg/fss_colour_01.jpg" width="615" alt=""></span><br class="autobr">
<i>Le site Substraction.com par Khoi Vinh</i></p>
<p><a href="http://www.form.de/" class="spip_out">Form</a>, un magazine de design allemand, utilise une typographie en noir et blanc (bas&#xE9;e sur une grille rigoureuse) pour transmettre son concept de marque aux utilisateurs du site. On voit l&#x2019;effet qui est atteint avec ce noir et blanc&#xA0;: l&#x2019;ouvrage qui est mis en lumi&#xE8;re, avec sa couleur vive, se d&#xE9;tache tr&#xE8;s nettement du cadre noir et blanc.</p>
<p><span class="spip_document_465 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/jpg/fss_colour_02.jpg" width="615" alt=""></span><br class="autobr">
<i>Le magazine allemand de design Form</i></p>
<h2>D&#x2019;abord du gris</h2>
<p>Faites donc le test pour votre prochain design. Comme indiqu&#xE9; dans le titre, contentez-vous de le d&#xE9;marrer avec du gris en diff&#xE9;rentes nuances. N&#x2019;ajoutez aucune couleur tant que vous n&#x2019;&#xEA;tes pas satisfait du design en noir et blanc. Il y a de grandes chances que les d&#xE9;cisions de palette et de couleurs que vous prendrez seront ensuite beaucoup plus simples, parce que le design ne d&#xE9;pendra plus de la couleur pour fonctionner. C&#x2019;est particuli&#xE8;rement pertinent si on cherche &#xE0; cr&#xE9;er un design avec une bonne accessibilit&#xE9;. Ce n&#x2019;est pas le sujet de cet article, puisque je me concentre ici sur le design graphique, mais l&#x2019;accessibilit&#xE9; reste n&#xE9;anmoins une question qui ne doit pas &#xEA;tre n&#xE9;glig&#xE9;e. En basant votre design sur le noir et blanc, vous vous assurez que la solution retenue ne d&#xE9;pendra jamais de la couleur.<br class="autobr">
J&#x2019;utilise souvent la couleur pour mettre des &#xE9;l&#xE9;ments du design en avant, mais en g&#xE9;n&#xE9;ral ils ont d&#xE9;j&#xE0; un r&#xF4;le dans le graphisme retenu, comme par exemple les lignes horizontales du site ci-dessous. On peut aussi imaginer mettre en valeur un bouton de recherche, ou bien les &#xE9;l&#xE9;ments d&#x2019;une barre de navigation. La couleur sert alors &#xE0; faire ressortir des &#xE9;l&#xE9;ments fonctionnels cruciaux de l&#x2019;interface.</p>
<p><span class="spip_document_466 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/jpg/fss_colour_03.jpg" width="615" alt=""></span><br class="autobr">
<i>On r&#xE9;sout d&#x2019;abord les questions de tons avant d&#x2019;appliquer de la couleur</i></p>
<h2>Vers des palettes mono- et duo-tonales</h2>
<p>Dans mon prochain billet, je vais aller un peu plus loin avec mes gris.<br class="autobr">
On a quand m&#xEA;me de la chance, nous les designers du web. On peut employer pratiquement n&#x2019;importe quelle couleur. Les designers papier, eux, sont confront&#xE9;s &#xE0; des limites sur l&#x2019;usage des couleurs depuis l&#x2019;origine de l&#x2019;imprimerie. Du coup, cela les a rendus tr&#xE8;s attentifs &#xE0; ces questions du design en couleur. Je trouve qu&#x2019;il n&#x2019;y a rien de plus formateur que de cr&#xE9;er des projets &#xE0; une ou deux couleurs, mais appliqu&#xE9;es &#xE0; un grand nombre de situations, afin de mieux r&#xE9;fl&#xE9;chir &#xE0; la fa&#xE7;on dont la couleur est employ&#xE9;e. Je vais essayer d&#x2019;&#xE9;voquer cet axe de r&#xE9;flexion (et cette contrainte) dans mon prochain billet.</p> </div>]]></description>
      <link>http://www.pompage.net/traduction/concevoir-un-design-sans-la-couleur</link>
      <guid>http://www.pompage.net/traduction/concevoir-un-design-sans-la-couleur</guid>
      <pubDate>Tue, 09 Sep 2014 10:09:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Concevoir un design sans la couleur]]></title>
      <description><![CDATA[<div id="article"> <p class="signature">Par <a href="http://markboulton.co.uk/">Mark Boulton</a> </p> <p class="moreInfo"> La conception d&apos;un design efficace est une affaire d&#xE9;licate, et souvent rendue plus difficile encore par les choix de couleurs. Pourquoi ne pas imaginer un mode initial de conception qui s&apos;affranchisse totalement de la couleur au profit d&apos;un travail sur les tons? </p> <p>Faire un design en travaillant sur la couleur, c&#x2019;est peut-&#xEA;tre l&#x2019;une des choses les plus difficiles &#xE0; faire dans le domaine du design graphique. Pourquoi&#xA0;? Parce qu&#x2019;il n&#x2019;y a rien de plus subjectif. Certains trouveront g&#xE9;nial de choisir une palette de gris sombre avec quelques touches de rose vif, tandis que d&#x2019;autres trouveront &#xE7;a tr&#xE8;s laid. On voit trop souvent des designers prendre des d&#xE9;cisions arbitraires sur cette question, qu&#x2019;ils soient ou non form&#xE9;s &#xE0; la th&#xE9;orie chromatique, et c&#x2019;est au moment o&#xF9; ils tentent de justifier ces choix aupr&#xE8;s de leurs clients que tout se complique. Dans ce premier article, je vais m&#x2019;int&#xE9;resser aux tons et &#xE0; l&#x2019;avantage qu&#x2019;on trouvera &#xE0; limiter l&#x2019;&#xE9;tendue de sa palette.</p>
<h2>On baisse d&#x2019;un ton</h2>
<p>Il y a quelques ann&#xE9;es (houl&#xE0;, &#xE7;a fait m&#xEA;me une bonne quinzaine d&#x2019;ann&#xE9;es&#x2026;) j&#x2019;&#xE9;tais en premi&#xE8;re ann&#xE9;e aux Beaux-Arts, ici &#xE0; Stockport au Royaume-Uni. Je voulais devenir peintre, ou plus exactement illustrateur. D&#xE8;s la premi&#xE8;re semaine, on nous a demand&#xE9; de nous d&#xE9;barrasser de tous les beaux pinceaux qu&#x2019;on venait de s&#x2019;acheter pour les cours. Nous avons donc d&#xFB; laisser notre mat&#xE9;riel tout neuf &#xE0; la maison, puis aller dehors r&#xE9;colter des brindilles et d&#xE9;nicher de l&#x2019;encre noire. Je n&#x2019;&#xE9;tais vraiment pas enthousiaste. Comment imaginer qu&#x2019;un artiste puisse cr&#xE9;er &#xE0; l&#x2019;aide d&#x2019;outils aussi primitifs&#xA0;?
Nos professeurs nous ont donc fait peindre avec des brindilles, puis avec nos pieds, puis les yeux band&#xE9;s&#xA0;: bref, la totale. &#xC0; l&#x2019;&#xE9;poque j&#x2019;ai trouv&#xE9; &#xE7;a nul, et je ne comprenais pas o&#xF9; ils voulaient en venir. Maintenant que j&#x2019;ai pris du recul, je per&#xE7;ois bien l&#x2019;int&#xE9;r&#xEA;t de cet horrible d&#xE9;marrage. Ils nous apprenaient &#xE0; observer et &#xE0; produire des &#x153;uvres qui n&#x2019;&#xE9;taient pas dict&#xE9;es par nos outils. En d&#x2019;autres termes, si nous avions dispos&#xE9; de couleurs vari&#xE9;es et de beaux pinceaux, la tentation de les exploiter aurait &#xE9;t&#xE9; trop grande. Faute de pinceaux et de couleurs, nous avons &#xE9;t&#xE9; contraints de communiquer la notion de couleur uniquement avec des effets de ton.<p>
C&#x2019;est par cela que je voudrais commencer.</p></p>
<h2>Faisons sans la couleur</h2>
<p>L&#x2019;une des choses que j&#x2019;appr&#xE9;cie dans le design &#xE9;ditorial, et en particulier dans le design typographique, c&#x2019;est l&#x2019;importance du noir et blanc. Bien s&#xFB;r, la couleur constitue une &#xE9;tape tr&#xE8;s importante de tout travail typographique, mais je m&#x2019;int&#xE9;resse avant tout au ton et &#xE0; la forme. Je crois qu&#x2019;il y a tout &#xE0; gagner &#xE0; retirer compl&#xE8;tement la couleur de l&#x2019;&#xE9;quation afin de focaliser sur les questions de tonalit&#xE9; d&#x2019;un design, avant d&#x2019;y appliquer des couleurs.
Quelques exemples notables suffiront &#xE0; montrer qu&#x2019;un design bas&#xE9; seulement sur du noir peut &#xEA;tre original et attirant.<p>
On ne saurait parler du design web en noir et blanc sans &#xE9;voquer le site de Khoi Vinh, <a href="http://www.subtraction.com/" class="spip_out">Subtraction.com</a>. Khoi travaille avec du noir et de l&#x2019;orange pour correspondre au style suisse du design (ou style typographique international, <i><abbr>NdT</abbr></i>).</p></p>
<p><span class="spip_document_464 spip_documents spip_documents_center">
<img src="https://www.pompage.net/traduction/IMG/jpg/fss_colour_01.jpg" width="615" alt=""></span><br class="autobr">
<i>Le site Substraction.com par Khoi Vinh</i></p>
<p><a href="http://www.form.de/" class="spip_out">Form</a>, un magazine de design allemand, utilise une typographie en noir et blanc (bas&#xE9;e sur une grille rigoureuse) pour transmettre son concept de marque aux utilisateurs du site. On voit l&#x2019;effet qui est atteint avec ce noir et blanc&#xA0;: l&#x2019;ouvrage qui est mis en lumi&#xE8;re, avec sa couleur vive, se d&#xE9;tache tr&#xE8;s nettement du cadre noir et blanc.</p>
<p><span class="spip_document_465 spip_documents spip_documents_center">
<img src="https://www.pompage.net/traduction/IMG/jpg/fss_colour_02.jpg" width="615" alt=""></span><br class="autobr">
<i>Le magazine allemand de design Form</i></p>
<h2>D&#x2019;abord du gris</h2>
<p>Faites donc le test pour votre prochain design. Comme indiqu&#xE9; dans le titre, contentez-vous de le d&#xE9;marrer avec du gris en diff&#xE9;rentes nuances. N&#x2019;ajoutez aucune couleur tant que vous n&#x2019;&#xEA;tes pas satisfait du design en noir et blanc. Il y a de grandes chances que les d&#xE9;cisions de palette et de couleurs que vous prendrez seront ensuite beaucoup plus simples, parce que le design ne d&#xE9;pendra plus de la couleur pour fonctionner. C&#x2019;est particuli&#xE8;rement pertinent si on cherche &#xE0; cr&#xE9;er un design avec une bonne accessibilit&#xE9;. Ce n&#x2019;est pas le sujet de cet article, puisque je me concentre ici sur le design graphique, mais l&#x2019;accessibilit&#xE9; reste n&#xE9;anmoins une question qui ne doit pas &#xEA;tre n&#xE9;glig&#xE9;e. En basant votre design sur le noir et blanc, vous vous assurez que la solution retenue ne d&#xE9;pendra jamais de la couleur.<br class="autobr">
J&#x2019;utilise souvent la couleur pour mettre des &#xE9;l&#xE9;ments du design en avant, mais en g&#xE9;n&#xE9;ral ils ont d&#xE9;j&#xE0; un r&#xF4;le dans le graphisme retenu, comme par exemple les lignes horizontales du site ci-dessous. On peut aussi imaginer mettre en valeur un bouton de recherche, ou bien les &#xE9;l&#xE9;ments d&#x2019;une barre de navigation. La couleur sert alors &#xE0; faire ressortir des &#xE9;l&#xE9;ments fonctionnels cruciaux de l&#x2019;interface.</p>
<p><span class="spip_document_466 spip_documents spip_documents_center">
<img src="https://www.pompage.net/traduction/IMG/jpg/fss_colour_03.jpg" width="615" alt=""></span><br class="autobr">
<i>On r&#xE9;sout d&#x2019;abord les questions de tons avant d&#x2019;appliquer de la couleur</i></p>
<h2>Vers des palettes mono- et duo-tonales</h2>
<p>Dans mon prochain billet, je vais aller un peu plus loin avec mes gris.<br class="autobr">
On a quand m&#xEA;me de la chance, nous les designers du web. On peut employer pratiquement n&#x2019;importe quelle couleur. Les designers papier, eux, sont confront&#xE9;s &#xE0; des limites sur l&#x2019;usage des couleurs depuis l&#x2019;origine de l&#x2019;imprimerie. Du coup, cela les a rendus tr&#xE8;s attentifs &#xE0; ces questions du design en couleur. Je trouve qu&#x2019;il n&#x2019;y a rien de plus formateur que de cr&#xE9;er des projets &#xE0; une ou deux couleurs, mais appliqu&#xE9;es &#xE0; un grand nombre de situations, afin de mieux r&#xE9;fl&#xE9;chir &#xE0; la fa&#xE7;on dont la couleur est employ&#xE9;e. Je vais essayer d&#x2019;&#xE9;voquer cet axe de r&#xE9;flexion (et cette contrainte) dans mon prochain billet.</p> </div>]]></description>
      <link>https://www.pompage.net/traduction/concevoir-un-design-sans-la-couleur</link>
      <guid>https://www.pompage.net/traduction/concevoir-un-design-sans-la-couleur</guid>
      <pubDate>Tue, 09 Sep 2014 10:09:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Écrire du JavaScript véloce et à faible empreinte mémoire]]></title>
      <description><![CDATA[<div id="article"><p class="signature">Par
<a href="http://addyosmani.com/">Addy Osmani</a></p><p>Qu&#x2019;il s&#x2019;agisse de V8, de <a href="https://developer.mozilla.org/en-US/docs/SpiderMonkey" class="spip_out"><span>Spider Monkey</span></a> (Firefox), de <a href="http://my.opera.com/ODIN/blog/carakan-faq" class="spip_out">Caracan</a> (Op&#xE9;ra) ou de <a href="http://en.wikipedia.org/wiki/Chakra_(JScript_engine)" class="spip_out">Chakra</a> (<abbr>IE</abbr>), conna&#xEE;tre le fonctionnement interne du moteur JavaScript vous permettra de mieux optimiser vos applications. Cela ne veut pas dire qu&#x2019;il faut que vous optimisiez votre code pour un seul moteur ou navigateur&#xA0;: ne faites jamais cela&#xA0;!</p><p>Vous devriez plut&#xF4;t vous poser ce type de questions&#xA0;:</p><ol class="spip"><li> Que puis-je faire pour rendre mon code plus efficient&#xA0;?</li><li> Quelles optimisations communes sont faites par les moteurs JavaScript&#xA0;?</li><li> Quelles sont les limites de l&#x2019;optimisation de ces moteurs&#xA0;? Le ramasse-miette est-il bien capable de lib&#xE9;rer la m&#xE9;moire comme je m&#x2019;y attend&#xA0;?</li></ol><dl class="spip_document_401 spip_documents spip_documents_center"><dt><img src="https://lh6.googleusercontent.com/ueM0mcKufwF0HEYKLCJ0JDntHX77xlHPH-5L4FPtUDZqMAnMbZ-ab9EZWZKmHVz0gAJE2lqaXfcfnCB3Jn12Aqj5iZQ8oxR8KF9VDyRDHbxA9isjDHRw" alt="JPEG - 126.8&#xA0;ko"></dt></dl><p><i>Les sites v&#xE9;loces, comme les voitures de course, n&#xE9;cessitent des outils sp&#xE9;cialis&#xE9;s. Cr&#xE9;dti de l&#x2019;image&#xA0;: <a href="http://dhybridcars.com/toyota-hybrid/2013-scion-fr-s-sexy-sport-car/media/2013-scion-fr-s-speed-gauge-img-8/" class="spip_out">dHybridcars</a></i></p><p>Nombreux sont les pi&#xE8;ges quand on souhaite produire du code rapide et &#xE9;conome en m&#xE9;moire. Cet article propose donc d&#x2019;explorer plusieurs techniques test&#xE9;es et approuv&#xE9;es pour &#xE9;crire du code qui s&#x2019;ex&#xE9;cute efficacement.</p><h2>Comment fonctionne JavaScript au sein de V8&#xA0;?</h2><p>Bien qu&#x2019;il soit possible d&#x2019;&#xE9;crire des applications volumineuses sans comprendre le fonctionnement des moteurs JavaScript, n&#x2019;importe quel conducteur vous dira qu&#x2019;il a d&#xE9;j&#xE0; jet&#xE9; un &#x153;il sous le capot au moins une fois. &#xC9;tant donn&#xE9; que Chrome est mon navigateur pr&#xE9;f&#xE9;r&#xE9;, je vais vous parler quelque peu de son moteur Javascript. Le c&#x153;ur de V8 est compos&#xE9; de diff&#xE9;rentes pi&#xE8;ces&#xA0;:</p><ol class="spip"><li> Un compilateur de base qui parcourt votre JavaScript et g&#xE9;n&#xE8;re du code machine avant qu&#x2019;il soit ex&#xE9;cut&#xE9;, plut&#xF4;t que d&#x2019;ex&#xE9;cuter du <code>bytecode</code> ou simplement de l&#x2019;interpr&#xE9;ter. Ce code natif n&#x2019;est pour le moment pas tr&#xE8;s optimis&#xE9;.</li><li> V8 repr&#xE9;sente vos objets dans un mod&#xE8;le objet. Les objets sont repr&#xE9;sent&#xE9;s au sein de tableaux associatifs en JavaScript, mais dans V8, ils sont repr&#xE9;sent&#xE9;s avec les classes cach&#xE9;es (<a href="https://developers.google.com/v8/design" class="spip_out"><span>hidden classes</span></a>) qui sont un syst&#xE8;me de typage interne pour optimiser la recherche de r&#xE9;f&#xE9;rences.</li><li> Le profileur &#xE0; l&#x2019;ex&#xE9;cution surveille le syst&#xE8;me en fonctionnement et identifie les fonctions &#xAB;&#xA0;chaudes&#xA0;&#xBB; (le code qui est fr&#xE9;quemment ex&#xE9;cut&#xE9;[a]).</li><li> Un compilateur optimis&#xE9; recompile et optimise les fonctions chaudes identifi&#xE9;es par le profileur &#xE0; l&#x2019;ex&#xE9;cution et proc&#xE8;de &#xE0; des optimisations comme l&#x2019;<span>inlining</span> (le remplacement des appels de fonction par le corps de la fonction appel&#xE9;e).</li><li> V8 supporte le retour sur optimisation[b] ce qui signifie que le compilateur peut r&#xE9;voquer le code optimis&#xE9; s&#x2019;il d&#xE9;couvre que les optimisations s&#x2019;av&#xE8;rent contre-productives.</li><li> V8 a &#xE9;galement un ramasse-miette. Comprendre son fonctionnement peut &#xEA;tre tout aussi important qu&#x2019;optimiser son JavaScript.</li></ol><h2>Le ramasse-miette</h2><p>Le ramasse-miette est un syst&#xE8;me de gestion de la m&#xE9;moire. Il introduit la notion de collecteur qui tente de lib&#xE9;rer la m&#xE9;moire occup&#xE9;e par des objets qui ne sont plus utilis&#xE9;s. Dans un langage &#xE0; ramasse-miette tel que JavaScript les objets qui sont toujours r&#xE9;f&#xE9;renc&#xE9;s par votre application ne sont pas effac&#xE9;s.</p><p>D&#xE9;r&#xE9;f&#xE9;rencer manuellement les objets s&#x2019;av&#xE8;re inutile la plupart du temps. En d&#xE9;clarant simplement les variables &#xE0; l&#x2019;endroit o&#xF9; elles sont n&#xE9;cessaires (id&#xE9;alement le plus localement possible&#xA0;; &#xE0; l&#x2019;int&#xE9;rieur de la fonction o&#xF9; elles sont utilis&#xE9;es plut&#xF4;t que dans un contexte parent), cela devrait fonctionner tout seul.</p><dl class="spip_document_403 spip_documents spip_documents_center"><dt><img src="https://lh4.googleusercontent.com/_M6Bmqzz2I2BiLo5kOFxzbhf2wl9hzHnf7ORv8_0WfGFBjvWUxnhsC2uuR4_gwOWENVX-nfqcn_goyQWZgTteSc-tN5OVyPwM6YopGVqP0cCqNHulDGg" alt="JPEG - 109.8&#xA0;ko"></dt></dl><p>Le ramasse-miette en train de lib&#xE9;rer de la m&#xE9;moire. Cr&#xE9;dits de l&#x2019;image&#xA0;: <a href="http://www.flickr.com/photos/26817893@N05/2864644153/" class="spip_out">Valtteri M&#xE4;ki</a>.</p><p>Il est impossible de forcer l&#x2019;intervention du ramasse-miette en Javascript. Ne pensez pas que c&#x2019;est dommage, car le processus de lib&#xE9;ration de la m&#xE9;moire est contr&#xF4;l&#xE9; par l&#x2019;environnement d&#x2019;ex&#xE9;cution et il sait g&#xE9;n&#xE9;ralement mieux que vous quand un nettoyage s&#x2019;impose.</p><h2>Les mythes du d&#xE9;r&#xE9;f&#xE9;rencement</h2><p>Dans un bon nombre de discussions en ligne &#xE0; propos de la lib&#xE9;ration de m&#xE9;moire en JavaScript, le mot-cl&#xE9; <code>delete</code> a amen&#xE9; certains d&#xE9;veloppeurs &#xE0; penser qu&#x2019;ils pouvaient forcer le d&#xE9;r&#xE9;f&#xE9;rencement en l&#x2019;utilisant, alors qu&#x2019;il est seulement suppos&#xE9; retirer une cl&#xE9; d&#x2019;un tableau de hachage. &#xC9;vitez d&#x2019;utiliser <code>delete</code> si vous le pouvez. Dans l&#x2019;exemple ci-dessous, <code>delete o.x</code> fait plus de mal que de bien contrairement aux apparences. Il change la classe cach&#xE9;e de l&#x2019;objet <code>o</code> et le transforme en objet g&#xE9;n&#xE9;rique plus lent.</p><pre><code>var o = { x: 1 };
delete o.x; // true
o.x; // undefined</code></pre><p>Cela dit, vous pouvez &#xEA;tre certains de trouver <code>delete</code> dans la plupart des biblioth&#xE8;ques JavaScript populaires. Il a une utilit&#xE9; au sein du langage. Ce qu&#x2019;il faut retenir, c&#x2019;est qu&#x2019;il modifie la structure des objets &#xAB;&#xA0;chauds&#xA0;&#xBB; &#xE0; l&#x2019;ex&#xE9;cution. Les moteurs JavaScript rep&#xE8;rent ces objets chauds et tentent de les optimiser. C&#x2019;est plus facile si la structure de ces objets &#xE9;volue peu au cours de leur utilisation, or <code>delete</code> impose des changements.</p><p>Il y a &#xE9;galement des erreurs d&#x2019;interpr&#xE9;tation sur le fonctionnement de <code>null</code>. Attribuer &#xE0; la r&#xE9;f&#xE9;rence d&#x2019;un objet la valeur <code>null</code> ne d&#xE9;truit pas l&#x2019;objet associ&#xE9;. Cela d&#xE9;truit en r&#xE9;alit&#xE9; la r&#xE9;f&#xE9;rence &#xE0; cet objet. Il vaut mieux utiliser <code>o.x=null</code> plut&#xF4;t que le mot-cl&#xE9; <code>delete</code>, mais c&#x2019;est rarement utile.</p><pre><code>var o = { x: 1 };
o = null;
o; // null
o.x; // TypeError</code></pre><p>Si cette r&#xE9;f&#xE9;rence est la derni&#xE8;re pointant sur cet objet, alors il devient &#xE9;ligible pour &#xEA;tre lib&#xE9;r&#xE9; de la m&#xE9;moire. Mais si ce n&#x2019;&#xE9;tait pas la derni&#xE8;re r&#xE9;f&#xE9;rence &#xE0; ce dernier, cet objet reste atteignable et ne sera donc pas d&#xE9;truit.</p><p>Une autre chose importante est que les variables globales ne sont pas d&#xE9;truites par le ramasse-miette durant toute la dur&#xE9;e de vie de votre page. Que celles-ci soient affich&#xE9;es une fraction de seconde ou plusieurs heures, les variables affect&#xE9;es au contexte global d&#x2019;ex&#xE9;cution du JavaScript resteront en m&#xE9;moire.</p><p><code>var monEspaceDeNomGlobal = {};</code></p><p>Les variables globales ne sont d&#xE9;truites que lorsque vous rafra&#xEE;chissez la page, naviguez vers une autre page, fermez l&#x2019;onglet ou votre navigateur. Les variables rattach&#xE9;es au contexte d&#x2019;une fonction sont d&#xE9;truites quand elles tombent en dehors du contexte courant. Cela signifie qu&#x2019;elles sont d&#xE9;truites quand les fonctions sont retir&#xE9;es de la pile d&#x2019;ex&#xE9;cution et qu&#x2019;il n&#x2019;y a plus de r&#xE9;f&#xE9;rences pointant vers elles.</p><h2>Quelques r&#xE8;gles g&#xE9;n&#xE9;rales</h2><p>Pour donner l&#x2019;opportunit&#xE9; au ramasse-miette de lib&#xE9;rer la m&#xE9;moire occup&#xE9;e par vos variables le plus t&#xF4;t possible, ne gardez pas de r&#xE9;f&#xE9;rence &#xE0; vos objets plus longtemps que n&#xE9;cessaire. La plupart du temps, cela se fait automatiquement. Mais voici quelques r&#xE8;gles &#xE0; garder en t&#xEA;te&#xA0;:</p><ol class="spip"><li> Comme dit plus haut, d&#xE9;clarez vos variables dans un contexte appropri&#xE9; plut&#xF4;t que de les d&#xE9;r&#xE9;f&#xE9;rencer manuellement. En d&#x2019;autres termes, au lieu de cr&#xE9;er une r&#xE9;f&#xE9;rence globale que vous devrez d&#xE9;r&#xE9;f&#xE9;rencer plus tard, optez pour une variable locale qui sera d&#xE9;truite lorsque son contexte sera sorti de la pile. Vous aurez alors un code plus propre, et moins de choses &#xE0; g&#xE9;rer.</li><li> Assurez-vous de bien supprimer vos &#xE9;couteurs d&#x2019;&#xE9;v&#xE9;nements des n&#x153;uds <abbr>DOM</abbr> d&#xE8;s lors qu&#x2019;ils deviennent inutiles, en particulier juste avant de retirer les n&#x153;uds du document.</li><li> Si vous cachez localement certaines donn&#xE9;es, assurez-vous de les nettoyer quand elles ne sont plus utiles ou de programmer leur suppression pour &#xE9;viter que de trop grands volumes de donn&#xE9;es ne soient stock&#xE9;es en m&#xE9;moire.</li></ol><h2>Les fonctions</h2><p>Maintenant, int&#xE9;ressons-nous aux fonctions. Comme dit pr&#xE9;c&#xE9;demment, le ramasse-miette fonctionne par r&#xE9;cup&#xE9;ration de pages m&#xE9;moires qui ne sont plus r&#xE9;f&#xE9;renc&#xE9;es par l&#x2019;application. Pour mieux illustrer notre propos, voyons quelques exemples.</p><pre><code>function foo() { var bar = new GrosObjet(); bar.appelQuelconque();
}</code></pre><p>Quand le fil d&#x2019;ex&#xE9;cution sort de la fonction <code>foo</code>, l&#x2019;objet vers lequel pointe <code>bar</code> est automatiquement &#xE9;ligible pour &#xEA;tre lib&#xE9;r&#xE9; de la m&#xE9;moire car il n&#x2019;existe plus aucune r&#xE9;f&#xE9;rence &#xE0; cet objet.</p><p>Comparons cet exemple au code suivant&#xA0;:</p><pre><code>function foo() { var bar = new GrosObjet(); bar.appelQuelconque(); return bar;
} //somewhere else
var b = foo();</code></pre><p>Nous avons maintenant une r&#xE9;f&#xE9;rence &#xE0; l&#x2019;objet qui survit &#xE0; l&#x2019;appel de la fonction <code>foo</code> et qui persistera tant qu&#x2019;aucun autre objet ne sera assign&#xE9; &#xE0; la variable <code>b</code> (ou tant que <code>b</code> sera dans le contexte d&#x2019;ex&#xE9;cution courant).</p><h2>Les <span>closures</span></h2><p>Quand vous trouvez une fonction qui contient la d&#xE9;claration d&#x2019;une autre fonction et retourne une r&#xE9;f&#xE9;rence vers cette fonction, cette derni&#xE8;re aura acc&#xE8;s au contexte de sa fonction parente m&#xEA;me si sa fonction parente est retir&#xE9;e de la pile d&#x2019;ex&#xE9;cution. C&#x2019;est ce qu&#x2019;on appelle une <a href="http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/" class="spip_out"><span>closure</span></a>&#xA0;; c&#x2019;est une expression qui a acc&#xE8;s aux variables situ&#xE9;es dans un contexte particulier. Par exemple&#xA0;:</p><pre><code>function somme(x) { function faitLaSomme(y) { return x + y; }; return faitLaSomme;
} // Usage
var sommeA = somme(4);
var sommeB = sommeA(3);
console.log(sommeB); // Renvoie 7</code></pre><p>L&#x2019;objet de type <code>function</code> cr&#xE9;&#xE9; lors de l&#x2019;appel &#xE0; <code>somme()</code> ne peut &#xEA;tre d&#xE9;truit puisqu&#x2019;il est toujours r&#xE9;f&#xE9;renc&#xE9; au sein du contexte global. Il est donc toujours r&#xE9;f&#xE9;renc&#xE9; et reste tout ce qu&#x2019;il y a de plus accessible via <code>sommeA(n)</code>.</p><p>Int&#xE9;ressons-nous &#xE0; un autre exemple. Pouvons-nous acc&#xE9;der &#xE0; <code>longueChaine</code>&#xA0;?</p><pre><code>var a = function () { var longueChaine = new Array(1000000).join(&apos;x&apos;); return function () { return longueChaine; };
}();</code></pre><p>Oui, bien s&#xFB;r, via <code>a()</code>, donc elle n&#x2019;a pas &#xE9;t&#xE9; d&#xE9;truite. Et dans l&#x2019;exemple suivant&#xA0;?</p><pre><code>var a = function () { var petiteChaine = &apos;x&apos;; var longueChaine = new Array(1000000).join(&apos;x&apos;); return function (n) { return petiteChaine; };
}();</code></pre><p>On ne peut plus y acc&#xE9;der et elle est &#xE9;ligible pour &#xEA;tre d&#xE9;truite par le ramasse-miette.</p><h2>Les <span>timers</span></h2><p>On trouve beaucoup de fuites de m&#xE9;moires dans les boucles, mais <code>setTimeout()</code>/<code>setInterval()</code> ne sont pas mal non plus pour &#xE7;a.</p><p>Consid&#xE9;rons l&#x2019;exemple suivant&#xA0;:</p><pre><code>var monObjet = { callMeMaybe: function () { var maReference = this; var val = setTimeout(function () { console.log(&apos;Tu perds ton temps!&apos;); maReference.callMeMaybe(); }, 1000); }
};</code></pre><p>Si nous appelons <code>monObjet.callMeMaybe();</code> pour mettre en route le <span>timer</span>, nous pourrons voir toutes les secondes dans la console le message suivant&#xA0;: &#xAB;&#xA0;Tu perds ton temps&#xA0;!&#xA0;&#xBB; Si nous tentons&#xA0;:</p><p><code>monObjet = null;</code></p><p>Le <span>timer</span> sera toujours actif. monObjet ne sera pas d&#xE9;truit puisque la <span>closure</span> transmise &#xE0; <code>setTimeout</code> doit &#xEA;tre conserv&#xE9;e pour rester accessible. Par effet d&#x2019;entra&#xEE;nement, monObjet est conserv&#xE9; puisqu&#x2019;il encapsule <code>maReference</code>. Il en irait de m&#xEA;me si nous avions pass&#xE9; cette <span>closure</span> &#xE0; n&#x2019;importe quelle autre fonction conservant une r&#xE9;f&#xE9;rence &#xE0; cet objet.</p><p>C&#x2019;est &#xE9;galement important de garder &#xE0; l&#x2019;esprit que les r&#xE9;f&#xE9;rences &#xE0; l&#x2019;int&#xE9;rieur des appels &#xE0; <code>setTimeout</code>/<code>setInterval</code>, comme pour les fonctions, ne pourront &#xEA;tre d&#xE9;truites qu&#x2019;apr&#xE8;s la compl&#xE8;te ex&#xE9;cution de ces derni&#xE8;res.</p><h2>Soyez &#xE0; l&#x2019;&#xE9;coute des probl&#xE8;mes de performance</h2><p>On ne le r&#xE9;p&#xE9;tera jamais assez&#xA0;: n&#x2019;optimisez votre code que lorsque vous constatez des probl&#xE8;mes de performance. On trouve des tas de micro-benchmarks d&#xE9;montrant que &#xAB;&#xA0;N&#xA0;&#xBB; est plus rapide que &#xAB;&#xA0;M&#xA0;&#xBB; dans V8, mais confront&#xE9; &#xE0; la r&#xE9;alit&#xE9; d&#x2019;un vrai module de code ou d&#x2019;une application concr&#xE8;te, l&#x2019;impact de ces optimisations pourrait &#xEA;tre bien moins important que ce que vous pensiez obtenir.</p><dl class="spip_document_404 spip_documents spip_documents_center"><dt><img src="https://lh3.googleusercontent.com/LHIP7xx4hrh8IRBWsxrsB62SMjtJVEBn-n7jrarXfYklh4Dom5KK1q4i6OQ77mS9GCuxgs0mvq0wPjTUQ0sQ9uwCg0UkvtEECV9JfUhrav6FaM4im8pl" alt="JPEG - 58.2&#xA0;ko"></dt></dl><p>En faire trop peut &#xEA;tre aussi probl&#xE9;matique que de ne rien faire du tout. Cr&#xE9;dits image&#xA0;: <a href="https://www.flickr.com/photos/tim_uk/7717078488/" class="spip_out">Tim Sheerman-Chase</a></p><p>Imaginons que nous voulions cr&#xE9;er un module qui&#xA0;:</p><ol class="spip"><li> utilise une source de donn&#xE9;e locale contenant des &#xE9;l&#xE9;ments avec un identifiant num&#xE9;rique,</li><li> affiche un tableau contenant ces donn&#xE9;es,</li><li> assigne des gestionnaires d&#x2019;&#xE9;v&#xE9;nements qui commutent une classe quand un utilisateur clique sur une cellule.</li></ol><p>Il y a plusieurs chose &#xE0; prendre en compte dans ce probl&#xE8;me, bien qu&#x2019;il soit tr&#xE8;s simple &#xE0; r&#xE9;soudre. Comment stockerons-nous les donn&#xE9;es&#xA0;? Comment g&#xE9;n&#xE9;rer[e] le tableau de mani&#xE8;re efficiente et l&#x2019;ins&#xE9;rer dans le <abbr>DOM</abbr>&#xA0;? Comment pouvons-nous capturer les &#xE9;v&#xE9;nements &#xE9;mis par le tableau de mani&#xE8;re optimale&#xA0;?</p><p>Une premi&#xE8;re m&#xE9;thode (na&#xEF;ve) serait de stocker chaque silo de donn&#xE9;es disponible dans des objets que nous regrouperions dans un tableau associatif. On pourrait utiliser jQuery pour parcourir ce tableau de donn&#xE9;es, g&#xE9;n&#xE9;rer le tableau et ensuite, l&#x2019;ins&#xE9;rer dans le <abbr>DOM</abbr>. Enfin, on pourrait utiliser les &#xE9;couteurs d&#x2019;&#xE9;v&#xE9;nements pour programmer le comportement d&#xE9;sir&#xE9; au clic sur une cellule.</p><p><strong>Ne faites SURTOUT PAS comme &#xE7;a&#xA0;!</strong></p><pre><code>var moduleA = function () { return { data: dataArrayObject, init: function () { this.addTable(); this.addEvents(); }, addTable: function () { for (var i = 0; i &lt; rows; i++) { $tr = $(&apos;&lt;tr&gt;&lt;/tr&gt;&apos;); for (var j = 0; j &lt; this.data.length; j++) { $tr.append(&apos;&lt;td&gt;&apos; + this.data[j][&apos;id&apos;] + &apos;&lt;/td&gt;&apos;); } $tr.appendTo($tbody); } }, addEvents: function () { $(&apos;table td&apos;).on(&apos;click&apos;, function () { $(this).toggleClass(&apos;active&apos;); }); } };
}();</code></pre><p>C&#x2019;est basique, mais &#xE7;a fait ce qui a &#xE9;t&#xE9; demand&#xE9;.</p><p>Dans ce cas, cependant, nous ne faisons qu&#x2019;utiliser la propri&#xE9;t&#xE9; ID de type num&#xE9;rique qui aurait &#xE9;t&#xE9; plus avantageusement stock&#xE9;e dans un simple tableau. Point int&#xE9;ressant, utiliser <code>documentFragment</code> et les m&#xE9;thodes natives du <abbr>DOM</abbr> est plus optimal que d&#x2019;utiliser jQuery de cette mani&#xE8;re pour g&#xE9;n&#xE9;rer notre tableau. Enfin, bien s&#xFB;r, &#xE9;couter les &#xE9;v&#xE9;nements au niveau du tableau aurait &#xE9;t&#xE9; plus performant que d&#x2019;&#xE9;couter les clics sur chaque cellule.</p><p>Notez que jQuery fait appel &#xE0; <code>DocumentFragment</code> en interne, mais dans notre exemple le code appelle la fonction <code>append()</code> &#xE0; chaque it&#xE9;ration de la boucle, cloisonnement qui emp&#xEA;che une bonne optimisation. Cela ne devrait pas &#xEA;tre si catastrophique mais n&#x2019;oubliez pas de passer votre code au banc d&#x2019;essai pour vous en assurer.</p><p>Dans notre cas, proc&#xE9;der &#xE0; ces am&#xE9;liorations engendrera de bons gains en performance comme nous pouvons nous y attendre. &#xC9;couter les &#xE9;v&#xE9;nements au niveau du tableau[g] apporte une am&#xE9;lioration int&#xE9;ressante, quant &#xE0; l&#x2019;<a href="http://jsperf.com/first-pass" class="spip_out">utilisation de <code>DocumentFragment</code></a>, elle dope v&#xE9;ritablement les performances.</p><pre><code>var moduleD = function () { return { data: dataArray, init: function () { this.addTable(); this.addEvents(); }, addTable: function () { var td, tr; var frag = document.createDocumentFragment(); var frag2 = document.createDocumentFragment(); for (var i = 0; i &lt; rows; i++) { tr = document.createElement(&apos;tr&apos;); for (var j = 0; j &lt; this.data.length; j++) { td = document.createElement(&apos;td&apos;); td.appendChild(document.createTextNode(this.data[j])); frag2.appendChild(td); } tr.appendChild(frag2); frag.appendChild(tr); } tbody.appendChild(frag); }, addEvents: function () { $(&apos;table&apos;).on(&apos;click&apos;, &apos;td&apos;, function () { $(this).toggleClass(&apos;active&apos;); }); } };
}();</code></pre><p>Nous pourrions &#xE9;galement tenter d&#x2019;autres approches pour am&#xE9;liorer les performances. Vous avez probablement lu quelque part qu&#x2019;utiliser le prototypage est plus optimal que de cr&#xE9;er un module (et nous l&#x2019;avons confirm&#xE9; au d&#xE9;but de cet article), ou entendu que les moteurs de gabarits (<span>templates</span>) JavaScript sont tr&#xE8;s performants. Ils le sont parfois, mais utilisez-les pour clarifier votre code et pr&#xE9;compilez vos gabarits. Testons et voyons si ces pratiques sont aussi int&#xE9;ressantes que &#xE7;a.</p><pre><code>var moduleG = function () {}; moduleG.prototype.data = dataArray;
moduleG.prototype.init = function () { this.addTable(); this.addEvents();
};
moduleG.prototype.addTable = function () { var template = _.template($(&apos;#template&apos;).text()); var html = template({&apos;data&apos; : this.data}); $tbody.append(html);
};
moduleG.prototype.addEvents = function () { $(&apos;table&apos;).on(&apos;click&apos;, &apos;td&apos;, function () { $(this).toggleClass(&apos;active&apos;); });
}; var modG = new moduleG();</code></pre><p>Comme on pouvait s&#x2019;y attendre, les b&#xE9;n&#xE9;fices en terme de performance sont n&#xE9;gligeables ici. Les <a href="http://jsperf.com/second-pass" class="spip_out">moteurs de <span>template</span> et le prototypage</a> ne nous apportent rien de plus que ce que nous avions auparavant. Cela dit, ce n&#x2019;est pas vraiment pour les performances que les d&#xE9;veloppeurs modernes utilisent ces outils. C&#x2019;est plut&#xF4;t la clart&#xE9;, le mod&#xE8;le d&#x2019;h&#xE9;ritage et la maintenabilit&#xE9; du code qui les motive.</p><p>Certains probl&#xE8;mes plus complexes concernent <a href="http://jsperf.com/canvas-drawimage-vs-webgl-drawarrays/6" class="spip_out">l&#x2019;efficience du dessin avec canvas</a> et <a href="http://jsperf.com/canvas-pixel-manipulation/30" class="spip_out">la manipulation de pixels</a> avec ou sans <a href="http://jsperf.com/typed-arrays-for-pixel-manipulation" class="spip_out">tableaux typ&#xE9;s</a>.</p><p>Jetez toujours un &#x153;il critique aux micro-benchmarks avant d&#x2019;appliquer leurs conclusions &#xE0; vos applications. Certains d&#x2019;entre vous pourraient se souvenir de l&#x2019;article <a href="http://jsperf.com/dom-vs-innerhtml-based-templating/473" class="spip_out"><span>Javascript templating shoot-off</span></a> et <a href="http://jsperf.com/javascript-templating-shootoff-extended/26" class="spip_out">la pol&#xE9;mique qui s&#x2019;en est suivie</a>. Vous devez vous assurer que les r&#xE9;sultats de vos tests ne sont pas influenc&#xE9;s par des contraintes inexistantes dans une application concr&#xE8;te. Testez &#xE9;galement ces optimisations dans leur contexte final.</p><h2>Quelques astuces d&#x2019;optimisation pour V8</h2><p>Lister toutes les optimisations r&#xE9;alisables pour V8 s&#x2019;&#xE9;loignerait du sujet de cet article, mais voici cependant quelques astuces qui m&#xE9;ritent d&#x2019;&#xEA;tre cit&#xE9;es. En les gardant &#xE0; l&#x2019;esprit vous serez en mesure de limiter l&#x2019;&#xE9;criture de code non-performant.</p><ol class="spip"><li> Certaines pratiques telles que l&#x2019;utilisation de <code>try...catch</code> emp&#xEA;chent V8 de se lancer dans la moindre optimisation. Pour plus d&#x2019;information sur les fonctions qui peuvent &#xEA;tre optimis&#xE9;es et celles qui ne le peuvent pas, utilisez d8, un petit utilitaire en ligne de commande fourni avec V8, et l&#x2019;option <code>--trace-opt file.js</code>.</li><li> Si la vitesse d&#x2019;ex&#xE9;cution vous importe, essayez de garder vos fonctions monomorphes&#xA0;; assurez-vous que les variables (tableaux, objets, param&#xE8;tres de fonction) ne contiennent que des &#xE9;l&#xE9;ments du m&#xEA;me type. Par exemple, &#xE9;vitez ce genre de code (NdT&#xA0;: en clair, faites comme si JavaScript &#xE9;tait un langage typ&#xE9;)&#xA0;:</li></ol><pre><code>function ajoute(x, y) { return x+y;
} ajoute(1, 2); ajoute(&apos;a&apos;,&apos;b&apos;); ajoute(mon_objet, undefined);</code></pre><ol class="spip"><li> Ne r&#xE9;utilisez pas des &#xE9;l&#xE9;ments d&#xE9;sinitialis&#xE9;s ou supprim&#xE9;s. Le r&#xE9;sultat sera identique, mais votre code sera bien plus lent.</li><li> N&#x2019;&#xE9;crivez pas de fonctions gigantesques car elles sont plus difficiles &#xE0; optimiser.</li></ol><p>Pour plus de trucs et astuces, je vous recommande de visualiser la vid&#xE9;o <a href="http://www.youtube.com/watch?v=UJPdhx5zTaw" class="spip_out"><span>Breaking the Javascript speed limit with V8</span></a> de <span>Daniel Clifford</span> au Google <abbr>IO</abbr>. Je vous recommande &#xE9;galement <a href="http://floitsch.blogspot.co.uk/2012/03/optimizing-for-v8-introduction.html" class="spip_out"><span>Optimizing For V8 - A Series</span></a> dans la foul&#xE9;e.</p><h2>Objets vs Tableaux&#xA0;: que dois-je utiliser&#xA0;?</h2><ol class="spip"><li> Si vous souhaitez stocker un paquet de nombres ou une liste d&#x2019;objets de m&#xEA;me nature, utilisez les tableaux.</li><li> Si ce dont vous avez besoin s&#xE9;mantiquement est un objet avec un lot de propri&#xE9;t&#xE9;s (de types diff&#xE9;rents), utilisez un objet avec des propri&#xE9;t&#xE9;s. C&#x2019;est tr&#xE8;s efficient en terme de m&#xE9;moire et assez rapide d&#x2019;acc&#xE8;s.</li><li> Qu&#x2019;elles soient stock&#xE9;es dans des objets ou des tableaux, les cl&#xE9;s num&#xE9;riques sont plus rapides d&#x2019;acc&#xE8;s lors de vos it&#xE9;rations que les propri&#xE9;t&#xE9;s des objets.</li><li> Les propri&#xE9;t&#xE9;s des objets sont tr&#xE8;s complexes&#xA0;: elle peuvent &#xEA;tre cr&#xE9;es avec des accesseurs (getters/setters) et utiliser diff&#xE9;rents type d&#x2019;&#xE9;num&#xE9;rabilit&#xE9; et d&#x2019;acc&#xE8;s en &#xE9;criture. Les &#xE9;l&#xE9;ments d&#x2019;un tableau sont au contraire peu personnalisables&#xA0;; ils existent ou pas, point final. Au niveau du moteur JavaScript, cela permet plus d&#x2019;optimisations en terme d&#x2019;organisation de la m&#xE9;moire pour repr&#xE9;senter sa structure. C&#x2019;est d&#x2019;autant plus b&#xE9;n&#xE9;fique quand ces tableaux contiennent des nombres. Par exemple, si vous avez besoin de stocker des vecteurs, ne d&#xE9;finissez pas une classe avec des propri&#xE9;t&#xE9;s <code>x</code>, <code>y</code> et <code>z</code>&#xA0;; utilisez plut&#xF4;t un tableau.</li></ol><p>Il existe une diff&#xE9;rence majeure entre les objets et les tableaux en JavaScript, c&#x2019;est la propri&#xE9;t&#xE9; magique <code>length</code>. Si vous g&#xE9;rez cette propri&#xE9;t&#xE9; vous-m&#xEA;me, vos objets seront tout aussi rapides que des tableaux dans V8.</p><h2>Quelques astuces pour l&#x2019;utilisation des objets</h2><ol class="spip"><li> Cr&#xE9;ez vos objets via leur fonction constructeur. Cela permet d&#x2019;assigner &#xE0; chaque objet la m&#xEA;me classe cach&#xE9;e et &#xE9;vite de changer cette derni&#xE8;re par la suite. Un autre point qui plaide pour cela est que c&#x2019;est l&#xE9;g&#xE8;rement plus rapide que son homologue <code>Object.create()</code>.</li><li> Il n&#x2019;y a aucune restriction sur le nombre de types d&#x2019;objets diff&#xE9;rents au sein d&#x2019;une application ou sur leur complexit&#xE9; (tout en restant raisonnable&#xA0;: les longues cha&#xEE;nes de prototype tendent &#xE0; ralentir l&#x2019;application, et les objets avec un nombre limit&#xE9; de propri&#xE9;t&#xE9; b&#xE9;n&#xE9;ficient d&#x2019;une repr&#xE9;sentation sp&#xE9;ciale leur conf&#xE9;rant une rapidit&#xE9; accrue). Pour les objets &#xAB;&#xA0;chauds&#xA0;&#xBB;, essayez de garder une cha&#xEE;ne de prototypes courte et peu de propri&#xE9;t&#xE9;s.</li></ol><h2>Clonage d&#x2019;objets</h2><p>Le clonage d&#x2019;objets est un probl&#xE8;me que rencontrent tous les d&#xE9;veloppeurs d&#x2019;applications. Bien qu&#x2019;il soit possible de tester ses diff&#xE9;rentes impl&#xE9;mentations pour observer comment elles se comportent avec le moteur V8, soyez prudents quand vous copiez quoi que ce soit. Copier des gros lots de donn&#xE9;es est g&#xE9;n&#xE9;ralement lent, ne le faites pas. Les boucles <code>for...in</code> sont particuli&#xE8;rement inadapt&#xE9;es pour cela car elles ont une sp&#xE9;cification d&#xE9;moniaque et ne seront jamais rapides pour des objets arbitraires, quel que soit le moteur JavaScript.</p><p>Si vous avez absolument besoin de copier des objets dans une partie critique de votre code en terme de performance (et que vous ne pouvez pas contourner le probl&#xE8;me), utilisez un tableau ou un &#x201C;constructeur de copie&#x201D; personnalis&#xE9; qui copie chaque propri&#xE9;t&#xE9; individuellement. C&#x2019;est probablement la mani&#xE8;re la plus rapide de le faire.</p><pre><code>function clone(original) { this.foo = original.foo; this.bar = original.bar;
}
var copie = new clone(original);</code></pre><h2>Les fonctions en cache gr&#xE2;ce aux modules</h2><p>Mettre vos fonctions en cache gr&#xE2;ce au patron de conception &#xAB;&#xA0;module&#xA0;&#xBB; peut am&#xE9;liorer les performances. Regardez l&#x2019;exemple ci-dessous, vous constaterez que l&#x2019;une ou l&#x2019;autre m&#xE9;thodes que vous avez l&#x2019;habitude de voir est plus lente car elle oblige &#xE0; copier les fonctions membres sans arr&#xEA;t.</p><p>Vous noterez &#xE9;galement que cette approche peut se r&#xE9;v&#xE9;ler significativement meilleure que de s&#x2019;appuyer sur la technique du prototype (et <a href="http://jsperf.com/prototypal-performance/12" class="spip_out">un test jsPerf le confirme</a>).</p><dl class="spip_document_406 spip_documents spip_documents_center"><dt><a href="https://lh3.googleusercontent.com/7CLlAgAFc-agiZoak-1a3vE50u8Cf2r2eIXPiSJoWORMTcvabAo7mcyoAVRk9TwcQDnr3x7ggPSMI2UMFVHaCCQJm2O5opwq63vmAWHTH_kxM0iJmGMF"><img src="http://www.pompage.net/traduction/local/cache-vignettes/L150xH110/7CLlAgAFc-ag8952-3457a.png" alt="PNG - 40&#xA0;ko"></a></dt></dl><p><i>Mesure des gains de performance des techniques modules et prototypes.</i></p><p>Voici un test comparatif entre les patrons de conception module et prototype.</p><pre><code> // Technique &quot;Prototype&quot; Klass1 = function () {} Klass1.prototype.foo = function () { log(&apos;foo&apos;); } Klass1.prototype.bar = function () { log(&apos;bar&apos;); } // Technique &quot;Module&quot; Klass2 = function () { var foo = function () { log(&apos;foo&apos;); }, bar = function () { log(&apos;bar&apos;); }; return { foo: foo, bar: bar } } // Technique &quot;Module avec fonctions mises en cache&quot; var FooFunction = function () { log(&apos;foo&apos;); }; var BarFunction = function () { log(&apos;bar&apos;); }; Klass3 = function () { return { foo: FooFunction, bar: BarFunction } } // Tests comparatifs // Prototype var i = 1000, objs = []; while (i--) { var o = new Klass1() objs.push(new Klass1()); o.bar; o.foo; } // Module simple var i = 1000, objs = []; while (i--) { var o = Klass2() objs.push(Klass2()); o.bar; o.foo; } // Module avec fonctions mises en cache var i = 1000, objs = []; while (i--) { var o = Klass3() objs.push(Klass3()); o.bar; o.foo; }
// Le reste du code est sur jsPerf</code></pre><h2>Quelques astuces pour l&#x2019;utilisation des tableaux</h2><p>Maintenant, jetons un &#x153;il aux tableaux. En r&#xE8;gle g&#xE9;n&#xE9;rale, ne supprimez pas d&#x2019;&#xE9;l&#xE9;ments dans les tableaux. Cela oblige le moteur &#xE0; basculer vers une repr&#xE9;sentation interne plus lente. Quand les cl&#xE9;s d&#x2019;un tableau deviennent &#xE9;parpill&#xE9;es, le moteur est susceptible de le transformer en tableau associatif, qui est encore plus lent.</p><h2>Repr&#xE9;sentation litt&#xE9;rale des tableaux</h2><p>L&#x2019;initialisation litt&#xE9;rale d&#x2019;un tableau est pr&#xE9;f&#xE9;rable puisque cela donne un aper&#xE7;u &#xE0; la machine virtuelle de ce que vous souhaitez y stocker (taille, type de valeurs). Ils sont typiquement souhaitables pour des tableaux de taille petite &#xE0; moyenne.</p><pre><code>// Ici, le moteur JS voit que vous souhaitez un tableau contenant 4 nombres
var a = [1, 2, 3, 4]; // Ne faites pas &#xE7;a :
a = []; // Ici, le moteur n&apos;a aucune id&#xE9;e de ce qui ira dans le tableau
for(var i = 1; i &lt;= 4; i++) { a.push(i);
}</code></pre><h2>Stocker un seul type de donn&#xE9;es versus donn&#xE9;es mixtes</h2><p>Il n&#x2019;est jamais bon de m&#xE9;langer diff&#xE9;rents types de valeurs dans un m&#xEA;me tableau (des nombres, cha&#xEE;nes, objets, bool&#xE9;ens ou undefined, comme par exemple&#xA0;: <code>var arr = [1, &#x201C;1&#x201D;, undefined, true, &#x201C;true&#x201D;]</code>).</p><p><a href="http://jsperf.com/type-inference-performance/2" class="spip_out">Test de performance de l&#x2019;inf&#xE9;rence de type</a></p><p>Comme vous pouvez le constater, le meilleur r&#xE9;sultat est obtenu par le tableau d&#x2019;entiers.</p><h2>Tableaux &#xE0; cl&#xE9;s cons&#xE9;cutives ou non</h2><p>Quand vous utilisez des tableaux aux cl&#xE9;s non cons&#xE9;cutives, soyez bien conscients qu&#x2019;acc&#xE9;der &#xE0; leurs &#xE9;l&#xE9;ments est bien plus lent que si les cl&#xE9;s se suivaient dans leur ordre naturel. La raison est que s&#x2019;il manque trop d&#x2019;&#xE9;l&#xE9;ments le moteur V8 choisira de ne pas leur allouer d&#x2019;espace m&#xE9;moire. &#xC0; la place, il pr&#xE9;f&#xE9;rera les g&#xE9;rer au sein d&#x2019;un tableau associatif, ce qui est bien plus lent en terme de temps d&#x2019;acc&#xE8;s.</p><p><a href="http://jsperf.com/sparse-arrays-vs-full-arrays" class="spip_out">Test comparatifs entre tableaux &#xE0; cl&#xE9;s &#xE9;parses et cl&#xE9; cons&#xE9;cutives</a></p><p>Ce test montre que la somme des &#xE9;l&#xE9;ments d&#x2019;un tableau aux cl&#xE9;s cons&#xE9;cutives est plus rapide. Le fait qu&#x2019;il contienne ou non des z&#xE9;ros ne fait aucune diff&#xE9;rence.</p><h2>Tableaux &#xAB;&#xA0;trou&#xE9;s&#xA0;&#xBB; contre tableaux &#xAB;&#xA0;pleins&#xA0;&#xBB;</h2><p>&#xC9;vitez de trouer vos tableaux (en supprimant des &#xE9;l&#xE9;ments ou en faisant <code>a[x] = foo</code> (dans le cas o&#xF9; <code>x &gt; a.length</code>). Il suffit qu&#x2019;un seul &#xE9;l&#xE9;ment manque dans un tableau pour ralentir le code.</p><p><a href="http://jsperf.com/packed-vs-holey-arrays" class="spip_out">Test entre tableaux &#xAB;&#xA0;trou&#xE9;s&#xA0;&#xBB; et tableaux &#xAB;&#xA0;pleins&#xA0;&#xBB;</a></p><h2>Allouer l&#x2019;espace du tableau &#xE0; l&#x2019;initialisation ou &#xE0; la vol&#xE9;e</h2><p>Ne pr&#xE9;-allouez pas les tableaux dont la taille exc&#xE9;derait 64 000 &#xE9;l&#xE9;ments. Faites-les plut&#xF4;t grossir &#xE0; la vol&#xE9;e. Avant d&#x2019;interpr&#xE9;ter les tests sur ce point, rappelez-vous bien que leurs r&#xE9;sultats sont fortement d&#xE9;pendants du moteur JavaScript test&#xE9;.</p><dl class="spip_document_407 spip_documents spip_documents_center"><dt><a href="https://lh4.googleusercontent.com/2C8fjpV7SYj_EBBTnJEMBaEC9c3BdL0fBiryH6eAxW-P0zvtktOp0jM3wawH6qnPe2MDSLDqElPeDS3OvMfJBn2rRQ98J7GBKtD2wCGtNXXrpbt5bwgQ"><img src="http://www.pompage.net/traduction/local/cache-vignettes/L150xH97/2C8fjpV7SYj_0a9e-2d412.jpg" alt="JPEG - 30.5&#xA0;ko"></a></dt></dl><p><i>Test des tableaux initialement vides par rapport aux tableaux pr&#xE9;-allou&#xE9;s.</i></p><p>Nitro (Safari) traite les tableaux pr&#xE9;-allou&#xE9;s plus favorablement. Cependant, c&#x2019;est le contraire pour les autres moteurs (V8 et <span>Spider Monkey</span>) pour lesquels allouer l&#x2019;espace &#xE0; la vol&#xE9;e est plus efficace.</p><p><a href="http://jsperf.com/pre-allocated-arrays" class="spip_out">Tester les tableaux pr&#xE9;-allou&#xE9;s</a></p><pre><code>// Tableau vide
var arr = [];
for (var i = 0; i &lt; 1000000; i++) { arr[i] = i;
} // Tableau pr&#xE9;-dimensionn&#xE9;
var arr = new Array(1000000);
for (var i = 0; i &lt; 1000000; i++) { arr[i] = i;
}</code></pre><h2>Optimiser vos applications</h2><p>Dans le monde des applications Web, la performance est primordiale. Aucun utilisateur ne souhaite qu&#x2019;un tableur prenne plusieurs secondes pour faire la somme des cellules d&#x2019;une colonne, ou attendre plusieurs minutes que s&#x2019;affiche le r&#xE9;sum&#xE9; de leurs messages. C&#x2019;est pourquoi rendre votre code aussi v&#xE9;loce que possible est parfois critique.</p><dl class="spip_document_408 spip_documents spip_documents_center"><dt><img src="https://lh6.googleusercontent.com/_O7Nq1qZ17dAYP5oZiQmWY5mCq8Euu_2eA8aK5er_I7PTC0QwvPJIg3tKteiY2vVmz1gX66FSV5xff-Ps2DWqGNBxHwLlk-vWuKSH2ISFZpcT5v4HvpW" alt="JPEG - 146.7&#xA0;ko"></dt></dl><p><i>Cr&#xE9;dits de l&#x2019;image&#xA0;: <a href="http://www.flickr.com/photos/perolofforsberg/6691744587/" class="spip_out">Per Olof Forsberg</a></i></p><p>Bien qu&#x2019;il soit utile de comprendre et d&#x2019;am&#xE9;liorer les performances de vos applications, cela peut &#xEA;tre difficile. Nous recommandons la d&#xE9;marche suivante pour venir &#xE0; bout des points qui vous ralentissent&#xA0;:</p><ol class="spip"><li> Mesurer&#xA0;: rep&#xE9;rer les points les plus lents de votre application (&#xA0;45%)</li><li> Comprendre&#xA0;: trouver ce qui provoque cette lenteur (&#xA0;45%)</li><li> Corriger&#xA0;! (&#xA0;10%)</li></ol><p>Quelques-uns des outils suivants peuvent vous aider dans cette t&#xE2;che.</p><h2>Mesurer la performance</h2><p>Il existe de nombreuses fa&#xE7;ons de tester les performances de vos bouts de code en JavaScript mais en r&#xE8;gle g&#xE9;n&#xE9;rale on effectue une comparaison entre deux chronom&#xE9;trages. L&#x2019;&#xE9;quipe de <a href="http://jsperf.com/" class="spip_out">jsPerf</a> a propos&#xE9; un mod&#xE8;le qui a &#xE9;t&#xE9; ensuite repris par les suites de tests que sont <a href="http://www.webkit.org/perf/sunspider/sunspider.html" class="spip_out">SunSpider</a> et <a href="http://krakenbenchmark.mozilla.org/" class="spip_out">Kraken</a>.</p><pre><code>var tempsTotal, depart = new Date, iterations = 1000;
while (iterations--) { // Placer ici le code a tester
}
// tempsTotal &#x2192; Nombre de millisecondes necessaires // pour executer les instructions 1000 fois
tempsTotal = new Date - depart;</code></pre><p>Dans cet exemple le code &#xE0; tester est plac&#xE9; dans une boucle et ex&#xE9;cut&#xE9; un nombre d&#xE9;termin&#xE9; de fois. Une fois termin&#xE9;, la date de d&#xE9;but d&#x2019;ex&#xE9;cution est soustraite &#xE0; la date de fin d&#xE9;terminant le temps &#xE9;coul&#xE9; durant le test.</p><p>N&#xE9;anmoins cette fa&#xE7;on de faire des tests est tr&#xE8;s r&#xE9;ductrice, surtout si vous voulez mesurer dans diff&#xE9;rents navigateurs et environnements. Le ramasse-miette lui-m&#xEA;me peut avoir des effets sur vos r&#xE9;sultats. M&#xEA;me en affinant la mesure en utilisant <code>window.performance</code>, vous pouvez &#xEA;tre s&#xFB;rs que des impond&#xE9;rables viendront fausser les mesures.</p><p>Que vous &#xE9;criviez simplement des tests sur des parties de votre code, des suites de tests ou une librairie compl&#xE8;te, il y a bien plus de facteurs &#xE0; prendre en compte que vous ne pouvez l&#x2019;imaginer. Pour un guide plus complet sur les tests de performance, je vous recommande fortement de lire <a href="http://mathiasbynens.be/notes/javascript-benchmarking" class="spip_out"><span>Javascript Benchmarking</span></a> de Mathias Bynens et John-David Dalton.</p><h2>Le profilage</h2><p>Les outils pour d&#xE9;veloppeur de Chrome permettent de <a href="https://developers.google.com/chrome-developer-tools/docs/profiles" class="spip_out">profiler ais&#xE9;ment vos applications</a>. Vous pouvez utiliser cette fonctionnalit&#xE9; pour identifier les fonctions les plus chronophages pour les optimiser en priorit&#xE9;. Cette d&#xE9;marche est importante car la moindre petite modification de votre code peut avoir des cons&#xE9;quences importantes en termes de performance.</p><dl class="spip_document_409 spip_documents spip_documents_center"><dt><img src="https://lh5.googleusercontent.com/VV_Q0smFYBKpTq3ldSFppG-p4Uic1bpF2xzO_hAfvqjthTVUej6u3HyjVpoqSDdkC-7ii_njsI70HO35mxZc-IUoyIE103nAEG25UBIzCUPYUtu0xThh" alt="JPEG - 40.8&#xA0;ko"></dt></dl><p><i>L&#x2019;onglet &#x201C;profilage&#x201D; des outils pour d&#xE9;veloppeur de Chrome.</i></p><p>Pour commencer le profilage, il faut obtenir une mesure de base des performances actuelles de votre application. Cette derni&#xE8;re peut &#xEA;tre obtenue gr&#xE2;ce &#xE0; l&#x2019;onglet &#x201C;<span>timeline</span>&#x201D; (frise chronologique). Cela nous permettra de mesurer le temps effectif d&#x2019;ex&#xE9;cution de notre application.</p><p>L&#x2019;onglet &#x201C;<span>profiles</span>&#x201D; nous donnera lui une vue plus d&#xE9;taill&#xE9;e de ce qui se passe vraiment dans notre application. Le profilage processeur (<span>JavaScript <abbr>CPU</abbr> profile</span>) nous permet de savoir combien de temps processeur est utilis&#xE9; par notre application, le profilage des s&#xE9;lecteurs <abbr>CSS</abbr> (<span><abbr>CSS</abbr> selector profile</span>) nous renseigne sur le temps n&#xE9;cessaire pour calculer les s&#xE9;lecteurs <abbr>CSS</abbr>, et les captures de pile de m&#xE9;moire <span>Heap</span> (<span>Heap snapshots</span>) nous permet de savoir combien nos objets consomment de m&#xE9;moire.</p><p>L&#x2019;utilisation de ces outils nous permet d&#x2019;ajuster et de profiler &#xE0; nouveaux notre code afin de v&#xE9;rifier si les changements r&#xE9;alis&#xE9;s ont bien un impact positif sur les performances.</p><dl class="spip_document_411 spip_documents spip_documents_center"><dt><img src="https://lh3.googleusercontent.com/7hD4UAk_zr2Vcu91RuhmsOsiG8NjrKs-GoOlgObXKsdPEH1-Il27aAjEk3AmqmpEPZm2SN05Zi3_xuvTPl1b5HJNebO3bIlzMmrpmW2lMwx6Nhd1drYb" alt="JPEG - 79.7&#xA0;ko"></dt></dl><p>Pour une bonne introduction au profilage dans Chrome, lisez <a href="http://coding.smashingmagazine.com/2012/06/12/javascript-profiling-chrome-developer-tools/" class="spip_out"><span>Javascript Profiling With The Chrome Developper Tools</span></a> par Zack Grossbart.</p><p>Petit truc&#xA0;: dans l&#x2019;id&#xE9;al, il vaut mieux &#xE9;viter que les extensions et applications install&#xE9;es dans Chrome n&#x2019;influent sur vos r&#xE9;sultats. Pour cela, ex&#xE9;cutez Chrome avec l&#x2019;option <code>--user-data-dir &lt;un_r&#xE9;pertoire_vide&gt;</code>. Cela suffit la plupart du temps, mais si vous avez besoin d&#x2019;aller plus loin les options de V8 vous seront d&#x2019;une grande aide.</p><h2>Eviter les fuites m&#xE9;moire&#xA0;: trois techniques pour les d&#xE9;celer</h2><p>Les &#xE9;quipes internes de Google, celle de Gmail par exemple, utilisent &#xE9;norm&#xE9;ment les outils pour d&#xE9;veloppeurs de Chrome pour traquer et &#xE9;liminer les fuites m&#xE9;moires.</p><dl class="spip_document_412 spip_documents spip_documents_center"><dt><img src="https://lh3.googleusercontent.com/KLG0BbASOYyCW-TQImgS-amc76d5b6DLfdlkyP_F-TM8HeMrJ8X2i7ziZnzGdjbXINAM39hc14NYcYHqA2kWHummXvIBlKEcA4Roah2oV4K_6A0i2UDN" alt="JPEG - 39&#xA0;ko"></dt></dl><p><i>Statistiques d&#x2019;utilisation m&#xE9;moire dans les outils pour d&#xE9;veloppeurs.</i></p><p>Les statistiques utilis&#xE9;es par nos &#xE9;quipes sont par exemple&#xA0;: l&#x2019;utilisation m&#xE9;moire priv&#xE9;e, la taille de la pile <span>Heap</span> de JavaScript, le nombre de n&#x153;uds <abbr>DOM</abbr>, l&#x2019;effacement des donn&#xE9;es, le nombre de gestionnaires d&#x2019;&#xE9;v&#xE8;nements et le comportement du ramasse-miette. Les habitu&#xE9;s des architectures dirig&#xE9;es par les &#xE9;v&#xE9;nements seront peut-&#xEA;tre contents d&#x2019;apprendre que la plupart de nos probl&#xE8;mes venaient de l&#x2019;utilisation de <code>listen()</code> non suivi d&#x2019;<code>unlisten()</code> (<span>Closure</span>) et par l&#x2019;absence de <code>dispose()</code> pour les objets cr&#xE9;ant des gestionnaires d&#x2019;&#xE9;v&#xE8;nements.</p><p>Par chance, les outils pour d&#xE9;veloppeurs peuvent nous aider &#xE0; localiser ces probl&#xE8;mes et Loreena Lee a cr&#xE9;&#xE9; une pr&#xE9;sentation fantastique, qui d&#xE9;taille la <a href="https://docs.google.com/presentation/d/1wUVmf78gG-ra5aOxvTfYdiLkdGaR9OhXRnOlIcEmu2s/pub?start=false&amp;loop=false&amp;delayms=3000#slide=id.g1d65bdf6_0_0" class="spip_out">technique des trois captures</a> pour d&#xE9;tecter les fuites m&#xE9;moires, que je ne vous recommenderai jamais assez de lire.</p><p>La base de la technique est d&#x2019;enregistrer un certain nombre d&#x2019;action utilisateur dans votre application, forcer l&#x2019;&#xE9;xecution du ramasse-miette, v&#xE9;rifier si le nombre de noeuds <abbr>DOM</abbr> reste sup&#xE9;rieur &#xE0; la normale puis comparer trois captures successives de la pile <span>Heap</span> pour d&#xE9;tecter s&#x2019;il y a une fuite de m&#xE9;moire.</p><h2>Gestion de la m&#xE9;moire dans les applications sans rechargement de page</h2><p>La gestion de la m&#xE9;moire est tr&#xE8;s importante au sein des applications qui ne sont jamais recharg&#xE9;es (avec AngularJS, Backbone, Ember..). En effet, une fuite de m&#xE9;moire devient rapidement handicapantes. C&#x2019;est un &#xE9;norme pi&#xE8;ge au sein des applications pour appareils mobiles (qui sont limit&#xE9;s en m&#xE9;moire) comme les clients mails ou les applications de r&#xE9;seaux sociaux qui ont une dur&#xE9;e d&#x2019;utilisation tr&#xE8;s importante. Comme on dit&#xA0;: <strong>de grands pouvoirs impliquent de grandes responsabilit&#xE9;s</strong>.</p><p>Il y a plusieurs fa&#xE7;on de se pr&#xE9;munir de cela. Dans <span>Backbone</span>, assurez-vous de toujours d&#xE9;r&#xE9;f&#xE9;rencer vos vues et r&#xE9;f&#xE9;rences en utilisant <code>dispose()</code> (actuellement disponible dans <a href="https://github.com/documentcloud/backbone/blob/master/backbone.js#L1234" class="spip_out">Backbone (edge)</a>).</p><p>Cette fonction, ajout&#xE9;e tout r&#xE9;cemment, supprime tout gestionnaire associ&#xE9; aux &#xE9;v&#xE8;nements de la vue ainsi qu&#x2019;&#xE0; toute collection ou &#xE9;couteur de mod&#xE8;le pour lesquels la vue a &#xE9;t&#xE9; pass&#xE9;e en troisi&#xE8;me argument (en tant que contexte de <code>callback</code>). <code>dispose()</code> est &#xE9;galement appel&#xE9; par la m&#xE9;thode <code>remove()</code> de la vue, et s&#x2019;occupe de nettoyer la majorit&#xE9; de l&#x2019;utilisation m&#xE9;moire lorsque <a href="https://github.com/documentcloud/backbone/blob/master/backbone.js#L1235" class="spip_out">la vue est supprim&#xE9;e de l&#x2019;&#xE9;cran</a>. D&#x2019;autres librairies, comme Ember, <a href="https://github.com/emberjs/ember.js/blob/d8f76a7fdde741ae3d1e07b12df9cb6718170e48/packages/ember-handlebars/lib/helpers/binding.js#L296" class="spip_out">suppriment les observateurs</a> quand ils d&#xE9;tectent que les &#xE9;l&#xE9;ments ont &#xE9;t&#xE9;s supprim&#xE9;s de la vue pour &#xE9;viter les fuites m&#xE9;moires.</p><p>Voici les conseils avis&#xE9;s de Derick Bailey&#xA0;:</p><blockquote class="spip"><p>Plut&#xF4;t que d&#x2019;essayer de comprendre comment fonctionnent les &#xE9;v&#xE8;nements en terme de r&#xE9;f&#xE9;rences, suivez simplement les r&#xE8;gles standard de gestion de la m&#xE9;moire en JavaScript et vous serez tranquilles. Si vous chargez des donn&#xE9;es dans une collection <span>Backbone</span> pleine d&#x2019;objets Utilisateurs et voulez que cette collection soit nettoy&#xE9;e par la suite afin de ne plus utiliser de m&#xE9;moire, vous devez supprimer toute r&#xE9;f&#xE9;rence &#xE0; cette collection et aux objets qu&#x2019;elle contient. Une fois toutes les r&#xE9;f&#xE9;rences supprim&#xE9;es, la m&#xE9;moire sera lib&#xE9;r&#xE9;e. Ce n&#x2019;est rien d&#x2019;autre que le comportement standard du ramasse-miette de JavaScript.</p></blockquote><p>Dans son article, Derick couvre la plupart des <a href="http://lostechies.com/derickbailey/2012/03/19/backbone-js-and-javascript-garbage-collection/" class="spip_out">erreurs communes de gestion de m&#xE9;moire</a> li&#xE9;es &#xE0; l&#x2019;utilisation de <span>Backbone</span> et comment les corriger.</p><p>Il y a &#xE9;galement un <a href="https://github.com/felixge/node-memory-leak-tutorial" class="spip_out">bon tutoriel disponible pour d&#xE9;boguer les fuites m&#xE9;moires</a> dans Node &#xE9;crit par Felix Geisend&#xF6;rfer. Particuli&#xE8;rement int&#xE9;ressant si votre application Node est utilis&#xE9;e dans le contexte d&#x2019;un application sans rechargement de page.</p><h2>Eviter les r&#xE9;agencements</h2><p>Quand un navigateur doit recalculer la position et la forme des &#xE9;l&#xE9;ments d&#x2019;un document afin de les redessiner, il effectue ce qu&#x2019;on appelle un <span>reflow</span> (r&#xE9;agencement). C&#x2019;est une op&#xE9;ration qui bloque l&#x2019;interface utilisateur, il est donc important de savoir comment limiter le temps qu&#x2019;elle dure.</p><dl class="spip_document_413 spip_documents spip_documents_center"><dt><img src="https://lh6.googleusercontent.com/wJllbq8Yl2jsKuxr_JguUmRYQjeMnJ0DziRPC1QKgimdoxba_Jshge3vKvtS98W264ac9Sp9f3kLBvWTv3rzD9rOx9pXHJGSlFP3uuv9-1NeObX9fgFg" alt="JPEG - 45.7&#xA0;ko"></dt></dl><p><i>Graphique montrant une succession de r&#xE9;agencements</i></p><p>Il vaut mieux regrouper les m&#xE9;thodes qui <a href="http://stackoverflow.com/questions/510213/when-does-reflow-happen-in-a-dom-environment" class="spip_out">provoquent des r&#xE9;agencements</a> ou un <span>repaint</span> (changement d&#x2019;apparence d&#x2019;un ou plusieurs &#xE9;l&#xE9;ments, sans changements de dimensions) et les &#xE9;viter autant que possible. Si c&#x2019;est n&#xE9;cessaire, effectuez de pr&#xE9;f&#xE9;rence vos modification en-dehors du <abbr>DOM</abbr>. Utilisez pour cela un <a href="http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-B63ED1A3" class="spip_out"><code>DocumentFragment</code></a> qui fonctionne &#xE0; l&#x2019;identique mais est bien plus l&#xE9;ger. Voyez-le comme une fa&#xE7;on d&#x2019;extraire une portion de l&#x2019;arbre du document ou de cr&#xE9;er un nouveau &#xAB;&#xA0;fragment&#xA0;&#xBB; de document. Plut&#xF4;t que de constamment ajouter des n&#x153;uds au document principal via le <abbr>DOM</abbr>, nous pouvons construire un fragment de document avec ce dont nous avons besoin et l&#x2019;ins&#xE9;rer en une seule fois dans le <abbr>DOM</abbr>, ce qui &#xE9;vite des reflows successifs et inutiles.</p><p>Par exemple, &#xE9;crivons une fonction qui ajoute 20 &#xE9;l&#xE9;ments <code>div</code> &#xE0; un autre. Le faire en ajoutant le nouveau <code>div</code> aussit&#xF4;t qu&#x2019;il est cr&#xE9;&#xE9; risque de d&#xE9;clencher 20 r&#xE9;agencements.</p><pre><code>function ajouteDivs(element) { var div; for (var i = 0; i &lt; 20; i ++) { div = document.createElement(&apos;div&apos;); div.innerHTML = &apos;Coucou!&apos;; element.appendChild(div); }
}</code></pre><p>Pour contourner ce probl&#xE8;me, nous pouvons utiliser un <code>DocumentFragment</code> auquel nous ajouterons chaque <code>div</code>. Quand nous int&#xE8;grerons ce fragment au document principal, tous ses n&#x153;uds enfants seront ajout&#xE9;s en une fois, ce qui ne provoque qu&#x2019;un seul recalcul.</p><pre><code>function ajouteDivs(element) { var div; // Cr&#xE9;e un fragment de document vide var fragment = document.createDocumentFragment(); for (var i = 0; i &lt; 20; i ++) { div = document.createElement(&apos;a&apos;); div.innerHTML = &apos;Coucou!&apos;; fragment.appendChild(div); } element.appendChild(fragment);
}</code></pre><p>Vous pouvez en savoir plus sur ce th&#xE8;me avec les articles <a href="https://developers.google.com/speed/articles/javascript-dom" class="spip_out"><span>Make the Web Faster</span></a>, <a href="http://blog.tojicode.com/2012/03/javascript-memory-optimization-and.html" class="spip_out"><span>JavaScript Memory Optimization</span></a> et <a href="http://gent.ilcore.com/2011/08/finding-memory-leaks.html" class="spip_out"><span>Finding Memory Leaks</span></a>.</p><h2>D&#xE9;tecter les fuites de m&#xE9;moires dans JavaScript</h2><p>Afin d&#x2019;aider &#xE0; la d&#xE9;tection des fuites m&#xE9;moires, deux de mes coll&#xE8;gues Googlers (Marja H&#xF6;ltt&#xE4; et Jochen Eisinger) ont d&#xE9;velopp&#xE9; un outil qui fonctionne avec les outils pour d&#xE9;veloppeurs de Google Chrome (avec le protocole d&#x2019;inspection &#xE0; distance pour &#xEA;tre pr&#xE9;cis). L&#x2019;outil r&#xE9;cup&#xE8;re plusieurs captures de la pile <span>heap</span> pour d&#xE9;tecter les objets provoquant des fuites m&#xE9;moire.</p><dl class="spip_document_414 spip_documents spip_documents_center"><dt><img src="https://lh3.googleusercontent.com/s_4W5xFT7d7BnC6xdjDjcfr5MpNCGve4vdE3aZsoThqNYhD5tVo1-2-Y-fCnl4uzy5-_sXGYOHACc8a6TML0J3IUVt9tXaijISnrUW6CdBZob9GkPkXH" alt="JPEG - 27.5&#xA0;ko"></dt></dl><p><i>Un outil d&#xE9;tectant les fuites m&#xE9;moire dans Javascript</i></p><p>Il existe un billet complet sur la <a href="http://google-opensource.blogspot.de/2012/08/leak-finder-new-tool-for-javascript.html" class="spip_out">fa&#xE7;on d&#x2019;utiliser l&#x2019;outil</a> et je vous encourage &#xE0; le lire ou &#xE0; jeter un &#x153;il sur la <a href="https://code.google.com/p/leak-finder-for-javascript/" class="spip_out">page du projet <span>Leak Finder</span></a>.</p><p>Si vous vous demandez pourquoi un tel outil n&#x2019;est pas directement int&#xE9;gr&#xE9; aux outils pour d&#xE9;veloppeurs, sachez qu&#x2019;il y a deux raisons. La premi&#xE8;re, c&#x2019;est qu&#x2019;&#xE0; l&#x2019;origine l&#x2019;outil a &#xE9;t&#xE9; d&#xE9;velopp&#xE9; pour nous aider &#xE0; capturer des sc&#xE9;narios sp&#xE9;cifiques dans la <span>Closure Library</span>, et la deuxi&#xE8;me c&#x2019;est qu&#x2019;il correspond plus &#xE0; un outil externe (ou peut-&#xEA;tre un jour en tant qu&#x2019;extension, si nous mettons en place une <abbr>API</abbr> de profilage de la pile <span>Heap</span>).</p><h2>Les options de V8 pour d&#xE9;boguer les optimisations et le ramasse-miette</h2><p>Chrome supporte le passage d&#x2019;options directement &#xE0; V8 via l&#x2019;option <code>js-flags</code> pour obtenir plus d&#x2019;informations sur les optimisations effectu&#xE9;es par le moteur. Par exemple, cette commande trace les optimisations de V8&#xA0;:</p><p><code>/Applications/Google Chrome/Google Chrome&quot; --js-flags=&quot;--trace-opt --trace-deopt</code></p><p>Si vous &#xEA;tes sur Windows, ex&#xE9;cutez&#xA0;:</p><p><code>chrome.exe --js-flags=&quot;--trace-opt --trace-deopt&quot;</code></p><p>Voici les options de d&#xE9;bogage disponibles pour d&#xE9;velopper avec Chrome&#xA0;:</p><ol class="spip"><li> <code>trace-opt</code>&#xA0;: enregistre dans un fichier le nom des fonctions optimis&#xE9;es et montre &#xE0; quels endroits V8 ne peut optimiser le code faute de pouvoir le cerner correctement.</li><li> <code>trace-deopt</code>&#xA0;: enregistre dans un fichier les portions de code qui ont &#xE9;t&#xE9; d&#xE9;optimis&#xE9;es pendant l&#x2019;ex&#xE9;cution.</li><li> <code>trace-gc</code>&#xA0;: enregistre dans un fichier chaque appel au ramasse-miette.</li></ol><p>Dans ces fichiers, V8 indique les fonctions optimis&#xE9;es avec une ast&#xE9;risque (<code>*</code>) et celles qui ne le sont pas avec un tilde (<code>~</code>).</p><p>Si vous souhaitez en apprendre plus au sujet des options de V8 et de la fa&#xE7;on dont il fonctionne je vous recommande fortement de jeter un &#x153;il &#xE0; <a href="http://mrale.ph/blog/2011/12/18/v8-optimization-checklist.html" class="spip_out">l&#x2019;excellent billet</a> de Vyacheslav Egorov qui r&#xE9;sume les meilleurs ressources disponibles actuellement sur le sujet.</p><h2>Mesures temporelles pr&#xE9;cises&#xA0;: <abbr>HRT</abbr> et <span>Navigation Time <abbr>API</abbr></span></h2><p><a href="http://www.w3.org/TR/hr-time/" class="spip_out"><span>High Resolution Time</span> (<abbr>HRT</abbr>)</a> est une interface JavaScript d&#xE9;livrant une mesure du temps avec une pr&#xE9;cision de l&#x2019;ordre du millioni&#xE8;me de microseconde, non sujette aux variations de l&#x2019;horloge syst&#xE8;me et aux ajustements de cette derni&#xE8;re par l&#x2019;utilisateur. Voyez cela comme une fa&#xE7;on plus pr&#xE9;cise de faire des tests de performance que la m&#xE9;thode vue pr&#xE9;c&#xE9;demment avec <code>new Date()</code> et <code>Date.now()</code>. C&#x2019;est tr&#xE8;s pratique quand vous &#xE9;crivez des tests de performance.</p><dl class="spip_document_416 spip_documents spip_documents_center"><dt><img src="https://lh5.googleusercontent.com/9qxlMZ8PU-PIkekzdQuqMp95NqrF_JTtJmiCl8mWtF7LAjHU-hHAHg_aDJVPi3FlGZe0bSUiA4F6_EIQDUto-GCkA1ozeV6Imb4CXkHMgR07CXAjUsjp" alt="JPEG - 28.3&#xA0;ko"></dt></dl><p><i><span>High Resolution Time</span> (<abbr>HRT</abbr>) indique le temps avec une pr&#xE9;cision au millioni&#xE8;me de milliseconde pr&#xE8;s.</i></p><p><abbr>HRT</abbr> est disponible dans Chrome (version stable) via <code>window.performance.webkitNow()</code>, mais la version canary de Chrome propose d&#xE9;j&#xE0; une version non-pr&#xE9;fix&#xE9;e (<code>window.performance.now()</code>) Paul Irish a r&#xE9;dig&#xE9; une <a href="http://updates.html5rocks.com/2012/08/When-milliseconds-are-not-enough-performance-now" class="spip_out">pr&#xE9;sentation plus compl&#xE8;te de <code>window.performance</code></a> sur HTML5Rocks.</p><p>Nous avons une mesure temporelle pr&#xE9;cise, mais <i>quid</i> de la mesure pr&#xE9;cise de performance sur le web&#xA0;?</p><p>Eh bien, nous avons maintenant &#xE0; notre disposition la <a href="https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/Overview.html" class="spip_out"><span>Navigation Timing <abbr>API</abbr></span></a>. Cette <abbr>API</abbr> propose une fa&#xE7;on simple d&#x2019;obtenir des mesures pr&#xE9;cises et d&#xE9;taill&#xE9;es, r&#xE9;cup&#xE9;r&#xE9;es durant le chargement de la page et sa pr&#xE9;sentation aux utilisateurs. Les mesures sont expos&#xE9;es via l&#x2019;objet <code>window.performance.timing</code> que vous pouvez simplement obtenir par le biais de la console Javascript.</p><dl class="spip_document_417 spip_documents spip_documents_center"><dt><img src="https://lh5.googleusercontent.com/MZXBB_oDX3yHC19byvXewTfnDXne5diUb4WNG7iu4-8cFo6dNODrLmpC-p0VWtf43Kfs4TMp0MYCaAcSJVqIveFpkw2ZDGagujRGNPZPiqVxiul_jqLL" alt="JPEG - 51.8&#xA0;ko"></dt></dl><p><i>Mesure de performances affich&#xE9;es dans la console JavaScript.</i></p><p>On peut ais&#xE9;ment extraire diverses informations tr&#xE8;s pratiques des donn&#xE9;es ci-dessus. Par exemple, la latence du r&#xE9;seau via <code>responseEnd - fetchStart</code>, le temps n&#xE9;cessaire au chargement de la page &#xE0; partir de sa r&#xE9;ception via <code>loadEventEnd - responseEnd</code> et le temps n&#xE9;cessaire pour passer du clic &#xE0; l&#x2019;affichage de la nouvelle page via <code>loadEventEnd - navigationStart</code>.</p><p>Comme vous pouvez le voir ci-dessus, une propri&#xE9;t&#xE9; <code>performance.memory</code> est disponible. Elle donne des informations sur l&#x2019;usage de la m&#xE9;moire par JavaScript comme par exemple la taille de la pile <span>Heap</span>.</p><p>Pour plus d&#x2019;informations sur la <span>Navigation Timing <abbr>API</abbr></span>, lisez le super billet de Sam Dutton&#xA0;: <a href="http://www.html5rocks.com/en/tutorials/webperformance/basics/" class="spip_out"><span>Measuring Page Load Speed With Navigation Timing</span></a>.</p><h2><code>About:memory</code> et <code>about:tracing</code></h2><p><code>about:tracing</code> dans Google Chrome affiche les performances du navigateur lui-m&#xEA;me, et enregistre l&#x2019;activit&#xE9; de chaque <span>thread</span>, de chaque onglet et de chaque processus.</p><dl class="spip_document_418 spip_documents spip_documents_center"><dt><img src="https://lh5.googleusercontent.com/r8N-F6YK0GdUTJtJ9QkyNZWuv5UTbxhAdk0ewKJ3gckG2-M4Wym8C5HxNkRIJPs0r4qSU_yvvEkEpgJqQdgJ68NgYiBu8r25pIvcGsL1j-W6j-4gkWBW" alt="JPEG - 30.1&#xA0;ko"></dt></dl><p><i><code>about:tracing</code> montre les performances du navigateur.</i></p><p>Ce qui est tr&#xE8;s pratique c&#x2019;est que cet outile permet de capturer et profiler les m&#xE9;canismes internes de Chrome de mani&#xE8;re &#xE0; pouvoir ajuster et optimiser votre JavaScript de mani&#xE8;re appropri&#xE9;e.</p><p>Lili Thompson a &#xE9;crit un excellent article destin&#xE9; aux d&#xE9;veloppeurs de jeux vid&#xE9;os HTML5 sur la fa&#xE7;on d&#x2019;<a href="http://www.html5rocks.com/en/tutorials/games/abouttracing/" class="spip_out">utiliser <code>about:tracing</code> pour le profilage de WebGL</a>. Les autres d&#xE9;veloppeurs y trouveront aussi des informations utiles.</p><p>Naviguer &#xE0; l&#x2019;int&#xE9;rieur de la page <code>about:memory</code> de Chrome est &#xE9;galement d&#x2019;une grande aide. Il montre l&#x2019;utilisation exacte de chaque onglet ce qui peut aider &#xE0; d&#xE9;tecter facilement les applications causant des fuites de m&#xE9;moire.</p><h2>Conclusion</h2><p>Comme nous l&#x2019;avons vu, <strong>il y a nombre de subtilit&#xE9;s &#xE0; conna&#xEE;tre dans le monde de la performance des moteurs JavaScript</strong>, et pas de solution miracle. Ce n&#x2019;est qu&#x2019;en confrontant vos optimisations &#xE0; des tests grandeur nature que vous pourrez estimer les gains en performance les plus importants. De plus, savoir comment les moteurs JavaScript interpr&#xE8;tent et optimisent votre code peut vous fournir des pistes pour le d&#xE9;veloppement de vos applications.</p><p><strong>Mesurez, comprenez, corrigez&#xA0;!</strong> ...et recommencez.</p><dl class="spip_document_419 spip_documents spip_documents_center"><dt><img src="https://lh5.googleusercontent.com/FaISwq_SHQqFahSfLXi9q8R_mmVdpqXxz4AhpdqFyRhPGQewTXfmF0UcARNLoydbZ7yNj0JqSBGrRSlluaYDDUDDFlPRaDeiPVSE56uTgP5hue3N_9sn" alt="JPEG - 155.6&#xA0;ko"></dt></dl><p>Cr&#xE9;dits image&#xA0;: <a href="http://www.flickr.com/photos/38891164@N02/4266609887/" class="spip_out">Sally Hunter</a></p><p>Soyez conscients de l&#x2019;importance de la performance, mais sans aller jusqu&#x2019;aux micros optimisations qui pourraient nuire &#xE0; la simplicit&#xE9; de votre code. Par exemple, certains d&#xE9;veloppeurs pr&#xE9;f&#xE8;rent utiliser <code>.forEach</code> et <code>Object.keys</code> plut&#xF4;t que les boucles <code>for</code> et <code>for...in</code>, malgr&#xE9; leur lenteur, pour pouvoir garder la main sur le contexte. Sachez distinguer les optimisations qui sont absolument indispensables &#xE0; votre application de celles dont elle peut se passer.</p><p>Aussi, soyez bien conscient que bien que les moteurs Javascript continuent &#xE0; am&#xE9;liorer leurs performances, la vraie bataille pour les performances se situe au niveau du <abbr>DOM</abbr>. Les r&#xE9;agencements et les recalculs graphiques (<span>reflows</span> et <span>repaints</span>) doivent &#xEA;tre &#xE9;vit&#xE9;s &#xE0; tout prix, souvenez-vous donc de ne toucher au <abbr>DOM</abbr> que quand c&#x2019;est absolument n&#xE9;cessaire. Et allez-y mollo sur le r&#xE9;seau&#xA0;: les requ&#xEA;tes <abbr>HTTP</abbr> sont pr&#xE9;cieuses, surtout dans un contexte de mobilit&#xE9;, vous devriez exploiter le maximum du potentiel du cache <abbr>HTTP</abbr> pour r&#xE9;duire le poids de vos ressources.</p><p>Garder tout cela &#xE0; l&#x2019;esprit vous assure de tirer le meilleur parti des informations contenues dans ce billet. J&#x2019;esp&#xE8;re que vous l&#x2019;avez trouv&#xE9; utile&#xA0;!</p><p class="moreInfo">
L&apos;article original a &#xE9;t&#xE9; relu par Jakob Kummerow, Michael Starzinger; Sindre Sorhus, Mathias Bynens, John-David Dalton et Paul Irish.</p></div>]]></description>
      <link>http://www.pompage.net/traduction/javascript-rapide-et-efficace</link>
      <guid>http://www.pompage.net/traduction/javascript-rapide-et-efficace</guid>
      <pubDate>Tue, 26 Aug 2014 10:08:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[]]></title>
      <description><![CDATA[<div><div id="article"> <p class="signature">Par <a href="http://addyosmani.com/">Addy Osmani</a> </p> <p>Qu&#x2019;il s&#x2019;agisse de V8, de <a href="https://developer.mozilla.org/en-US/docs/SpiderMonkey" class="spip_out"><span>Spider Monkey</span></a> (Firefox), de <a href="http://my.opera.com/ODIN/blog/carakan-faq" class="spip_out">Caracan</a> (Op&#xE9;ra) ou de <a href="http://en.wikipedia.org/wiki/Chakra_(JScript_engine)" class="spip_out">Chakra</a> (<abbr>IE</abbr>), conna&#xEE;tre le fonctionnement interne du moteur JavaScript vous permettra de mieux optimiser vos applications. Cela ne veut pas dire qu&#x2019;il faut que vous optimisiez votre code pour un seul moteur ou navigateur&#xA0;: ne faites jamais cela&#xA0;!</p>
<p>Vous devriez plut&#xF4;t vous poser ce type de questions&#xA0;:</p>
<ol class="spip"><li> Que puis-je faire pour rendre mon code plus efficient&#xA0;?</li><li> Quelles optimisations communes sont faites par les moteurs JavaScript&#xA0;?</li><li> Quelles sont les limites de l&#x2019;optimisation de ces moteurs&#xA0;? Le ramasse-miette est-il bien capable de lib&#xE9;rer la m&#xE9;moire comme je m&#x2019;y attend&#xA0;?</li></ol><dl class="spip_document_401 spip_documents spip_documents_center">
<dt><img src="https://lh6.googleusercontent.com/ueM0mcKufwF0HEYKLCJ0JDntHX77xlHPH-5L4FPtUDZqMAnMbZ-ab9EZWZKmHVz0gAJE2lqaXfcfnCB3Jn12Aqj5iZQ8oxR8KF9VDyRDHbxA9isjDHRw" width="700" alt=""></dt>
</dl>
<p><i>Les sites v&#xE9;loces, comme les voitures de course, n&#xE9;cessitent des outils sp&#xE9;cialis&#xE9;s. Cr&#xE9;dti de l&#x2019;image&#xA0;: <a href="http://dhybridcars.com/toyota-hybrid/2013-scion-fr-s-sexy-sport-car/media/2013-scion-fr-s-speed-gauge-img-8/" class="spip_out">dHybridcars</a></i></p>
<p>Nombreux sont les pi&#xE8;ges quand on souhaite produire du code rapide et &#xE9;conome en m&#xE9;moire. Cet article propose donc d&#x2019;explorer plusieurs techniques test&#xE9;es et approuv&#xE9;es pour &#xE9;crire du code qui s&#x2019;ex&#xE9;cute efficacement.</p>
<h2>Comment fonctionne JavaScript au sein de V8&#xA0;?</h2>
<p>Bien qu&#x2019;il soit possible d&#x2019;&#xE9;crire des applications volumineuses sans comprendre le fonctionnement des moteurs JavaScript, n&#x2019;importe quel conducteur vous dira qu&#x2019;il a d&#xE9;j&#xE0; jet&#xE9; un &#x153;il sous le capot au moins une fois. &#xC9;tant donn&#xE9; que Chrome est mon navigateur pr&#xE9;f&#xE9;r&#xE9;, je vais vous parler quelque peu de son moteur Javascript. Le c&#x153;ur de V8 est compos&#xE9; de diff&#xE9;rentes pi&#xE8;ces&#xA0;:</p>
<ol class="spip"><li> Un compilateur de base qui parcourt votre JavaScript et g&#xE9;n&#xE8;re du code machine avant qu&#x2019;il soit ex&#xE9;cut&#xE9;, plut&#xF4;t que d&#x2019;ex&#xE9;cuter du <code>bytecode</code> ou simplement de l&#x2019;interpr&#xE9;ter. Ce code natif n&#x2019;est pour le moment pas tr&#xE8;s optimis&#xE9;.</li><li> V8 repr&#xE9;sente vos objets dans un mod&#xE8;le objet. Les objets sont repr&#xE9;sent&#xE9;s au sein de tableaux associatifs en JavaScript, mais dans V8, ils sont repr&#xE9;sent&#xE9;s avec les classes cach&#xE9;es (<a href="https://developers.google.com/v8/design" class="spip_out"><span>hidden classes</span></a>) qui sont un syst&#xE8;me de typage interne pour optimiser la recherche de r&#xE9;f&#xE9;rences.</li><li> Le profileur &#xE0; l&#x2019;ex&#xE9;cution surveille le syst&#xE8;me en fonctionnement et identifie les fonctions &#xAB;&#xA0;chaudes&#xA0;&#xBB; (le code qui est fr&#xE9;quemment ex&#xE9;cut&#xE9;[a]).</li><li> Un compilateur optimis&#xE9; recompile et optimise les fonctions chaudes identifi&#xE9;es par le profileur &#xE0; l&#x2019;ex&#xE9;cution et proc&#xE8;de &#xE0; des optimisations comme l&#x2019;<span>inlining</span> (le remplacement des appels de fonction par le corps de la fonction appel&#xE9;e).</li><li> V8 supporte le retour sur optimisation[b] ce qui signifie que le compilateur peut r&#xE9;voquer le code optimis&#xE9; s&#x2019;il d&#xE9;couvre que les optimisations s&#x2019;av&#xE8;rent contre-productives.</li><li> V8 a &#xE9;galement un ramasse-miette. Comprendre son fonctionnement peut &#xEA;tre tout aussi important qu&#x2019;optimiser son JavaScript.</li></ol><h2>Le ramasse-miette</h2>
<p>Le ramasse-miette est un syst&#xE8;me de gestion de la m&#xE9;moire. Il introduit la notion de collecteur qui tente de lib&#xE9;rer la m&#xE9;moire occup&#xE9;e par des objets qui ne sont plus utilis&#xE9;s. Dans un langage &#xE0; ramasse-miette tel que JavaScript les objets qui sont toujours r&#xE9;f&#xE9;renc&#xE9;s par votre application ne sont pas effac&#xE9;s.</p>
<p>D&#xE9;r&#xE9;f&#xE9;rencer manuellement les objets s&#x2019;av&#xE8;re inutile la plupart du temps. En d&#xE9;clarant simplement les variables &#xE0; l&#x2019;endroit o&#xF9; elles sont n&#xE9;cessaires (id&#xE9;alement le plus localement possible&#xA0;; &#xE0; l&#x2019;int&#xE9;rieur de la fonction o&#xF9; elles sont utilis&#xE9;es plut&#xF4;t que dans un contexte parent), cela devrait fonctionner tout seul.</p>
<dl class="spip_document_403 spip_documents spip_documents_center">
<dt><img src="https://lh4.googleusercontent.com/_M6Bmqzz2I2BiLo5kOFxzbhf2wl9hzHnf7ORv8_0WfGFBjvWUxnhsC2uuR4_gwOWENVX-nfqcn_goyQWZgTteSc-tN5OVyPwM6YopGVqP0cCqNHulDGg" width="500" alt=""></dt>
</dl>
<p>Le ramasse-miette en train de lib&#xE9;rer de la m&#xE9;moire. Cr&#xE9;dits de l&#x2019;image&#xA0;: <a href="http://www.flickr.com/photos/26817893@N05/2864644153/" class="spip_out">Valtteri M&#xE4;ki</a>.</p>
<p>Il est impossible de forcer l&#x2019;intervention du ramasse-miette en Javascript. Ne pensez pas que c&#x2019;est dommage, car le processus de lib&#xE9;ration de la m&#xE9;moire est contr&#xF4;l&#xE9; par l&#x2019;environnement d&#x2019;ex&#xE9;cution et il sait g&#xE9;n&#xE9;ralement mieux que vous quand un nettoyage s&#x2019;impose.</p>
<h2>Les mythes du d&#xE9;r&#xE9;f&#xE9;rencement</h2>
<p>Dans un bon nombre de discussions en ligne &#xE0; propos de la lib&#xE9;ration de m&#xE9;moire en JavaScript, le mot-cl&#xE9; <code>delete</code> a amen&#xE9; certains d&#xE9;veloppeurs &#xE0; penser qu&#x2019;ils pouvaient forcer le d&#xE9;r&#xE9;f&#xE9;rencement en l&#x2019;utilisant, alors qu&#x2019;il est seulement suppos&#xE9; retirer une cl&#xE9; d&#x2019;un tableau de hachage. &#xC9;vitez d&#x2019;utiliser <code>delete</code> si vous le pouvez. Dans l&#x2019;exemple ci-dessous, <code>delete o.x</code> fait plus de mal que de bien contrairement aux apparences. Il change la classe cach&#xE9;e de l&#x2019;objet <code>o</code> et le transforme en objet g&#xE9;n&#xE9;rique plus lent.</p>
<pre><code>var o = { x: 1 };
delete o.x; // true
o.x; // undefined</code></pre>
<p>Cela dit, vous pouvez &#xEA;tre certains de trouver <code>delete</code> dans la plupart des biblioth&#xE8;ques JavaScript populaires. Il a une utilit&#xE9; au sein du langage. Ce qu&#x2019;il faut retenir, c&#x2019;est qu&#x2019;il modifie la structure des objets &#xAB;&#xA0;chauds&#xA0;&#xBB; &#xE0; l&#x2019;ex&#xE9;cution. Les moteurs JavaScript rep&#xE8;rent ces objets chauds et tentent de les optimiser. C&#x2019;est plus facile si la structure de ces objets &#xE9;volue peu au cours de leur utilisation, or <code>delete</code> impose des changements.</p>
<p>Il y a &#xE9;galement des erreurs d&#x2019;interpr&#xE9;tation sur le fonctionnement de <code>null</code>. Attribuer &#xE0; la r&#xE9;f&#xE9;rence d&#x2019;un objet la valeur <code>null</code> ne d&#xE9;truit pas l&#x2019;objet associ&#xE9;. Cela d&#xE9;truit en r&#xE9;alit&#xE9; la r&#xE9;f&#xE9;rence &#xE0; cet objet. Il vaut mieux utiliser <code>o.x=null</code> plut&#xF4;t que le mot-cl&#xE9; <code>delete</code>, mais c&#x2019;est rarement utile.</p>
<pre><code>var o = { x: 1 };
o = null;
o; // null
o.x; // TypeError</code></pre>
<p>Si cette r&#xE9;f&#xE9;rence est la derni&#xE8;re pointant sur cet objet, alors il devient &#xE9;ligible pour &#xEA;tre lib&#xE9;r&#xE9; de la m&#xE9;moire. Mais si ce n&#x2019;&#xE9;tait pas la derni&#xE8;re r&#xE9;f&#xE9;rence &#xE0; ce dernier, cet objet reste atteignable et ne sera donc pas d&#xE9;truit.</p>
<p>Une autre chose importante est que les variables globales ne sont pas d&#xE9;truites par le ramasse-miette durant toute la dur&#xE9;e de vie de votre page. Que celles-ci soient affich&#xE9;es une fraction de seconde ou plusieurs heures, les variables affect&#xE9;es au contexte global d&#x2019;ex&#xE9;cution du JavaScript resteront en m&#xE9;moire.</p>
<p><code>var monEspaceDeNomGlobal = {};</code></p>
<p>Les variables globales ne sont d&#xE9;truites que lorsque vous rafra&#xEE;chissez la page, naviguez vers une autre page, fermez l&#x2019;onglet ou votre navigateur. Les variables rattach&#xE9;es au contexte d&#x2019;une fonction sont d&#xE9;truites quand elles tombent en dehors du contexte courant. Cela signifie qu&#x2019;elles sont d&#xE9;truites quand les fonctions sont retir&#xE9;es de la pile d&#x2019;ex&#xE9;cution et qu&#x2019;il n&#x2019;y a plus de r&#xE9;f&#xE9;rences pointant vers elles.</p>
<h2>Quelques r&#xE8;gles g&#xE9;n&#xE9;rales</h2>
<p>Pour donner l&#x2019;opportunit&#xE9; au ramasse-miette de lib&#xE9;rer la m&#xE9;moire occup&#xE9;e par vos variables le plus t&#xF4;t possible, ne gardez pas de r&#xE9;f&#xE9;rence &#xE0; vos objets plus longtemps que n&#xE9;cessaire. La plupart du temps, cela se fait automatiquement. Mais voici quelques r&#xE8;gles &#xE0; garder en t&#xEA;te&#xA0;:</p>
<ol class="spip"><li> Comme dit plus haut, d&#xE9;clarez vos variables dans un contexte appropri&#xE9; plut&#xF4;t que de les d&#xE9;r&#xE9;f&#xE9;rencer manuellement. En d&#x2019;autres termes, au lieu de cr&#xE9;er une r&#xE9;f&#xE9;rence globale que vous devrez d&#xE9;r&#xE9;f&#xE9;rencer plus tard, optez pour une variable locale qui sera d&#xE9;truite lorsque son contexte sera sorti de la pile. Vous aurez alors un code plus propre, et moins de choses &#xE0; g&#xE9;rer.</li><li> Assurez-vous de bien supprimer vos &#xE9;couteurs d&#x2019;&#xE9;v&#xE9;nements des n&#x153;uds <abbr>DOM</abbr> d&#xE8;s lors qu&#x2019;ils deviennent inutiles, en particulier juste avant de retirer les n&#x153;uds du document.</li><li> Si vous cachez localement certaines donn&#xE9;es, assurez-vous de les nettoyer quand elles ne sont plus utiles ou de programmer leur suppression pour &#xE9;viter que de trop grands volumes de donn&#xE9;es ne soient stock&#xE9;es en m&#xE9;moire.</li></ol><h2>Les fonctions</h2>
<p>Maintenant, int&#xE9;ressons-nous aux fonctions. Comme dit pr&#xE9;c&#xE9;demment, le ramasse-miette fonctionne par r&#xE9;cup&#xE9;ration de pages m&#xE9;moires qui ne sont plus r&#xE9;f&#xE9;renc&#xE9;es par l&#x2019;application. Pour mieux illustrer notre propos, voyons quelques exemples.</p>
<pre><code>function foo() { var bar = new GrosObjet(); bar.appelQuelconque();
}</code></pre>
<p>Quand le fil d&#x2019;ex&#xE9;cution sort de la fonction <code>foo</code>, l&#x2019;objet vers lequel pointe <code>bar</code> est automatiquement &#xE9;ligible pour &#xEA;tre lib&#xE9;r&#xE9; de la m&#xE9;moire car il n&#x2019;existe plus aucune r&#xE9;f&#xE9;rence &#xE0; cet objet.</p>
<p>Comparons cet exemple au code suivant&#xA0;:</p>
<pre><code>function foo() { var bar = new GrosObjet(); bar.appelQuelconque(); return bar;
} //somewhere else
var b = foo();</code></pre>
<p>Nous avons maintenant une r&#xE9;f&#xE9;rence &#xE0; l&#x2019;objet qui survit &#xE0; l&#x2019;appel de la fonction <code>foo</code> et qui persistera tant qu&#x2019;aucun autre objet ne sera assign&#xE9; &#xE0; la variable <code>b</code> (ou tant que <code>b</code> sera dans le contexte d&#x2019;ex&#xE9;cution courant).</p>
<h2>Les <span>closures</span></h2>
<p>Quand vous trouvez une fonction qui contient la d&#xE9;claration d&#x2019;une autre fonction et retourne une r&#xE9;f&#xE9;rence vers cette fonction, cette derni&#xE8;re aura acc&#xE8;s au contexte de sa fonction parente m&#xEA;me si sa fonction parente est retir&#xE9;e de la pile d&#x2019;ex&#xE9;cution. C&#x2019;est ce qu&#x2019;on appelle une <a href="http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/" class="spip_out"><span>closure</span></a>&#xA0;; c&#x2019;est une expression qui a acc&#xE8;s aux variables situ&#xE9;es dans un contexte particulier. Par exemple&#xA0;:</p>
<pre><code>function somme(x) { function faitLaSomme(y) { return x + y; }; return faitLaSomme;
} // Usage
var sommeA = somme(4);
var sommeB = sommeA(3);
console.log(sommeB); // Renvoie 7</code></pre>
<p>L&#x2019;objet de type <code>function</code> cr&#xE9;&#xE9; lors de l&#x2019;appel &#xE0; <code>somme()</code> ne peut &#xEA;tre d&#xE9;truit puisqu&#x2019;il est toujours r&#xE9;f&#xE9;renc&#xE9; au sein du contexte global. Il est donc toujours r&#xE9;f&#xE9;renc&#xE9; et reste tout ce qu&#x2019;il y a de plus accessible via <code>sommeA(n)</code>.</p>
<p>Int&#xE9;ressons-nous &#xE0; un autre exemple. Pouvons-nous acc&#xE9;der &#xE0; <code>longueChaine</code>&#xA0;?</p>
<pre><code>var a = function () { var longueChaine = new Array(1000000).join(&apos;x&apos;); return function () { return longueChaine; };
}();</code></pre>
<p>Oui, bien s&#xFB;r, via <code>a()</code>, donc elle n&#x2019;a pas &#xE9;t&#xE9; d&#xE9;truite. Et dans l&#x2019;exemple suivant&#xA0;?</p>
<pre><code>var a = function () { var petiteChaine = &apos;x&apos;; var longueChaine = new Array(1000000).join(&apos;x&apos;); return function (n) { return petiteChaine; };
}();</code></pre>
<p>On ne peut plus y acc&#xE9;der et elle est &#xE9;ligible pour &#xEA;tre d&#xE9;truite par le ramasse-miette.</p>
<h2>Les <span>timers</span></h2>
<p>On trouve beaucoup de fuites de m&#xE9;moires dans les boucles, mais <code>setTimeout()</code>/<code>setInterval()</code> ne sont pas mal non plus pour &#xE7;a.</p>
<p>Consid&#xE9;rons l&#x2019;exemple suivant&#xA0;:</p>
<pre><code>var monObjet = { callMeMaybe: function () { var maReference = this; var val = setTimeout(function () { console.log(&apos;Tu perds ton temps!&apos;); maReference.callMeMaybe(); }, 1000); }
};</code></pre>
<p>Si nous appelons <code>monObjet.callMeMaybe();</code> pour mettre en route le <span>timer</span>, nous pourrons voir toutes les secondes dans la console le message suivant&#xA0;: &#xAB;&#xA0;Tu perds ton temps&#xA0;!&#xA0;&#xBB; Si nous tentons&#xA0;:</p>
<p><code>monObjet = null;</code></p>
<p>Le <span>timer</span> sera toujours actif. monObjet ne sera pas d&#xE9;truit puisque la <span>closure</span> transmise &#xE0; <code>setTimeout</code> doit &#xEA;tre conserv&#xE9;e pour rester accessible. Par effet d&#x2019;entra&#xEE;nement, monObjet est conserv&#xE9; puisqu&#x2019;il encapsule <code>maReference</code>. Il en irait de m&#xEA;me si nous avions pass&#xE9; cette <span>closure</span> &#xE0; n&#x2019;importe quelle autre fonction conservant une r&#xE9;f&#xE9;rence &#xE0; cet objet.</p>
<p>C&#x2019;est &#xE9;galement important de garder &#xE0; l&#x2019;esprit que les r&#xE9;f&#xE9;rences &#xE0; l&#x2019;int&#xE9;rieur des appels &#xE0; <code>setTimeout</code>/<code>setInterval</code>, comme pour les fonctions, ne pourront &#xEA;tre d&#xE9;truites qu&#x2019;apr&#xE8;s la compl&#xE8;te ex&#xE9;cution de ces derni&#xE8;res.</p>
<h2>Soyez &#xE0; l&#x2019;&#xE9;coute des probl&#xE8;mes de performance</h2>
<p>On ne le r&#xE9;p&#xE9;tera jamais assez&#xA0;: n&#x2019;optimisez votre code que lorsque vous constatez des probl&#xE8;mes de performance. On trouve des tas de micro-benchmarks d&#xE9;montrant que &#xAB;&#xA0;N&#xA0;&#xBB; est plus rapide que &#xAB;&#xA0;M&#xA0;&#xBB; dans V8, mais confront&#xE9; &#xE0; la r&#xE9;alit&#xE9; d&#x2019;un vrai module de code ou d&#x2019;une application concr&#xE8;te, l&#x2019;impact de ces optimisations pourrait &#xEA;tre bien moins important que ce que vous pensiez obtenir.</p>
<dl class="spip_document_404 spip_documents spip_documents_center">
<dt><img src="https://lh3.googleusercontent.com/LHIP7xx4hrh8IRBWsxrsB62SMjtJVEBn-n7jrarXfYklh4Dom5KK1q4i6OQ77mS9GCuxgs0mvq0wPjTUQ0sQ9uwCg0UkvtEECV9JfUhrav6FaM4im8pl" width="500" alt=""></dt>
</dl>
<p>En faire trop peut &#xEA;tre aussi probl&#xE9;matique que de ne rien faire du tout. Cr&#xE9;dits image&#xA0;: <a href="https://www.flickr.com/photos/tim_uk/7717078488/" class="spip_out">Tim Sheerman-Chase</a></p>
<p>Imaginons que nous voulions cr&#xE9;er un module qui&#xA0;:</p>
<ol class="spip"><li> utilise une source de donn&#xE9;e locale contenant des &#xE9;l&#xE9;ments avec un identifiant num&#xE9;rique,</li><li> affiche un tableau contenant ces donn&#xE9;es,</li><li> assigne des gestionnaires d&#x2019;&#xE9;v&#xE9;nements qui commutent une classe quand un utilisateur clique sur une cellule.</li></ol>
<p>Il y a plusieurs chose &#xE0; prendre en compte dans ce probl&#xE8;me, bien qu&#x2019;il soit tr&#xE8;s simple &#xE0; r&#xE9;soudre. Comment stockerons-nous les donn&#xE9;es&#xA0;? Comment g&#xE9;n&#xE9;rer[e] le tableau de mani&#xE8;re efficiente et l&#x2019;ins&#xE9;rer dans le <abbr>DOM</abbr>&#xA0;? Comment pouvons-nous capturer les &#xE9;v&#xE9;nements &#xE9;mis par le tableau de mani&#xE8;re optimale&#xA0;?</p>
<p>Une premi&#xE8;re m&#xE9;thode (na&#xEF;ve) serait de stocker chaque silo de donn&#xE9;es disponible dans des objets que nous regrouperions dans un tableau associatif. On pourrait utiliser jQuery pour parcourir ce tableau de donn&#xE9;es, g&#xE9;n&#xE9;rer le tableau et ensuite, l&#x2019;ins&#xE9;rer dans le <abbr>DOM</abbr>. Enfin, on pourrait utiliser les &#xE9;couteurs d&#x2019;&#xE9;v&#xE9;nements pour programmer le comportement d&#xE9;sir&#xE9; au clic sur une cellule.</p>
<p><strong>Ne faites SURTOUT PAS comme &#xE7;a&#xA0;!</strong></p>
<pre><code>var moduleA = function () { return { data: dataArrayObject, init: function () { this.addTable(); this.addEvents(); }, addTable: function () { for (var i = 0; i &lt; rows; i++) { $tr = $(&apos;&lt;tr&gt;&lt;/tr&gt;&apos;); for (var j = 0; j &lt; this.data.length; j++) { $tr.append(&apos;&lt;td&gt;&apos; + this.data[j][&apos;id&apos;] + &apos;&lt;/td&gt;&apos;); } $tr.appendTo($tbody); } }, addEvents: function () { $(&apos;table td&apos;).on(&apos;click&apos;, function () { $(this).toggleClass(&apos;active&apos;); }); } };
}();</code></pre>
<p>C&#x2019;est basique, mais &#xE7;a fait ce qui a &#xE9;t&#xE9; demand&#xE9;.</p>
<p>Dans ce cas, cependant, nous ne faisons qu&#x2019;utiliser la propri&#xE9;t&#xE9; ID de type num&#xE9;rique qui aurait &#xE9;t&#xE9; plus avantageusement stock&#xE9;e dans un simple tableau. Point int&#xE9;ressant, utiliser <code>documentFragment</code> et les m&#xE9;thodes natives du <abbr>DOM</abbr> est plus optimal que d&#x2019;utiliser jQuery de cette mani&#xE8;re pour g&#xE9;n&#xE9;rer notre tableau. Enfin, bien s&#xFB;r, &#xE9;couter les &#xE9;v&#xE9;nements au niveau du tableau aurait &#xE9;t&#xE9; plus performant que d&#x2019;&#xE9;couter les clics sur chaque cellule.</p>
<p>Notez que jQuery fait appel &#xE0; <code>DocumentFragment</code> en interne, mais dans notre exemple le code appelle la fonction <code>append()</code> &#xE0; chaque it&#xE9;ration de la boucle, cloisonnement qui emp&#xEA;che une bonne optimisation. Cela ne devrait pas &#xEA;tre si catastrophique mais n&#x2019;oubliez pas de passer votre code au banc d&#x2019;essai pour vous en assurer.</p>
<p>Dans notre cas, proc&#xE9;der &#xE0; ces am&#xE9;liorations engendrera de bons gains en performance comme nous pouvons nous y attendre. &#xC9;couter les &#xE9;v&#xE9;nements au niveau du tableau[g] apporte une am&#xE9;lioration int&#xE9;ressante, quant &#xE0; l&#x2019;<a href="http://jsperf.com/first-pass" class="spip_out">utilisation de <code>DocumentFragment</code></a>, elle dope v&#xE9;ritablement les performances.</p>
<pre><code>var moduleD = function () { return { data: dataArray, init: function () { this.addTable(); this.addEvents(); }, addTable: function () { var td, tr; var frag = document.createDocumentFragment(); var frag2 = document.createDocumentFragment(); for (var i = 0; i &lt; rows; i++) { tr = document.createElement(&apos;tr&apos;); for (var j = 0; j &lt; this.data.length; j++) { td = document.createElement(&apos;td&apos;); td.appendChild(document.createTextNode(this.data[j])); frag2.appendChild(td); } tr.appendChild(frag2); frag.appendChild(tr); } tbody.appendChild(frag); }, addEvents: function () { $(&apos;table&apos;).on(&apos;click&apos;, &apos;td&apos;, function () { $(this).toggleClass(&apos;active&apos;); }); } };
}();</code></pre>
<p>Nous pourrions &#xE9;galement tenter d&#x2019;autres approches pour am&#xE9;liorer les performances. Vous avez probablement lu quelque part qu&#x2019;utiliser le prototypage est plus optimal que de cr&#xE9;er un module (et nous l&#x2019;avons confirm&#xE9; au d&#xE9;but de cet article), ou entendu que les moteurs de gabarits (<span>templates</span>) JavaScript sont tr&#xE8;s performants. Ils le sont parfois, mais utilisez-les pour clarifier votre code et pr&#xE9;compilez vos gabarits. Testons et voyons si ces pratiques sont aussi int&#xE9;ressantes que &#xE7;a.</p>
<pre><code>var moduleG = function () {}; moduleG.prototype.data = dataArray;
moduleG.prototype.init = function () { this.addTable(); this.addEvents();
};
moduleG.prototype.addTable = function () { var template = _.template($(&apos;#template&apos;).text()); var html = template({&apos;data&apos; : this.data}); $tbody.append(html);
};
moduleG.prototype.addEvents = function () { $(&apos;table&apos;).on(&apos;click&apos;, &apos;td&apos;, function () { $(this).toggleClass(&apos;active&apos;); });
}; var modG = new moduleG();</code></pre>
<p>Comme on pouvait s&#x2019;y attendre, les b&#xE9;n&#xE9;fices en terme de performance sont n&#xE9;gligeables ici. Les <a href="http://jsperf.com/second-pass" class="spip_out">moteurs de <span>template</span> et le prototypage</a> ne nous apportent rien de plus que ce que nous avions auparavant. Cela dit, ce n&#x2019;est pas vraiment pour les performances que les d&#xE9;veloppeurs modernes utilisent ces outils. C&#x2019;est plut&#xF4;t la clart&#xE9;, le mod&#xE8;le d&#x2019;h&#xE9;ritage et la maintenabilit&#xE9; du code qui les motive.</p>
<p>Certains probl&#xE8;mes plus complexes concernent <a href="http://jsperf.com/canvas-drawimage-vs-webgl-drawarrays/6" class="spip_out">l&#x2019;efficience du dessin avec canvas</a> et <a href="http://jsperf.com/canvas-pixel-manipulation/30" class="spip_out">la manipulation de pixels</a> avec ou sans <a href="http://jsperf.com/typed-arrays-for-pixel-manipulation" class="spip_out">tableaux typ&#xE9;s</a>.</p>
<p>Jetez toujours un &#x153;il critique aux micro-benchmarks avant d&#x2019;appliquer leurs conclusions &#xE0; vos applications. Certains d&#x2019;entre vous pourraient se souvenir de l&#x2019;article <a href="http://jsperf.com/dom-vs-innerhtml-based-templating/473" class="spip_out"><span>Javascript templating shoot-off</span></a> et <a href="http://jsperf.com/javascript-templating-shootoff-extended/26" class="spip_out">la pol&#xE9;mique qui s&#x2019;en est suivie</a>. Vous devez vous assurer que les r&#xE9;sultats de vos tests ne sont pas influenc&#xE9;s par des contraintes inexistantes dans une application concr&#xE8;te. Testez &#xE9;galement ces optimisations dans leur contexte final.</p>
<h2>Quelques astuces d&#x2019;optimisation pour V8</h2>
<p>Lister toutes les optimisations r&#xE9;alisables pour V8 s&#x2019;&#xE9;loignerait du sujet de cet article, mais voici cependant quelques astuces qui m&#xE9;ritent d&#x2019;&#xEA;tre cit&#xE9;es. En les gardant &#xE0; l&#x2019;esprit vous serez en mesure de limiter l&#x2019;&#xE9;criture de code non-performant.</p>
<ol class="spip"><li> Certaines pratiques telles que l&#x2019;utilisation de <code>try...catch</code> emp&#xEA;chent V8 de se lancer dans la moindre optimisation. Pour plus d&#x2019;information sur les fonctions qui peuvent &#xEA;tre optimis&#xE9;es et celles qui ne le peuvent pas, utilisez d8, un petit utilitaire en ligne de commande fourni avec V8, et l&#x2019;option <code>--trace-opt file.js</code>.</li><li> Si la vitesse d&#x2019;ex&#xE9;cution vous importe, essayez de garder vos fonctions monomorphes&#xA0;; assurez-vous que les variables (tableaux, objets, param&#xE8;tres de fonction) ne contiennent que des &#xE9;l&#xE9;ments du m&#xEA;me type. Par exemple, &#xE9;vitez ce genre de code (NdT&#xA0;: en clair, faites comme si JavaScript &#xE9;tait un langage typ&#xE9;)&#xA0;:</li></ol><pre><code>function ajoute(x, y) { return x+y;
} ajoute(1, 2); ajoute(&apos;a&apos;,&apos;b&apos;); ajoute(mon_objet, undefined);</code></pre><ol class="spip"><li> Ne r&#xE9;utilisez pas des &#xE9;l&#xE9;ments d&#xE9;sinitialis&#xE9;s ou supprim&#xE9;s. Le r&#xE9;sultat sera identique, mais votre code sera bien plus lent.</li><li> N&#x2019;&#xE9;crivez pas de fonctions gigantesques car elles sont plus difficiles &#xE0; optimiser.</li></ol>
<p>Pour plus de trucs et astuces, je vous recommande de visualiser la vid&#xE9;o <a href="http://www.youtube.com/watch?v=UJPdhx5zTaw" class="spip_out"><span>Breaking the Javascript speed limit with V8</span></a> de <span>Daniel Clifford</span> au Google <abbr>IO</abbr>. Je vous recommande &#xE9;galement <a href="http://floitsch.blogspot.co.uk/2012/03/optimizing-for-v8-introduction.html" class="spip_out"><span>Optimizing For V8 - A Series</span></a> dans la foul&#xE9;e.</p>
<h2>Objets vs Tableaux&#xA0;: que dois-je utiliser&#xA0;?</h2><ol class="spip"><li> Si vous souhaitez stocker un paquet de nombres ou une liste d&#x2019;objets de m&#xEA;me nature, utilisez les tableaux.</li><li> Si ce dont vous avez besoin s&#xE9;mantiquement est un objet avec un lot de propri&#xE9;t&#xE9;s (de types diff&#xE9;rents), utilisez un objet avec des propri&#xE9;t&#xE9;s. C&#x2019;est tr&#xE8;s efficient en terme de m&#xE9;moire et assez rapide d&#x2019;acc&#xE8;s.</li><li> Qu&#x2019;elles soient stock&#xE9;es dans des objets ou des tableaux, les cl&#xE9;s num&#xE9;riques sont plus rapides d&#x2019;acc&#xE8;s lors de vos it&#xE9;rations que les propri&#xE9;t&#xE9;s des objets.</li><li> Les propri&#xE9;t&#xE9;s des objets sont tr&#xE8;s complexes&#xA0;: elle peuvent &#xEA;tre cr&#xE9;es avec des accesseurs (getters/setters) et utiliser diff&#xE9;rents type d&#x2019;&#xE9;num&#xE9;rabilit&#xE9; et d&#x2019;acc&#xE8;s en &#xE9;criture. Les &#xE9;l&#xE9;ments d&#x2019;un tableau sont au contraire peu personnalisables&#xA0;; ils existent ou pas, point final. Au niveau du moteur JavaScript, cela permet plus d&#x2019;optimisations en terme d&#x2019;organisation de la m&#xE9;moire pour repr&#xE9;senter sa structure. C&#x2019;est d&#x2019;autant plus b&#xE9;n&#xE9;fique quand ces tableaux contiennent des nombres. Par exemple, si vous avez besoin de stocker des vecteurs, ne d&#xE9;finissez pas une classe avec des propri&#xE9;t&#xE9;s <code>x</code>, <code>y</code> et <code>z</code>&#xA0;; utilisez plut&#xF4;t un tableau.</li></ol>
<p>Il existe une diff&#xE9;rence majeure entre les objets et les tableaux en JavaScript, c&#x2019;est la propri&#xE9;t&#xE9; magique <code>length</code>. Si vous g&#xE9;rez cette propri&#xE9;t&#xE9; vous-m&#xEA;me, vos objets seront tout aussi rapides que des tableaux dans V8.</p>
<h2>Quelques astuces pour l&#x2019;utilisation des objets</h2><ol class="spip"><li> Cr&#xE9;ez vos objets via leur fonction constructeur. Cela permet d&#x2019;assigner &#xE0; chaque objet la m&#xEA;me classe cach&#xE9;e et &#xE9;vite de changer cette derni&#xE8;re par la suite. Un autre point qui plaide pour cela est que c&#x2019;est l&#xE9;g&#xE8;rement plus rapide que son homologue <code>Object.create()</code>.</li><li> Il n&#x2019;y a aucune restriction sur le nombre de types d&#x2019;objets diff&#xE9;rents au sein d&#x2019;une application ou sur leur complexit&#xE9; (tout en restant raisonnable&#xA0;: les longues cha&#xEE;nes de prototype tendent &#xE0; ralentir l&#x2019;application, et les objets avec un nombre limit&#xE9; de propri&#xE9;t&#xE9; b&#xE9;n&#xE9;ficient d&#x2019;une repr&#xE9;sentation sp&#xE9;ciale leur conf&#xE9;rant une rapidit&#xE9; accrue). Pour les objets &#xAB;&#xA0;chauds&#xA0;&#xBB;, essayez de garder une cha&#xEE;ne de prototypes courte et peu de propri&#xE9;t&#xE9;s.</li></ol><h2>Clonage d&#x2019;objets</h2>
<p>Le clonage d&#x2019;objets est un probl&#xE8;me que rencontrent tous les d&#xE9;veloppeurs d&#x2019;applications. Bien qu&#x2019;il soit possible de tester ses diff&#xE9;rentes impl&#xE9;mentations pour observer comment elles se comportent avec le moteur V8, soyez prudents quand vous copiez quoi que ce soit. Copier des gros lots de donn&#xE9;es est g&#xE9;n&#xE9;ralement lent, ne le faites pas. Les boucles <code>for...in</code> sont particuli&#xE8;rement inadapt&#xE9;es pour cela car elles ont une sp&#xE9;cification d&#xE9;moniaque et ne seront jamais rapides pour des objets arbitraires, quel que soit le moteur JavaScript.</p>
<p>Si vous avez absolument besoin de copier des objets dans une partie critique de votre code en terme de performance (et que vous ne pouvez pas contourner le probl&#xE8;me), utilisez un tableau ou un &#x201C;constructeur de copie&#x201D; personnalis&#xE9; qui copie chaque propri&#xE9;t&#xE9; individuellement. C&#x2019;est probablement la mani&#xE8;re la plus rapide de le faire.</p>
<pre><code>function clone(original) { this.foo = original.foo; this.bar = original.bar;
}
var copie = new clone(original);</code></pre><h2>Les fonctions en cache gr&#xE2;ce aux modules</h2>
<p>Mettre vos fonctions en cache gr&#xE2;ce au patron de conception &#xAB;&#xA0;module&#xA0;&#xBB; peut am&#xE9;liorer les performances. Regardez l&#x2019;exemple ci-dessous, vous constaterez que l&#x2019;une ou l&#x2019;autre m&#xE9;thodes que vous avez l&#x2019;habitude de voir est plus lente car elle oblige &#xE0; copier les fonctions membres sans arr&#xEA;t.</p>
<p>Vous noterez &#xE9;galement que cette approche peut se r&#xE9;v&#xE9;ler significativement meilleure que de s&#x2019;appuyer sur la technique du prototype (et <a href="http://jsperf.com/prototypal-performance/12" class="spip_out">un test jsPerf le confirme</a>).</p>
<dl class="spip_document_406 spip_documents spip_documents_center">
<dt><a href="https://lh3.googleusercontent.com/7CLlAgAFc-agiZoak-1a3vE50u8Cf2r2eIXPiSJoWORMTcvabAo7mcyoAVRk9TwcQDnr3x7ggPSMI2UMFVHaCCQJm2O5opwq63vmAWHTH_kxM0iJmGMF"><img src="http://www.pompage.net/traduction/local/cache-vignettes/L150xH110/7CLlAgAFc-ag8952-3457a.png" width="150" alt=""></a></dt>
</dl>
<p><i>Mesure des gains de performance des techniques modules et prototypes.</i></p>
<p>Voici un test comparatif entre les patrons de conception module et prototype.</p>
<pre><code> // Technique &quot;Prototype&quot; Klass1 = function () {} Klass1.prototype.foo = function () { log(&apos;foo&apos;); } Klass1.prototype.bar = function () { log(&apos;bar&apos;); } // Technique &quot;Module&quot; Klass2 = function () { var foo = function () { log(&apos;foo&apos;); }, bar = function () { log(&apos;bar&apos;); }; return { foo: foo, bar: bar } } // Technique &quot;Module avec fonctions mises en cache&quot; var FooFunction = function () { log(&apos;foo&apos;); }; var BarFunction = function () { log(&apos;bar&apos;); }; Klass3 = function () { return { foo: FooFunction, bar: BarFunction } } // Tests comparatifs // Prototype var i = 1000, objs = []; while (i--) { var o = new Klass1() objs.push(new Klass1()); o.bar; o.foo; } // Module simple var i = 1000, objs = []; while (i--) { var o = Klass2() objs.push(Klass2()); o.bar; o.foo; } // Module avec fonctions mises en cache var i = 1000, objs = []; while (i--) { var o = Klass3() objs.push(Klass3()); o.bar; o.foo; }
// Le reste du code est sur jsPerf</code></pre><h2>Quelques astuces pour l&#x2019;utilisation des tableaux</h2>
<p>Maintenant, jetons un &#x153;il aux tableaux. En r&#xE8;gle g&#xE9;n&#xE9;rale, ne supprimez pas d&#x2019;&#xE9;l&#xE9;ments dans les tableaux. Cela oblige le moteur &#xE0; basculer vers une repr&#xE9;sentation interne plus lente. Quand les cl&#xE9;s d&#x2019;un tableau deviennent &#xE9;parpill&#xE9;es, le moteur est susceptible de le transformer en tableau associatif, qui est encore plus lent.</p>
<h2>Repr&#xE9;sentation litt&#xE9;rale des tableaux</h2>
<p>L&#x2019;initialisation litt&#xE9;rale d&#x2019;un tableau est pr&#xE9;f&#xE9;rable puisque cela donne un aper&#xE7;u &#xE0; la machine virtuelle de ce que vous souhaitez y stocker (taille, type de valeurs). Ils sont typiquement souhaitables pour des tableaux de taille petite &#xE0; moyenne.</p>
<pre><code>// Ici, le moteur JS voit que vous souhaitez un tableau contenant 4 nombres
var a = [1, 2, 3, 4]; // Ne faites pas &#xE7;a :
a = []; // Ici, le moteur n&apos;a aucune id&#xE9;e de ce qui ira dans le tableau
for(var i = 1; i &lt;= 4; i++) { a.push(i);
}</code></pre><h2>Stocker un seul type de donn&#xE9;es versus donn&#xE9;es mixtes</h2>
<p>Il n&#x2019;est jamais bon de m&#xE9;langer diff&#xE9;rents types de valeurs dans un m&#xEA;me tableau (des nombres, cha&#xEE;nes, objets, bool&#xE9;ens ou undefined, comme par exemple&#xA0;: <code>var arr = [1, &#x201C;1&#x201D;, undefined, true, &#x201C;true&#x201D;]</code>).</p>
<p><a href="http://jsperf.com/type-inference-performance/2" class="spip_out">Test de performance de l&#x2019;inf&#xE9;rence de type</a></p>
<p>Comme vous pouvez le constater, le meilleur r&#xE9;sultat est obtenu par le tableau d&#x2019;entiers.</p>
<h2>Tableaux &#xE0; cl&#xE9;s cons&#xE9;cutives ou non</h2>
<p>Quand vous utilisez des tableaux aux cl&#xE9;s non cons&#xE9;cutives, soyez bien conscients qu&#x2019;acc&#xE9;der &#xE0; leurs &#xE9;l&#xE9;ments est bien plus lent que si les cl&#xE9;s se suivaient dans leur ordre naturel. La raison est que s&#x2019;il manque trop d&#x2019;&#xE9;l&#xE9;ments le moteur V8 choisira de ne pas leur allouer d&#x2019;espace m&#xE9;moire. &#xC0; la place, il pr&#xE9;f&#xE9;rera les g&#xE9;rer au sein d&#x2019;un tableau associatif, ce qui est bien plus lent en terme de temps d&#x2019;acc&#xE8;s.</p>
<p><a href="http://jsperf.com/sparse-arrays-vs-full-arrays" class="spip_out">Test comparatifs entre tableaux &#xE0; cl&#xE9;s &#xE9;parses et cl&#xE9; cons&#xE9;cutives</a></p>
<p>Ce test montre que la somme des &#xE9;l&#xE9;ments d&#x2019;un tableau aux cl&#xE9;s cons&#xE9;cutives est plus rapide. Le fait qu&#x2019;il contienne ou non des z&#xE9;ros ne fait aucune diff&#xE9;rence.</p>
<h2>Tableaux &#xAB;&#xA0;trou&#xE9;s&#xA0;&#xBB; contre tableaux &#xAB;&#xA0;pleins&#xA0;&#xBB;</h2>
<p>&#xC9;vitez de trouer vos tableaux (en supprimant des &#xE9;l&#xE9;ments ou en faisant <code>a[x] = foo</code> (dans le cas o&#xF9; <code>x &gt; a.length</code>). Il suffit qu&#x2019;un seul &#xE9;l&#xE9;ment manque dans un tableau pour ralentir le code.</p>
<p><a href="http://jsperf.com/packed-vs-holey-arrays" class="spip_out">Test entre tableaux &#xAB;&#xA0;trou&#xE9;s&#xA0;&#xBB; et tableaux &#xAB;&#xA0;pleins&#xA0;&#xBB;</a></p>
<h2>Allouer l&#x2019;espace du tableau &#xE0; l&#x2019;initialisation ou &#xE0; la vol&#xE9;e</h2>
<p>Ne pr&#xE9;-allouez pas les tableaux dont la taille exc&#xE9;derait 64 000 &#xE9;l&#xE9;ments. Faites-les plut&#xF4;t grossir &#xE0; la vol&#xE9;e. Avant d&#x2019;interpr&#xE9;ter les tests sur ce point, rappelez-vous bien que leurs r&#xE9;sultats sont fortement d&#xE9;pendants du moteur JavaScript test&#xE9;.</p>
<dl class="spip_document_407 spip_documents spip_documents_center">
<dt><a href="https://lh4.googleusercontent.com/2C8fjpV7SYj_EBBTnJEMBaEC9c3BdL0fBiryH6eAxW-P0zvtktOp0jM3wawH6qnPe2MDSLDqElPeDS3OvMfJBn2rRQ98J7GBKtD2wCGtNXXrpbt5bwgQ"><img src="http://www.pompage.net/traduction/local/cache-vignettes/L150xH97/2C8fjpV7SYj_0a9e-2d412.jpg" width="150" alt=""></a></dt>
</dl>
<p><i>Test des tableaux initialement vides par rapport aux tableaux pr&#xE9;-allou&#xE9;s.</i></p>
<p>Nitro (Safari) traite les tableaux pr&#xE9;-allou&#xE9;s plus favorablement. Cependant, c&#x2019;est le contraire pour les autres moteurs (V8 et <span>Spider Monkey</span>) pour lesquels allouer l&#x2019;espace &#xE0; la vol&#xE9;e est plus efficace.</p>
<p><a href="http://jsperf.com/pre-allocated-arrays" class="spip_out">Tester les tableaux pr&#xE9;-allou&#xE9;s</a></p>
<pre><code>// Tableau vide
var arr = [];
for (var i = 0; i &lt; 1000000; i++) { arr[i] = i;
} // Tableau pr&#xE9;-dimensionn&#xE9;
var arr = new Array(1000000);
for (var i = 0; i &lt; 1000000; i++) { arr[i] = i;
}</code></pre><h2>Optimiser vos applications</h2>
<p>Dans le monde des applications Web, la performance est primordiale. Aucun utilisateur ne souhaite qu&#x2019;un tableur prenne plusieurs secondes pour faire la somme des cellules d&#x2019;une colonne, ou attendre plusieurs minutes que s&#x2019;affiche le r&#xE9;sum&#xE9; de leurs messages. C&#x2019;est pourquoi rendre votre code aussi v&#xE9;loce que possible est parfois critique.</p>
<dl class="spip_document_408 spip_documents spip_documents_center">
<dt><img src="https://lh6.googleusercontent.com/_O7Nq1qZ17dAYP5oZiQmWY5mCq8Euu_2eA8aK5er_I7PTC0QwvPJIg3tKteiY2vVmz1gX66FSV5xff-Ps2DWqGNBxHwLlk-vWuKSH2ISFZpcT5v4HvpW" width="500" alt=""></dt>
</dl>
<p><i>Cr&#xE9;dits de l&#x2019;image&#xA0;: <a href="http://www.flickr.com/photos/perolofforsberg/6691744587/" class="spip_out">Per Olof Forsberg</a></i></p>
<p>Bien qu&#x2019;il soit utile de comprendre et d&#x2019;am&#xE9;liorer les performances de vos applications, cela peut &#xEA;tre difficile. Nous recommandons la d&#xE9;marche suivante pour venir &#xE0; bout des points qui vous ralentissent&#xA0;:</p>
<ol class="spip"><li> Mesurer&#xA0;: rep&#xE9;rer les points les plus lents de votre application (&#xA0;45%)</li><li> Comprendre&#xA0;: trouver ce qui provoque cette lenteur (&#xA0;45%)</li><li> Corriger&#xA0;! (&#xA0;10%)</li></ol>
<p>Quelques-uns des outils suivants peuvent vous aider dans cette t&#xE2;che.</p>
<h2>Mesurer la performance</h2>
<p>Il existe de nombreuses fa&#xE7;ons de tester les performances de vos bouts de code en JavaScript mais en r&#xE8;gle g&#xE9;n&#xE9;rale on effectue une comparaison entre deux chronom&#xE9;trages. L&#x2019;&#xE9;quipe de <a href="http://jsperf.com/" class="spip_out">jsPerf</a> a propos&#xE9; un mod&#xE8;le qui a &#xE9;t&#xE9; ensuite repris par les suites de tests que sont <a href="http://www.webkit.org/perf/sunspider/sunspider.html" class="spip_out">SunSpider</a> et <a href="http://krakenbenchmark.mozilla.org/" class="spip_out">Kraken</a>.</p>
<pre><code>var tempsTotal, depart = new Date, iterations = 1000;
while (iterations--) { // Placer ici le code a tester
}
// tempsTotal &#x2192; Nombre de millisecondes necessaires // pour executer les instructions 1000 fois
tempsTotal = new Date - depart;</code></pre>
<p>Dans cet exemple le code &#xE0; tester est plac&#xE9; dans une boucle et ex&#xE9;cut&#xE9; un nombre d&#xE9;termin&#xE9; de fois. Une fois termin&#xE9;, la date de d&#xE9;but d&#x2019;ex&#xE9;cution est soustraite &#xE0; la date de fin d&#xE9;terminant le temps &#xE9;coul&#xE9; durant le test.</p>
<p>N&#xE9;anmoins cette fa&#xE7;on de faire des tests est tr&#xE8;s r&#xE9;ductrice, surtout si vous voulez mesurer dans diff&#xE9;rents navigateurs et environnements. Le ramasse-miette lui-m&#xEA;me peut avoir des effets sur vos r&#xE9;sultats. M&#xEA;me en affinant la mesure en utilisant <code>window.performance</code>, vous pouvez &#xEA;tre s&#xFB;rs que des impond&#xE9;rables viendront fausser les mesures.</p>
<p>Que vous &#xE9;criviez simplement des tests sur des parties de votre code, des suites de tests ou une librairie compl&#xE8;te, il y a bien plus de facteurs &#xE0; prendre en compte que vous ne pouvez l&#x2019;imaginer. Pour un guide plus complet sur les tests de performance, je vous recommande fortement de lire <a href="http://mathiasbynens.be/notes/javascript-benchmarking" class="spip_out"><span>Javascript Benchmarking</span></a> de Mathias Bynens et John-David Dalton.</p>
<h2>Le profilage</h2>
<p>Les outils pour d&#xE9;veloppeur de Chrome permettent de <a href="https://developers.google.com/chrome-developer-tools/docs/profiles" class="spip_out">profiler ais&#xE9;ment vos applications</a>. Vous pouvez utiliser cette fonctionnalit&#xE9; pour identifier les fonctions les plus chronophages pour les optimiser en priorit&#xE9;. Cette d&#xE9;marche est importante car la moindre petite modification de votre code peut avoir des cons&#xE9;quences importantes en termes de performance.</p>
<dl class="spip_document_409 spip_documents spip_documents_center">
<dt><img src="https://lh5.googleusercontent.com/VV_Q0smFYBKpTq3ldSFppG-p4Uic1bpF2xzO_hAfvqjthTVUej6u3HyjVpoqSDdkC-7ii_njsI70HO35mxZc-IUoyIE103nAEG25UBIzCUPYUtu0xThh" width="600" alt=""></dt>
</dl>
<p><i>L&#x2019;onglet &#x201C;profilage&#x201D; des outils pour d&#xE9;veloppeur de Chrome.</i></p>
<p>Pour commencer le profilage, il faut obtenir une mesure de base des performances actuelles de votre application. Cette derni&#xE8;re peut &#xEA;tre obtenue gr&#xE2;ce &#xE0; l&#x2019;onglet &#x201C;<span>timeline</span>&#x201D; (frise chronologique). Cela nous permettra de mesurer le temps effectif d&#x2019;ex&#xE9;cution de notre application.</p>
<p>L&#x2019;onglet &#x201C;<span>profiles</span>&#x201D; nous donnera lui une vue plus d&#xE9;taill&#xE9;e de ce qui se passe vraiment dans notre application. Le profilage processeur (<span>JavaScript <abbr>CPU</abbr> profile</span>) nous permet de savoir combien de temps processeur est utilis&#xE9; par notre application, le profilage des s&#xE9;lecteurs <abbr>CSS</abbr> (<span><abbr>CSS</abbr> selector profile</span>) nous renseigne sur le temps n&#xE9;cessaire pour calculer les s&#xE9;lecteurs <abbr>CSS</abbr>, et les captures de pile de m&#xE9;moire <span>Heap</span> (<span>Heap snapshots</span>) nous permet de savoir combien nos objets consomment de m&#xE9;moire.</p>
<p>L&#x2019;utilisation de ces outils nous permet d&#x2019;ajuster et de profiler &#xE0; nouveaux notre code afin de v&#xE9;rifier si les changements r&#xE9;alis&#xE9;s ont bien un impact positif sur les performances.</p>
<dl class="spip_document_411 spip_documents spip_documents_center">
<dt><img src="https://lh3.googleusercontent.com/7hD4UAk_zr2Vcu91RuhmsOsiG8NjrKs-GoOlgObXKsdPEH1-Il27aAjEk3AmqmpEPZm2SN05Zi3_xuvTPl1b5HJNebO3bIlzMmrpmW2lMwx6Nhd1drYb" width="600" alt=""></dt>
</dl>
<p>Pour une bonne introduction au profilage dans Chrome, lisez <a href="http://coding.smashingmagazine.com/2012/06/12/javascript-profiling-chrome-developer-tools/" class="spip_out"><span>Javascript Profiling With The Chrome Developper Tools</span></a> par Zack Grossbart.</p>
<p>Petit truc&#xA0;: dans l&#x2019;id&#xE9;al, il vaut mieux &#xE9;viter que les extensions et applications install&#xE9;es dans Chrome n&#x2019;influent sur vos r&#xE9;sultats. Pour cela, ex&#xE9;cutez Chrome avec l&#x2019;option <code>--user-data-dir &lt;un_r&#xE9;pertoire_vide&gt;</code>. Cela suffit la plupart du temps, mais si vous avez besoin d&#x2019;aller plus loin les options de V8 vous seront d&#x2019;une grande aide.</p>
<h2>Eviter les fuites m&#xE9;moire&#xA0;: trois techniques pour les d&#xE9;celer</h2>
<p>Les &#xE9;quipes internes de Google, celle de Gmail par exemple, utilisent &#xE9;norm&#xE9;ment les outils pour d&#xE9;veloppeurs de Chrome pour traquer et &#xE9;liminer les fuites m&#xE9;moires.</p>
<dl class="spip_document_412 spip_documents spip_documents_center">
<dt><img src="https://lh3.googleusercontent.com/KLG0BbASOYyCW-TQImgS-amc76d5b6DLfdlkyP_F-TM8HeMrJ8X2i7ziZnzGdjbXINAM39hc14NYcYHqA2kWHummXvIBlKEcA4Roah2oV4K_6A0i2UDN" width="600" alt=""></dt>
</dl>
<p><i>Statistiques d&#x2019;utilisation m&#xE9;moire dans les outils pour d&#xE9;veloppeurs.</i></p>
<p>Les statistiques utilis&#xE9;es par nos &#xE9;quipes sont par exemple&#xA0;: l&#x2019;utilisation m&#xE9;moire priv&#xE9;e, la taille de la pile <span>Heap</span> de JavaScript, le nombre de n&#x153;uds <abbr>DOM</abbr>, l&#x2019;effacement des donn&#xE9;es, le nombre de gestionnaires d&#x2019;&#xE9;v&#xE8;nements et le comportement du ramasse-miette. Les habitu&#xE9;s des architectures dirig&#xE9;es par les &#xE9;v&#xE9;nements seront peut-&#xEA;tre contents d&#x2019;apprendre que la plupart de nos probl&#xE8;mes venaient de l&#x2019;utilisation de <code>listen()</code> non suivi d&#x2019;<code>unlisten()</code> (<span>Closure</span>) et par l&#x2019;absence de <code>dispose()</code> pour les objets cr&#xE9;ant des gestionnaires d&#x2019;&#xE9;v&#xE8;nements.</p>
<p>Par chance, les outils pour d&#xE9;veloppeurs peuvent nous aider &#xE0; localiser ces probl&#xE8;mes et Loreena Lee a cr&#xE9;&#xE9; une pr&#xE9;sentation fantastique, qui d&#xE9;taille la <a href="https://docs.google.com/presentation/d/1wUVmf78gG-ra5aOxvTfYdiLkdGaR9OhXRnOlIcEmu2s/pub?start=false&amp;loop=false&amp;delayms=3000#slide=id.g1d65bdf6_0_0" class="spip_out">technique des trois captures</a> pour d&#xE9;tecter les fuites m&#xE9;moires, que je ne vous recommenderai jamais assez de lire.</p>
<p>La base de la technique est d&#x2019;enregistrer un certain nombre d&#x2019;action utilisateur dans votre application, forcer l&#x2019;&#xE9;xecution du ramasse-miette, v&#xE9;rifier si le nombre de noeuds <abbr>DOM</abbr> reste sup&#xE9;rieur &#xE0; la normale puis comparer trois captures successives de la pile <span>Heap</span> pour d&#xE9;tecter s&#x2019;il y a une fuite de m&#xE9;moire.</p>
<h2>Gestion de la m&#xE9;moire dans les applications sans rechargement de page</h2>
<p>La gestion de la m&#xE9;moire est tr&#xE8;s importante au sein des applications qui ne sont jamais recharg&#xE9;es (avec AngularJS, Backbone, Ember..). En effet, une fuite de m&#xE9;moire devient rapidement handicapantes. C&#x2019;est un &#xE9;norme pi&#xE8;ge au sein des applications pour appareils mobiles (qui sont limit&#xE9;s en m&#xE9;moire) comme les clients mails ou les applications de r&#xE9;seaux sociaux qui ont une dur&#xE9;e d&#x2019;utilisation tr&#xE8;s importante. Comme on dit&#xA0;: <strong>de grands pouvoirs impliquent de grandes responsabilit&#xE9;s</strong>.</p>
<p>Il y a plusieurs fa&#xE7;on de se pr&#xE9;munir de cela. Dans <span>Backbone</span>, assurez-vous de toujours d&#xE9;r&#xE9;f&#xE9;rencer vos vues et r&#xE9;f&#xE9;rences en utilisant <code>dispose()</code> (actuellement disponible dans <a href="https://github.com/documentcloud/backbone/blob/master/backbone.js#L1234" class="spip_out">Backbone (edge)</a>).</p>
<p>Cette fonction, ajout&#xE9;e tout r&#xE9;cemment, supprime tout gestionnaire associ&#xE9; aux &#xE9;v&#xE8;nements de la vue ainsi qu&#x2019;&#xE0; toute collection ou &#xE9;couteur de mod&#xE8;le pour lesquels la vue a &#xE9;t&#xE9; pass&#xE9;e en troisi&#xE8;me argument (en tant que contexte de <code>callback</code>). <code>dispose()</code> est &#xE9;galement appel&#xE9; par la m&#xE9;thode <code>remove()</code> de la vue, et s&#x2019;occupe de nettoyer la majorit&#xE9; de l&#x2019;utilisation m&#xE9;moire lorsque <a href="https://github.com/documentcloud/backbone/blob/master/backbone.js#L1235" class="spip_out">la vue est supprim&#xE9;e de l&#x2019;&#xE9;cran</a>. D&#x2019;autres librairies, comme Ember, <a href="https://github.com/emberjs/ember.js/blob/d8f76a7fdde741ae3d1e07b12df9cb6718170e48/packages/ember-handlebars/lib/helpers/binding.js#L296" class="spip_out">suppriment les observateurs</a> quand ils d&#xE9;tectent que les &#xE9;l&#xE9;ments ont &#xE9;t&#xE9;s supprim&#xE9;s de la vue pour &#xE9;viter les fuites m&#xE9;moires.</p>
<p>Voici les conseils avis&#xE9;s de Derick Bailey&#xA0;:</p>
<blockquote class="spip">
<p>Plut&#xF4;t que d&#x2019;essayer de comprendre comment fonctionnent les &#xE9;v&#xE8;nements en terme de r&#xE9;f&#xE9;rences, suivez simplement les r&#xE8;gles standard de gestion de la m&#xE9;moire en JavaScript et vous serez tranquilles. Si vous chargez des donn&#xE9;es dans une collection <span>Backbone</span> pleine d&#x2019;objets Utilisateurs et voulez que cette collection soit nettoy&#xE9;e par la suite afin de ne plus utiliser de m&#xE9;moire, vous devez supprimer toute r&#xE9;f&#xE9;rence &#xE0; cette collection et aux objets qu&#x2019;elle contient. Une fois toutes les r&#xE9;f&#xE9;rences supprim&#xE9;es, la m&#xE9;moire sera lib&#xE9;r&#xE9;e. Ce n&#x2019;est rien d&#x2019;autre que le comportement standard du ramasse-miette de JavaScript.</p>
</blockquote>
<p>Dans son article, Derick couvre la plupart des <a href="http://lostechies.com/derickbailey/2012/03/19/backbone-js-and-javascript-garbage-collection/" class="spip_out">erreurs communes de gestion de m&#xE9;moire</a> li&#xE9;es &#xE0; l&#x2019;utilisation de <span>Backbone</span> et comment les corriger.</p>
<p>Il y a &#xE9;galement un <a href="https://github.com/felixge/node-memory-leak-tutorial" class="spip_out">bon tutoriel disponible pour d&#xE9;boguer les fuites m&#xE9;moires</a> dans Node &#xE9;crit par Felix Geisend&#xF6;rfer. Particuli&#xE8;rement int&#xE9;ressant si votre application Node est utilis&#xE9;e dans le contexte d&#x2019;un application sans rechargement de page.</p>
<h2>Eviter les r&#xE9;agencements</h2>
<p>Quand un navigateur doit recalculer la position et la forme des &#xE9;l&#xE9;ments d&#x2019;un document afin de les redessiner, il effectue ce qu&#x2019;on appelle un <span>reflow</span> (r&#xE9;agencement). C&#x2019;est une op&#xE9;ration qui bloque l&#x2019;interface utilisateur, il est donc important de savoir comment limiter le temps qu&#x2019;elle dure.</p>
<dl class="spip_document_413 spip_documents spip_documents_center">
<dt><img src="https://lh6.googleusercontent.com/wJllbq8Yl2jsKuxr_JguUmRYQjeMnJ0DziRPC1QKgimdoxba_Jshge3vKvtS98W264ac9Sp9f3kLBvWTv3rzD9rOx9pXHJGSlFP3uuv9-1NeObX9fgFg" width="600" alt=""></dt>
</dl>
<p><i>Graphique montrant une succession de r&#xE9;agencements</i></p>
<p>Il vaut mieux regrouper les m&#xE9;thodes qui <a href="http://stackoverflow.com/questions/510213/when-does-reflow-happen-in-a-dom-environment" class="spip_out">provoquent des r&#xE9;agencements</a> ou un <span>repaint</span> (changement d&#x2019;apparence d&#x2019;un ou plusieurs &#xE9;l&#xE9;ments, sans changements de dimensions) et les &#xE9;viter autant que possible. Si c&#x2019;est n&#xE9;cessaire, effectuez de pr&#xE9;f&#xE9;rence vos modification en-dehors du <abbr>DOM</abbr>. Utilisez pour cela un <a href="http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-B63ED1A3" class="spip_out"><code>DocumentFragment</code></a> qui fonctionne &#xE0; l&#x2019;identique mais est bien plus l&#xE9;ger. Voyez-le comme une fa&#xE7;on d&#x2019;extraire une portion de l&#x2019;arbre du document ou de cr&#xE9;er un nouveau &#xAB;&#xA0;fragment&#xA0;&#xBB; de document. Plut&#xF4;t que de constamment ajouter des n&#x153;uds au document principal via le <abbr>DOM</abbr>, nous pouvons construire un fragment de document avec ce dont nous avons besoin et l&#x2019;ins&#xE9;rer en une seule fois dans le <abbr>DOM</abbr>, ce qui &#xE9;vite des reflows successifs et inutiles.</p>
<p>Par exemple, &#xE9;crivons une fonction qui ajoute 20 &#xE9;l&#xE9;ments <code>div</code> &#xE0; un autre. Le faire en ajoutant le nouveau <code>div</code> aussit&#xF4;t qu&#x2019;il est cr&#xE9;&#xE9; risque de d&#xE9;clencher 20 r&#xE9;agencements.</p>
<pre><code>function ajouteDivs(element) { var div; for (var i = 0; i &lt; 20; i ++) { div = document.createElement(&apos;div&apos;); div.innerHTML = &apos;Coucou!&apos;; element.appendChild(div); }
}</code></pre>
<p>Pour contourner ce probl&#xE8;me, nous pouvons utiliser un <code>DocumentFragment</code> auquel nous ajouterons chaque <code>div</code>. Quand nous int&#xE8;grerons ce fragment au document principal, tous ses n&#x153;uds enfants seront ajout&#xE9;s en une fois, ce qui ne provoque qu&#x2019;un seul recalcul.</p>
<pre><code>function ajouteDivs(element) { var div; // Cr&#xE9;e un fragment de document vide var fragment = document.createDocumentFragment(); for (var i = 0; i &lt; 20; i ++) { div = document.createElement(&apos;a&apos;); div.innerHTML = &apos;Coucou!&apos;; fragment.appendChild(div); } element.appendChild(fragment);
}</code></pre>
<p>Vous pouvez en savoir plus sur ce th&#xE8;me avec les articles <a href="https://developers.google.com/speed/articles/javascript-dom" class="spip_out"><span>Make the Web Faster</span></a>, <a href="http://blog.tojicode.com/2012/03/javascript-memory-optimization-and.html" class="spip_out"><span>JavaScript Memory Optimization</span></a> et <a href="http://gent.ilcore.com/2011/08/finding-memory-leaks.html" class="spip_out"><span>Finding Memory Leaks</span></a>.</p>
<h2>D&#xE9;tecter les fuites de m&#xE9;moires dans JavaScript</h2>
<p>Afin d&#x2019;aider &#xE0; la d&#xE9;tection des fuites m&#xE9;moires, deux de mes coll&#xE8;gues Googlers (Marja H&#xF6;ltt&#xE4; et Jochen Eisinger) ont d&#xE9;velopp&#xE9; un outil qui fonctionne avec les outils pour d&#xE9;veloppeurs de Google Chrome (avec le protocole d&#x2019;inspection &#xE0; distance pour &#xEA;tre pr&#xE9;cis). L&#x2019;outil r&#xE9;cup&#xE8;re plusieurs captures de la pile <span>heap</span> pour d&#xE9;tecter les objets provoquant des fuites m&#xE9;moire.</p>
<dl class="spip_document_414 spip_documents spip_documents_center">
<dt><img src="https://lh3.googleusercontent.com/s_4W5xFT7d7BnC6xdjDjcfr5MpNCGve4vdE3aZsoThqNYhD5tVo1-2-Y-fCnl4uzy5-_sXGYOHACc8a6TML0J3IUVt9tXaijISnrUW6CdBZob9GkPkXH" width="600" alt=""></dt>
</dl>
<p><i>Un outil d&#xE9;tectant les fuites m&#xE9;moire dans Javascript</i></p>
<p>Il existe un billet complet sur la <a href="http://google-opensource.blogspot.de/2012/08/leak-finder-new-tool-for-javascript.html" class="spip_out">fa&#xE7;on d&#x2019;utiliser l&#x2019;outil</a> et je vous encourage &#xE0; le lire ou &#xE0; jeter un &#x153;il sur la <a href="https://code.google.com/p/leak-finder-for-javascript/" class="spip_out">page du projet <span>Leak Finder</span></a>.</p>
<p>Si vous vous demandez pourquoi un tel outil n&#x2019;est pas directement int&#xE9;gr&#xE9; aux outils pour d&#xE9;veloppeurs, sachez qu&#x2019;il y a deux raisons. La premi&#xE8;re, c&#x2019;est qu&#x2019;&#xE0; l&#x2019;origine l&#x2019;outil a &#xE9;t&#xE9; d&#xE9;velopp&#xE9; pour nous aider &#xE0; capturer des sc&#xE9;narios sp&#xE9;cifiques dans la <span>Closure Library</span>, et la deuxi&#xE8;me c&#x2019;est qu&#x2019;il correspond plus &#xE0; un outil externe (ou peut-&#xEA;tre un jour en tant qu&#x2019;extension, si nous mettons en place une <abbr>API</abbr> de profilage de la pile <span>Heap</span>).</p>
<h2>Les options de V8 pour d&#xE9;boguer les optimisations et le ramasse-miette</h2>
<p>Chrome supporte le passage d&#x2019;options directement &#xE0; V8 via l&#x2019;option <code>js-flags</code> pour obtenir plus d&#x2019;informations sur les optimisations effectu&#xE9;es par le moteur. Par exemple, cette commande trace les optimisations de V8&#xA0;:</p>
<p><code>/Applications/Google Chrome/Google Chrome&quot; --js-flags=&quot;--trace-opt --trace-deopt</code></p>
<p>Si vous &#xEA;tes sur Windows, ex&#xE9;cutez&#xA0;:</p>
<p><code>chrome.exe --js-flags=&quot;--trace-opt --trace-deopt&quot;</code></p>
<p>Voici les options de d&#xE9;bogage disponibles pour d&#xE9;velopper avec Chrome&#xA0;:</p>
<ol class="spip"><li> <code>trace-opt</code>&#xA0;: enregistre dans un fichier le nom des fonctions optimis&#xE9;es et montre &#xE0; quels endroits V8 ne peut optimiser le code faute de pouvoir le cerner correctement.</li><li> <code>trace-deopt</code>&#xA0;: enregistre dans un fichier les portions de code qui ont &#xE9;t&#xE9; d&#xE9;optimis&#xE9;es pendant l&#x2019;ex&#xE9;cution.</li><li> <code>trace-gc</code>&#xA0;: enregistre dans un fichier chaque appel au ramasse-miette.</li></ol>
<p>Dans ces fichiers, V8 indique les fonctions optimis&#xE9;es avec une ast&#xE9;risque (<code>*</code>) et celles qui ne le sont pas avec un tilde (<code>~</code>).</p>
<p>Si vous souhaitez en apprendre plus au sujet des options de V8 et de la fa&#xE7;on dont il fonctionne je vous recommande fortement de jeter un &#x153;il &#xE0; <a href="http://mrale.ph/blog/2011/12/18/v8-optimization-checklist.html" class="spip_out">l&#x2019;excellent billet</a> de Vyacheslav Egorov qui r&#xE9;sume les meilleurs ressources disponibles actuellement sur le sujet.</p>
<h2>Mesures temporelles pr&#xE9;cises&#xA0;: <abbr>HRT</abbr> et <span>Navigation Time <abbr>API</abbr></span></h2>
<p><a href="http://www.w3.org/TR/hr-time/" class="spip_out"><span>High Resolution Time</span> (<abbr>HRT</abbr>)</a> est une interface JavaScript d&#xE9;livrant une mesure du temps avec une pr&#xE9;cision de l&#x2019;ordre du millioni&#xE8;me de microseconde, non sujette aux variations de l&#x2019;horloge syst&#xE8;me et aux ajustements de cette derni&#xE8;re par l&#x2019;utilisateur. Voyez cela comme une fa&#xE7;on plus pr&#xE9;cise de faire des tests de performance que la m&#xE9;thode vue pr&#xE9;c&#xE9;demment avec <code>new Date()</code> et <code>Date.now()</code>. C&#x2019;est tr&#xE8;s pratique quand vous &#xE9;crivez des tests de performance.</p>
<dl class="spip_document_416 spip_documents spip_documents_center">
<dt><img src="https://lh5.googleusercontent.com/9qxlMZ8PU-PIkekzdQuqMp95NqrF_JTtJmiCl8mWtF7LAjHU-hHAHg_aDJVPi3FlGZe0bSUiA4F6_EIQDUto-GCkA1ozeV6Imb4CXkHMgR07CXAjUsjp" width="578" alt=""></dt>
</dl>
<p><i><span>High Resolution Time</span> (<abbr>HRT</abbr>) indique le temps avec une pr&#xE9;cision au millioni&#xE8;me de milliseconde pr&#xE8;s.</i></p>
<p><abbr>HRT</abbr> est disponible dans Chrome (version stable) via <code>window.performance.webkitNow()</code>, mais la version canary de Chrome propose d&#xE9;j&#xE0; une version non-pr&#xE9;fix&#xE9;e (<code>window.performance.now()</code>) Paul Irish a r&#xE9;dig&#xE9; une <a href="http://updates.html5rocks.com/2012/08/When-milliseconds-are-not-enough-performance-now" class="spip_out">pr&#xE9;sentation plus compl&#xE8;te de <code>window.performance</code></a> sur HTML5Rocks.</p>
<p>Nous avons une mesure temporelle pr&#xE9;cise, mais <i>quid</i> de la mesure pr&#xE9;cise de performance sur le web&#xA0;?</p>
<p>Eh bien, nous avons maintenant &#xE0; notre disposition la <a href="https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/Overview.html" class="spip_out"><span>Navigation Timing <abbr>API</abbr></span></a>. Cette <abbr>API</abbr> propose une fa&#xE7;on simple d&#x2019;obtenir des mesures pr&#xE9;cises et d&#xE9;taill&#xE9;es, r&#xE9;cup&#xE9;r&#xE9;es durant le chargement de la page et sa pr&#xE9;sentation aux utilisateurs. Les mesures sont expos&#xE9;es via l&#x2019;objet <code>window.performance.timing</code> que vous pouvez simplement obtenir par le biais de la console Javascript.</p>
<dl class="spip_document_417 spip_documents spip_documents_center">
<dt><img src="https://lh5.googleusercontent.com/MZXBB_oDX3yHC19byvXewTfnDXne5diUb4WNG7iu4-8cFo6dNODrLmpC-p0VWtf43Kfs4TMp0MYCaAcSJVqIveFpkw2ZDGagujRGNPZPiqVxiul_jqLL" width="600" alt=""></dt>
</dl>
<p><i>Mesure de performances affich&#xE9;es dans la console JavaScript.</i></p>
<p>On peut ais&#xE9;ment extraire diverses informations tr&#xE8;s pratiques des donn&#xE9;es ci-dessus. Par exemple, la latence du r&#xE9;seau via <code>responseEnd - fetchStart</code>, le temps n&#xE9;cessaire au chargement de la page &#xE0; partir de sa r&#xE9;ception via <code>loadEventEnd - responseEnd</code> et le temps n&#xE9;cessaire pour passer du clic &#xE0; l&#x2019;affichage de la nouvelle page via <code>loadEventEnd - navigationStart</code>.</p>
<p>Comme vous pouvez le voir ci-dessus, une propri&#xE9;t&#xE9; <code>performance.memory</code> est disponible. Elle donne des informations sur l&#x2019;usage de la m&#xE9;moire par JavaScript comme par exemple la taille de la pile <span>Heap</span>.</p>
<p>Pour plus d&#x2019;informations sur la <span>Navigation Timing <abbr>API</abbr></span>, lisez le super billet de Sam Dutton&#xA0;: <a href="http://www.html5rocks.com/en/tutorials/webperformance/basics/" class="spip_out"><span>Measuring Page Load Speed With Navigation Timing</span></a>.</p>
<h2><code>About:memory</code> et <code>about:tracing</code></h2>
<p><code>about:tracing</code> dans Google Chrome affiche les performances du navigateur lui-m&#xEA;me, et enregistre l&#x2019;activit&#xE9; de chaque <span>thread</span>, de chaque onglet et de chaque processus.</p>
<dl class="spip_document_418 spip_documents spip_documents_center">
<dt><img src="https://lh5.googleusercontent.com/r8N-F6YK0GdUTJtJ9QkyNZWuv5UTbxhAdk0ewKJ3gckG2-M4Wym8C5HxNkRIJPs0r4qSU_yvvEkEpgJqQdgJ68NgYiBu8r25pIvcGsL1j-W6j-4gkWBW" width="600" alt=""></dt>
</dl>
<p><i><code>about:tracing</code> montre les performances du navigateur.</i></p>
<p>Ce qui est tr&#xE8;s pratique c&#x2019;est que cet outile permet de capturer et profiler les m&#xE9;canismes internes de Chrome de mani&#xE8;re &#xE0; pouvoir ajuster et optimiser votre JavaScript de mani&#xE8;re appropri&#xE9;e.</p>
<p>Lili Thompson a &#xE9;crit un excellent article destin&#xE9; aux d&#xE9;veloppeurs de jeux vid&#xE9;os HTML5 sur la fa&#xE7;on d&#x2019;<a href="http://www.html5rocks.com/en/tutorials/games/abouttracing/" class="spip_out">utiliser <code>about:tracing</code> pour le profilage de WebGL</a>. Les autres d&#xE9;veloppeurs y trouveront aussi des informations utiles.</p>
<p>Naviguer &#xE0; l&#x2019;int&#xE9;rieur de la page <code>about:memory</code> de Chrome est &#xE9;galement d&#x2019;une grande aide. Il montre l&#x2019;utilisation exacte de chaque onglet ce qui peut aider &#xE0; d&#xE9;tecter facilement les applications causant des fuites de m&#xE9;moire.</p>
<h2>Conclusion</h2>
<p>Comme nous l&#x2019;avons vu, <strong>il y a nombre de subtilit&#xE9;s &#xE0; conna&#xEE;tre dans le monde de la performance des moteurs JavaScript</strong>, et pas de solution miracle. Ce n&#x2019;est qu&#x2019;en confrontant vos optimisations &#xE0; des tests grandeur nature que vous pourrez estimer les gains en performance les plus importants. De plus, savoir comment les moteurs JavaScript interpr&#xE8;tent et optimisent votre code peut vous fournir des pistes pour le d&#xE9;veloppement de vos applications.</p>
<p><strong>Mesurez, comprenez, corrigez&#xA0;!</strong> ...et recommencez.</p>
<dl class="spip_document_419 spip_documents spip_documents_center">
<dt><img src="https://lh5.googleusercontent.com/FaISwq_SHQqFahSfLXi9q8R_mmVdpqXxz4AhpdqFyRhPGQewTXfmF0UcARNLoydbZ7yNj0JqSBGrRSlluaYDDUDDFlPRaDeiPVSE56uTgP5hue3N_9sn" width="496" alt=""></dt>
</dl>
<p>Cr&#xE9;dits image&#xA0;: <a href="http://www.flickr.com/photos/38891164@N02/4266609887/" class="spip_out">Sally Hunter</a></p>
<p>Soyez conscients de l&#x2019;importance de la performance, mais sans aller jusqu&#x2019;aux micros optimisations qui pourraient nuire &#xE0; la simplicit&#xE9; de votre code. Par exemple, certains d&#xE9;veloppeurs pr&#xE9;f&#xE8;rent utiliser <code>.forEach</code> et <code>Object.keys</code> plut&#xF4;t que les boucles <code>for</code> et <code>for...in</code>, malgr&#xE9; leur lenteur, pour pouvoir garder la main sur le contexte. Sachez distinguer les optimisations qui sont absolument indispensables &#xE0; votre application de celles dont elle peut se passer.</p>
<p>Aussi, soyez bien conscient que bien que les moteurs Javascript continuent &#xE0; am&#xE9;liorer leurs performances, la vraie bataille pour les performances se situe au niveau du <abbr>DOM</abbr>. Les r&#xE9;agencements et les recalculs graphiques (<span>reflows</span> et <span>repaints</span>) doivent &#xEA;tre &#xE9;vit&#xE9;s &#xE0; tout prix, souvenez-vous donc de ne toucher au <abbr>DOM</abbr> que quand c&#x2019;est absolument n&#xE9;cessaire. Et allez-y mollo sur le r&#xE9;seau&#xA0;: les requ&#xEA;tes <abbr>HTTP</abbr> sont pr&#xE9;cieuses, surtout dans un contexte de mobilit&#xE9;, vous devriez exploiter le maximum du potentiel du cache <abbr>HTTP</abbr> pour r&#xE9;duire le poids de vos ressources.</p>
<p>Garder tout cela &#xE0; l&#x2019;esprit vous assure de tirer le meilleur parti des informations contenues dans ce billet. J&#x2019;esp&#xE8;re que vous l&#x2019;avez trouv&#xE9; utile&#xA0;!</p> <p class="moreInfo"> L&apos;article original a &#xE9;t&#xE9; relu par Jakob Kummerow, Michael Starzinger; Sindre Sorhus, Mathias Bynens, John-David Dalton et Paul Irish. </p> </div></div>]]></description>
      <link>http://www.pompage.net/traduction/javascript-rapide-et-efficace</link>
      <guid>http://www.pompage.net/traduction/javascript-rapide-et-efficace</guid>
      <pubDate>Tue, 26 Aug 2014 10:08:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Écrire du JavaScript véloce et à faible empreinte mémoire]]></title>
      <description><![CDATA[<div><div id="article"> <p class="signature">Par <a href="http://addyosmani.com/">Addy Osmani</a> </p> <p>Qu&#x2019;il s&#x2019;agisse de V8, de <a href="https://developer.mozilla.org/en-US/docs/SpiderMonkey" class="spip_out"><span>Spider Monkey</span></a> (Firefox), de <a href="http://my.opera.com/ODIN/blog/carakan-faq" class="spip_out">Caracan</a> (Op&#xE9;ra) ou de <a href="http://en.wikipedia.org/wiki/Chakra_(JScript_engine)" class="spip_out">Chakra</a> (<abbr>IE</abbr>), conna&#xEE;tre le fonctionnement interne du moteur JavaScript vous permettra de mieux optimiser vos applications. Cela ne veut pas dire qu&#x2019;il faut que vous optimisiez votre code pour un seul moteur ou navigateur&#xA0;: ne faites jamais cela&#xA0;!</p>
<p>Vous devriez plut&#xF4;t vous poser ce type de questions&#xA0;:</p>
<ol class="spip"><li> Que puis-je faire pour rendre mon code plus efficient&#xA0;?</li><li> Quelles optimisations communes sont faites par les moteurs JavaScript&#xA0;?</li><li> Quelles sont les limites de l&#x2019;optimisation de ces moteurs&#xA0;? Le ramasse-miette est-il bien capable de lib&#xE9;rer la m&#xE9;moire comme je m&#x2019;y attend&#xA0;?</li></ol><dl class="spip_document_401 spip_documents spip_documents_center">
<dt><img src="https://lh6.googleusercontent.com/ueM0mcKufwF0HEYKLCJ0JDntHX77xlHPH-5L4FPtUDZqMAnMbZ-ab9EZWZKmHVz0gAJE2lqaXfcfnCB3Jn12Aqj5iZQ8oxR8KF9VDyRDHbxA9isjDHRw" width="700" alt=""></dt>
</dl>
<p><i>Les sites v&#xE9;loces, comme les voitures de course, n&#xE9;cessitent des outils sp&#xE9;cialis&#xE9;s. Cr&#xE9;dti de l&#x2019;image&#xA0;: <a href="http://dhybridcars.com/toyota-hybrid/2013-scion-fr-s-sexy-sport-car/media/2013-scion-fr-s-speed-gauge-img-8/" class="spip_out">dHybridcars</a></i></p>
<p>Nombreux sont les pi&#xE8;ges quand on souhaite produire du code rapide et &#xE9;conome en m&#xE9;moire. Cet article propose donc d&#x2019;explorer plusieurs techniques test&#xE9;es et approuv&#xE9;es pour &#xE9;crire du code qui s&#x2019;ex&#xE9;cute efficacement.</p>
<h2>Comment fonctionne JavaScript au sein de V8&#xA0;?</h2>
<p>Bien qu&#x2019;il soit possible d&#x2019;&#xE9;crire des applications volumineuses sans comprendre le fonctionnement des moteurs JavaScript, n&#x2019;importe quel conducteur vous dira qu&#x2019;il a d&#xE9;j&#xE0; jet&#xE9; un &#x153;il sous le capot au moins une fois. &#xC9;tant donn&#xE9; que Chrome est mon navigateur pr&#xE9;f&#xE9;r&#xE9;, je vais vous parler quelque peu de son moteur Javascript. Le c&#x153;ur de V8 est compos&#xE9; de diff&#xE9;rentes pi&#xE8;ces&#xA0;:</p>
<ol class="spip"><li> Un compilateur de base qui parcourt votre JavaScript et g&#xE9;n&#xE8;re du code machine avant qu&#x2019;il soit ex&#xE9;cut&#xE9;, plut&#xF4;t que d&#x2019;ex&#xE9;cuter du <code>bytecode</code> ou simplement de l&#x2019;interpr&#xE9;ter. Ce code natif n&#x2019;est pour le moment pas tr&#xE8;s optimis&#xE9;.</li><li> V8 repr&#xE9;sente vos objets dans un mod&#xE8;le objet. Les objets sont repr&#xE9;sent&#xE9;s au sein de tableaux associatifs en JavaScript, mais dans V8, ils sont repr&#xE9;sent&#xE9;s avec les classes cach&#xE9;es (<a href="https://developers.google.com/v8/design" class="spip_out"><span>hidden classes</span></a>) qui sont un syst&#xE8;me de typage interne pour optimiser la recherche de r&#xE9;f&#xE9;rences.</li><li> Le profileur &#xE0; l&#x2019;ex&#xE9;cution surveille le syst&#xE8;me en fonctionnement et identifie les fonctions &#xAB;&#xA0;chaudes&#xA0;&#xBB; (le code qui est fr&#xE9;quemment ex&#xE9;cut&#xE9;[a]).</li><li> Un compilateur optimis&#xE9; recompile et optimise les fonctions chaudes identifi&#xE9;es par le profileur &#xE0; l&#x2019;ex&#xE9;cution et proc&#xE8;de &#xE0; des optimisations comme l&#x2019;<span>inlining</span> (le remplacement des appels de fonction par le corps de la fonction appel&#xE9;e).</li><li> V8 supporte le retour sur optimisation[b] ce qui signifie que le compilateur peut r&#xE9;voquer le code optimis&#xE9; s&#x2019;il d&#xE9;couvre que les optimisations s&#x2019;av&#xE8;rent contre-productives.</li><li> V8 a &#xE9;galement un ramasse-miette. Comprendre son fonctionnement peut &#xEA;tre tout aussi important qu&#x2019;optimiser son JavaScript.</li></ol><h2>Le ramasse-miette</h2>
<p>Le ramasse-miette est un syst&#xE8;me de gestion de la m&#xE9;moire. Il introduit la notion de collecteur qui tente de lib&#xE9;rer la m&#xE9;moire occup&#xE9;e par des objets qui ne sont plus utilis&#xE9;s. Dans un langage &#xE0; ramasse-miette tel que JavaScript les objets qui sont toujours r&#xE9;f&#xE9;renc&#xE9;s par votre application ne sont pas effac&#xE9;s.</p>
<p>D&#xE9;r&#xE9;f&#xE9;rencer manuellement les objets s&#x2019;av&#xE8;re inutile la plupart du temps. En d&#xE9;clarant simplement les variables &#xE0; l&#x2019;endroit o&#xF9; elles sont n&#xE9;cessaires (id&#xE9;alement le plus localement possible&#xA0;; &#xE0; l&#x2019;int&#xE9;rieur de la fonction o&#xF9; elles sont utilis&#xE9;es plut&#xF4;t que dans un contexte parent), cela devrait fonctionner tout seul.</p>
<dl class="spip_document_403 spip_documents spip_documents_center">
<dt><img src="https://lh4.googleusercontent.com/_M6Bmqzz2I2BiLo5kOFxzbhf2wl9hzHnf7ORv8_0WfGFBjvWUxnhsC2uuR4_gwOWENVX-nfqcn_goyQWZgTteSc-tN5OVyPwM6YopGVqP0cCqNHulDGg" width="500" alt=""></dt>
</dl>
<p>Le ramasse-miette en train de lib&#xE9;rer de la m&#xE9;moire. Cr&#xE9;dits de l&#x2019;image&#xA0;: <a href="http://www.flickr.com/photos/26817893@N05/2864644153/" class="spip_out">Valtteri M&#xE4;ki</a>.</p>
<p>Il est impossible de forcer l&#x2019;intervention du ramasse-miette en Javascript. Ne pensez pas que c&#x2019;est dommage, car le processus de lib&#xE9;ration de la m&#xE9;moire est contr&#xF4;l&#xE9; par l&#x2019;environnement d&#x2019;ex&#xE9;cution et il sait g&#xE9;n&#xE9;ralement mieux que vous quand un nettoyage s&#x2019;impose.</p>
<h2>Les mythes du d&#xE9;r&#xE9;f&#xE9;rencement</h2>
<p>Dans un bon nombre de discussions en ligne &#xE0; propos de la lib&#xE9;ration de m&#xE9;moire en JavaScript, le mot-cl&#xE9; <code>delete</code> a amen&#xE9; certains d&#xE9;veloppeurs &#xE0; penser qu&#x2019;ils pouvaient forcer le d&#xE9;r&#xE9;f&#xE9;rencement en l&#x2019;utilisant, alors qu&#x2019;il est seulement suppos&#xE9; retirer une cl&#xE9; d&#x2019;un tableau de hachage. &#xC9;vitez d&#x2019;utiliser <code>delete</code> si vous le pouvez. Dans l&#x2019;exemple ci-dessous, <code>delete o.x</code> fait plus de mal que de bien contrairement aux apparences. Il change la classe cach&#xE9;e de l&#x2019;objet <code>o</code> et le transforme en objet g&#xE9;n&#xE9;rique plus lent.</p>
<pre><code>var o = { x: 1 };
delete o.x; // true
o.x; // undefined</code></pre>
<p>Cela dit, vous pouvez &#xEA;tre certains de trouver <code>delete</code> dans la plupart des biblioth&#xE8;ques JavaScript populaires. Il a une utilit&#xE9; au sein du langage. Ce qu&#x2019;il faut retenir, c&#x2019;est qu&#x2019;il modifie la structure des objets &#xAB;&#xA0;chauds&#xA0;&#xBB; &#xE0; l&#x2019;ex&#xE9;cution. Les moteurs JavaScript rep&#xE8;rent ces objets chauds et tentent de les optimiser. C&#x2019;est plus facile si la structure de ces objets &#xE9;volue peu au cours de leur utilisation, or <code>delete</code> impose des changements.</p>
<p>Il y a &#xE9;galement des erreurs d&#x2019;interpr&#xE9;tation sur le fonctionnement de <code>null</code>. Attribuer &#xE0; la r&#xE9;f&#xE9;rence d&#x2019;un objet la valeur <code>null</code> ne d&#xE9;truit pas l&#x2019;objet associ&#xE9;. Cela d&#xE9;truit en r&#xE9;alit&#xE9; la r&#xE9;f&#xE9;rence &#xE0; cet objet. Il vaut mieux utiliser <code>o.x=null</code> plut&#xF4;t que le mot-cl&#xE9; <code>delete</code>, mais c&#x2019;est rarement utile.</p>
<pre><code>var o = { x: 1 };
o = null;
o; // null
o.x; // TypeError</code></pre>
<p>Si cette r&#xE9;f&#xE9;rence est la derni&#xE8;re pointant sur cet objet, alors il devient &#xE9;ligible pour &#xEA;tre lib&#xE9;r&#xE9; de la m&#xE9;moire. Mais si ce n&#x2019;&#xE9;tait pas la derni&#xE8;re r&#xE9;f&#xE9;rence &#xE0; ce dernier, cet objet reste atteignable et ne sera donc pas d&#xE9;truit.</p>
<p>Une autre chose importante est que les variables globales ne sont pas d&#xE9;truites par le ramasse-miette durant toute la dur&#xE9;e de vie de votre page. Que celles-ci soient affich&#xE9;es une fraction de seconde ou plusieurs heures, les variables affect&#xE9;es au contexte global d&#x2019;ex&#xE9;cution du JavaScript resteront en m&#xE9;moire.</p>
<p><code>var monEspaceDeNomGlobal = {};</code></p>
<p>Les variables globales ne sont d&#xE9;truites que lorsque vous rafra&#xEE;chissez la page, naviguez vers une autre page, fermez l&#x2019;onglet ou votre navigateur. Les variables rattach&#xE9;es au contexte d&#x2019;une fonction sont d&#xE9;truites quand elles tombent en dehors du contexte courant. Cela signifie qu&#x2019;elles sont d&#xE9;truites quand les fonctions sont retir&#xE9;es de la pile d&#x2019;ex&#xE9;cution et qu&#x2019;il n&#x2019;y a plus de r&#xE9;f&#xE9;rences pointant vers elles.</p>
<h2>Quelques r&#xE8;gles g&#xE9;n&#xE9;rales</h2>
<p>Pour donner l&#x2019;opportunit&#xE9; au ramasse-miette de lib&#xE9;rer la m&#xE9;moire occup&#xE9;e par vos variables le plus t&#xF4;t possible, ne gardez pas de r&#xE9;f&#xE9;rence &#xE0; vos objets plus longtemps que n&#xE9;cessaire. La plupart du temps, cela se fait automatiquement. Mais voici quelques r&#xE8;gles &#xE0; garder en t&#xEA;te&#xA0;:</p>
<ol class="spip"><li> Comme dit plus haut, d&#xE9;clarez vos variables dans un contexte appropri&#xE9; plut&#xF4;t que de les d&#xE9;r&#xE9;f&#xE9;rencer manuellement. En d&#x2019;autres termes, au lieu de cr&#xE9;er une r&#xE9;f&#xE9;rence globale que vous devrez d&#xE9;r&#xE9;f&#xE9;rencer plus tard, optez pour une variable locale qui sera d&#xE9;truite lorsque son contexte sera sorti de la pile. Vous aurez alors un code plus propre, et moins de choses &#xE0; g&#xE9;rer.</li><li> Assurez-vous de bien supprimer vos &#xE9;couteurs d&#x2019;&#xE9;v&#xE9;nements des n&#x153;uds <abbr>DOM</abbr> d&#xE8;s lors qu&#x2019;ils deviennent inutiles, en particulier juste avant de retirer les n&#x153;uds du document.</li><li> Si vous cachez localement certaines donn&#xE9;es, assurez-vous de les nettoyer quand elles ne sont plus utiles ou de programmer leur suppression pour &#xE9;viter que de trop grands volumes de donn&#xE9;es ne soient stock&#xE9;es en m&#xE9;moire.</li></ol><h2>Les fonctions</h2>
<p>Maintenant, int&#xE9;ressons-nous aux fonctions. Comme dit pr&#xE9;c&#xE9;demment, le ramasse-miette fonctionne par r&#xE9;cup&#xE9;ration de pages m&#xE9;moires qui ne sont plus r&#xE9;f&#xE9;renc&#xE9;es par l&#x2019;application. Pour mieux illustrer notre propos, voyons quelques exemples.</p>
<pre><code>function foo() { var bar = new GrosObjet(); bar.appelQuelconque();
}</code></pre>
<p>Quand le fil d&#x2019;ex&#xE9;cution sort de la fonction <code>foo</code>, l&#x2019;objet vers lequel pointe <code>bar</code> est automatiquement &#xE9;ligible pour &#xEA;tre lib&#xE9;r&#xE9; de la m&#xE9;moire car il n&#x2019;existe plus aucune r&#xE9;f&#xE9;rence &#xE0; cet objet.</p>
<p>Comparons cet exemple au code suivant&#xA0;:</p>
<pre><code>function foo() { var bar = new GrosObjet(); bar.appelQuelconque(); return bar;
} //somewhere else
var b = foo();</code></pre>
<p>Nous avons maintenant une r&#xE9;f&#xE9;rence &#xE0; l&#x2019;objet qui survit &#xE0; l&#x2019;appel de la fonction <code>foo</code> et qui persistera tant qu&#x2019;aucun autre objet ne sera assign&#xE9; &#xE0; la variable <code>b</code> (ou tant que <code>b</code> sera dans le contexte d&#x2019;ex&#xE9;cution courant).</p>
<h2>Les <span>closures</span></h2>
<p>Quand vous trouvez une fonction qui contient la d&#xE9;claration d&#x2019;une autre fonction et retourne une r&#xE9;f&#xE9;rence vers cette fonction, cette derni&#xE8;re aura acc&#xE8;s au contexte de sa fonction parente m&#xEA;me si sa fonction parente est retir&#xE9;e de la pile d&#x2019;ex&#xE9;cution. C&#x2019;est ce qu&#x2019;on appelle une <a href="http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/" class="spip_out"><span>closure</span></a>&#xA0;; c&#x2019;est une expression qui a acc&#xE8;s aux variables situ&#xE9;es dans un contexte particulier. Par exemple&#xA0;:</p>
<pre><code>function somme(x) { function faitLaSomme(y) { return x + y; }; return faitLaSomme;
} // Usage
var sommeA = somme(4);
var sommeB = sommeA(3);
console.log(sommeB); // Renvoie 7</code></pre>
<p>L&#x2019;objet de type <code>function</code> cr&#xE9;&#xE9; lors de l&#x2019;appel &#xE0; <code>somme()</code> ne peut &#xEA;tre d&#xE9;truit puisqu&#x2019;il est toujours r&#xE9;f&#xE9;renc&#xE9; au sein du contexte global. Il est donc toujours r&#xE9;f&#xE9;renc&#xE9; et reste tout ce qu&#x2019;il y a de plus accessible via <code>sommeA(n)</code>.</p>
<p>Int&#xE9;ressons-nous &#xE0; un autre exemple. Pouvons-nous acc&#xE9;der &#xE0; <code>longueChaine</code>&#xA0;?</p>
<pre><code>var a = function () { var longueChaine = new Array(1000000).join(&apos;x&apos;); return function () { return longueChaine; };
}();</code></pre>
<p>Oui, bien s&#xFB;r, via <code>a()</code>, donc elle n&#x2019;a pas &#xE9;t&#xE9; d&#xE9;truite. Et dans l&#x2019;exemple suivant&#xA0;?</p>
<pre><code>var a = function () { var petiteChaine = &apos;x&apos;; var longueChaine = new Array(1000000).join(&apos;x&apos;); return function (n) { return petiteChaine; };
}();</code></pre>
<p>On ne peut plus y acc&#xE9;der et elle est &#xE9;ligible pour &#xEA;tre d&#xE9;truite par le ramasse-miette.</p>
<h2>Les <span>timers</span></h2>
<p>On trouve beaucoup de fuites de m&#xE9;moires dans les boucles, mais <code>setTimeout()</code>/<code>setInterval()</code> ne sont pas mal non plus pour &#xE7;a.</p>
<p>Consid&#xE9;rons l&#x2019;exemple suivant&#xA0;:</p>
<pre><code>var monObjet = { callMeMaybe: function () { var maReference = this; var val = setTimeout(function () { console.log(&apos;Tu perds ton temps!&apos;); maReference.callMeMaybe(); }, 1000); }
};</code></pre>
<p>Si nous appelons <code>monObjet.callMeMaybe();</code> pour mettre en route le <span>timer</span>, nous pourrons voir toutes les secondes dans la console le message suivant&#xA0;: &#xAB;&#xA0;Tu perds ton temps&#xA0;!&#xA0;&#xBB; Si nous tentons&#xA0;:</p>
<p><code>monObjet = null;</code></p>
<p>Le <span>timer</span> sera toujours actif. monObjet ne sera pas d&#xE9;truit puisque la <span>closure</span> transmise &#xE0; <code>setTimeout</code> doit &#xEA;tre conserv&#xE9;e pour rester accessible. Par effet d&#x2019;entra&#xEE;nement, monObjet est conserv&#xE9; puisqu&#x2019;il encapsule <code>maReference</code>. Il en irait de m&#xEA;me si nous avions pass&#xE9; cette <span>closure</span> &#xE0; n&#x2019;importe quelle autre fonction conservant une r&#xE9;f&#xE9;rence &#xE0; cet objet.</p>
<p>C&#x2019;est &#xE9;galement important de garder &#xE0; l&#x2019;esprit que les r&#xE9;f&#xE9;rences &#xE0; l&#x2019;int&#xE9;rieur des appels &#xE0; <code>setTimeout</code>/<code>setInterval</code>, comme pour les fonctions, ne pourront &#xEA;tre d&#xE9;truites qu&#x2019;apr&#xE8;s la compl&#xE8;te ex&#xE9;cution de ces derni&#xE8;res.</p>
<h2>Soyez &#xE0; l&#x2019;&#xE9;coute des probl&#xE8;mes de performance</h2>
<p>On ne le r&#xE9;p&#xE9;tera jamais assez&#xA0;: n&#x2019;optimisez votre code que lorsque vous constatez des probl&#xE8;mes de performance. On trouve des tas de micro-benchmarks d&#xE9;montrant que &#xAB;&#xA0;N&#xA0;&#xBB; est plus rapide que &#xAB;&#xA0;M&#xA0;&#xBB; dans V8, mais confront&#xE9; &#xE0; la r&#xE9;alit&#xE9; d&#x2019;un vrai module de code ou d&#x2019;une application concr&#xE8;te, l&#x2019;impact de ces optimisations pourrait &#xEA;tre bien moins important que ce que vous pensiez obtenir.</p>
<dl class="spip_document_404 spip_documents spip_documents_center">
<dt><img src="https://lh3.googleusercontent.com/LHIP7xx4hrh8IRBWsxrsB62SMjtJVEBn-n7jrarXfYklh4Dom5KK1q4i6OQ77mS9GCuxgs0mvq0wPjTUQ0sQ9uwCg0UkvtEECV9JfUhrav6FaM4im8pl" width="500" alt=""></dt>
</dl>
<p>En faire trop peut &#xEA;tre aussi probl&#xE9;matique que de ne rien faire du tout. Cr&#xE9;dits image&#xA0;: <a href="https://www.flickr.com/photos/tim_uk/7717078488/" class="spip_out">Tim Sheerman-Chase</a></p>
<p>Imaginons que nous voulions cr&#xE9;er un module qui&#xA0;:</p>
<ol class="spip"><li> utilise une source de donn&#xE9;e locale contenant des &#xE9;l&#xE9;ments avec un identifiant num&#xE9;rique,</li><li> affiche un tableau contenant ces donn&#xE9;es,</li><li> assigne des gestionnaires d&#x2019;&#xE9;v&#xE9;nements qui commutent une classe quand un utilisateur clique sur une cellule.</li></ol>
<p>Il y a plusieurs chose &#xE0; prendre en compte dans ce probl&#xE8;me, bien qu&#x2019;il soit tr&#xE8;s simple &#xE0; r&#xE9;soudre. Comment stockerons-nous les donn&#xE9;es&#xA0;? Comment g&#xE9;n&#xE9;rer[e] le tableau de mani&#xE8;re efficiente et l&#x2019;ins&#xE9;rer dans le <abbr>DOM</abbr>&#xA0;? Comment pouvons-nous capturer les &#xE9;v&#xE9;nements &#xE9;mis par le tableau de mani&#xE8;re optimale&#xA0;?</p>
<p>Une premi&#xE8;re m&#xE9;thode (na&#xEF;ve) serait de stocker chaque silo de donn&#xE9;es disponible dans des objets que nous regrouperions dans un tableau associatif. On pourrait utiliser jQuery pour parcourir ce tableau de donn&#xE9;es, g&#xE9;n&#xE9;rer le tableau et ensuite, l&#x2019;ins&#xE9;rer dans le <abbr>DOM</abbr>. Enfin, on pourrait utiliser les &#xE9;couteurs d&#x2019;&#xE9;v&#xE9;nements pour programmer le comportement d&#xE9;sir&#xE9; au clic sur une cellule.</p>
<p><strong>Ne faites SURTOUT PAS comme &#xE7;a&#xA0;!</strong></p>
<pre><code>var moduleA = function () { return { data: dataArrayObject, init: function () { this.addTable(); this.addEvents(); }, addTable: function () { for (var i = 0; i &lt; rows; i++) { $tr = $(&apos;&lt;tr&gt;&lt;/tr&gt;&apos;); for (var j = 0; j &lt; this.data.length; j++) { $tr.append(&apos;&lt;td&gt;&apos; + this.data[j][&apos;id&apos;] + &apos;&lt;/td&gt;&apos;); } $tr.appendTo($tbody); } }, addEvents: function () { $(&apos;table td&apos;).on(&apos;click&apos;, function () { $(this).toggleClass(&apos;active&apos;); }); } };
}();</code></pre>
<p>C&#x2019;est basique, mais &#xE7;a fait ce qui a &#xE9;t&#xE9; demand&#xE9;.</p>
<p>Dans ce cas, cependant, nous ne faisons qu&#x2019;utiliser la propri&#xE9;t&#xE9; ID de type num&#xE9;rique qui aurait &#xE9;t&#xE9; plus avantageusement stock&#xE9;e dans un simple tableau. Point int&#xE9;ressant, utiliser <code>documentFragment</code> et les m&#xE9;thodes natives du <abbr>DOM</abbr> est plus optimal que d&#x2019;utiliser jQuery de cette mani&#xE8;re pour g&#xE9;n&#xE9;rer notre tableau. Enfin, bien s&#xFB;r, &#xE9;couter les &#xE9;v&#xE9;nements au niveau du tableau aurait &#xE9;t&#xE9; plus performant que d&#x2019;&#xE9;couter les clics sur chaque cellule.</p>
<p>Notez que jQuery fait appel &#xE0; <code>DocumentFragment</code> en interne, mais dans notre exemple le code appelle la fonction <code>append()</code> &#xE0; chaque it&#xE9;ration de la boucle, cloisonnement qui emp&#xEA;che une bonne optimisation. Cela ne devrait pas &#xEA;tre si catastrophique mais n&#x2019;oubliez pas de passer votre code au banc d&#x2019;essai pour vous en assurer.</p>
<p>Dans notre cas, proc&#xE9;der &#xE0; ces am&#xE9;liorations engendrera de bons gains en performance comme nous pouvons nous y attendre. &#xC9;couter les &#xE9;v&#xE9;nements au niveau du tableau[g] apporte une am&#xE9;lioration int&#xE9;ressante, quant &#xE0; l&#x2019;<a href="http://jsperf.com/first-pass" class="spip_out">utilisation de <code>DocumentFragment</code></a>, elle dope v&#xE9;ritablement les performances.</p>
<pre><code>var moduleD = function () { return { data: dataArray, init: function () { this.addTable(); this.addEvents(); }, addTable: function () { var td, tr; var frag = document.createDocumentFragment(); var frag2 = document.createDocumentFragment(); for (var i = 0; i &lt; rows; i++) { tr = document.createElement(&apos;tr&apos;); for (var j = 0; j &lt; this.data.length; j++) { td = document.createElement(&apos;td&apos;); td.appendChild(document.createTextNode(this.data[j])); frag2.appendChild(td); } tr.appendChild(frag2); frag.appendChild(tr); } tbody.appendChild(frag); }, addEvents: function () { $(&apos;table&apos;).on(&apos;click&apos;, &apos;td&apos;, function () { $(this).toggleClass(&apos;active&apos;); }); } };
}();</code></pre>
<p>Nous pourrions &#xE9;galement tenter d&#x2019;autres approches pour am&#xE9;liorer les performances. Vous avez probablement lu quelque part qu&#x2019;utiliser le prototypage est plus optimal que de cr&#xE9;er un module (et nous l&#x2019;avons confirm&#xE9; au d&#xE9;but de cet article), ou entendu que les moteurs de gabarits (<span>templates</span>) JavaScript sont tr&#xE8;s performants. Ils le sont parfois, mais utilisez-les pour clarifier votre code et pr&#xE9;compilez vos gabarits. Testons et voyons si ces pratiques sont aussi int&#xE9;ressantes que &#xE7;a.</p>
<pre><code>var moduleG = function () {}; moduleG.prototype.data = dataArray;
moduleG.prototype.init = function () { this.addTable(); this.addEvents();
};
moduleG.prototype.addTable = function () { var template = _.template($(&apos;#template&apos;).text()); var html = template({&apos;data&apos; : this.data}); $tbody.append(html);
};
moduleG.prototype.addEvents = function () { $(&apos;table&apos;).on(&apos;click&apos;, &apos;td&apos;, function () { $(this).toggleClass(&apos;active&apos;); });
}; var modG = new moduleG();</code></pre>
<p>Comme on pouvait s&#x2019;y attendre, les b&#xE9;n&#xE9;fices en terme de performance sont n&#xE9;gligeables ici. Les <a href="http://jsperf.com/second-pass" class="spip_out">moteurs de <span>template</span> et le prototypage</a> ne nous apportent rien de plus que ce que nous avions auparavant. Cela dit, ce n&#x2019;est pas vraiment pour les performances que les d&#xE9;veloppeurs modernes utilisent ces outils. C&#x2019;est plut&#xF4;t la clart&#xE9;, le mod&#xE8;le d&#x2019;h&#xE9;ritage et la maintenabilit&#xE9; du code qui les motive.</p>
<p>Certains probl&#xE8;mes plus complexes concernent <a href="http://jsperf.com/canvas-drawimage-vs-webgl-drawarrays/6" class="spip_out">l&#x2019;efficience du dessin avec canvas</a> et <a href="http://jsperf.com/canvas-pixel-manipulation/30" class="spip_out">la manipulation de pixels</a> avec ou sans <a href="http://jsperf.com/typed-arrays-for-pixel-manipulation" class="spip_out">tableaux typ&#xE9;s</a>.</p>
<p>Jetez toujours un &#x153;il critique aux micro-benchmarks avant d&#x2019;appliquer leurs conclusions &#xE0; vos applications. Certains d&#x2019;entre vous pourraient se souvenir de l&#x2019;article <a href="http://jsperf.com/dom-vs-innerhtml-based-templating/473" class="spip_out"><span>Javascript templating shoot-off</span></a> et <a href="http://jsperf.com/javascript-templating-shootoff-extended/26" class="spip_out">la pol&#xE9;mique qui s&#x2019;en est suivie</a>. Vous devez vous assurer que les r&#xE9;sultats de vos tests ne sont pas influenc&#xE9;s par des contraintes inexistantes dans une application concr&#xE8;te. Testez &#xE9;galement ces optimisations dans leur contexte final.</p>
<h2>Quelques astuces d&#x2019;optimisation pour V8</h2>
<p>Lister toutes les optimisations r&#xE9;alisables pour V8 s&#x2019;&#xE9;loignerait du sujet de cet article, mais voici cependant quelques astuces qui m&#xE9;ritent d&#x2019;&#xEA;tre cit&#xE9;es. En les gardant &#xE0; l&#x2019;esprit vous serez en mesure de limiter l&#x2019;&#xE9;criture de code non-performant.</p>
<ol class="spip"><li> Certaines pratiques telles que l&#x2019;utilisation de <code>try...catch</code> emp&#xEA;chent V8 de se lancer dans la moindre optimisation. Pour plus d&#x2019;information sur les fonctions qui peuvent &#xEA;tre optimis&#xE9;es et celles qui ne le peuvent pas, utilisez d8, un petit utilitaire en ligne de commande fourni avec V8, et l&#x2019;option <code>--trace-opt file.js</code>.</li><li> Si la vitesse d&#x2019;ex&#xE9;cution vous importe, essayez de garder vos fonctions monomorphes&#xA0;; assurez-vous que les variables (tableaux, objets, param&#xE8;tres de fonction) ne contiennent que des &#xE9;l&#xE9;ments du m&#xEA;me type. Par exemple, &#xE9;vitez ce genre de code (NdT&#xA0;: en clair, faites comme si JavaScript &#xE9;tait un langage typ&#xE9;)&#xA0;:</li></ol><pre><code>function ajoute(x, y) { return x+y;
} ajoute(1, 2); ajoute(&apos;a&apos;,&apos;b&apos;); ajoute(mon_objet, undefined);</code></pre><ol class="spip"><li> Ne r&#xE9;utilisez pas des &#xE9;l&#xE9;ments d&#xE9;sinitialis&#xE9;s ou supprim&#xE9;s. Le r&#xE9;sultat sera identique, mais votre code sera bien plus lent.</li><li> N&#x2019;&#xE9;crivez pas de fonctions gigantesques car elles sont plus difficiles &#xE0; optimiser.</li></ol>
<p>Pour plus de trucs et astuces, je vous recommande de visualiser la vid&#xE9;o <a href="http://www.youtube.com/watch?v=UJPdhx5zTaw" class="spip_out"><span>Breaking the Javascript speed limit with V8</span></a> de <span>Daniel Clifford</span> au Google <abbr>IO</abbr>. Je vous recommande &#xE9;galement <a href="http://floitsch.blogspot.co.uk/2012/03/optimizing-for-v8-introduction.html" class="spip_out"><span>Optimizing For V8 - A Series</span></a> dans la foul&#xE9;e.</p>
<h2>Objets vs Tableaux&#xA0;: que dois-je utiliser&#xA0;?</h2><ol class="spip"><li> Si vous souhaitez stocker un paquet de nombres ou une liste d&#x2019;objets de m&#xEA;me nature, utilisez les tableaux.</li><li> Si ce dont vous avez besoin s&#xE9;mantiquement est un objet avec un lot de propri&#xE9;t&#xE9;s (de types diff&#xE9;rents), utilisez un objet avec des propri&#xE9;t&#xE9;s. C&#x2019;est tr&#xE8;s efficient en terme de m&#xE9;moire et assez rapide d&#x2019;acc&#xE8;s.</li><li> Qu&#x2019;elles soient stock&#xE9;es dans des objets ou des tableaux, les cl&#xE9;s num&#xE9;riques sont plus rapides d&#x2019;acc&#xE8;s lors de vos it&#xE9;rations que les propri&#xE9;t&#xE9;s des objets.</li><li> Les propri&#xE9;t&#xE9;s des objets sont tr&#xE8;s complexes&#xA0;: elle peuvent &#xEA;tre cr&#xE9;es avec des accesseurs (getters/setters) et utiliser diff&#xE9;rents type d&#x2019;&#xE9;num&#xE9;rabilit&#xE9; et d&#x2019;acc&#xE8;s en &#xE9;criture. Les &#xE9;l&#xE9;ments d&#x2019;un tableau sont au contraire peu personnalisables&#xA0;; ils existent ou pas, point final. Au niveau du moteur JavaScript, cela permet plus d&#x2019;optimisations en terme d&#x2019;organisation de la m&#xE9;moire pour repr&#xE9;senter sa structure. C&#x2019;est d&#x2019;autant plus b&#xE9;n&#xE9;fique quand ces tableaux contiennent des nombres. Par exemple, si vous avez besoin de stocker des vecteurs, ne d&#xE9;finissez pas une classe avec des propri&#xE9;t&#xE9;s <code>x</code>, <code>y</code> et <code>z</code>&#xA0;; utilisez plut&#xF4;t un tableau.</li></ol>
<p>Il existe une diff&#xE9;rence majeure entre les objets et les tableaux en JavaScript, c&#x2019;est la propri&#xE9;t&#xE9; magique <code>length</code>. Si vous g&#xE9;rez cette propri&#xE9;t&#xE9; vous-m&#xEA;me, vos objets seront tout aussi rapides que des tableaux dans V8.</p>
<h2>Quelques astuces pour l&#x2019;utilisation des objets</h2><ol class="spip"><li> Cr&#xE9;ez vos objets via leur fonction constructeur. Cela permet d&#x2019;assigner &#xE0; chaque objet la m&#xEA;me classe cach&#xE9;e et &#xE9;vite de changer cette derni&#xE8;re par la suite. Un autre point qui plaide pour cela est que c&#x2019;est l&#xE9;g&#xE8;rement plus rapide que son homologue <code>Object.create()</code>.</li><li> Il n&#x2019;y a aucune restriction sur le nombre de types d&#x2019;objets diff&#xE9;rents au sein d&#x2019;une application ou sur leur complexit&#xE9; (tout en restant raisonnable&#xA0;: les longues cha&#xEE;nes de prototype tendent &#xE0; ralentir l&#x2019;application, et les objets avec un nombre limit&#xE9; de propri&#xE9;t&#xE9; b&#xE9;n&#xE9;ficient d&#x2019;une repr&#xE9;sentation sp&#xE9;ciale leur conf&#xE9;rant une rapidit&#xE9; accrue). Pour les objets &#xAB;&#xA0;chauds&#xA0;&#xBB;, essayez de garder une cha&#xEE;ne de prototypes courte et peu de propri&#xE9;t&#xE9;s.</li></ol><h2>Clonage d&#x2019;objets</h2>
<p>Le clonage d&#x2019;objets est un probl&#xE8;me que rencontrent tous les d&#xE9;veloppeurs d&#x2019;applications. Bien qu&#x2019;il soit possible de tester ses diff&#xE9;rentes impl&#xE9;mentations pour observer comment elles se comportent avec le moteur V8, soyez prudents quand vous copiez quoi que ce soit. Copier des gros lots de donn&#xE9;es est g&#xE9;n&#xE9;ralement lent, ne le faites pas. Les boucles <code>for...in</code> sont particuli&#xE8;rement inadapt&#xE9;es pour cela car elles ont une sp&#xE9;cification d&#xE9;moniaque et ne seront jamais rapides pour des objets arbitraires, quel que soit le moteur JavaScript.</p>
<p>Si vous avez absolument besoin de copier des objets dans une partie critique de votre code en terme de performance (et que vous ne pouvez pas contourner le probl&#xE8;me), utilisez un tableau ou un &#x201C;constructeur de copie&#x201D; personnalis&#xE9; qui copie chaque propri&#xE9;t&#xE9; individuellement. C&#x2019;est probablement la mani&#xE8;re la plus rapide de le faire.</p>
<pre><code>function clone(original) { this.foo = original.foo; this.bar = original.bar;
}
var copie = new clone(original);</code></pre><h2>Les fonctions en cache gr&#xE2;ce aux modules</h2>
<p>Mettre vos fonctions en cache gr&#xE2;ce au patron de conception &#xAB;&#xA0;module&#xA0;&#xBB; peut am&#xE9;liorer les performances. Regardez l&#x2019;exemple ci-dessous, vous constaterez que l&#x2019;une ou l&#x2019;autre m&#xE9;thodes que vous avez l&#x2019;habitude de voir est plus lente car elle oblige &#xE0; copier les fonctions membres sans arr&#xEA;t.</p>
<p>Vous noterez &#xE9;galement que cette approche peut se r&#xE9;v&#xE9;ler significativement meilleure que de s&#x2019;appuyer sur la technique du prototype (et <a href="http://jsperf.com/prototypal-performance/12" class="spip_out">un test jsPerf le confirme</a>).</p>
<dl class="spip_document_406 spip_documents spip_documents_center">
<dt><a href="https://lh3.googleusercontent.com/7CLlAgAFc-agiZoak-1a3vE50u8Cf2r2eIXPiSJoWORMTcvabAo7mcyoAVRk9TwcQDnr3x7ggPSMI2UMFVHaCCQJm2O5opwq63vmAWHTH_kxM0iJmGMF"><img src="https://www.pompage.net/traduction/local/cache-vignettes/L150xH110/7CLlAgAFc-ag8952-3457a.png" width="150" alt=""></a></dt>
</dl>
<p><i>Mesure des gains de performance des techniques modules et prototypes.</i></p>
<p>Voici un test comparatif entre les patrons de conception module et prototype.</p>
<pre><code> // Technique &quot;Prototype&quot; Klass1 = function () {} Klass1.prototype.foo = function () { log(&apos;foo&apos;); } Klass1.prototype.bar = function () { log(&apos;bar&apos;); } // Technique &quot;Module&quot; Klass2 = function () { var foo = function () { log(&apos;foo&apos;); }, bar = function () { log(&apos;bar&apos;); }; return { foo: foo, bar: bar } } // Technique &quot;Module avec fonctions mises en cache&quot; var FooFunction = function () { log(&apos;foo&apos;); }; var BarFunction = function () { log(&apos;bar&apos;); }; Klass3 = function () { return { foo: FooFunction, bar: BarFunction } } // Tests comparatifs // Prototype var i = 1000, objs = []; while (i--) { var o = new Klass1() objs.push(new Klass1()); o.bar; o.foo; } // Module simple var i = 1000, objs = []; while (i--) { var o = Klass2() objs.push(Klass2()); o.bar; o.foo; } // Module avec fonctions mises en cache var i = 1000, objs = []; while (i--) { var o = Klass3() objs.push(Klass3()); o.bar; o.foo; }
// Le reste du code est sur jsPerf</code></pre><h2>Quelques astuces pour l&#x2019;utilisation des tableaux</h2>
<p>Maintenant, jetons un &#x153;il aux tableaux. En r&#xE8;gle g&#xE9;n&#xE9;rale, ne supprimez pas d&#x2019;&#xE9;l&#xE9;ments dans les tableaux. Cela oblige le moteur &#xE0; basculer vers une repr&#xE9;sentation interne plus lente. Quand les cl&#xE9;s d&#x2019;un tableau deviennent &#xE9;parpill&#xE9;es, le moteur est susceptible de le transformer en tableau associatif, qui est encore plus lent.</p>
<h2>Repr&#xE9;sentation litt&#xE9;rale des tableaux</h2>
<p>L&#x2019;initialisation litt&#xE9;rale d&#x2019;un tableau est pr&#xE9;f&#xE9;rable puisque cela donne un aper&#xE7;u &#xE0; la machine virtuelle de ce que vous souhaitez y stocker (taille, type de valeurs). Ils sont typiquement souhaitables pour des tableaux de taille petite &#xE0; moyenne.</p>
<pre><code>// Ici, le moteur JS voit que vous souhaitez un tableau contenant 4 nombres
var a = [1, 2, 3, 4]; // Ne faites pas &#xE7;a :
a = []; // Ici, le moteur n&apos;a aucune id&#xE9;e de ce qui ira dans le tableau
for(var i = 1; i &lt;= 4; i++) { a.push(i);
}</code></pre><h2>Stocker un seul type de donn&#xE9;es versus donn&#xE9;es mixtes</h2>
<p>Il n&#x2019;est jamais bon de m&#xE9;langer diff&#xE9;rents types de valeurs dans un m&#xEA;me tableau (des nombres, cha&#xEE;nes, objets, bool&#xE9;ens ou undefined, comme par exemple&#xA0;: <code>var arr = [1, &#x201C;1&#x201D;, undefined, true, &#x201C;true&#x201D;]</code>).</p>
<p><a href="http://jsperf.com/type-inference-performance/2" class="spip_out">Test de performance de l&#x2019;inf&#xE9;rence de type</a></p>
<p>Comme vous pouvez le constater, le meilleur r&#xE9;sultat est obtenu par le tableau d&#x2019;entiers.</p>
<h2>Tableaux &#xE0; cl&#xE9;s cons&#xE9;cutives ou non</h2>
<p>Quand vous utilisez des tableaux aux cl&#xE9;s non cons&#xE9;cutives, soyez bien conscients qu&#x2019;acc&#xE9;der &#xE0; leurs &#xE9;l&#xE9;ments est bien plus lent que si les cl&#xE9;s se suivaient dans leur ordre naturel. La raison est que s&#x2019;il manque trop d&#x2019;&#xE9;l&#xE9;ments le moteur V8 choisira de ne pas leur allouer d&#x2019;espace m&#xE9;moire. &#xC0; la place, il pr&#xE9;f&#xE9;rera les g&#xE9;rer au sein d&#x2019;un tableau associatif, ce qui est bien plus lent en terme de temps d&#x2019;acc&#xE8;s.</p>
<p><a href="http://jsperf.com/sparse-arrays-vs-full-arrays" class="spip_out">Test comparatifs entre tableaux &#xE0; cl&#xE9;s &#xE9;parses et cl&#xE9; cons&#xE9;cutives</a></p>
<p>Ce test montre que la somme des &#xE9;l&#xE9;ments d&#x2019;un tableau aux cl&#xE9;s cons&#xE9;cutives est plus rapide. Le fait qu&#x2019;il contienne ou non des z&#xE9;ros ne fait aucune diff&#xE9;rence.</p>
<h2>Tableaux &#xAB;&#xA0;trou&#xE9;s&#xA0;&#xBB; contre tableaux &#xAB;&#xA0;pleins&#xA0;&#xBB;</h2>
<p>&#xC9;vitez de trouer vos tableaux (en supprimant des &#xE9;l&#xE9;ments ou en faisant <code>a[x] = foo</code> (dans le cas o&#xF9; <code>x &gt; a.length</code>). Il suffit qu&#x2019;un seul &#xE9;l&#xE9;ment manque dans un tableau pour ralentir le code.</p>
<p><a href="http://jsperf.com/packed-vs-holey-arrays" class="spip_out">Test entre tableaux &#xAB;&#xA0;trou&#xE9;s&#xA0;&#xBB; et tableaux &#xAB;&#xA0;pleins&#xA0;&#xBB;</a></p>
<h2>Allouer l&#x2019;espace du tableau &#xE0; l&#x2019;initialisation ou &#xE0; la vol&#xE9;e</h2>
<p>Ne pr&#xE9;-allouez pas les tableaux dont la taille exc&#xE9;derait 64 000 &#xE9;l&#xE9;ments. Faites-les plut&#xF4;t grossir &#xE0; la vol&#xE9;e. Avant d&#x2019;interpr&#xE9;ter les tests sur ce point, rappelez-vous bien que leurs r&#xE9;sultats sont fortement d&#xE9;pendants du moteur JavaScript test&#xE9;.</p>
<dl class="spip_document_407 spip_documents spip_documents_center">
<dt><a href="https://lh4.googleusercontent.com/2C8fjpV7SYj_EBBTnJEMBaEC9c3BdL0fBiryH6eAxW-P0zvtktOp0jM3wawH6qnPe2MDSLDqElPeDS3OvMfJBn2rRQ98J7GBKtD2wCGtNXXrpbt5bwgQ"><img src="https://www.pompage.net/traduction/local/cache-vignettes/L150xH97/2C8fjpV7SYj_0a9e-2d412.jpg" width="150" alt=""></a></dt>
</dl>
<p><i>Test des tableaux initialement vides par rapport aux tableaux pr&#xE9;-allou&#xE9;s.</i></p>
<p>Nitro (Safari) traite les tableaux pr&#xE9;-allou&#xE9;s plus favorablement. Cependant, c&#x2019;est le contraire pour les autres moteurs (V8 et <span>Spider Monkey</span>) pour lesquels allouer l&#x2019;espace &#xE0; la vol&#xE9;e est plus efficace.</p>
<p><a href="http://jsperf.com/pre-allocated-arrays" class="spip_out">Tester les tableaux pr&#xE9;-allou&#xE9;s</a></p>
<pre><code>// Tableau vide
var arr = [];
for (var i = 0; i &lt; 1000000; i++) { arr[i] = i;
} // Tableau pr&#xE9;-dimensionn&#xE9;
var arr = new Array(1000000);
for (var i = 0; i &lt; 1000000; i++) { arr[i] = i;
}</code></pre><h2>Optimiser vos applications</h2>
<p>Dans le monde des applications Web, la performance est primordiale. Aucun utilisateur ne souhaite qu&#x2019;un tableur prenne plusieurs secondes pour faire la somme des cellules d&#x2019;une colonne, ou attendre plusieurs minutes que s&#x2019;affiche le r&#xE9;sum&#xE9; de leurs messages. C&#x2019;est pourquoi rendre votre code aussi v&#xE9;loce que possible est parfois critique.</p>
<dl class="spip_document_408 spip_documents spip_documents_center">
<dt><img src="https://lh6.googleusercontent.com/_O7Nq1qZ17dAYP5oZiQmWY5mCq8Euu_2eA8aK5er_I7PTC0QwvPJIg3tKteiY2vVmz1gX66FSV5xff-Ps2DWqGNBxHwLlk-vWuKSH2ISFZpcT5v4HvpW" width="500" alt=""></dt>
</dl>
<p><i>Cr&#xE9;dits de l&#x2019;image&#xA0;: <a href="http://www.flickr.com/photos/perolofforsberg/6691744587/" class="spip_out">Per Olof Forsberg</a></i></p>
<p>Bien qu&#x2019;il soit utile de comprendre et d&#x2019;am&#xE9;liorer les performances de vos applications, cela peut &#xEA;tre difficile. Nous recommandons la d&#xE9;marche suivante pour venir &#xE0; bout des points qui vous ralentissent&#xA0;:</p>
<ol class="spip"><li> Mesurer&#xA0;: rep&#xE9;rer les points les plus lents de votre application (&#xA0;45%)</li><li> Comprendre&#xA0;: trouver ce qui provoque cette lenteur (&#xA0;45%)</li><li> Corriger&#xA0;! (&#xA0;10%)</li></ol>
<p>Quelques-uns des outils suivants peuvent vous aider dans cette t&#xE2;che.</p>
<h2>Mesurer la performance</h2>
<p>Il existe de nombreuses fa&#xE7;ons de tester les performances de vos bouts de code en JavaScript mais en r&#xE8;gle g&#xE9;n&#xE9;rale on effectue une comparaison entre deux chronom&#xE9;trages. L&#x2019;&#xE9;quipe de <a href="http://jsperf.com/" class="spip_out">jsPerf</a> a propos&#xE9; un mod&#xE8;le qui a &#xE9;t&#xE9; ensuite repris par les suites de tests que sont <a href="http://www.webkit.org/perf/sunspider/sunspider.html" class="spip_out">SunSpider</a> et <a href="http://krakenbenchmark.mozilla.org/" class="spip_out">Kraken</a>.</p>
<pre><code>var tempsTotal, depart = new Date, iterations = 1000;
while (iterations--) { // Placer ici le code a tester
}
// tempsTotal &#x2192; Nombre de millisecondes necessaires // pour executer les instructions 1000 fois
tempsTotal = new Date - depart;</code></pre>
<p>Dans cet exemple le code &#xE0; tester est plac&#xE9; dans une boucle et ex&#xE9;cut&#xE9; un nombre d&#xE9;termin&#xE9; de fois. Une fois termin&#xE9;, la date de d&#xE9;but d&#x2019;ex&#xE9;cution est soustraite &#xE0; la date de fin d&#xE9;terminant le temps &#xE9;coul&#xE9; durant le test.</p>
<p>N&#xE9;anmoins cette fa&#xE7;on de faire des tests est tr&#xE8;s r&#xE9;ductrice, surtout si vous voulez mesurer dans diff&#xE9;rents navigateurs et environnements. Le ramasse-miette lui-m&#xEA;me peut avoir des effets sur vos r&#xE9;sultats. M&#xEA;me en affinant la mesure en utilisant <code>window.performance</code>, vous pouvez &#xEA;tre s&#xFB;rs que des impond&#xE9;rables viendront fausser les mesures.</p>
<p>Que vous &#xE9;criviez simplement des tests sur des parties de votre code, des suites de tests ou une librairie compl&#xE8;te, il y a bien plus de facteurs &#xE0; prendre en compte que vous ne pouvez l&#x2019;imaginer. Pour un guide plus complet sur les tests de performance, je vous recommande fortement de lire <a href="http://mathiasbynens.be/notes/javascript-benchmarking" class="spip_out"><span>Javascript Benchmarking</span></a> de Mathias Bynens et John-David Dalton.</p>
<h2>Le profilage</h2>
<p>Les outils pour d&#xE9;veloppeur de Chrome permettent de <a href="https://developers.google.com/chrome-developer-tools/docs/profiles" class="spip_out">profiler ais&#xE9;ment vos applications</a>. Vous pouvez utiliser cette fonctionnalit&#xE9; pour identifier les fonctions les plus chronophages pour les optimiser en priorit&#xE9;. Cette d&#xE9;marche est importante car la moindre petite modification de votre code peut avoir des cons&#xE9;quences importantes en termes de performance.</p>
<dl class="spip_document_409 spip_documents spip_documents_center">
<dt><img src="https://lh5.googleusercontent.com/VV_Q0smFYBKpTq3ldSFppG-p4Uic1bpF2xzO_hAfvqjthTVUej6u3HyjVpoqSDdkC-7ii_njsI70HO35mxZc-IUoyIE103nAEG25UBIzCUPYUtu0xThh" width="600" alt=""></dt>
</dl>
<p><i>L&#x2019;onglet &#x201C;profilage&#x201D; des outils pour d&#xE9;veloppeur de Chrome.</i></p>
<p>Pour commencer le profilage, il faut obtenir une mesure de base des performances actuelles de votre application. Cette derni&#xE8;re peut &#xEA;tre obtenue gr&#xE2;ce &#xE0; l&#x2019;onglet &#x201C;<span>timeline</span>&#x201D; (frise chronologique). Cela nous permettra de mesurer le temps effectif d&#x2019;ex&#xE9;cution de notre application.</p>
<p>L&#x2019;onglet &#x201C;<span>profiles</span>&#x201D; nous donnera lui une vue plus d&#xE9;taill&#xE9;e de ce qui se passe vraiment dans notre application. Le profilage processeur (<span>JavaScript <abbr>CPU</abbr> profile</span>) nous permet de savoir combien de temps processeur est utilis&#xE9; par notre application, le profilage des s&#xE9;lecteurs <abbr>CSS</abbr> (<span><abbr>CSS</abbr> selector profile</span>) nous renseigne sur le temps n&#xE9;cessaire pour calculer les s&#xE9;lecteurs <abbr>CSS</abbr>, et les captures de pile de m&#xE9;moire <span>Heap</span> (<span>Heap snapshots</span>) nous permet de savoir combien nos objets consomment de m&#xE9;moire.</p>
<p>L&#x2019;utilisation de ces outils nous permet d&#x2019;ajuster et de profiler &#xE0; nouveaux notre code afin de v&#xE9;rifier si les changements r&#xE9;alis&#xE9;s ont bien un impact positif sur les performances.</p>
<dl class="spip_document_411 spip_documents spip_documents_center">
<dt><img src="https://lh3.googleusercontent.com/7hD4UAk_zr2Vcu91RuhmsOsiG8NjrKs-GoOlgObXKsdPEH1-Il27aAjEk3AmqmpEPZm2SN05Zi3_xuvTPl1b5HJNebO3bIlzMmrpmW2lMwx6Nhd1drYb" width="600" alt=""></dt>
</dl>
<p>Pour une bonne introduction au profilage dans Chrome, lisez <a href="http://coding.smashingmagazine.com/2012/06/12/javascript-profiling-chrome-developer-tools/" class="spip_out"><span>Javascript Profiling With The Chrome Developper Tools</span></a> par Zack Grossbart.</p>
<p>Petit truc&#xA0;: dans l&#x2019;id&#xE9;al, il vaut mieux &#xE9;viter que les extensions et applications install&#xE9;es dans Chrome n&#x2019;influent sur vos r&#xE9;sultats. Pour cela, ex&#xE9;cutez Chrome avec l&#x2019;option <code>--user-data-dir &lt;un_r&#xE9;pertoire_vide&gt;</code>. Cela suffit la plupart du temps, mais si vous avez besoin d&#x2019;aller plus loin les options de V8 vous seront d&#x2019;une grande aide.</p>
<h2>Eviter les fuites m&#xE9;moire&#xA0;: trois techniques pour les d&#xE9;celer</h2>
<p>Les &#xE9;quipes internes de Google, celle de Gmail par exemple, utilisent &#xE9;norm&#xE9;ment les outils pour d&#xE9;veloppeurs de Chrome pour traquer et &#xE9;liminer les fuites m&#xE9;moires.</p>
<dl class="spip_document_412 spip_documents spip_documents_center">
<dt><img src="https://lh3.googleusercontent.com/KLG0BbASOYyCW-TQImgS-amc76d5b6DLfdlkyP_F-TM8HeMrJ8X2i7ziZnzGdjbXINAM39hc14NYcYHqA2kWHummXvIBlKEcA4Roah2oV4K_6A0i2UDN" width="600" alt=""></dt>
</dl>
<p><i>Statistiques d&#x2019;utilisation m&#xE9;moire dans les outils pour d&#xE9;veloppeurs.</i></p>
<p>Les statistiques utilis&#xE9;es par nos &#xE9;quipes sont par exemple&#xA0;: l&#x2019;utilisation m&#xE9;moire priv&#xE9;e, la taille de la pile <span>Heap</span> de JavaScript, le nombre de n&#x153;uds <abbr>DOM</abbr>, l&#x2019;effacement des donn&#xE9;es, le nombre de gestionnaires d&#x2019;&#xE9;v&#xE8;nements et le comportement du ramasse-miette. Les habitu&#xE9;s des architectures dirig&#xE9;es par les &#xE9;v&#xE9;nements seront peut-&#xEA;tre contents d&#x2019;apprendre que la plupart de nos probl&#xE8;mes venaient de l&#x2019;utilisation de <code>listen()</code> non suivi d&#x2019;<code>unlisten()</code> (<span>Closure</span>) et par l&#x2019;absence de <code>dispose()</code> pour les objets cr&#xE9;ant des gestionnaires d&#x2019;&#xE9;v&#xE8;nements.</p>
<p>Par chance, les outils pour d&#xE9;veloppeurs peuvent nous aider &#xE0; localiser ces probl&#xE8;mes et Loreena Lee a cr&#xE9;&#xE9; une pr&#xE9;sentation fantastique, qui d&#xE9;taille la <a href="https://docs.google.com/presentation/d/1wUVmf78gG-ra5aOxvTfYdiLkdGaR9OhXRnOlIcEmu2s/pub?start=false&amp;loop=false&amp;delayms=3000#slide=id.g1d65bdf6_0_0" class="spip_out">technique des trois captures</a> pour d&#xE9;tecter les fuites m&#xE9;moires, que je ne vous recommenderai jamais assez de lire.</p>
<p>La base de la technique est d&#x2019;enregistrer un certain nombre d&#x2019;action utilisateur dans votre application, forcer l&#x2019;&#xE9;xecution du ramasse-miette, v&#xE9;rifier si le nombre de noeuds <abbr>DOM</abbr> reste sup&#xE9;rieur &#xE0; la normale puis comparer trois captures successives de la pile <span>Heap</span> pour d&#xE9;tecter s&#x2019;il y a une fuite de m&#xE9;moire.</p>
<h2>Gestion de la m&#xE9;moire dans les applications sans rechargement de page</h2>
<p>La gestion de la m&#xE9;moire est tr&#xE8;s importante au sein des applications qui ne sont jamais recharg&#xE9;es (avec AngularJS, Backbone, Ember..). En effet, une fuite de m&#xE9;moire devient rapidement handicapantes. C&#x2019;est un &#xE9;norme pi&#xE8;ge au sein des applications pour appareils mobiles (qui sont limit&#xE9;s en m&#xE9;moire) comme les clients mails ou les applications de r&#xE9;seaux sociaux qui ont une dur&#xE9;e d&#x2019;utilisation tr&#xE8;s importante. Comme on dit&#xA0;: <strong>de grands pouvoirs impliquent de grandes responsabilit&#xE9;s</strong>.</p>
<p>Il y a plusieurs fa&#xE7;on de se pr&#xE9;munir de cela. Dans <span>Backbone</span>, assurez-vous de toujours d&#xE9;r&#xE9;f&#xE9;rencer vos vues et r&#xE9;f&#xE9;rences en utilisant <code>dispose()</code> (actuellement disponible dans <a href="https://github.com/documentcloud/backbone/blob/master/backbone.js#L1234" class="spip_out">Backbone (edge)</a>).</p>
<p>Cette fonction, ajout&#xE9;e tout r&#xE9;cemment, supprime tout gestionnaire associ&#xE9; aux &#xE9;v&#xE8;nements de la vue ainsi qu&#x2019;&#xE0; toute collection ou &#xE9;couteur de mod&#xE8;le pour lesquels la vue a &#xE9;t&#xE9; pass&#xE9;e en troisi&#xE8;me argument (en tant que contexte de <code>callback</code>). <code>dispose()</code> est &#xE9;galement appel&#xE9; par la m&#xE9;thode <code>remove()</code> de la vue, et s&#x2019;occupe de nettoyer la majorit&#xE9; de l&#x2019;utilisation m&#xE9;moire lorsque <a href="https://github.com/documentcloud/backbone/blob/master/backbone.js#L1235" class="spip_out">la vue est supprim&#xE9;e de l&#x2019;&#xE9;cran</a>. D&#x2019;autres librairies, comme Ember, <a href="https://github.com/emberjs/ember.js/blob/d8f76a7fdde741ae3d1e07b12df9cb6718170e48/packages/ember-handlebars/lib/helpers/binding.js#L296" class="spip_out">suppriment les observateurs</a> quand ils d&#xE9;tectent que les &#xE9;l&#xE9;ments ont &#xE9;t&#xE9;s supprim&#xE9;s de la vue pour &#xE9;viter les fuites m&#xE9;moires.</p>
<p>Voici les conseils avis&#xE9;s de Derick Bailey&#xA0;:</p>
<blockquote class="spip">
<p>Plut&#xF4;t que d&#x2019;essayer de comprendre comment fonctionnent les &#xE9;v&#xE8;nements en terme de r&#xE9;f&#xE9;rences, suivez simplement les r&#xE8;gles standard de gestion de la m&#xE9;moire en JavaScript et vous serez tranquilles. Si vous chargez des donn&#xE9;es dans une collection <span>Backbone</span> pleine d&#x2019;objets Utilisateurs et voulez que cette collection soit nettoy&#xE9;e par la suite afin de ne plus utiliser de m&#xE9;moire, vous devez supprimer toute r&#xE9;f&#xE9;rence &#xE0; cette collection et aux objets qu&#x2019;elle contient. Une fois toutes les r&#xE9;f&#xE9;rences supprim&#xE9;es, la m&#xE9;moire sera lib&#xE9;r&#xE9;e. Ce n&#x2019;est rien d&#x2019;autre que le comportement standard du ramasse-miette de JavaScript.</p>
</blockquote>
<p>Dans son article, Derick couvre la plupart des <a href="http://lostechies.com/derickbailey/2012/03/19/backbone-js-and-javascript-garbage-collection/" class="spip_out">erreurs communes de gestion de m&#xE9;moire</a> li&#xE9;es &#xE0; l&#x2019;utilisation de <span>Backbone</span> et comment les corriger.</p>
<p>Il y a &#xE9;galement un <a href="https://github.com/felixge/node-memory-leak-tutorial" class="spip_out">bon tutoriel disponible pour d&#xE9;boguer les fuites m&#xE9;moires</a> dans Node &#xE9;crit par Felix Geisend&#xF6;rfer. Particuli&#xE8;rement int&#xE9;ressant si votre application Node est utilis&#xE9;e dans le contexte d&#x2019;un application sans rechargement de page.</p>
<h2>Eviter les r&#xE9;agencements</h2>
<p>Quand un navigateur doit recalculer la position et la forme des &#xE9;l&#xE9;ments d&#x2019;un document afin de les redessiner, il effectue ce qu&#x2019;on appelle un <span>reflow</span> (r&#xE9;agencement). C&#x2019;est une op&#xE9;ration qui bloque l&#x2019;interface utilisateur, il est donc important de savoir comment limiter le temps qu&#x2019;elle dure.</p>
<dl class="spip_document_413 spip_documents spip_documents_center">
<dt><img src="https://lh6.googleusercontent.com/wJllbq8Yl2jsKuxr_JguUmRYQjeMnJ0DziRPC1QKgimdoxba_Jshge3vKvtS98W264ac9Sp9f3kLBvWTv3rzD9rOx9pXHJGSlFP3uuv9-1NeObX9fgFg" width="600" alt=""></dt>
</dl>
<p><i>Graphique montrant une succession de r&#xE9;agencements</i></p>
<p>Il vaut mieux regrouper les m&#xE9;thodes qui <a href="http://stackoverflow.com/questions/510213/when-does-reflow-happen-in-a-dom-environment" class="spip_out">provoquent des r&#xE9;agencements</a> ou un <span>repaint</span> (changement d&#x2019;apparence d&#x2019;un ou plusieurs &#xE9;l&#xE9;ments, sans changements de dimensions) et les &#xE9;viter autant que possible. Si c&#x2019;est n&#xE9;cessaire, effectuez de pr&#xE9;f&#xE9;rence vos modification en-dehors du <abbr>DOM</abbr>. Utilisez pour cela un <a href="http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-B63ED1A3" class="spip_out"><code>DocumentFragment</code></a> qui fonctionne &#xE0; l&#x2019;identique mais est bien plus l&#xE9;ger. Voyez-le comme une fa&#xE7;on d&#x2019;extraire une portion de l&#x2019;arbre du document ou de cr&#xE9;er un nouveau &#xAB;&#xA0;fragment&#xA0;&#xBB; de document. Plut&#xF4;t que de constamment ajouter des n&#x153;uds au document principal via le <abbr>DOM</abbr>, nous pouvons construire un fragment de document avec ce dont nous avons besoin et l&#x2019;ins&#xE9;rer en une seule fois dans le <abbr>DOM</abbr>, ce qui &#xE9;vite des reflows successifs et inutiles.</p>
<p>Par exemple, &#xE9;crivons une fonction qui ajoute 20 &#xE9;l&#xE9;ments <code>div</code> &#xE0; un autre. Le faire en ajoutant le nouveau <code>div</code> aussit&#xF4;t qu&#x2019;il est cr&#xE9;&#xE9; risque de d&#xE9;clencher 20 r&#xE9;agencements.</p>
<pre><code>function ajouteDivs(element) { var div; for (var i = 0; i &lt; 20; i ++) { div = document.createElement(&apos;div&apos;); div.innerHTML = &apos;Coucou!&apos;; element.appendChild(div); }
}</code></pre>
<p>Pour contourner ce probl&#xE8;me, nous pouvons utiliser un <code>DocumentFragment</code> auquel nous ajouterons chaque <code>div</code>. Quand nous int&#xE8;grerons ce fragment au document principal, tous ses n&#x153;uds enfants seront ajout&#xE9;s en une fois, ce qui ne provoque qu&#x2019;un seul recalcul.</p>
<pre><code>function ajouteDivs(element) { var div; // Cr&#xE9;e un fragment de document vide var fragment = document.createDocumentFragment(); for (var i = 0; i &lt; 20; i ++) { div = document.createElement(&apos;a&apos;); div.innerHTML = &apos;Coucou!&apos;; fragment.appendChild(div); } element.appendChild(fragment);
}</code></pre>
<p>Vous pouvez en savoir plus sur ce th&#xE8;me avec les articles <a href="https://developers.google.com/speed/articles/javascript-dom" class="spip_out"><span>Make the Web Faster</span></a>, <a href="http://blog.tojicode.com/2012/03/javascript-memory-optimization-and.html" class="spip_out"><span>JavaScript Memory Optimization</span></a> et <a href="http://gent.ilcore.com/2011/08/finding-memory-leaks.html" class="spip_out"><span>Finding Memory Leaks</span></a>.</p>
<h2>D&#xE9;tecter les fuites de m&#xE9;moires dans JavaScript</h2>
<p>Afin d&#x2019;aider &#xE0; la d&#xE9;tection des fuites m&#xE9;moires, deux de mes coll&#xE8;gues Googlers (Marja H&#xF6;ltt&#xE4; et Jochen Eisinger) ont d&#xE9;velopp&#xE9; un outil qui fonctionne avec les outils pour d&#xE9;veloppeurs de Google Chrome (avec le protocole d&#x2019;inspection &#xE0; distance pour &#xEA;tre pr&#xE9;cis). L&#x2019;outil r&#xE9;cup&#xE8;re plusieurs captures de la pile <span>heap</span> pour d&#xE9;tecter les objets provoquant des fuites m&#xE9;moire.</p>
<dl class="spip_document_414 spip_documents spip_documents_center">
<dt><img src="https://lh3.googleusercontent.com/s_4W5xFT7d7BnC6xdjDjcfr5MpNCGve4vdE3aZsoThqNYhD5tVo1-2-Y-fCnl4uzy5-_sXGYOHACc8a6TML0J3IUVt9tXaijISnrUW6CdBZob9GkPkXH" width="600" alt=""></dt>
</dl>
<p><i>Un outil d&#xE9;tectant les fuites m&#xE9;moire dans Javascript</i></p>
<p>Il existe un billet complet sur la <a href="http://google-opensource.blogspot.de/2012/08/leak-finder-new-tool-for-javascript.html" class="spip_out">fa&#xE7;on d&#x2019;utiliser l&#x2019;outil</a> et je vous encourage &#xE0; le lire ou &#xE0; jeter un &#x153;il sur la <a href="https://code.google.com/p/leak-finder-for-javascript/" class="spip_out">page du projet <span>Leak Finder</span></a>.</p>
<p>Si vous vous demandez pourquoi un tel outil n&#x2019;est pas directement int&#xE9;gr&#xE9; aux outils pour d&#xE9;veloppeurs, sachez qu&#x2019;il y a deux raisons. La premi&#xE8;re, c&#x2019;est qu&#x2019;&#xE0; l&#x2019;origine l&#x2019;outil a &#xE9;t&#xE9; d&#xE9;velopp&#xE9; pour nous aider &#xE0; capturer des sc&#xE9;narios sp&#xE9;cifiques dans la <span>Closure Library</span>, et la deuxi&#xE8;me c&#x2019;est qu&#x2019;il correspond plus &#xE0; un outil externe (ou peut-&#xEA;tre un jour en tant qu&#x2019;extension, si nous mettons en place une <abbr>API</abbr> de profilage de la pile <span>Heap</span>).</p>
<h2>Les options de V8 pour d&#xE9;boguer les optimisations et le ramasse-miette</h2>
<p>Chrome supporte le passage d&#x2019;options directement &#xE0; V8 via l&#x2019;option <code>js-flags</code> pour obtenir plus d&#x2019;informations sur les optimisations effectu&#xE9;es par le moteur. Par exemple, cette commande trace les optimisations de V8&#xA0;:</p>
<p><code>/Applications/Google Chrome/Google Chrome&quot; --js-flags=&quot;--trace-opt --trace-deopt</code></p>
<p>Si vous &#xEA;tes sur Windows, ex&#xE9;cutez&#xA0;:</p>
<p><code>chrome.exe --js-flags=&quot;--trace-opt --trace-deopt&quot;</code></p>
<p>Voici les options de d&#xE9;bogage disponibles pour d&#xE9;velopper avec Chrome&#xA0;:</p>
<ol class="spip"><li> <code>trace-opt</code>&#xA0;: enregistre dans un fichier le nom des fonctions optimis&#xE9;es et montre &#xE0; quels endroits V8 ne peut optimiser le code faute de pouvoir le cerner correctement.</li><li> <code>trace-deopt</code>&#xA0;: enregistre dans un fichier les portions de code qui ont &#xE9;t&#xE9; d&#xE9;optimis&#xE9;es pendant l&#x2019;ex&#xE9;cution.</li><li> <code>trace-gc</code>&#xA0;: enregistre dans un fichier chaque appel au ramasse-miette.</li></ol>
<p>Dans ces fichiers, V8 indique les fonctions optimis&#xE9;es avec une ast&#xE9;risque (<code>*</code>) et celles qui ne le sont pas avec un tilde (<code>~</code>).</p>
<p>Si vous souhaitez en apprendre plus au sujet des options de V8 et de la fa&#xE7;on dont il fonctionne je vous recommande fortement de jeter un &#x153;il &#xE0; <a href="http://mrale.ph/blog/2011/12/18/v8-optimization-checklist.html" class="spip_out">l&#x2019;excellent billet</a> de Vyacheslav Egorov qui r&#xE9;sume les meilleurs ressources disponibles actuellement sur le sujet.</p>
<h2>Mesures temporelles pr&#xE9;cises&#xA0;: <abbr>HRT</abbr> et <span>Navigation Time <abbr>API</abbr></span></h2>
<p><a href="http://www.w3.org/TR/hr-time/" class="spip_out"><span>High Resolution Time</span> (<abbr>HRT</abbr>)</a> est une interface JavaScript d&#xE9;livrant une mesure du temps avec une pr&#xE9;cision de l&#x2019;ordre du millioni&#xE8;me de microseconde, non sujette aux variations de l&#x2019;horloge syst&#xE8;me et aux ajustements de cette derni&#xE8;re par l&#x2019;utilisateur. Voyez cela comme une fa&#xE7;on plus pr&#xE9;cise de faire des tests de performance que la m&#xE9;thode vue pr&#xE9;c&#xE9;demment avec <code>new Date()</code> et <code>Date.now()</code>. C&#x2019;est tr&#xE8;s pratique quand vous &#xE9;crivez des tests de performance.</p>
<dl class="spip_document_416 spip_documents spip_documents_center">
<dt><img src="https://lh5.googleusercontent.com/9qxlMZ8PU-PIkekzdQuqMp95NqrF_JTtJmiCl8mWtF7LAjHU-hHAHg_aDJVPi3FlGZe0bSUiA4F6_EIQDUto-GCkA1ozeV6Imb4CXkHMgR07CXAjUsjp" width="578" alt=""></dt>
</dl>
<p><i><span>High Resolution Time</span> (<abbr>HRT</abbr>) indique le temps avec une pr&#xE9;cision au millioni&#xE8;me de milliseconde pr&#xE8;s.</i></p>
<p><abbr>HRT</abbr> est disponible dans Chrome (version stable) via <code>window.performance.webkitNow()</code>, mais la version canary de Chrome propose d&#xE9;j&#xE0; une version non-pr&#xE9;fix&#xE9;e (<code>window.performance.now()</code>) Paul Irish a r&#xE9;dig&#xE9; une <a href="http://updates.html5rocks.com/2012/08/When-milliseconds-are-not-enough-performance-now" class="spip_out">pr&#xE9;sentation plus compl&#xE8;te de <code>window.performance</code></a> sur HTML5Rocks.</p>
<p>Nous avons une mesure temporelle pr&#xE9;cise, mais <i>quid</i> de la mesure pr&#xE9;cise de performance sur le web&#xA0;?</p>
<p>Eh bien, nous avons maintenant &#xE0; notre disposition la <a href="https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/Overview.html" class="spip_out"><span>Navigation Timing <abbr>API</abbr></span></a>. Cette <abbr>API</abbr> propose une fa&#xE7;on simple d&#x2019;obtenir des mesures pr&#xE9;cises et d&#xE9;taill&#xE9;es, r&#xE9;cup&#xE9;r&#xE9;es durant le chargement de la page et sa pr&#xE9;sentation aux utilisateurs. Les mesures sont expos&#xE9;es via l&#x2019;objet <code>window.performance.timing</code> que vous pouvez simplement obtenir par le biais de la console Javascript.</p>
<dl class="spip_document_417 spip_documents spip_documents_center">
<dt><img src="https://lh5.googleusercontent.com/MZXBB_oDX3yHC19byvXewTfnDXne5diUb4WNG7iu4-8cFo6dNODrLmpC-p0VWtf43Kfs4TMp0MYCaAcSJVqIveFpkw2ZDGagujRGNPZPiqVxiul_jqLL" width="600" alt=""></dt>
</dl>
<p><i>Mesure de performances affich&#xE9;es dans la console JavaScript.</i></p>
<p>On peut ais&#xE9;ment extraire diverses informations tr&#xE8;s pratiques des donn&#xE9;es ci-dessus. Par exemple, la latence du r&#xE9;seau via <code>responseEnd - fetchStart</code>, le temps n&#xE9;cessaire au chargement de la page &#xE0; partir de sa r&#xE9;ception via <code>loadEventEnd - responseEnd</code> et le temps n&#xE9;cessaire pour passer du clic &#xE0; l&#x2019;affichage de la nouvelle page via <code>loadEventEnd - navigationStart</code>.</p>
<p>Comme vous pouvez le voir ci-dessus, une propri&#xE9;t&#xE9; <code>performance.memory</code> est disponible. Elle donne des informations sur l&#x2019;usage de la m&#xE9;moire par JavaScript comme par exemple la taille de la pile <span>Heap</span>.</p>
<p>Pour plus d&#x2019;informations sur la <span>Navigation Timing <abbr>API</abbr></span>, lisez le super billet de Sam Dutton&#xA0;: <a href="http://www.html5rocks.com/en/tutorials/webperformance/basics/" class="spip_out"><span>Measuring Page Load Speed With Navigation Timing</span></a>.</p>
<h2><code>About:memory</code> et <code>about:tracing</code></h2>
<p><code>about:tracing</code> dans Google Chrome affiche les performances du navigateur lui-m&#xEA;me, et enregistre l&#x2019;activit&#xE9; de chaque <span>thread</span>, de chaque onglet et de chaque processus.</p>
<dl class="spip_document_418 spip_documents spip_documents_center">
<dt><img src="https://lh5.googleusercontent.com/r8N-F6YK0GdUTJtJ9QkyNZWuv5UTbxhAdk0ewKJ3gckG2-M4Wym8C5HxNkRIJPs0r4qSU_yvvEkEpgJqQdgJ68NgYiBu8r25pIvcGsL1j-W6j-4gkWBW" width="600" alt=""></dt>
</dl>
<p><i><code>about:tracing</code> montre les performances du navigateur.</i></p>
<p>Ce qui est tr&#xE8;s pratique c&#x2019;est que cet outile permet de capturer et profiler les m&#xE9;canismes internes de Chrome de mani&#xE8;re &#xE0; pouvoir ajuster et optimiser votre JavaScript de mani&#xE8;re appropri&#xE9;e.</p>
<p>Lili Thompson a &#xE9;crit un excellent article destin&#xE9; aux d&#xE9;veloppeurs de jeux vid&#xE9;os HTML5 sur la fa&#xE7;on d&#x2019;<a href="http://www.html5rocks.com/en/tutorials/games/abouttracing/" class="spip_out">utiliser <code>about:tracing</code> pour le profilage de WebGL</a>. Les autres d&#xE9;veloppeurs y trouveront aussi des informations utiles.</p>
<p>Naviguer &#xE0; l&#x2019;int&#xE9;rieur de la page <code>about:memory</code> de Chrome est &#xE9;galement d&#x2019;une grande aide. Il montre l&#x2019;utilisation exacte de chaque onglet ce qui peut aider &#xE0; d&#xE9;tecter facilement les applications causant des fuites de m&#xE9;moire.</p>
<h2>Conclusion</h2>
<p>Comme nous l&#x2019;avons vu, <strong>il y a nombre de subtilit&#xE9;s &#xE0; conna&#xEE;tre dans le monde de la performance des moteurs JavaScript</strong>, et pas de solution miracle. Ce n&#x2019;est qu&#x2019;en confrontant vos optimisations &#xE0; des tests grandeur nature que vous pourrez estimer les gains en performance les plus importants. De plus, savoir comment les moteurs JavaScript interpr&#xE8;tent et optimisent votre code peut vous fournir des pistes pour le d&#xE9;veloppement de vos applications.</p>
<p><strong>Mesurez, comprenez, corrigez&#xA0;!</strong> ...et recommencez.</p>
<dl class="spip_document_419 spip_documents spip_documents_center">
<dt><img src="https://lh5.googleusercontent.com/FaISwq_SHQqFahSfLXi9q8R_mmVdpqXxz4AhpdqFyRhPGQewTXfmF0UcARNLoydbZ7yNj0JqSBGrRSlluaYDDUDDFlPRaDeiPVSE56uTgP5hue3N_9sn" width="496" alt=""></dt>
</dl>
<p>Cr&#xE9;dits image&#xA0;: <a href="http://www.flickr.com/photos/38891164@N02/4266609887/" class="spip_out">Sally Hunter</a></p>
<p>Soyez conscients de l&#x2019;importance de la performance, mais sans aller jusqu&#x2019;aux micros optimisations qui pourraient nuire &#xE0; la simplicit&#xE9; de votre code. Par exemple, certains d&#xE9;veloppeurs pr&#xE9;f&#xE8;rent utiliser <code>.forEach</code> et <code>Object.keys</code> plut&#xF4;t que les boucles <code>for</code> et <code>for...in</code>, malgr&#xE9; leur lenteur, pour pouvoir garder la main sur le contexte. Sachez distinguer les optimisations qui sont absolument indispensables &#xE0; votre application de celles dont elle peut se passer.</p>
<p>Aussi, soyez bien conscient que bien que les moteurs Javascript continuent &#xE0; am&#xE9;liorer leurs performances, la vraie bataille pour les performances se situe au niveau du <abbr>DOM</abbr>. Les r&#xE9;agencements et les recalculs graphiques (<span>reflows</span> et <span>repaints</span>) doivent &#xEA;tre &#xE9;vit&#xE9;s &#xE0; tout prix, souvenez-vous donc de ne toucher au <abbr>DOM</abbr> que quand c&#x2019;est absolument n&#xE9;cessaire. Et allez-y mollo sur le r&#xE9;seau&#xA0;: les requ&#xEA;tes <abbr>HTTP</abbr> sont pr&#xE9;cieuses, surtout dans un contexte de mobilit&#xE9;, vous devriez exploiter le maximum du potentiel du cache <abbr>HTTP</abbr> pour r&#xE9;duire le poids de vos ressources.</p>
<p>Garder tout cela &#xE0; l&#x2019;esprit vous assure de tirer le meilleur parti des informations contenues dans ce billet. J&#x2019;esp&#xE8;re que vous l&#x2019;avez trouv&#xE9; utile&#xA0;!</p> <p class="moreInfo"> L&apos;article original a &#xE9;t&#xE9; relu par Jakob Kummerow, Michael Starzinger; Sindre Sorhus, Mathias Bynens, John-David Dalton et Paul Irish. </p> </div></div>]]></description>
      <link>https://www.pompage.net/traduction/javascript-rapide-et-efficace</link>
      <guid>https://www.pompage.net/traduction/javascript-rapide-et-efficace</guid>
      <pubDate>Tue, 26 Aug 2014 10:08:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Inline-block est-il un substitut aux floats ?]]></title>
      <description><![CDATA[<div><div id="article"><p class="signature">Par
<a href="http://www.vanseodesign.com/">Steven Bradley</a></p><p class="moreInfo">
Quand vient le moment de d&#xE9;velopper la mise en page avec CSS, <code>float</code> fait le plus gros du travail. Nous utilisons les &#xE9;l&#xE9;ments flottants pour les blocs importants comme une zone de contenu principale ou une colonne lat&#xE9;rale ; nous y avons aussi recours pour les blocs de moindre taille &#xE0; l&#x2019;int&#xE9;rieur de ces blocs principaux. Mais les floats sont-ils toujours le meilleur choix?</p><p>Si les floats fonctionnent g&#xE9;n&#xE9;ralement sans probl&#xE8;me, il peut parfois &#xEA;tre d&#xE9;licat de les manipuler. C&#x2019;est tout particuli&#xE8;rement compliqu&#xE9; quand il s&#x2019;agit de blocs imbriqu&#xE9;s, comme par exemple lorsqu&#x2019;on veut organiser une grille d&#x2019;images, mais qu&#x2019;elles refusent de bien s&#x2019;aligner. Une alternative existe&#xA0;: les blocs en lignes. Ils b&#xE9;n&#xE9;ficient de <a href="http://www.vanseodesign.com/css/understanding-css-floats/" class="spip_out">certains avantages des floats</a> sans en pr&#xE9;senter les inconv&#xE9;nients.</p><p>Les inline-block n&#x2019;ont rien d&#x2019;une nouveaut&#xE9; et il est possible que vous les utilisiez d&#xE9;j&#xE0;. Ce n&#x2019;&#xE9;tait pas mon cas jusqu&#x2019;&#xE0; r&#xE9;cemment. Il se trouve que les derniers sites que j&#x2019;ai r&#xE9;alis&#xE9;s &#xE9;taient destin&#xE9;s &#xE0; des photographes. Naturellement, ce genre de site pr&#xE9;sente des grilles d&#x2019;image. Pour les mettre en forme, j&#x2019;ai privil&#xE9;gi&#xE9; inline-block &#xE0; float.<br class="autobr">
<span class="spip_document_462 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/png/css-box-model_fr.png" alt=""></span></p><h2>Qu&#x2019;est ce qu&#x2019;un inline-block&#xA0;?</h2><p><a href="http://www.w3.org/TR/CSS21/visuren.html#display-prop" class="spip_out">Inline-block</a> est l&#x2019;une des valeurs possibles pouvant &#xEA;tre assign&#xE9;es &#xE0; <a href="http://www.vanseodesign.com/css/display-property/" class="spip_out">la propri&#xE9;t&#xE9; <code>display </code>d&#x2019;un &#xE9;l&#xE9;ment</a>. Cette valeur tient son nom du fait qu&#x2019;elle regroupe certaines caract&#xE9;ristiques des &#xE9;l&#xE9;ments de type bloc et en ligne.</p><ul class="spip"><li> Les &#xE9;l&#xE9;ments de type bloc g&#xE9;n&#xE8;rent des bo&#xEE;tes selon <a href="http://www.w3.org/TR/css3-box/" class="spip_out">le mod&#xE8;le de bo&#xEE;tes <abbr>CSS</abbr></a>. Ils peuvent avoir une largeur (<code>width</code>), une hauteur (<code>height</code>), des bordures et des marges int&#xE9;rieures et ext&#xE9;rieures (<code>padding </code>et <code>margin</code>). Ils s&#x2019;organisent verticalement les uns au-dessus des autres.</li><li> Les &#xE9;l&#xE9;ments en-ligne ne forment pas de bo&#xEE;tes. Ils se suivent horizontalement. (<abbr>NdT</abbr>&#xA0;: Ils g&#xE9;n&#xE8;rent en fait des bo&#xEE;tes de ligne&#xA0;: voir <a href="http://www.w3.org/TR/css3-box/#block-level0" class="spip_out">indications du W3C</a>.)</li><li> Les &#xE9;l&#xE9;ments de type blocs-en-ligne, de l&#x2019;int&#xE9;rieur, se comportent comme des <a href="http://quirksmode.org/css/css2/display.html" class="spip_out">&#xE9;l&#xE9;ments de type bloc</a>&#xA0;: ils forment des bo&#xEE;tes. Vus de l&#x2019;ext&#xE9;rieur, ils se comportent tels des &#xE9;l&#xE9;ments en-ligne, se suivent horizontalement au lieu de <a href="http://www.vanseodesign.com/css/css-stack-z-index/" class="spip_out">s&#x2019;empiler</a>.</li></ul><p>Lorsqu&#x2019;on y pense, ce comportement n&#x2019;est pas si &#xE9;loign&#xE9; de celui des &#xE9;l&#xE9;ments flottants. Les flottants forment des bo&#xEE;tes et se tiennent eux aussi c&#xF4;te &#xE0; c&#xF4;te au lieu de s&#x2019;organiser verticalement. L&#x2019;un et l&#x2019;autre ne sont bien s&#xFB;r pas identiques, mais leur positionnement en ligne &#xE0; l&#x2019;ext&#xE9;rieur et leur comportement en bloc &#xE0; l&#x2019;int&#xE9;rieur sont parfois les seules caract&#xE9;ristiques recherch&#xE9;es. Dans ce cas, un float ou un <a href="http://www.impressivewebs.com/inline-block/" class="spip_out">inline-block</a> pourra &#xEA;tre utilis&#xE9; indiff&#xE9;remment.<br class="autobr">
<span class="spip_document_463 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/png/floats-inline-blocks_fr.png" alt=""></span></p><h2>La diff&#xE9;rence entre float et inline-block</h2><p>M&#xEA;me si float et inline-block partagent quelques similitudes, il existe <a href="http://www.onderhond.com/blog/inline-block-vs-float" class="spip_out">des diff&#xE9;rences bien pr&#xE9;cises</a> entre les deux.</p><ul class="spip"><li> Flux du document &#x2013; Les flottants sont retir&#xE9;s du flux normal, permettant ainsi aux &#xE9;l&#xE9;ments qui les suivent de <a href="http://www.ternstyle.us/blog/float-vs-inline-block" class="spip_out">flotter autour d&#x2019;eux</a>&#xA0;; les blocs en ligne restent dans le flux du document. Ainsi, il n&#x2019;est pas n&#xE9;cessaire d&#x2019;avoir recours &#xE0; des techniques telles que <code>clearfix </code>ou <code>overflow:hidden</code>. Ainsi, les &#xE9;l&#xE9;ments suivant un &#xAB;&#xA0;inline-block&#xA0;&#xBB; ne peuvent pas habiller ce dernier, et on ne peut pas forcer un &#xE9;l&#xE9;ment &#xE0; passer sous un &#xAB;&#xA0;inline-block&#xA0;&#xBB; avec la propri&#xE9;t&#xE9; <code>clear</code>.</li><li> Positionnement horizontal &#x2013; Un exemple concret serait des floats qui ne peuvent &#xEA;tre centr&#xE9;s avec un <code>text-align: center</code> plac&#xE9; sur leur parent. De plus, aucun style de positionnement appliqu&#xE9; au parent d&#x2019;un flottant n&#x2019;aura d&#x2019;influence sur ce dernier. &#xC0; l&#x2019;inverse, le parent d&#x2019;un inline-block peut <a href="http://joshnh.com/2012/02/07/why-you-should-use-inline-block-when-positioning-elements/" class="spip_out">affecter sa position</a>.</li><li> Alignement vertical &#x2013; Les inline-blocks s&#x2019;alignent par d&#xE9;faut sur la ligne de base du texte. Les floats s&#x2019;alignent en haut de leur parent. Il est possible de changer ce comportement par d&#xE9;faut pour les inline-blocks et ainsi <a href="http://designshack.net/articles/css/whats-the-deal-with-display-inline-block/" class="spip_out">contr&#xF4;ler o&#xF9; ils seront align&#xE9;s verticalement</a>, ce qui n&#x2019;est pas le cas pour les floats. C&#x2019;est principalement pour cette raison que&#x202F;j&#x2019;ai eu davantage recours aux inline-blocks.</li><li> Espaces blancs &#x2013; Les inline-blocks ob&#xE9;issent aux espaces pr&#xE9;sents dans le <abbr>HTML</abbr> (<abbr>NdT</abbr>&#xA0;: que ce soit une espace simple, une tabulation ou un retour chariot). Si plusieurs &#xE9;l&#xE9;ments inline-block sont chacun d&#xE9;clar&#xE9;s sur une nouvelle ligne dans le code <abbr>HTML</abbr>, ils s&#x2019;afficheront de chaque c&#xF4;t&#xE9; d&#x2019;un espace horizontal. Les &#xE9;l&#xE9;ments flottants se tiendront eux les uns &#xE0; c&#xF4;t&#xE9; des autres ind&#xE9;pendamment des espaces pr&#xE9;sents dans le balisage.</li><li> <abbr>IE</abbr>6 et <abbr>IE</abbr>7 &#x2013; Les blocs en ligne ne sont pas support&#xE9;s ou n&#x2019;ont qu&#x2019;un support partiel dans Internet Explorer 6 et 7. Si vous avez besoin de prendre en charge ces versions du navigateur, vous aurez besoin d&#x2019;une alternative.</li></ul><p><span class="spip_document_461 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/png/whitespace.png" alt=""></span><br class="autobr">
<i>Tous les blocs ci-dessus ont une d&#xE9;claration <code>display: inline-block</code>. &#xC0; gauche, une espace est pr&#xE9;sente entre eux dans le code. &#xC0; droite, l&#x2019;espace a &#xE9;t&#xE9; retir&#xE9;e du <abbr>HTML</abbr>. Aucune autre diff&#xE9;rence.</i></p><h2>R&#xE9;gler le probl&#xE8;me de l&#x2019;espace blanc</h2><p>Cela est possible. Il est probable que vous voudrez utiliser plusieurs inline-block sans pour autant souhaiter l&#x2019;espace entre eux. Il existe <a href="http://css-tricks.com/fighting-the-space-between-inline-block-elements/" class="spip_out">quelques m&#xE9;thodes</a> pour le supprimer.</p><ul class="spip"><li> Supprimez tout espace dans le balisage (<abbr>NDT</abbr>&#x202F;&#xA0;: tabulations et retours &#xE0; la ligne compris) &#x2013; Affranchissez-vous des retours chariot entre les &#xE9;l&#xE9;ments de type inline-block. Il ne s&#x2019;agit pas de la solution la plus &#xE9;l&#xE9;gante, mais elle est efficace, surtout si vous n&#x2019;avez que quelques &#xE9;l&#xE9;ments.</li><li> Utilisez des marges n&#xE9;gatives &#x2013; Il vous faudra prendre en compte la taille de la fonte car les espaces sont calcul&#xE9;es en fonction de cette valeur. J&#x2019;aime &#xE0; penser qu&#x2019;il s&#x2019;agit de 0,25em, mais n&#x2019;&#xE9;tant pas s&#xFB;r, laissez un commentaire si vous en savez plus sur le sujet.</li><li> Appliquer une taille de police de 0 au parent &#x2013; Qu&#x2019;importe la taille de l&#x2019;espace, une taille de texte nulle implique que l&#x2019;espace sera lui aussi nul. Il sera alors &#xE9;videmment n&#xE9;cessaire d&#x2019;attribuer une nouvelle taille pour tous les enfants qui en auraient besoin.</li></ul><p><span class="spip_document_457 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/jpg/floating-blocks.jpg" alt=""></span></p><h2>Quand utiliser les inline-blocks et quand utiliser les floats&#xA0;?</h2><p><a href="http://css-tricks.com/forums/topic/inline-block-vs-float/" class="spip_out">Quand utiliser l&#x2019;un ou l&#x2019;autre</a> d&#xE9;pend des sp&#xE9;cificit&#xE9;s de votre design, et de ce que vous tentez de r&#xE9;aliser. Si vous voulez que le texte s&#x2019;&#xE9;coule autour d&#x2019;un &#xE9;l&#xE9;ment, alors float est la r&#xE9;ponse la plus &#xE9;vidente. Si vous voulez centrer un &#xE9;l&#xE9;ment, inline-block est la meilleure option.<br class="autobr">
En d&#xE9;finitive, votre choix d&#xE9;coulera des diff&#xE9;rences entre inline-block et float, et des particularit&#xE9;s de chacun qui vous sont n&#xE9;cessaires.</p><ul class="spip"><li> Utilisez inline-block&#x2026; lorsque vous avez besoin d&#x2019;un plus grand contr&#xF4;le sur l&#x2019;alignement vertical et le <a href="http://www.vanseodesign.com/css/css-positioning/" class="spip_out">positionnement horizontal des &#xE9;l&#xE9;ments</a>.</li><li> Utilisez float&#x2026; lorsque vous attendez des autres &#xE9;l&#xE9;ments qu&#x2019;ils s&#x2019;agencent autour d&#x2019;un &#xE9;l&#xE9;ment sp&#xE9;cifique, lorsque vous d&#xE9;sirez un support pour les versions plus anciennes d&#x2019;Internet Explorer ou souhaitez &#xE9;viter la probl&#xE9;matique de l&#x2019;espace entre &#xE9;l&#xE9;ments.</li></ul><p><span class="spip_document_458 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/png/floats.png" alt=""></span><br class="autobr">
<i>Les blocs ci-dessus flottent &#xE0; gauche pour composer une grille. Le cinqui&#xE8;me bloc [five] se retrouve coinc&#xE9; par le second [two] car ce dernier est le plus haut de sa rang&#xE9;e. C&#x2019;est un probl&#xE8;me r&#xE9;current lors de la cr&#xE9;ation de grilles d&#x2019;images.</i></p><h2>Les floats, les inline-blocks et les grilles d&#x2019;images</h2><p>Dans mon cas, l&#x2019;utilisation des inline-blocks m&#x2019;est utile face au souci de l&#x2019;alignement vertical. Je crois que cela doit &#xEA;tre la m&#xEA;me chose pour beaucoup de personnes qui commencent &#xE0; les utiliser. J&#x2019;ai derni&#xE8;rement construit plusieurs sites pour des photographes et, bien entendu, ces sites sont in&#xE9;vitablement charg&#xE9;s de <a href="http://blog.teamtreehouse.com/using-inline-block-to-display-a-product-grid-view" class="spip_out">grilles d&#x2019;images</a>.</p><p>Les flottants sont plus efficaces si les images de la grille ont toutes la m&#xEA;me hauteur. D&#xE8;s que ce n&#x2019;est plus le cas, c&#x2019;est-&#xE0;-dire la plupart du temps, les floats se retrouvent comme suspendus &#xE0; c&#xF4;t&#xE9; de l&#x2019;image la plus haute de la rang&#xE9;e sup&#xE9;rieure. Ceci est d&#xFB; au fait que les floats sont exclus du flux normal du document.</p><p>Les blocs en ligne n&#x2019;ont pas ce probl&#xE8;me puisqu&#x2019;ils restent dans le flux. Quand une nouvelle rang&#xE9;e d&#x2019;images doit &#xEA;tre cr&#xE9;&#xE9;e, la nouvelle rang&#xE9;e se positionne naturellement sous la pr&#xE9;c&#xE9;dente, de mani&#xE8;re rectiligne. Pour avoir ce m&#xEA;me comportement avec des &#xE9;l&#xE9;ments flottants, nous aurions besoin de savoir pr&#xE9;cis&#xE9;ment sur quel flottant positionner la propri&#xE9;t&#xE9; <code>clear </code>(<abbr>NDT</abbr>&#xA0;: pour forcer un vrai retour &#xE0; la ligne). Ceci peut poser probl&#xE8;me dans le cas o&#xF9; les &#xE9;l&#xE9;ments sont g&#xE9;n&#xE9;r&#xE9;s dynamiquement. Dans ce cas pr&#xE9;cis, utiliser des blocs en ligne est bien plus naturel. <br class="autobr">
<a href="http://www.vanseodesign.com/blog/demo/inline-block/" class="spip_out">Voici une d&#xE9;monstration</a> qui illustre le probl&#xE8;me abord&#xE9; plus haut et les diff&#xE9;rents r&#xE9;sultats obtenus suivant la technique utilis&#xE9;e.</p><p><span class="spip_document_460 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/png/inline-blocks.png" alt=""></span><br class="autobr">
<i><code>display: inline-block</code> est appliqu&#xE9; aux blocs du dessus. &#xC9;tant donn&#xE9; qu&#x2019;ils ne sont pas exclus du flux du document, aucun des blocs ne se retrouve prisonnier des blocs de la ligne sup&#xE9;rieure.</i></p><h2>Les inline-blocks pour la navigation</h2><p>Une autre application possible pour inline-block se trouve dans <a href="http://www.vanseodesign.com/css/simple-navigation-bar-with-css-and-xhtml/" class="spip_out">les barres horizontales de navigation</a>. On y fait g&#xE9;n&#xE9;ralement flotter les liens pour ensuite les d&#xE9;clarer comme des &#xE9;l&#xE9;ments de type bloc. Je me vois &#xE9;galement d&#xE9;clarer des items de liste comme inline. S&#x2019;il vous faut jongler avec des valeurs inline et block pour utiliser float, inline-block repr&#xE9;sente alors peut&#x2011;&#xEA;tre une meilleure solution.</p><p>Partout o&#xF9; vous avez besoin de ranger vos &#xE9;l&#xE9;ments en une ou plusieurs lignes, vous devriez songer &#xE0; utiliser inline-block plut&#xF4;t que float. &#xC9;videmment, des tableaux feraient eux aussi l&#x2019;affaire dans ces circonstances. Apr&#xE8;s tout, ils sont faits pour aligner du contenu en lignes et colonnes.</p><p>Si vous construisez quelque chose de plus complexe n&#xE9;cessitant lignes et colonnes, alors <a href="http://www.vanseodesign.com/css/tables/" class="spip_out">un tableau HTML ou CSS</a> peut &#xEA;tre votre meilleure option, m&#xEA;me si les inline-blocks restent &#xE0; privil&#xE9;gier pour les constructions plus simples.</p><p><span class="spip_document_456 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/jpg/block.jpg" alt=""></span></p><h2>Conclusion</h2><p>Les inline-blocks puisent parmi les caract&#xE9;ristiques des &#xE9;l&#xE9;ments en ligne vus de l&#x2019;ext&#xE9;rieur&#xA0;; et des &#xE9;l&#xE9;ments de type block vus de l&#x2019;int&#xE9;rieur. Cela les rend tr&#xE8;s similaires aux flottants &#xE0; quelques diff&#xE9;rences pr&#xE8;s.</p><p>Ces diff&#xE9;rences vous aideront &#xE0; choisir l&#x2019;utilisation la mieux adapt&#xE9;e. Si vous rencontrez des probl&#xE8;mes avec <a href="http://www.vanseodesign.com/css/dynamic-vertical-centering/" class="spip_out">l&#x2019;alignement vertical</a> ou le positionnement horizontal, vous serez plus enclin &#xE0; utiliser un inline-block. Si vous avez besoin de plus de contr&#xF4;le sur un seul &#xE9;l&#xE9;ment et son interaction avec le contenu qui l&#x2019;entoure, vous serez plus enclin &#xE0; utiliser un float.<br class="autobr">
Bien entendu, un tableau peut s&#x2019;av&#xE9;rer comme &#xE9;tant la meilleure option en fonction de ce que vous tentez d&#x2019;accomplir.</p><p>Tout ceci n&#x2019;est rien de nouveau, mais j&#x2019;ai pens&#xE9; qu&#x2019;un article et <a href="http://www.vanseodesign.com/blog/demo/inline-block/" class="spip_out">une d&#xE9;monstration</a> seraient utiles &#xE0; quiconque n&#x2019;aurait pas utilis&#xE9; les blocs en ligne l&#xE0; o&#xF9; il aurait d&#xFB;.</p></div><div id="similaires"><p>
Voici la liste des dix articles les plus r&#xE9;cents en rapport avec cet article&#xA0;:</p></div></div>]]></description>
      <link>http://www.pompage.net/traduction/inline-block-vs-float</link>
      <guid>http://www.pompage.net/traduction/inline-block-vs-float</guid>
      <pubDate>Tue, 05 Aug 2014 10:08:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Inline-block est-il un substitut aux floats ?]]></title>
      <description><![CDATA[<div><div id="article"> <p class="signature">Par <a href="http://www.vanseodesign.com/">Steven Bradley</a> </p> <p class="moreInfo"> Quand vient le moment de d&#xE9;velopper la mise en page avec CSS, <code>float</code> fait le plus gros du travail. Nous utilisons les &#xE9;l&#xE9;ments flottants pour les blocs importants comme une zone de contenu principale ou une colonne lat&#xE9;rale ; nous y avons aussi recours pour les blocs de moindre taille &#xE0; l&#x2019;int&#xE9;rieur de ces blocs principaux. Mais les floats sont-ils toujours le meilleur choix? </p> <p>Si les floats fonctionnent g&#xE9;n&#xE9;ralement sans probl&#xE8;me, il peut parfois &#xEA;tre d&#xE9;licat de les manipuler. C&#x2019;est tout particuli&#xE8;rement compliqu&#xE9; quand il s&#x2019;agit de blocs imbriqu&#xE9;s, comme par exemple lorsqu&#x2019;on veut organiser une grille d&#x2019;images, mais qu&#x2019;elles refusent de bien s&#x2019;aligner. Une alternative existe&#xA0;: les blocs en lignes. Ils b&#xE9;n&#xE9;ficient de <a href="http://www.vanseodesign.com/css/understanding-css-floats/" class="spip_out">certains avantages des floats</a> sans en pr&#xE9;senter les inconv&#xE9;nients.</p>
<p>Les inline-block n&#x2019;ont rien d&#x2019;une nouveaut&#xE9; et il est possible que vous les utilisiez d&#xE9;j&#xE0;. Ce n&#x2019;&#xE9;tait pas mon cas jusqu&#x2019;&#xE0; r&#xE9;cemment. Il se trouve que les derniers sites que j&#x2019;ai r&#xE9;alis&#xE9;s &#xE9;taient destin&#xE9;s &#xE0; des photographes. Naturellement, ce genre de site pr&#xE9;sente des grilles d&#x2019;image. Pour les mettre en forme, j&#x2019;ai privil&#xE9;gi&#xE9; inline-block &#xE0; float.<br class="autobr">
<span class="spip_document_462 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/png/css-box-model_fr.png" width="600" alt=""></span></p>
<h2>Qu&#x2019;est ce qu&#x2019;un inline-block&#xA0;?</h2>
<p><a href="http://www.w3.org/TR/CSS21/visuren.html#display-prop" class="spip_out">Inline-block</a> est l&#x2019;une des valeurs possibles pouvant &#xEA;tre assign&#xE9;es &#xE0; <a href="http://www.vanseodesign.com/css/display-property/" class="spip_out">la propri&#xE9;t&#xE9; <code>display </code>d&#x2019;un &#xE9;l&#xE9;ment</a>. Cette valeur tient son nom du fait qu&#x2019;elle regroupe certaines caract&#xE9;ristiques des &#xE9;l&#xE9;ments de type bloc et en ligne.</p>
<ul class="spip"><li> Les &#xE9;l&#xE9;ments de type bloc g&#xE9;n&#xE8;rent des bo&#xEE;tes selon <a href="http://www.w3.org/TR/css3-box/" class="spip_out">le mod&#xE8;le de bo&#xEE;tes <abbr>CSS</abbr></a>. Ils peuvent avoir une largeur (<code>width</code>), une hauteur (<code>height</code>), des bordures et des marges int&#xE9;rieures et ext&#xE9;rieures (<code>padding </code>et <code>margin</code>). Ils s&#x2019;organisent verticalement les uns au-dessus des autres.</li><li> Les &#xE9;l&#xE9;ments en-ligne ne forment pas de bo&#xEE;tes. Ils se suivent horizontalement. (<abbr>NdT</abbr>&#xA0;: Ils g&#xE9;n&#xE8;rent en fait des bo&#xEE;tes de ligne&#xA0;: voir <a href="http://www.w3.org/TR/css3-box/#block-level0" class="spip_out">indications du W3C</a>.)</li><li> Les &#xE9;l&#xE9;ments de type blocs-en-ligne, de l&#x2019;int&#xE9;rieur, se comportent comme des <a href="http://quirksmode.org/css/css2/display.html" class="spip_out">&#xE9;l&#xE9;ments de type bloc</a>&#xA0;: ils forment des bo&#xEE;tes. Vus de l&#x2019;ext&#xE9;rieur, ils se comportent tels des &#xE9;l&#xE9;ments en-ligne, se suivent horizontalement au lieu de <a href="http://www.vanseodesign.com/css/css-stack-z-index/" class="spip_out">s&#x2019;empiler</a>.</li></ul>
<p>Lorsqu&#x2019;on y pense, ce comportement n&#x2019;est pas si &#xE9;loign&#xE9; de celui des &#xE9;l&#xE9;ments flottants. Les flottants forment des bo&#xEE;tes et se tiennent eux aussi c&#xF4;te &#xE0; c&#xF4;te au lieu de s&#x2019;organiser verticalement. L&#x2019;un et l&#x2019;autre ne sont bien s&#xFB;r pas identiques, mais leur positionnement en ligne &#xE0; l&#x2019;ext&#xE9;rieur et leur comportement en bloc &#xE0; l&#x2019;int&#xE9;rieur sont parfois les seules caract&#xE9;ristiques recherch&#xE9;es. Dans ce cas, un float ou un <a href="http://www.impressivewebs.com/inline-block/" class="spip_out">inline-block</a> pourra &#xEA;tre utilis&#xE9; indiff&#xE9;remment.<br class="autobr">
<span class="spip_document_463 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/png/floats-inline-blocks_fr.png" width="600" alt=""></span></p>
<h2>La diff&#xE9;rence entre float et inline-block</h2>
<p>M&#xEA;me si float et inline-block partagent quelques similitudes, il existe <a href="http://www.onderhond.com/blog/inline-block-vs-float" class="spip_out">des diff&#xE9;rences bien pr&#xE9;cises</a> entre les deux.</p>
<ul class="spip"><li> Flux du document &#x2013; Les flottants sont retir&#xE9;s du flux normal, permettant ainsi aux &#xE9;l&#xE9;ments qui les suivent de <a href="http://www.ternstyle.us/blog/float-vs-inline-block" class="spip_out">flotter autour d&#x2019;eux</a>&#xA0;; les blocs en ligne restent dans le flux du document. Ainsi, il n&#x2019;est pas n&#xE9;cessaire d&#x2019;avoir recours &#xE0; des techniques telles que <code>clearfix </code>ou <code>overflow:hidden</code>. Ainsi, les &#xE9;l&#xE9;ments suivant un &#xAB;&#xA0;inline-block&#xA0;&#xBB; ne peuvent pas habiller ce dernier, et on ne peut pas forcer un &#xE9;l&#xE9;ment &#xE0; passer sous un &#xAB;&#xA0;inline-block&#xA0;&#xBB; avec la propri&#xE9;t&#xE9; <code>clear</code>.</li><li> Positionnement horizontal &#x2013; Un exemple concret serait des floats qui ne peuvent &#xEA;tre centr&#xE9;s avec un <code>text-align: center</code> plac&#xE9; sur leur parent. De plus, aucun style de positionnement appliqu&#xE9; au parent d&#x2019;un flottant n&#x2019;aura d&#x2019;influence sur ce dernier. &#xC0; l&#x2019;inverse, le parent d&#x2019;un inline-block peut <a href="http://joshnh.com/2012/02/07/why-you-should-use-inline-block-when-positioning-elements/" class="spip_out">affecter sa position</a>.</li><li> Alignement vertical &#x2013; Les inline-blocks s&#x2019;alignent par d&#xE9;faut sur la ligne de base du texte. Les floats s&#x2019;alignent en haut de leur parent. Il est possible de changer ce comportement par d&#xE9;faut pour les inline-blocks et ainsi <a href="http://designshack.net/articles/css/whats-the-deal-with-display-inline-block/" class="spip_out">contr&#xF4;ler o&#xF9; ils seront align&#xE9;s verticalement</a>, ce qui n&#x2019;est pas le cas pour les floats. C&#x2019;est principalement pour cette raison que&#x202F;j&#x2019;ai eu davantage recours aux inline-blocks.</li><li> Espaces blancs &#x2013; Les inline-blocks ob&#xE9;issent aux espaces pr&#xE9;sents dans le <abbr>HTML</abbr> (<abbr>NdT</abbr>&#xA0;: que ce soit une espace simple, une tabulation ou un retour chariot). Si plusieurs &#xE9;l&#xE9;ments inline-block sont chacun d&#xE9;clar&#xE9;s sur une nouvelle ligne dans le code <abbr>HTML</abbr>, ils s&#x2019;afficheront de chaque c&#xF4;t&#xE9; d&#x2019;un espace horizontal. Les &#xE9;l&#xE9;ments flottants se tiendront eux les uns &#xE0; c&#xF4;t&#xE9; des autres ind&#xE9;pendamment des espaces pr&#xE9;sents dans le balisage.</li><li> <abbr>IE</abbr>6 et <abbr>IE</abbr>7 &#x2013; Les blocs en ligne ne sont pas support&#xE9;s ou n&#x2019;ont qu&#x2019;un support partiel dans Internet Explorer 6 et 7. Si vous avez besoin de prendre en charge ces versions du navigateur, vous aurez besoin d&#x2019;une alternative.</li></ul>
<p><span class="spip_document_461 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/png/whitespace.png" width="600" alt=""></span><br class="autobr">
<i>Tous les blocs ci-dessus ont une d&#xE9;claration <code>display: inline-block</code>. &#xC0; gauche, une espace est pr&#xE9;sente entre eux dans le code. &#xC0; droite, l&#x2019;espace a &#xE9;t&#xE9; retir&#xE9;e du <abbr>HTML</abbr>. Aucune autre diff&#xE9;rence.</i></p>
<h2>R&#xE9;gler le probl&#xE8;me de l&#x2019;espace blanc</h2>
<p>Cela est possible. Il est probable que vous voudrez utiliser plusieurs inline-block sans pour autant souhaiter l&#x2019;espace entre eux. Il existe <a href="http://css-tricks.com/fighting-the-space-between-inline-block-elements/" class="spip_out">quelques m&#xE9;thodes</a> pour le supprimer.</p>
<ul class="spip"><li> Supprimez tout espace dans le balisage (<abbr>NDT</abbr>&#x202F;&#xA0;: tabulations et retours &#xE0; la ligne compris) &#x2013; Affranchissez-vous des retours chariot entre les &#xE9;l&#xE9;ments de type inline-block. Il ne s&#x2019;agit pas de la solution la plus &#xE9;l&#xE9;gante, mais elle est efficace, surtout si vous n&#x2019;avez que quelques &#xE9;l&#xE9;ments.</li><li> Utilisez des marges n&#xE9;gatives &#x2013; Il vous faudra prendre en compte la taille de la fonte car les espaces sont calcul&#xE9;es en fonction de cette valeur. J&#x2019;aime &#xE0; penser qu&#x2019;il s&#x2019;agit de 0,25em, mais n&#x2019;&#xE9;tant pas s&#xFB;r, laissez un commentaire si vous en savez plus sur le sujet.</li><li> Appliquer une taille de police de 0 au parent &#x2013; Qu&#x2019;importe la taille de l&#x2019;espace, une taille de texte nulle implique que l&#x2019;espace sera lui aussi nul. Il sera alors &#xE9;videmment n&#xE9;cessaire d&#x2019;attribuer une nouvelle taille pour tous les enfants qui en auraient besoin.</li></ul>
<p><span class="spip_document_457 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/jpg/floating-blocks.jpg" width="600" alt=""></span></p>
<h2>Quand utiliser les inline-blocks et quand utiliser les floats&#xA0;?</h2>
<p><a href="http://css-tricks.com/forums/topic/inline-block-vs-float/" class="spip_out">Quand utiliser l&#x2019;un ou l&#x2019;autre</a> d&#xE9;pend des sp&#xE9;cificit&#xE9;s de votre design, et de ce que vous tentez de r&#xE9;aliser. Si vous voulez que le texte s&#x2019;&#xE9;coule autour d&#x2019;un &#xE9;l&#xE9;ment, alors float est la r&#xE9;ponse la plus &#xE9;vidente. Si vous voulez centrer un &#xE9;l&#xE9;ment, inline-block est la meilleure option.<br class="autobr">
En d&#xE9;finitive, votre choix d&#xE9;coulera des diff&#xE9;rences entre inline-block et float, et des particularit&#xE9;s de chacun qui vous sont n&#xE9;cessaires.</p>
<ul class="spip"><li> Utilisez inline-block&#x2026; lorsque vous avez besoin d&#x2019;un plus grand contr&#xF4;le sur l&#x2019;alignement vertical et le <a href="http://www.vanseodesign.com/css/css-positioning/" class="spip_out">positionnement horizontal des &#xE9;l&#xE9;ments</a>.</li><li> Utilisez float&#x2026; lorsque vous attendez des autres &#xE9;l&#xE9;ments qu&#x2019;ils s&#x2019;agencent autour d&#x2019;un &#xE9;l&#xE9;ment sp&#xE9;cifique, lorsque vous d&#xE9;sirez un support pour les versions plus anciennes d&#x2019;Internet Explorer ou souhaitez &#xE9;viter la probl&#xE9;matique de l&#x2019;espace entre &#xE9;l&#xE9;ments.</li></ul>
<p><span class="spip_document_458 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/png/floats.png" width="600" alt=""></span><br class="autobr">
<i>Les blocs ci-dessus flottent &#xE0; gauche pour composer une grille. Le cinqui&#xE8;me bloc [five] se retrouve coinc&#xE9; par le second [two] car ce dernier est le plus haut de sa rang&#xE9;e. C&#x2019;est un probl&#xE8;me r&#xE9;current lors de la cr&#xE9;ation de grilles d&#x2019;images.</i></p>
<h2>Les floats, les inline-blocks et les grilles d&#x2019;images</h2>
<p>Dans mon cas, l&#x2019;utilisation des inline-blocks m&#x2019;est utile face au souci de l&#x2019;alignement vertical. Je crois que cela doit &#xEA;tre la m&#xEA;me chose pour beaucoup de personnes qui commencent &#xE0; les utiliser. J&#x2019;ai derni&#xE8;rement construit plusieurs sites pour des photographes et, bien entendu, ces sites sont in&#xE9;vitablement charg&#xE9;s de <a href="http://blog.teamtreehouse.com/using-inline-block-to-display-a-product-grid-view" class="spip_out">grilles d&#x2019;images</a>.</p>
<p>Les flottants sont plus efficaces si les images de la grille ont toutes la m&#xEA;me hauteur. D&#xE8;s que ce n&#x2019;est plus le cas, c&#x2019;est-&#xE0;-dire la plupart du temps, les floats se retrouvent comme suspendus &#xE0; c&#xF4;t&#xE9; de l&#x2019;image la plus haute de la rang&#xE9;e sup&#xE9;rieure. Ceci est d&#xFB; au fait que les floats sont exclus du flux normal du document.</p>
<p>Les blocs en ligne n&#x2019;ont pas ce probl&#xE8;me puisqu&#x2019;ils restent dans le flux. Quand une nouvelle rang&#xE9;e d&#x2019;images doit &#xEA;tre cr&#xE9;&#xE9;e, la nouvelle rang&#xE9;e se positionne naturellement sous la pr&#xE9;c&#xE9;dente, de mani&#xE8;re rectiligne. Pour avoir ce m&#xEA;me comportement avec des &#xE9;l&#xE9;ments flottants, nous aurions besoin de savoir pr&#xE9;cis&#xE9;ment sur quel flottant positionner la propri&#xE9;t&#xE9; <code>clear </code>(<abbr>NDT</abbr>&#xA0;: pour forcer un vrai retour &#xE0; la ligne). Ceci peut poser probl&#xE8;me dans le cas o&#xF9; les &#xE9;l&#xE9;ments sont g&#xE9;n&#xE9;r&#xE9;s dynamiquement. Dans ce cas pr&#xE9;cis, utiliser des blocs en ligne est bien plus naturel. <br class="autobr">
<a href="http://www.vanseodesign.com/blog/demo/inline-block/" class="spip_out">Voici une d&#xE9;monstration</a> qui illustre le probl&#xE8;me abord&#xE9; plus haut et les diff&#xE9;rents r&#xE9;sultats obtenus suivant la technique utilis&#xE9;e.</p>
<p><span class="spip_document_460 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/png/inline-blocks.png" width="600" alt=""></span><br class="autobr">
<i><code>display: inline-block</code> est appliqu&#xE9; aux blocs du dessus. &#xC9;tant donn&#xE9; qu&#x2019;ils ne sont pas exclus du flux du document, aucun des blocs ne se retrouve prisonnier des blocs de la ligne sup&#xE9;rieure.</i></p>
<h2>Les inline-blocks pour la navigation</h2>
<p>Une autre application possible pour inline-block se trouve dans <a href="http://www.vanseodesign.com/css/simple-navigation-bar-with-css-and-xhtml/" class="spip_out">les barres horizontales de navigation</a>. On y fait g&#xE9;n&#xE9;ralement flotter les liens pour ensuite les d&#xE9;clarer comme des &#xE9;l&#xE9;ments de type bloc. Je me vois &#xE9;galement d&#xE9;clarer des items de liste comme inline. S&#x2019;il vous faut jongler avec des valeurs inline et block pour utiliser float, inline-block repr&#xE9;sente alors peut&#x2011;&#xEA;tre une meilleure solution.</p>
<p>Partout o&#xF9; vous avez besoin de ranger vos &#xE9;l&#xE9;ments en une ou plusieurs lignes, vous devriez songer &#xE0; utiliser inline-block plut&#xF4;t que float. &#xC9;videmment, des tableaux feraient eux aussi l&#x2019;affaire dans ces circonstances. Apr&#xE8;s tout, ils sont faits pour aligner du contenu en lignes et colonnes.</p>
<p>Si vous construisez quelque chose de plus complexe n&#xE9;cessitant lignes et colonnes, alors <a href="http://www.vanseodesign.com/css/tables/" class="spip_out">un tableau HTML ou CSS</a> peut &#xEA;tre votre meilleure option, m&#xEA;me si les inline-blocks restent &#xE0; privil&#xE9;gier pour les constructions plus simples.</p>
<p><span class="spip_document_456 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/jpg/block.jpg" width="600" alt=""></span></p>
<h2>Conclusion</h2>
<p>Les inline-blocks puisent parmi les caract&#xE9;ristiques des &#xE9;l&#xE9;ments en ligne vus de l&#x2019;ext&#xE9;rieur&#xA0;; et des &#xE9;l&#xE9;ments de type block vus de l&#x2019;int&#xE9;rieur. Cela les rend tr&#xE8;s similaires aux flottants &#xE0; quelques diff&#xE9;rences pr&#xE8;s.</p>
<p>Ces diff&#xE9;rences vous aideront &#xE0; choisir l&#x2019;utilisation la mieux adapt&#xE9;e. Si vous rencontrez des probl&#xE8;mes avec <a href="http://www.vanseodesign.com/css/dynamic-vertical-centering/" class="spip_out">l&#x2019;alignement vertical</a> ou le positionnement horizontal, vous serez plus enclin &#xE0; utiliser un inline-block. Si vous avez besoin de plus de contr&#xF4;le sur un seul &#xE9;l&#xE9;ment et son interaction avec le contenu qui l&#x2019;entoure, vous serez plus enclin &#xE0; utiliser un float.<br class="autobr">
Bien entendu, un tableau peut s&#x2019;av&#xE9;rer comme &#xE9;tant la meilleure option en fonction de ce que vous tentez d&#x2019;accomplir.</p>
<p>Tout ceci n&#x2019;est rien de nouveau, mais j&#x2019;ai pens&#xE9; qu&#x2019;un article et <a href="http://www.vanseodesign.com/blog/demo/inline-block/" class="spip_out">une d&#xE9;monstration</a> seraient utiles &#xE0; quiconque n&#x2019;aurait pas utilis&#xE9; les blocs en ligne l&#xE0; o&#xF9; il aurait d&#xFB;.</p> </div><div id="similaires"> <p> Voici la liste des dix articles les plus r&#xE9;cents en rapport avec cet article&#xA0;: </p> </div></div>]]></description>
      <link>http://www.pompage.net/traduction/inline-block-vs-float</link>
      <guid>http://www.pompage.net/traduction/inline-block-vs-float</guid>
      <pubDate>Tue, 05 Aug 2014 10:08:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Inline-block est-il un substitut aux floats ?]]></title>
      <description><![CDATA[<div><div id="article"> <p class="signature">Par <a href="http://www.vanseodesign.com/">Steven Bradley</a> </p> <p class="moreInfo"> Quand vient le moment de d&#xE9;velopper la mise en page avec CSS, <code>float</code> fait le plus gros du travail. Nous utilisons les &#xE9;l&#xE9;ments flottants pour les blocs importants comme une zone de contenu principale ou une colonne lat&#xE9;rale ; nous y avons aussi recours pour les blocs de moindre taille &#xE0; l&#x2019;int&#xE9;rieur de ces blocs principaux. Mais les floats sont-ils toujours le meilleur choix? </p> <p>Si les floats fonctionnent g&#xE9;n&#xE9;ralement sans probl&#xE8;me, il peut parfois &#xEA;tre d&#xE9;licat de les manipuler. C&#x2019;est tout particuli&#xE8;rement compliqu&#xE9; quand il s&#x2019;agit de blocs imbriqu&#xE9;s, comme par exemple lorsqu&#x2019;on veut organiser une grille d&#x2019;images, mais qu&#x2019;elles refusent de bien s&#x2019;aligner. Une alternative existe&#xA0;: les blocs en lignes. Ils b&#xE9;n&#xE9;ficient de <a href="http://www.vanseodesign.com/css/understanding-css-floats/" class="spip_out">certains avantages des floats</a> sans en pr&#xE9;senter les inconv&#xE9;nients.</p>
<p>Les inline-block n&#x2019;ont rien d&#x2019;une nouveaut&#xE9; et il est possible que vous les utilisiez d&#xE9;j&#xE0;. Ce n&#x2019;&#xE9;tait pas mon cas jusqu&#x2019;&#xE0; r&#xE9;cemment. Il se trouve que les derniers sites que j&#x2019;ai r&#xE9;alis&#xE9;s &#xE9;taient destin&#xE9;s &#xE0; des photographes. Naturellement, ce genre de site pr&#xE9;sente des grilles d&#x2019;image. Pour les mettre en forme, j&#x2019;ai privil&#xE9;gi&#xE9; inline-block &#xE0; float.<br class="autobr">
<span class="spip_document_462 spip_documents spip_documents_center">
<img src="https://www.pompage.net/traduction/IMG/png/css-box-model_fr.png" width="600" alt=""></span></p>
<h2>Qu&#x2019;est ce qu&#x2019;un inline-block&#xA0;?</h2>
<p><a href="http://www.w3.org/TR/CSS21/visuren.html#display-prop" class="spip_out">Inline-block</a> est l&#x2019;une des valeurs possibles pouvant &#xEA;tre assign&#xE9;es &#xE0; <a href="http://www.vanseodesign.com/css/display-property/" class="spip_out">la propri&#xE9;t&#xE9; <code>display </code>d&#x2019;un &#xE9;l&#xE9;ment</a>. Cette valeur tient son nom du fait qu&#x2019;elle regroupe certaines caract&#xE9;ristiques des &#xE9;l&#xE9;ments de type bloc et en ligne.</p>
<ul class="spip"><li> Les &#xE9;l&#xE9;ments de type bloc g&#xE9;n&#xE8;rent des bo&#xEE;tes selon <a href="http://www.w3.org/TR/css3-box/" class="spip_out">le mod&#xE8;le de bo&#xEE;tes <abbr>CSS</abbr></a>. Ils peuvent avoir une largeur (<code>width</code>), une hauteur (<code>height</code>), des bordures et des marges int&#xE9;rieures et ext&#xE9;rieures (<code>padding </code>et <code>margin</code>). Ils s&#x2019;organisent verticalement les uns au-dessus des autres.</li><li> Les &#xE9;l&#xE9;ments en-ligne ne forment pas de bo&#xEE;tes. Ils se suivent horizontalement. (<abbr>NdT</abbr>&#xA0;: Ils g&#xE9;n&#xE8;rent en fait des bo&#xEE;tes de ligne&#xA0;: voir <a href="http://www.w3.org/TR/css3-box/#block-level0" class="spip_out">indications du W3C</a>.)</li><li> Les &#xE9;l&#xE9;ments de type blocs-en-ligne, de l&#x2019;int&#xE9;rieur, se comportent comme des <a href="http://quirksmode.org/css/css2/display.html" class="spip_out">&#xE9;l&#xE9;ments de type bloc</a>&#xA0;: ils forment des bo&#xEE;tes. Vus de l&#x2019;ext&#xE9;rieur, ils se comportent tels des &#xE9;l&#xE9;ments en-ligne, se suivent horizontalement au lieu de <a href="http://www.vanseodesign.com/css/css-stack-z-index/" class="spip_out">s&#x2019;empiler</a>.</li></ul>
<p>Lorsqu&#x2019;on y pense, ce comportement n&#x2019;est pas si &#xE9;loign&#xE9; de celui des &#xE9;l&#xE9;ments flottants. Les flottants forment des bo&#xEE;tes et se tiennent eux aussi c&#xF4;te &#xE0; c&#xF4;te au lieu de s&#x2019;organiser verticalement. L&#x2019;un et l&#x2019;autre ne sont bien s&#xFB;r pas identiques, mais leur positionnement en ligne &#xE0; l&#x2019;ext&#xE9;rieur et leur comportement en bloc &#xE0; l&#x2019;int&#xE9;rieur sont parfois les seules caract&#xE9;ristiques recherch&#xE9;es. Dans ce cas, un float ou un <a href="http://www.impressivewebs.com/inline-block/" class="spip_out">inline-block</a> pourra &#xEA;tre utilis&#xE9; indiff&#xE9;remment.<br class="autobr">
<span class="spip_document_463 spip_documents spip_documents_center">
<img src="https://www.pompage.net/traduction/IMG/png/floats-inline-blocks_fr.png" width="600" alt=""></span></p>
<h2>La diff&#xE9;rence entre float et inline-block</h2>
<p>M&#xEA;me si float et inline-block partagent quelques similitudes, il existe <a href="http://www.onderhond.com/blog/inline-block-vs-float" class="spip_out">des diff&#xE9;rences bien pr&#xE9;cises</a> entre les deux.</p>
<ul class="spip"><li> Flux du document &#x2013; Les flottants sont retir&#xE9;s du flux normal, permettant ainsi aux &#xE9;l&#xE9;ments qui les suivent de <a href="http://www.ternstyle.us/blog/float-vs-inline-block" class="spip_out">flotter autour d&#x2019;eux</a>&#xA0;; les blocs en ligne restent dans le flux du document. Ainsi, il n&#x2019;est pas n&#xE9;cessaire d&#x2019;avoir recours &#xE0; des techniques telles que <code>clearfix </code>ou <code>overflow:hidden</code>. Ainsi, les &#xE9;l&#xE9;ments suivant un &#xAB;&#xA0;inline-block&#xA0;&#xBB; ne peuvent pas habiller ce dernier, et on ne peut pas forcer un &#xE9;l&#xE9;ment &#xE0; passer sous un &#xAB;&#xA0;inline-block&#xA0;&#xBB; avec la propri&#xE9;t&#xE9; <code>clear</code>.</li><li> Positionnement horizontal &#x2013; Un exemple concret serait des floats qui ne peuvent &#xEA;tre centr&#xE9;s avec un <code>text-align: center</code> plac&#xE9; sur leur parent. De plus, aucun style de positionnement appliqu&#xE9; au parent d&#x2019;un flottant n&#x2019;aura d&#x2019;influence sur ce dernier. &#xC0; l&#x2019;inverse, le parent d&#x2019;un inline-block peut <a href="http://joshnh.com/2012/02/07/why-you-should-use-inline-block-when-positioning-elements/" class="spip_out">affecter sa position</a>.</li><li> Alignement vertical &#x2013; Les inline-blocks s&#x2019;alignent par d&#xE9;faut sur la ligne de base du texte. Les floats s&#x2019;alignent en haut de leur parent. Il est possible de changer ce comportement par d&#xE9;faut pour les inline-blocks et ainsi <a href="http://designshack.net/articles/css/whats-the-deal-with-display-inline-block/" class="spip_out">contr&#xF4;ler o&#xF9; ils seront align&#xE9;s verticalement</a>, ce qui n&#x2019;est pas le cas pour les floats. C&#x2019;est principalement pour cette raison que&#x202F;j&#x2019;ai eu davantage recours aux inline-blocks.</li><li> Espaces blancs &#x2013; Les inline-blocks ob&#xE9;issent aux espaces pr&#xE9;sents dans le <abbr>HTML</abbr> (<abbr>NdT</abbr>&#xA0;: que ce soit une espace simple, une tabulation ou un retour chariot). Si plusieurs &#xE9;l&#xE9;ments inline-block sont chacun d&#xE9;clar&#xE9;s sur une nouvelle ligne dans le code <abbr>HTML</abbr>, ils s&#x2019;afficheront de chaque c&#xF4;t&#xE9; d&#x2019;un espace horizontal. Les &#xE9;l&#xE9;ments flottants se tiendront eux les uns &#xE0; c&#xF4;t&#xE9; des autres ind&#xE9;pendamment des espaces pr&#xE9;sents dans le balisage.</li><li> <abbr>IE</abbr>6 et <abbr>IE</abbr>7 &#x2013; Les blocs en ligne ne sont pas support&#xE9;s ou n&#x2019;ont qu&#x2019;un support partiel dans Internet Explorer 6 et 7. Si vous avez besoin de prendre en charge ces versions du navigateur, vous aurez besoin d&#x2019;une alternative.</li></ul>
<p><span class="spip_document_461 spip_documents spip_documents_center">
<img src="https://www.pompage.net/traduction/IMG/png/whitespace.png" width="600" alt=""></span><br class="autobr">
<i>Tous les blocs ci-dessus ont une d&#xE9;claration <code>display: inline-block</code>. &#xC0; gauche, une espace est pr&#xE9;sente entre eux dans le code. &#xC0; droite, l&#x2019;espace a &#xE9;t&#xE9; retir&#xE9;e du <abbr>HTML</abbr>. Aucune autre diff&#xE9;rence.</i></p>
<h2>R&#xE9;gler le probl&#xE8;me de l&#x2019;espace blanc</h2>
<p>Cela est possible. Il est probable que vous voudrez utiliser plusieurs inline-block sans pour autant souhaiter l&#x2019;espace entre eux. Il existe <a href="http://css-tricks.com/fighting-the-space-between-inline-block-elements/" class="spip_out">quelques m&#xE9;thodes</a> pour le supprimer.</p>
<ul class="spip"><li> Supprimez tout espace dans le balisage (<abbr>NDT</abbr>&#x202F;&#xA0;: tabulations et retours &#xE0; la ligne compris) &#x2013; Affranchissez-vous des retours chariot entre les &#xE9;l&#xE9;ments de type inline-block. Il ne s&#x2019;agit pas de la solution la plus &#xE9;l&#xE9;gante, mais elle est efficace, surtout si vous n&#x2019;avez que quelques &#xE9;l&#xE9;ments.</li><li> Utilisez des marges n&#xE9;gatives &#x2013; Il vous faudra prendre en compte la taille de la fonte car les espaces sont calcul&#xE9;es en fonction de cette valeur. J&#x2019;aime &#xE0; penser qu&#x2019;il s&#x2019;agit de 0,25em, mais n&#x2019;&#xE9;tant pas s&#xFB;r, laissez un commentaire si vous en savez plus sur le sujet.</li><li> Appliquer une taille de police de 0 au parent &#x2013; Qu&#x2019;importe la taille de l&#x2019;espace, une taille de texte nulle implique que l&#x2019;espace sera lui aussi nul. Il sera alors &#xE9;videmment n&#xE9;cessaire d&#x2019;attribuer une nouvelle taille pour tous les enfants qui en auraient besoin.</li></ul>
<p><span class="spip_document_457 spip_documents spip_documents_center">
<img src="https://www.pompage.net/traduction/IMG/jpg/floating-blocks.jpg" width="600" alt=""></span></p>
<h2>Quand utiliser les inline-blocks et quand utiliser les floats&#xA0;?</h2>
<p><a href="http://css-tricks.com/forums/topic/inline-block-vs-float/" class="spip_out">Quand utiliser l&#x2019;un ou l&#x2019;autre</a> d&#xE9;pend des sp&#xE9;cificit&#xE9;s de votre design, et de ce que vous tentez de r&#xE9;aliser. Si vous voulez que le texte s&#x2019;&#xE9;coule autour d&#x2019;un &#xE9;l&#xE9;ment, alors float est la r&#xE9;ponse la plus &#xE9;vidente. Si vous voulez centrer un &#xE9;l&#xE9;ment, inline-block est la meilleure option.<br class="autobr">
En d&#xE9;finitive, votre choix d&#xE9;coulera des diff&#xE9;rences entre inline-block et float, et des particularit&#xE9;s de chacun qui vous sont n&#xE9;cessaires.</p>
<ul class="spip"><li> Utilisez inline-block&#x2026; lorsque vous avez besoin d&#x2019;un plus grand contr&#xF4;le sur l&#x2019;alignement vertical et le <a href="http://www.vanseodesign.com/css/css-positioning/" class="spip_out">positionnement horizontal des &#xE9;l&#xE9;ments</a>.</li><li> Utilisez float&#x2026; lorsque vous attendez des autres &#xE9;l&#xE9;ments qu&#x2019;ils s&#x2019;agencent autour d&#x2019;un &#xE9;l&#xE9;ment sp&#xE9;cifique, lorsque vous d&#xE9;sirez un support pour les versions plus anciennes d&#x2019;Internet Explorer ou souhaitez &#xE9;viter la probl&#xE9;matique de l&#x2019;espace entre &#xE9;l&#xE9;ments.</li></ul>
<p><span class="spip_document_458 spip_documents spip_documents_center">
<img src="https://www.pompage.net/traduction/IMG/png/floats.png" width="600" alt=""></span><br class="autobr">
<i>Les blocs ci-dessus flottent &#xE0; gauche pour composer une grille. Le cinqui&#xE8;me bloc [five] se retrouve coinc&#xE9; par le second [two] car ce dernier est le plus haut de sa rang&#xE9;e. C&#x2019;est un probl&#xE8;me r&#xE9;current lors de la cr&#xE9;ation de grilles d&#x2019;images.</i></p>
<h2>Les floats, les inline-blocks et les grilles d&#x2019;images</h2>
<p>Dans mon cas, l&#x2019;utilisation des inline-blocks m&#x2019;est utile face au souci de l&#x2019;alignement vertical. Je crois que cela doit &#xEA;tre la m&#xEA;me chose pour beaucoup de personnes qui commencent &#xE0; les utiliser. J&#x2019;ai derni&#xE8;rement construit plusieurs sites pour des photographes et, bien entendu, ces sites sont in&#xE9;vitablement charg&#xE9;s de <a href="http://blog.teamtreehouse.com/using-inline-block-to-display-a-product-grid-view" class="spip_out">grilles d&#x2019;images</a>.</p>
<p>Les flottants sont plus efficaces si les images de la grille ont toutes la m&#xEA;me hauteur. D&#xE8;s que ce n&#x2019;est plus le cas, c&#x2019;est-&#xE0;-dire la plupart du temps, les floats se retrouvent comme suspendus &#xE0; c&#xF4;t&#xE9; de l&#x2019;image la plus haute de la rang&#xE9;e sup&#xE9;rieure. Ceci est d&#xFB; au fait que les floats sont exclus du flux normal du document.</p>
<p>Les blocs en ligne n&#x2019;ont pas ce probl&#xE8;me puisqu&#x2019;ils restent dans le flux. Quand une nouvelle rang&#xE9;e d&#x2019;images doit &#xEA;tre cr&#xE9;&#xE9;e, la nouvelle rang&#xE9;e se positionne naturellement sous la pr&#xE9;c&#xE9;dente, de mani&#xE8;re rectiligne. Pour avoir ce m&#xEA;me comportement avec des &#xE9;l&#xE9;ments flottants, nous aurions besoin de savoir pr&#xE9;cis&#xE9;ment sur quel flottant positionner la propri&#xE9;t&#xE9; <code>clear </code>(<abbr>NDT</abbr>&#xA0;: pour forcer un vrai retour &#xE0; la ligne). Ceci peut poser probl&#xE8;me dans le cas o&#xF9; les &#xE9;l&#xE9;ments sont g&#xE9;n&#xE9;r&#xE9;s dynamiquement. Dans ce cas pr&#xE9;cis, utiliser des blocs en ligne est bien plus naturel. <br class="autobr">
<a href="http://www.vanseodesign.com/blog/demo/inline-block/" class="spip_out">Voici une d&#xE9;monstration</a> qui illustre le probl&#xE8;me abord&#xE9; plus haut et les diff&#xE9;rents r&#xE9;sultats obtenus suivant la technique utilis&#xE9;e.</p>
<p><span class="spip_document_460 spip_documents spip_documents_center">
<img src="https://www.pompage.net/traduction/IMG/png/inline-blocks.png" width="600" alt=""></span><br class="autobr">
<i><code>display: inline-block</code> est appliqu&#xE9; aux blocs du dessus. &#xC9;tant donn&#xE9; qu&#x2019;ils ne sont pas exclus du flux du document, aucun des blocs ne se retrouve prisonnier des blocs de la ligne sup&#xE9;rieure.</i></p>
<h2>Les inline-blocks pour la navigation</h2>
<p>Une autre application possible pour inline-block se trouve dans <a href="http://www.vanseodesign.com/css/simple-navigation-bar-with-css-and-xhtml/" class="spip_out">les barres horizontales de navigation</a>. On y fait g&#xE9;n&#xE9;ralement flotter les liens pour ensuite les d&#xE9;clarer comme des &#xE9;l&#xE9;ments de type bloc. Je me vois &#xE9;galement d&#xE9;clarer des items de liste comme inline. S&#x2019;il vous faut jongler avec des valeurs inline et block pour utiliser float, inline-block repr&#xE9;sente alors peut&#x2011;&#xEA;tre une meilleure solution.</p>
<p>Partout o&#xF9; vous avez besoin de ranger vos &#xE9;l&#xE9;ments en une ou plusieurs lignes, vous devriez songer &#xE0; utiliser inline-block plut&#xF4;t que float. &#xC9;videmment, des tableaux feraient eux aussi l&#x2019;affaire dans ces circonstances. Apr&#xE8;s tout, ils sont faits pour aligner du contenu en lignes et colonnes.</p>
<p>Si vous construisez quelque chose de plus complexe n&#xE9;cessitant lignes et colonnes, alors <a href="http://www.vanseodesign.com/css/tables/" class="spip_out">un tableau HTML ou CSS</a> peut &#xEA;tre votre meilleure option, m&#xEA;me si les inline-blocks restent &#xE0; privil&#xE9;gier pour les constructions plus simples.</p>
<p><span class="spip_document_456 spip_documents spip_documents_center">
<img src="https://www.pompage.net/traduction/IMG/jpg/block.jpg" width="600" alt=""></span></p>
<h2>Conclusion</h2>
<p>Les inline-blocks puisent parmi les caract&#xE9;ristiques des &#xE9;l&#xE9;ments en ligne vus de l&#x2019;ext&#xE9;rieur&#xA0;; et des &#xE9;l&#xE9;ments de type block vus de l&#x2019;int&#xE9;rieur. Cela les rend tr&#xE8;s similaires aux flottants &#xE0; quelques diff&#xE9;rences pr&#xE8;s.</p>
<p>Ces diff&#xE9;rences vous aideront &#xE0; choisir l&#x2019;utilisation la mieux adapt&#xE9;e. Si vous rencontrez des probl&#xE8;mes avec <a href="http://www.vanseodesign.com/css/dynamic-vertical-centering/" class="spip_out">l&#x2019;alignement vertical</a> ou le positionnement horizontal, vous serez plus enclin &#xE0; utiliser un inline-block. Si vous avez besoin de plus de contr&#xF4;le sur un seul &#xE9;l&#xE9;ment et son interaction avec le contenu qui l&#x2019;entoure, vous serez plus enclin &#xE0; utiliser un float.<br class="autobr">
Bien entendu, un tableau peut s&#x2019;av&#xE9;rer comme &#xE9;tant la meilleure option en fonction de ce que vous tentez d&#x2019;accomplir.</p>
<p>Tout ceci n&#x2019;est rien de nouveau, mais j&#x2019;ai pens&#xE9; qu&#x2019;un article et <a href="http://www.vanseodesign.com/blog/demo/inline-block/" class="spip_out">une d&#xE9;monstration</a> seraient utiles &#xE0; quiconque n&#x2019;aurait pas utilis&#xE9; les blocs en ligne l&#xE0; o&#xF9; il aurait d&#xFB;.</p> </div><div id="similaires"> <p> Voici la liste des dix articles les plus r&#xE9;cents en rapport avec cet article&#xA0;: </p> </div></div>]]></description>
      <link>https://www.pompage.net/traduction/inline-block-vs-float</link>
      <guid>https://www.pompage.net/traduction/inline-block-vs-float</guid>
      <pubDate>Tue, 05 Aug 2014 10:08:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Introduction à l'accessibilité de JavaScript]]></title>
      <description><![CDATA[<p class="signature">Par <a title="Le site de James Edwards." href="http://www.brothercake.com/" hreflang="en">James Edwards</a></p><p>Il fut un temps où l’accessibilité de JavaScript signifiait simplement assurer une dégradation élégante lorsque JavaScript n’était pas disponible. Mais, avec la percée d’Ajax et des Applications Internet Riches (<abbr>RIA</abbr>), JavaScript n’est plus seulement utilisé pour améliorer l’utilisabilité à la marge, il constitue désormais la base des applications web. De nos jours, parler de l’accessibilité de JavaScript c’est s’assurer que le code JavaScript est accessible en lui-même.</p><h2>Ce que nous réserve l’avenir</h2><p>Le protocole d’accessibilité des applications Internet riches (NdT : <abbr>ARIA</abbr> en anglais, pour Accessible Rich Internet Applications) est une des évolutions les plus importantes de ces dernières années dans l’accessibilité web. Il a été conçu par le groupe Initiative pour l’Accessibilité du Web (<abbr>WAI</abbr>) et définit une sémantique permettant de rendre le contenu interactif accessible aux technologies d’assistance telles que les lecteurs d’écran. <abbr>WAI-ARIA</abbr> est apparu par nécessité, l’explosion du Web 2.0 s’étant faite presque sans aucune considération d’accessibilité. JavaScript est désormais utilisé dans le code d’applications web critiques et les technologies d’assistance doivent donc impérativement pouvoir interpréter le contenu dynamique.</p><h2>Aujourd’hui</h2><p>Malheureusement, <abbr>ARIA</abbr> n’est pas encore très bien pris en charge. Seules les dernières versions des (très coûteux) lecteurs d’écran offrent un début de prise en charge, et aucun d’entre eux ne l’offre intégralement. De plus, ce qui est supporté n’est pas forcément bien implémenté. Et même quand <abbr>ARIA</abbr> sera largement pris en charge, ce ne sera pas pour autant la réponse à tout car l’accessibilité de JavaScript ne se résume pas à ce qui est défini par <abbr>ARIA</abbr>. Pour que les fondations de ce protocole soient solides, elles doivent associer une véritable compréhension du besoin utilisateur et des développements basés sur les standards.</p><p>Sitepoint va consacrer <a href="http://www.sitepoint.com/category/javascript/" class="spip_out" rel="external">plusieurs articles à l’accessibilité de JavaScript</a>. Nous commençons par un aperçu des choses simples que vous pouvez faire dès à présent pour rendre votre JavaScript plus accessible. Plus tard, nous entrerons plus en détails dans le monde d’<abbr>ARIA</abbr>. Mais avant toute chose, nous devons revoir quelques concepts théoriques</p><h2>Le cœur de l’accessibilité</h2><p>L’accessibilité de JavaScript peut être divisée en trois grands groupes de besoins utilisateurs. Ce chapitre décrit ces groupes de manière détaillée.</p><h2>Les utilisateurs de technologies d’assistance</h2><p>Le premier groupe comprend les personnes qui utilisent des lecteurs d’écran, plages Braille ou d’autres aides techniques de ce genre. Les aveugles sont majoritaires dans ce groupe, mais il inclut également les personnes souffrant de handicaps visuels ou cognitifs, pour qui les lecteurs d’écran facilitent la lecture et la compréhension.</p><p>Les technologies d’assistance présentent toutes les informations sous forme de texte structuré. Par conséquent, toutes les fonctionnalités JavaScript doivent adopter une forme qui puisse être présentée textuellement. Une barre de progression scriptée telle qu’illustrée ci-dessous fournit des informations visuelles, elle devrait donc être complétée par un texte fournissant les mêmes informations.</p><div class="spip_document_454 spip_document spip_documents spip_document_image spip_documents_center spip_document_center spip_document_avec_legende" data-legende-len="228" data-legende-lenx="xxx"><figure class="spip_doc_inner"><img src="http://www.pompage.net/traduction/IMG/png/javascript-a4a48.png" width="226" height="51" alt="" /><figcaption class="spip_doc_legende">Une barre de progressions dont la position, 76%, est indiquée visuellement et à l’aide d’un nombre en pourcentage.
Sitepoint, <a href="http://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2012/11/javascript-accessibility-progress.png" class="spip_url spip_out auto" rel="nofollow external">http://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2012/11/javascript-accessibility-progress.png</a>
</figcaption></figure></div><p>Le texte en lui-même ne suffit pas, s’il ne possède pas de structure ou de liaisons interprétables par les technologies d’assistance. Un texte est souvent structuré de façon très simple, sous forme de listes et de tableaux. Les technologies d’assistance comprennent aisément ce type de structure, il ne nous reste donc qu’à les utiliser correctement.</p><p>En utilisant par exemple des listes non ordonnées et des libellés de structure comme base d’un menu déroulant, les technologies d’assistance peuvent interpréter le sens à partir de la sémantique et de la hiérarchie de ces éléments. Nous pouvons également construire des widgets de calendrier où chaque mois est représenté par un tableau <abbr>HTML</abbr>. Il suffit alors de déclencher son affichage par un bouton et de le décrire à l’aide d’une légende. Une sémantique solide des éléments doit constituer la base de tout contenu interactif.</p><h2>Les utilisateurs qui naviguent au clavier</h2><p>Le deuxième groupe est formé par les personnes qui utilisent uniquement le clavier. Ce groupe comprend les non-voyants utilisant un lecteur d’écran, mais également les personnes voyantes qui ne peuvent pas utiliser la souris en raison d’un handicap moteur, ainsi que les personnes ayant une déficience cognitive et pour suivre les éléments qui possèdent le focus aide à se concentrer. Pour s’adapter aux besoins de ce groupe, toutes les fonctionnalités JavaScript doit être accessibles au clavier. Les interactions par exemple doivent être limitées aux touches les plus intuitives : tabulation, les flèches, la touche Entrée et la touche d’échappement.</p><p>La prise en charge du clavier se fait souvent à moindre coût, pour peu que vous partiez du principe que le meilleur événement est toujours celui qui est le plus indépendant du périphérique. Ainsi, la validation du formulaire doit être liée à l’événement <code>submit</code> du formulaire, tandis que les événements d’activation primaires devraient être liés à l’événement clic universel, plutôt que des événements spécifiques comme <code>mousedown</code>, <code>touchstart</code> ou <code>KeyDown</code>.</p><p>Pour les interactions plus complexes, il est souvent nécessaire de combiner les événements. Les Règles d’Accessibilité pour les Contenus Web (<abbr>NdT</abbr> : Web Content Accessibility Guidelines, ou <abbr>WCAG</abbr> en anglais) parlent d’association d’événements : il s’agit de coupler les événements souris avec leur équivalent clavier le plus similaire. Un exemple est le couplage des événements <code>mousedown</code> et <code>keydown</code>. Ce n’est toutefois pas la bonne façon de voir les choses car on se concentre ici sur la technique plutôt que sur la finalité d’une action. Tant que l’objectif est atteint, peu importe que les modalités au clavier soient totalement différentes de l’action à la souris.</p><p>Pour le glisser-déposer par exemple, il n’y a pas d’équivalent à l’événement <code>mousemove</code>, mais nous pouvons quand même rendre cette fonctionnalité accessible au clavier. Il s’agit en fait de deux interactions distinctes. La première permet de déplacer des éléments vers le haut ou le bas pour les réorganiser, ce qui peut tout simplement se faire grâce aux flèches haut et bas. La seconde interaction concerne l’action d’attraper et de déplacer, pour déplacer des fichiers d’un dossier à un autre par exemple. Cela peut se faire par exemple avec la touche Espace pour sélectionner l’élément, la touche Tabulation pour sélectionner la destination, et la touche Entrée pour déposer.</p><p>Lorsque des touches non-standard sont utilisées, un texte d’accompagnement devrait figurer pour l’expliquer. Dans les faits, certaines interactions seront immanquablement plus compliquées que leur équivalent à la souris. Mais ce n’est pas bien grave, du moment que le résultat est atteignable. L’accessibilité c’est l’équivalence, pas l’égalité.</p><p>Une autre considération importante concernant l’accessibilité au clavier est de garder un ordre logique du contenu. Des bulles d’aide enrichies, par exemple, doivent être insérées immédiatement après l’élément qu’elles concernent pour qu’on y accède directement en tabulant une seule fois, et afin que les lecteurs d’écran puissent les lire dans la foulée.</p><h2>Les utilisateurs sensibles au clignotement ou aux limites de temps</h2><p>Le dernier groupe comprend les personnes sensibles aux clignotements ou aux brusques changements de luminosité, ou qui ne peuvent pas réagir aux événements en temps réel comme les autres. Le contenu clignotant affecte les personnes souffrant d’une épilepsie photosensible, chez qui cela peut provoquer une crise, ainsi que les personnes souffrant de déficience cognitive, qui ont du mal à se concentrer lorsque les choses bougent dans leur vision périphérique. Les limitations sur les contenus qui clignotent sont assez bien formulées par les règles d’accessibilité pour les contenus web et synthétisées par le seuil de trois clignotements maximum.</p><p>Les limites temporelles peuvent également s’avérer problématiques car écouter un contenu vocalisé prend plus de temps que de le lire. Naviguer au clavier prend également plus de temps qu’à la souris. De ce fait, les actions JavaScript basées sur le temps doivent être contrôlables par l’utilisateur. Les limites sur des activités temporelles ne sont pas trop spécifiques, car il y a différents cas de figure à prendre en considération.</p><p>Le grand principe pour les limites temporelles est que si une activité doit être effectuée dans un certain laps de temps, l’utilisateur est prévenu quand la limite est sur le point d’expirer et se voit proposer une façon de la rallonger. Par exemple, un site de banque en ligne peut avoir des limites de temps strictes sur l’inactivité de session, mais l’utilisateur doit pouvoir l’allonger à l’aide d’un simple dialogue de confirmation (comme ceux qu’on peut voir sur les guichets automatiques qui vous demandent si vous avez besoin de davantage de temps).</p><p>Lorsque du contenu est animé, l’animation ne devrait pas durer plus de cinq secondes, à moins que l’utilisateur ait un moyen de la contrôler. Une animation peut être purement décorative, la limite de temps est donc utile pour les personnes qui souffrent de déficience cognitive et pour qui une animation continue en périphérie rend plus difficile le fait de se concentrer sur le contenu principal.</p><p>Pour une animation telle que le défilement ou le déplacement d’un contenu, la restriction impose de permettre aux utilisateurs de terminer leur tâche sans changements de contexte inattendus. Un lecteur d’actualités qui défile automatiquement par exemple devrait avoir un bouton pause, pour laisser l’utilisateur lire chaque actualité à son propre rythme et en étant assuré que les choses ne bougeront pas pendant qu’il la lira ! Cela est également valable lorsque de grands blocs de contenus ou des pages entières sont automatiquement rechargés. C’est très courant sur les sites de bourse en ligne ou de résultats sportifs. Vous ne devriez jamais faire cela, à moins de fournir des contrôles spécifiques à l’utilisateur sur la fréquence de rafraîchissement (qui devrait être à <code>never</code> (jamais) par défaut).</p><p>Mais les limites temporelles font souvent partie intégrante des activités pour lesquelles elles sont utilisées. Beaucoup de jeux comportent intrinsèquement des limites de temps et les supprimer nuirait au principe même du jeu. Dans de tels cas, on peut dire que le contenu ne peut être rendu accessible sans changer sa signification. Les règles d’accessibilité autorisent cette possibilité, du moment que le contenu est clairement décrit comme tel.</p><h2>Conclusion</h2><p>Nous venons de voir que l’accessibilité de JavaScript peut se résumer à trois principes fondamentaux.</p><ul class="spip"><li>Toute fonctionnalité JavaScript doit prendre une forme qui peut être interprétée comme du texte.</li>
<li>Toute fonctionnalité JavaScript doit être accessible au clavier.</li>
<li>Les activités temporelles en JavaScript doivent pouvoir être contrôlées par l’utilisateur, à moins que cela ne change leur sens.</li>
</ul><p>La prochaine fois, nous nous éloignerons de la théorie, pour voir quelques petites choses simples mais pratiques que vous pouvez mettre en œuvre dès à présent pour rendre une fonctionnalité JavaScript plus accessible. Et nous ne parlons pas de techniques à peine prises en charge, non testées ou avant-gardistes mais bien de ce que nous faisons déjà depuis des années.</p>http://www.sitepoint.com/javascript-accessibility-101/]]></description>
      <link>http://www.pompage.net/traduction/introduction-a-l-accessibilite-de-javascript</link>
      <guid>http://www.pompage.net/traduction/introduction-a-l-accessibilite-de-javascript</guid>
      <pubDate>Mon, 04 Aug 2014 10:00:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Introduction à l'accessibilité de JavaScript]]></title>
      <description><![CDATA[<div id="article"><p class="signature">Par
<a href="http://www.brothercake.com/">James Edwards</a></p><p>Il fut un temps o&#xF9; l&#x2019;accessibilit&#xE9; de JavaScript signifiait simplement assurer une d&#xE9;gradation &#xE9;l&#xE9;gante lorsque JavaScript n&#x2019;&#xE9;tait pas disponible. Mais, avec la perc&#xE9;e d&#x2019;Ajax et des Applications Internet Riches (<abbr>RIA</abbr>), JavaScript n&#x2019;est plus seulement utilis&#xE9; pour am&#xE9;liorer l&#x2019;utilisabilit&#xE9; &#xE0; la marge, il constitue d&#xE9;sormais la base des applications web. De nos jours, parler de l&#x2019;accessibilit&#xE9; de JavaScript c&#x2019;est s&#x2019;assurer que le code JavaScript est accessible en lui-m&#xEA;me.</p><h2>Ce que nous r&#xE9;serve l&#x2019;avenir</h2><p>Le protocole d&#x2019;accessibilit&#xE9; des applications Internet riches (NdT&#xA0;: <abbr>ARIA</abbr> en anglais, pour <span>Accessible Rich Internet Applications</span>) est une des &#xE9;volutions les plus importantes de ces derni&#xE8;res ann&#xE9;es dans l&#x2019;accessibilit&#xE9; web. Il a &#xE9;t&#xE9; con&#xE7;u par le groupe Initiative pour l&#x2019;Accessibilit&#xE9; du Web (<abbr>WAI</abbr>) et d&#xE9;finit une s&#xE9;mantique permettant de rendre le contenu interactif accessible aux technologies d&#x2019;assistance telles que les lecteurs d&#x2019;&#xE9;cran. <abbr>WAI-ARIA</abbr> est apparu par n&#xE9;cessit&#xE9;, l&#x2019;explosion du Web 2.0 s&#x2019;&#xE9;tant faite presque sans aucune consid&#xE9;ration d&#x2019;accessibilit&#xE9;. JavaScript est d&#xE9;sormais utilis&#xE9; dans le code d&#x2019;applications web critiques et les technologies d&#x2019;assistance doivent donc imp&#xE9;rativement pouvoir interpr&#xE9;ter le contenu dynamique.</p><h2>Aujourd&#x2019;hui</h2><p>Malheureusement, <abbr>ARIA</abbr> n&#x2019;est pas encore tr&#xE8;s bien pris en charge. Seules les derni&#xE8;res versions des (tr&#xE8;s co&#xFB;teux) lecteurs d&#x2019;&#xE9;cran offrent un d&#xE9;but de prise en charge, et aucun d&#x2019;entre eux ne l&#x2019;offre int&#xE9;gralement. De plus, ce qui est support&#xE9; n&#x2019;est pas forc&#xE9;ment bien impl&#xE9;ment&#xE9;. Et m&#xEA;me quand <abbr>ARIA</abbr> sera largement pris en charge, ce ne sera pas pour autant la r&#xE9;ponse &#xE0; tout car l&#x2019;accessibilit&#xE9; de JavaScript ne se r&#xE9;sume pas &#xE0; ce qui est d&#xE9;fini par <abbr>ARIA</abbr>. Pour que les fondations de ce protocole soient solides, elles doivent associer une v&#xE9;ritable compr&#xE9;hension du besoin utilisateur et des d&#xE9;veloppements bas&#xE9;s sur les standards.</p><p>Sitepoint va consacrer <a href="http://www.sitepoint.com/category/javascript/" class="spip_out">plusieurs articles &#xE0; l&#x2019;accessibilit&#xE9; de JavaScript</a>. Nous commen&#xE7;ons par un aper&#xE7;u des choses simples que vous pouvez faire d&#xE8;s &#xE0; pr&#xE9;sent pour rendre votre JavaScript plus accessible. Plus tard, nous entrerons plus en d&#xE9;tails dans le monde d&#x2019;<abbr>ARIA</abbr>. Mais avant toute chose, nous devons revoir quelques concepts th&#xE9;oriques</p><h2>Le c&#x153;ur de l&#x2019;accessibilit&#xE9;</h2><p>L&#x2019;accessibilit&#xE9; de JavaScript peut &#xEA;tre divis&#xE9;e en trois grands groupes de besoins utilisateurs. Ce chapitre d&#xE9;crit ces groupes de mani&#xE8;re d&#xE9;taill&#xE9;e.</p><h2>Les utilisateurs de technologies d&#x2019;assistance</h2><p>Le premier groupe comprend les personnes qui utilisent des lecteurs d&#x2019;&#xE9;cran, plages Braille ou d&#x2019;autres aides techniques de ce genre. Les aveugles sont majoritaires dans ce groupe, mais il inclut &#xE9;galement les personnes souffrant de handicaps visuels ou cognitifs, pour qui les lecteurs d&#x2019;&#xE9;cran facilitent la lecture et la compr&#xE9;hension.</p><p>Les technologies d&#x2019;assistance pr&#xE9;sentent toutes les informations sous forme de texte structur&#xE9;. Par cons&#xE9;quent, toutes les fonctionnalit&#xE9;s JavaScript doivent adopter une forme qui puisse &#xEA;tre pr&#xE9;sent&#xE9;e textuellement. Une barre de progression script&#xE9;e telle qu&#x2019;illustr&#xE9;e ci-dessous fournit des informations visuelles, elle devrait donc &#xEA;tre compl&#xE9;t&#xE9;e par un texte fournissant les m&#xEA;mes informations.</p><dl class="spip_document_454 spip_documents spip_documents_center"><dt><img src="http://www.pompage.net/traduction/IMG/png/javascript-a4a48.png" alt="PNG - 3.4&#xA0;ko"></dt><dd class="crayon document-descriptif-454 spip_doc_descriptif">Une barre de progressions dont la position, 76%, est indiqu&#xE9;e visuellement et &#xE0; l&#x2019;aide d&#x2019;un nombre en pourcentage.</dd></dl><p>Le texte en lui-m&#xEA;me ne suffit pas, s&#x2019;il ne poss&#xE8;de pas de structure ou de liaisons interpr&#xE9;tables par les technologies d&#x2019;assistance. Un texte est souvent structur&#xE9; de fa&#xE7;on tr&#xE8;s simple, sous forme de listes et de tableaux. Les technologies d&#x2019;assistance comprennent ais&#xE9;ment ce type de structure, il ne nous reste donc qu&#x2019;&#xE0; les utiliser correctement.</p><p>En utilisant par exemple des listes non ordonn&#xE9;es et des libell&#xE9;s de structure comme base d&#x2019;un menu d&#xE9;roulant, les technologies d&#x2019;assistance peuvent interpr&#xE9;ter le sens &#xE0; partir de la s&#xE9;mantique et de la hi&#xE9;rarchie de ces &#xE9;l&#xE9;ments. Nous pouvons &#xE9;galement construire des widgets de calendrier o&#xF9; chaque mois est repr&#xE9;sent&#xE9; par un tableau <abbr>HTML</abbr>. Il suffit alors de d&#xE9;clencher son affichage par un bouton et de le d&#xE9;crire &#xE0; l&#x2019;aide d&#x2019;une l&#xE9;gende. Une s&#xE9;mantique solide des &#xE9;l&#xE9;ments doit constituer la base de tout contenu interactif.</p><h2>Les utilisateurs qui naviguent au clavier</h2><p>Le deuxi&#xE8;me groupe est form&#xE9; par les personnes qui utilisent uniquement le clavier. Ce groupe comprend les non-voyants utilisant un lecteur d&#x2019;&#xE9;cran, mais &#xE9;galement les personnes voyantes qui ne peuvent pas utiliser la souris en raison d&#x2019;un handicap moteur, ainsi que les personnes ayant une d&#xE9;ficience cognitive et pour suivre les &#xE9;l&#xE9;ments qui poss&#xE8;dent le focus aide &#xE0; se concentrer. Pour s&#x2019;adapter aux besoins de ce groupe, toutes les fonctionnalit&#xE9;s JavaScript doit &#xEA;tre accessibles au clavier. Les interactions par exemple doivent &#xEA;tre limit&#xE9;es aux touches les plus intuitives&#xA0;: tabulation, les fl&#xE8;ches, la touche Entr&#xE9;e et la touche d&#x2019;&#xE9;chappement.</p><p>La prise en charge du clavier se fait souvent &#xE0; moindre co&#xFB;t, pour peu que vous partiez du principe que le meilleur &#xE9;v&#xE9;nement est toujours celui qui est le plus ind&#xE9;pendant du p&#xE9;riph&#xE9;rique. Ainsi, la validation du formulaire doit &#xEA;tre li&#xE9;e &#xE0; l&#x2019;&#xE9;v&#xE9;nement <code>submit</code> du formulaire, tandis que les &#xE9;v&#xE9;nements d&#x2019;activation primaires devraient &#xEA;tre li&#xE9;s &#xE0; l&#x2019;&#xE9;v&#xE9;nement clic universel, plut&#xF4;t que des &#xE9;v&#xE9;nements sp&#xE9;cifiques comme <code>mousedown</code>, <code>touchstart</code> ou <code>KeyDown</code>.</p><p>Pour les interactions plus complexes, il est souvent n&#xE9;cessaire de combiner les &#xE9;v&#xE9;nements. Les R&#xE8;gles d&#x2019;Accessibilit&#xE9; pour les Contenus Web (<abbr>NdT</abbr>&#xA0;: <span>Web Content Accessibility Guidelines</span>, ou <abbr>WCAG</abbr> en anglais) parlent d&#x2019;association d&#x2019;&#xE9;v&#xE9;nements&#xA0;: il s&#x2019;agit de coupler les &#xE9;v&#xE9;nements souris avec leur &#xE9;quivalent clavier le plus similaire. Un exemple est le couplage des &#xE9;v&#xE9;nements <code>mousedown</code> et <code>keydown</code>. Ce n&#x2019;est toutefois pas la bonne fa&#xE7;on de voir les choses car on se concentre ici sur la technique plut&#xF4;t que sur la finalit&#xE9; d&#x2019;une action. Tant que l&#x2019;objectif est atteint, peu importe que les modalit&#xE9;s au clavier soient totalement diff&#xE9;rentes de l&#x2019;action &#xE0; la souris.</p><p>Pour le glisser-d&#xE9;poser par exemple, il n&#x2019;y a pas d&#x2019;&#xE9;quivalent &#xE0; l&#x2019;&#xE9;v&#xE9;nement <code>mousemove</code>, mais nous pouvons quand m&#xEA;me rendre cette fonctionnalit&#xE9; accessible au clavier. Il s&#x2019;agit en fait de deux interactions distinctes. La premi&#xE8;re permet de d&#xE9;placer des &#xE9;l&#xE9;ments vers le haut ou le bas pour les r&#xE9;organiser, ce qui peut tout simplement se faire gr&#xE2;ce aux fl&#xE8;ches haut et bas. La seconde interaction concerne l&#x2019;action d&#x2019;attraper et de d&#xE9;placer, pour d&#xE9;placer des fichiers d&#x2019;un dossier &#xE0; un autre par exemple. Cela peut se faire par exemple avec la touche Espace pour s&#xE9;lectionner l&#x2019;&#xE9;l&#xE9;ment, la touche Tabulation pour s&#xE9;lectionner la destination, et la touche Entr&#xE9;e pour d&#xE9;poser.</p><p>Lorsque des touches non-standard sont utilis&#xE9;es, un texte d&#x2019;accompagnement devrait figurer pour l&#x2019;expliquer. Dans les faits, certaines interactions seront immanquablement plus compliqu&#xE9;es que leur &#xE9;quivalent &#xE0; la souris. Mais ce n&#x2019;est pas bien grave, du moment que le r&#xE9;sultat est atteignable. L&#x2019;accessibilit&#xE9; c&#x2019;est l&#x2019;&#xE9;quivalence, pas l&#x2019;&#xE9;galit&#xE9;.</p><p>Une autre consid&#xE9;ration importante concernant l&#x2019;accessibilit&#xE9; au clavier est de garder un ordre logique du contenu. Des bulles d&#x2019;aide enrichies, par exemple, doivent &#xEA;tre ins&#xE9;r&#xE9;es imm&#xE9;diatement apr&#xE8;s l&#x2019;&#xE9;l&#xE9;ment qu&#x2019;elles concernent pour qu&#x2019;on y acc&#xE8;de directement en tabulant une seule fois, et afin que les lecteurs d&#x2019;&#xE9;cran puissent les lire dans la foul&#xE9;e.</p><h2>Les utilisateurs sensibles au clignotement ou aux limites de temps</h2><p>Le dernier groupe comprend les personnes sensibles aux clignotements ou aux brusques changements de luminosit&#xE9;, ou qui ne peuvent pas r&#xE9;agir aux &#xE9;v&#xE9;nements en temps r&#xE9;el comme les autres. Le contenu clignotant affecte les personnes souffrant d&#x2019;une &#xE9;pilepsie photosensible, chez qui cela peut provoquer une crise, ainsi que les personnes souffrant de d&#xE9;ficience cognitive, qui ont du mal &#xE0; se concentrer lorsque les choses bougent dans leur vision p&#xE9;riph&#xE9;rique. Les limitations sur les contenus qui clignotent sont assez bien formul&#xE9;es par les r&#xE8;gles d&#x2019;accessibilit&#xE9; pour les contenus web et synth&#xE9;tis&#xE9;es par le seuil de trois clignotements maximum.</p><p>Les limites temporelles peuvent &#xE9;galement s&#x2019;av&#xE9;rer probl&#xE9;matiques car &#xE9;couter un contenu vocalis&#xE9; prend plus de temps que de le lire. Naviguer au clavier prend &#xE9;galement plus de temps qu&#x2019;&#xE0; la souris. De ce fait, les actions JavaScript bas&#xE9;es sur le temps doivent &#xEA;tre contr&#xF4;lables par l&#x2019;utilisateur. Les limites sur des activit&#xE9;s temporelles ne sont pas trop sp&#xE9;cifiques, car il y a diff&#xE9;rents cas de figure &#xE0; prendre en consid&#xE9;ration.</p><p>Le grand principe pour les limites temporelles est que si une activit&#xE9; doit &#xEA;tre effectu&#xE9;e dans un certain laps de temps, l&#x2019;utilisateur est pr&#xE9;venu quand la limite est sur le point d&#x2019;expirer et se voit proposer une fa&#xE7;on de la rallonger. Par exemple, un site de banque en ligne peut avoir des limites de temps strictes sur l&#x2019;inactivit&#xE9; de session, mais l&#x2019;utilisateur doit pouvoir l&#x2019;allonger &#xE0; l&#x2019;aide d&#x2019;un simple dialogue de confirmation (comme ceux qu&#x2019;on peut voir sur les guichets automatiques qui vous demandent si vous avez besoin de davantage de temps).</p><p>Lorsque du contenu est anim&#xE9;, l&#x2019;animation ne devrait pas durer plus de cinq secondes, &#xE0; moins que l&#x2019;utilisateur ait un moyen de la contr&#xF4;ler. Une animation peut &#xEA;tre purement d&#xE9;corative, la limite de temps est donc utile pour les personnes qui souffrent de d&#xE9;ficience cognitive et pour qui une animation continue en p&#xE9;riph&#xE9;rie rend plus difficile le fait de se concentrer sur le contenu principal.</p><p>Pour une animation telle que le d&#xE9;filement ou le d&#xE9;placement d&#x2019;un contenu, la restriction impose de permettre aux utilisateurs de terminer leur t&#xE2;che sans changements de contexte inattendus. Un lecteur d&#x2019;actualit&#xE9;s qui d&#xE9;file automatiquement par exemple devrait avoir un bouton pause, pour laisser l&#x2019;utilisateur lire chaque actualit&#xE9; &#xE0; son propre rythme et en &#xE9;tant assur&#xE9; que les choses ne bougeront pas pendant qu&#x2019;il la lira&#xA0;! Cela est &#xE9;galement valable lorsque de grands blocs de contenus ou des pages enti&#xE8;res sont automatiquement recharg&#xE9;s. C&#x2019;est tr&#xE8;s courant sur les sites de bourse en ligne ou de r&#xE9;sultats sportifs. Vous ne devriez jamais faire cela, &#xE0; moins de fournir des contr&#xF4;les sp&#xE9;cifiques &#xE0; l&#x2019;utilisateur sur la fr&#xE9;quence de rafra&#xEE;chissement (qui devrait &#xEA;tre &#xE0; <code>never</code> (jamais) par d&#xE9;faut).</p><p>Mais les limites temporelles font souvent partie int&#xE9;grante des activit&#xE9;s pour lesquelles elles sont utilis&#xE9;es. Beaucoup de jeux comportent intrins&#xE8;quement des limites de temps et les supprimer nuirait au principe m&#xEA;me du jeu. Dans de tels cas, on peut dire que le contenu ne peut &#xEA;tre rendu accessible sans changer sa signification. Les r&#xE8;gles d&#x2019;accessibilit&#xE9; autorisent cette possibilit&#xE9;, du moment que le contenu est clairement d&#xE9;crit comme tel.</p><h2>Conclusion</h2><p>Nous venons de voir que l&#x2019;accessibilit&#xE9; de JavaScript peut se r&#xE9;sumer &#xE0; trois principes fondamentaux.</p><ul class="spip"><li> Toute fonctionnalit&#xE9; JavaScript doit prendre une forme qui peut &#xEA;tre interpr&#xE9;t&#xE9;e comme du texte.</li><li> Toute fonctionnalit&#xE9; JavaScript doit &#xEA;tre accessible au clavier.</li><li> Les activit&#xE9;s temporelles en JavaScript doivent pouvoir &#xEA;tre contr&#xF4;l&#xE9;es par l&#x2019;utilisateur, &#xE0; moins que cela ne change leur sens.</li></ul><p>La prochaine fois, nous nous &#xE9;loignerons de la th&#xE9;orie, pour voir quelques petites choses simples mais pratiques que vous pouvez mettre en &#x153;uvre d&#xE8;s &#xE0; pr&#xE9;sent pour rendre une fonctionnalit&#xE9; JavaScript plus accessible. Et nous ne parlons pas de techniques &#xE0; peine prises en charge, non test&#xE9;es ou avant-gardistes mais bien de ce que nous faisons d&#xE9;j&#xE0; depuis des ann&#xE9;es.</p></div>]]></description>
      <link>http://www.pompage.net/traduction/introduction-a-l-accessibilite-de</link>
      <guid>http://www.pompage.net/traduction/introduction-a-l-accessibilite-de</guid>
      <pubDate>Mon, 04 Aug 2014 08:08:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[]]></title>
      <description><![CDATA[<div id="article"> <p class="signature">Par <a href="http://www.brothercake.com/">James Edwards</a> </p> <p>Il fut un temps o&#xF9; l&#x2019;accessibilit&#xE9; de JavaScript signifiait simplement assurer une d&#xE9;gradation &#xE9;l&#xE9;gante lorsque JavaScript n&#x2019;&#xE9;tait pas disponible. Mais, avec la perc&#xE9;e d&#x2019;Ajax et des Applications Internet Riches (<abbr>RIA</abbr>), JavaScript n&#x2019;est plus seulement utilis&#xE9; pour am&#xE9;liorer l&#x2019;utilisabilit&#xE9; &#xE0; la marge, il constitue d&#xE9;sormais la base des applications web. De nos jours, parler de l&#x2019;accessibilit&#xE9; de JavaScript c&#x2019;est s&#x2019;assurer que le code JavaScript est accessible en lui-m&#xEA;me.</p>
<h2>Ce que nous r&#xE9;serve l&#x2019;avenir</h2>
<p>Le protocole d&#x2019;accessibilit&#xE9; des applications Internet riches (NdT&#xA0;: <abbr>ARIA</abbr> en anglais, pour <span>Accessible Rich Internet Applications</span>) est une des &#xE9;volutions les plus importantes de ces derni&#xE8;res ann&#xE9;es dans l&#x2019;accessibilit&#xE9; web. Il a &#xE9;t&#xE9; con&#xE7;u par le groupe Initiative pour l&#x2019;Accessibilit&#xE9; du Web (<abbr>WAI</abbr>) et d&#xE9;finit une s&#xE9;mantique permettant de rendre le contenu interactif accessible aux technologies d&#x2019;assistance telles que les lecteurs d&#x2019;&#xE9;cran. <abbr>WAI-ARIA</abbr> est apparu par n&#xE9;cessit&#xE9;, l&#x2019;explosion du Web 2.0 s&#x2019;&#xE9;tant faite presque sans aucune consid&#xE9;ration d&#x2019;accessibilit&#xE9;. JavaScript est d&#xE9;sormais utilis&#xE9; dans le code d&#x2019;applications web critiques et les technologies d&#x2019;assistance doivent donc imp&#xE9;rativement pouvoir interpr&#xE9;ter le contenu dynamique.</p>
<h2>Aujourd&#x2019;hui</h2>
<p>Malheureusement, <abbr>ARIA</abbr> n&#x2019;est pas encore tr&#xE8;s bien pris en charge. Seules les derni&#xE8;res versions des (tr&#xE8;s co&#xFB;teux) lecteurs d&#x2019;&#xE9;cran offrent un d&#xE9;but de prise en charge, et aucun d&#x2019;entre eux ne l&#x2019;offre int&#xE9;gralement. De plus, ce qui est support&#xE9; n&#x2019;est pas forc&#xE9;ment bien impl&#xE9;ment&#xE9;. Et m&#xEA;me quand <abbr>ARIA</abbr> sera largement pris en charge, ce ne sera pas pour autant la r&#xE9;ponse &#xE0; tout car l&#x2019;accessibilit&#xE9; de JavaScript ne se r&#xE9;sume pas &#xE0; ce qui est d&#xE9;fini par <abbr>ARIA</abbr>. Pour que les fondations de ce protocole soient solides, elles doivent associer une v&#xE9;ritable compr&#xE9;hension du besoin utilisateur et des d&#xE9;veloppements bas&#xE9;s sur les standards.</p>
<p>Sitepoint va consacrer <a href="http://www.sitepoint.com/category/javascript/" class="spip_out">plusieurs articles &#xE0; l&#x2019;accessibilit&#xE9; de JavaScript</a>. Nous commen&#xE7;ons par un aper&#xE7;u des choses simples que vous pouvez faire d&#xE8;s &#xE0; pr&#xE9;sent pour rendre votre JavaScript plus accessible. Plus tard, nous entrerons plus en d&#xE9;tails dans le monde d&#x2019;<abbr>ARIA</abbr>. Mais avant toute chose, nous devons revoir quelques concepts th&#xE9;oriques</p>
<h2>Le c&#x153;ur de l&#x2019;accessibilit&#xE9;</h2>
<p>L&#x2019;accessibilit&#xE9; de JavaScript peut &#xEA;tre divis&#xE9;e en trois grands groupes de besoins utilisateurs. Ce chapitre d&#xE9;crit ces groupes de mani&#xE8;re d&#xE9;taill&#xE9;e.</p>
<h2>Les utilisateurs de technologies d&#x2019;assistance</h2>
<p>Le premier groupe comprend les personnes qui utilisent des lecteurs d&#x2019;&#xE9;cran, plages Braille ou d&#x2019;autres aides techniques de ce genre. Les aveugles sont majoritaires dans ce groupe, mais il inclut &#xE9;galement les personnes souffrant de handicaps visuels ou cognitifs, pour qui les lecteurs d&#x2019;&#xE9;cran facilitent la lecture et la compr&#xE9;hension.</p>
<p>Les technologies d&#x2019;assistance pr&#xE9;sentent toutes les informations sous forme de texte structur&#xE9;. Par cons&#xE9;quent, toutes les fonctionnalit&#xE9;s JavaScript doivent adopter une forme qui puisse &#xEA;tre pr&#xE9;sent&#xE9;e textuellement. Une barre de progression script&#xE9;e telle qu&#x2019;illustr&#xE9;e ci-dessous fournit des informations visuelles, elle devrait donc &#xEA;tre compl&#xE9;t&#xE9;e par un texte fournissant les m&#xEA;mes informations.</p>
<dl class="spip_document_454 spip_documents spip_documents_center">
<dt><img src="http://www.pompage.net/traduction/IMG/png/javascript-a4a48.png" width="226" alt=""></dt>
<dd class="crayon document-descriptif-454 spip_doc_descriptif">Une barre de progressions dont la position, 76%, est indiqu&#xE9;e visuellement et &#xE0; l&#x2019;aide d&#x2019;un nombre en pourcentage.
</dd>
</dl>
<p>Le texte en lui-m&#xEA;me ne suffit pas, s&#x2019;il ne poss&#xE8;de pas de structure ou de liaisons interpr&#xE9;tables par les technologies d&#x2019;assistance. Un texte est souvent structur&#xE9; de fa&#xE7;on tr&#xE8;s simple, sous forme de listes et de tableaux. Les technologies d&#x2019;assistance comprennent ais&#xE9;ment ce type de structure, il ne nous reste donc qu&#x2019;&#xE0; les utiliser correctement.</p>
<p>En utilisant par exemple des listes non ordonn&#xE9;es et des libell&#xE9;s de structure comme base d&#x2019;un menu d&#xE9;roulant, les technologies d&#x2019;assistance peuvent interpr&#xE9;ter le sens &#xE0; partir de la s&#xE9;mantique et de la hi&#xE9;rarchie de ces &#xE9;l&#xE9;ments. Nous pouvons &#xE9;galement construire des widgets de calendrier o&#xF9; chaque mois est repr&#xE9;sent&#xE9; par un tableau <abbr>HTML</abbr>. Il suffit alors de d&#xE9;clencher son affichage par un bouton et de le d&#xE9;crire &#xE0; l&#x2019;aide d&#x2019;une l&#xE9;gende. Une s&#xE9;mantique solide des &#xE9;l&#xE9;ments doit constituer la base de tout contenu interactif.</p>
<h2>Les utilisateurs qui naviguent au clavier</h2>
<p>Le deuxi&#xE8;me groupe est form&#xE9; par les personnes qui utilisent uniquement le clavier. Ce groupe comprend les non-voyants utilisant un lecteur d&#x2019;&#xE9;cran, mais &#xE9;galement les personnes voyantes qui ne peuvent pas utiliser la souris en raison d&#x2019;un handicap moteur, ainsi que les personnes ayant une d&#xE9;ficience cognitive et pour suivre les &#xE9;l&#xE9;ments qui poss&#xE8;dent le focus aide &#xE0; se concentrer. Pour s&#x2019;adapter aux besoins de ce groupe, toutes les fonctionnalit&#xE9;s JavaScript doit &#xEA;tre accessibles au clavier. Les interactions par exemple doivent &#xEA;tre limit&#xE9;es aux touches les plus intuitives&#xA0;: tabulation, les fl&#xE8;ches, la touche Entr&#xE9;e et la touche d&#x2019;&#xE9;chappement.</p>
<p>La prise en charge du clavier se fait souvent &#xE0; moindre co&#xFB;t, pour peu que vous partiez du principe que le meilleur &#xE9;v&#xE9;nement est toujours celui qui est le plus ind&#xE9;pendant du p&#xE9;riph&#xE9;rique. Ainsi, la validation du formulaire doit &#xEA;tre li&#xE9;e &#xE0; l&#x2019;&#xE9;v&#xE9;nement <code>submit</code> du formulaire, tandis que les &#xE9;v&#xE9;nements d&#x2019;activation primaires devraient &#xEA;tre li&#xE9;s &#xE0; l&#x2019;&#xE9;v&#xE9;nement clic universel, plut&#xF4;t que des &#xE9;v&#xE9;nements sp&#xE9;cifiques comme <code>mousedown</code>, <code>touchstart</code> ou <code>KeyDown</code>.</p>
<p>Pour les interactions plus complexes, il est souvent n&#xE9;cessaire de combiner les &#xE9;v&#xE9;nements. Les R&#xE8;gles d&#x2019;Accessibilit&#xE9; pour les Contenus Web (<abbr>NdT</abbr>&#xA0;: <span>Web Content Accessibility Guidelines</span>, ou <abbr>WCAG</abbr> en anglais) parlent d&#x2019;association d&#x2019;&#xE9;v&#xE9;nements&#xA0;: il s&#x2019;agit de coupler les &#xE9;v&#xE9;nements souris avec leur &#xE9;quivalent clavier le plus similaire. Un exemple est le couplage des &#xE9;v&#xE9;nements <code>mousedown</code> et <code>keydown</code>. Ce n&#x2019;est toutefois pas la bonne fa&#xE7;on de voir les choses car on se concentre ici sur la technique plut&#xF4;t que sur la finalit&#xE9; d&#x2019;une action. Tant que l&#x2019;objectif est atteint, peu importe que les modalit&#xE9;s au clavier soient totalement diff&#xE9;rentes de l&#x2019;action &#xE0; la souris.</p>
<p>Pour le glisser-d&#xE9;poser par exemple, il n&#x2019;y a pas d&#x2019;&#xE9;quivalent &#xE0; l&#x2019;&#xE9;v&#xE9;nement <code>mousemove</code>, mais nous pouvons quand m&#xEA;me rendre cette fonctionnalit&#xE9; accessible au clavier. Il s&#x2019;agit en fait de deux interactions distinctes. La premi&#xE8;re permet de d&#xE9;placer des &#xE9;l&#xE9;ments vers le haut ou le bas pour les r&#xE9;organiser, ce qui peut tout simplement se faire gr&#xE2;ce aux fl&#xE8;ches haut et bas. La seconde interaction concerne l&#x2019;action d&#x2019;attraper et de d&#xE9;placer, pour d&#xE9;placer des fichiers d&#x2019;un dossier &#xE0; un autre par exemple. Cela peut se faire par exemple avec la touche Espace pour s&#xE9;lectionner l&#x2019;&#xE9;l&#xE9;ment, la touche Tabulation pour s&#xE9;lectionner la destination, et la touche Entr&#xE9;e pour d&#xE9;poser.</p>
<p>Lorsque des touches non-standard sont utilis&#xE9;es, un texte d&#x2019;accompagnement devrait figurer pour l&#x2019;expliquer. Dans les faits, certaines interactions seront immanquablement plus compliqu&#xE9;es que leur &#xE9;quivalent &#xE0; la souris. Mais ce n&#x2019;est pas bien grave, du moment que le r&#xE9;sultat est atteignable. L&#x2019;accessibilit&#xE9; c&#x2019;est l&#x2019;&#xE9;quivalence, pas l&#x2019;&#xE9;galit&#xE9;.</p>
<p>Une autre consid&#xE9;ration importante concernant l&#x2019;accessibilit&#xE9; au clavier est de garder un ordre logique du contenu. Des bulles d&#x2019;aide enrichies, par exemple, doivent &#xEA;tre ins&#xE9;r&#xE9;es imm&#xE9;diatement apr&#xE8;s l&#x2019;&#xE9;l&#xE9;ment qu&#x2019;elles concernent pour qu&#x2019;on y acc&#xE8;de directement en tabulant une seule fois, et afin que les lecteurs d&#x2019;&#xE9;cran puissent les lire dans la foul&#xE9;e.</p>
<h2>Les utilisateurs sensibles au clignotement ou aux limites de temps</h2>
<p>Le dernier groupe comprend les personnes sensibles aux clignotements ou aux brusques changements de luminosit&#xE9;, ou qui ne peuvent pas r&#xE9;agir aux &#xE9;v&#xE9;nements en temps r&#xE9;el comme les autres. Le contenu clignotant affecte les personnes souffrant d&#x2019;une &#xE9;pilepsie photosensible, chez qui cela peut provoquer une crise, ainsi que les personnes souffrant de d&#xE9;ficience cognitive, qui ont du mal &#xE0; se concentrer lorsque les choses bougent dans leur vision p&#xE9;riph&#xE9;rique. Les limitations sur les contenus qui clignotent sont assez bien formul&#xE9;es par les r&#xE8;gles d&#x2019;accessibilit&#xE9; pour les contenus web et synth&#xE9;tis&#xE9;es par le seuil de trois clignotements maximum.</p>
<p>Les limites temporelles peuvent &#xE9;galement s&#x2019;av&#xE9;rer probl&#xE9;matiques car &#xE9;couter un contenu vocalis&#xE9; prend plus de temps que de le lire. Naviguer au clavier prend &#xE9;galement plus de temps qu&#x2019;&#xE0; la souris. De ce fait, les actions JavaScript bas&#xE9;es sur le temps doivent &#xEA;tre contr&#xF4;lables par l&#x2019;utilisateur. Les limites sur des activit&#xE9;s temporelles ne sont pas trop sp&#xE9;cifiques, car il y a diff&#xE9;rents cas de figure &#xE0; prendre en consid&#xE9;ration.</p>
<p>Le grand principe pour les limites temporelles est que si une activit&#xE9; doit &#xEA;tre effectu&#xE9;e dans un certain laps de temps, l&#x2019;utilisateur est pr&#xE9;venu quand la limite est sur le point d&#x2019;expirer et se voit proposer une fa&#xE7;on de la rallonger. Par exemple, un site de banque en ligne peut avoir des limites de temps strictes sur l&#x2019;inactivit&#xE9; de session, mais l&#x2019;utilisateur doit pouvoir l&#x2019;allonger &#xE0; l&#x2019;aide d&#x2019;un simple dialogue de confirmation (comme ceux qu&#x2019;on peut voir sur les guichets automatiques qui vous demandent si vous avez besoin de davantage de temps).</p>
<p>Lorsque du contenu est anim&#xE9;, l&#x2019;animation ne devrait pas durer plus de cinq secondes, &#xE0; moins que l&#x2019;utilisateur ait un moyen de la contr&#xF4;ler. Une animation peut &#xEA;tre purement d&#xE9;corative, la limite de temps est donc utile pour les personnes qui souffrent de d&#xE9;ficience cognitive et pour qui une animation continue en p&#xE9;riph&#xE9;rie rend plus difficile le fait de se concentrer sur le contenu principal.</p>
<p>Pour une animation telle que le d&#xE9;filement ou le d&#xE9;placement d&#x2019;un contenu, la restriction impose de permettre aux utilisateurs de terminer leur t&#xE2;che sans changements de contexte inattendus. Un lecteur d&#x2019;actualit&#xE9;s qui d&#xE9;file automatiquement par exemple devrait avoir un bouton pause, pour laisser l&#x2019;utilisateur lire chaque actualit&#xE9; &#xE0; son propre rythme et en &#xE9;tant assur&#xE9; que les choses ne bougeront pas pendant qu&#x2019;il la lira&#xA0;! Cela est &#xE9;galement valable lorsque de grands blocs de contenus ou des pages enti&#xE8;res sont automatiquement recharg&#xE9;s. C&#x2019;est tr&#xE8;s courant sur les sites de bourse en ligne ou de r&#xE9;sultats sportifs. Vous ne devriez jamais faire cela, &#xE0; moins de fournir des contr&#xF4;les sp&#xE9;cifiques &#xE0; l&#x2019;utilisateur sur la fr&#xE9;quence de rafra&#xEE;chissement (qui devrait &#xEA;tre &#xE0; <code>never</code> (jamais) par d&#xE9;faut).</p>
<p>Mais les limites temporelles font souvent partie int&#xE9;grante des activit&#xE9;s pour lesquelles elles sont utilis&#xE9;es. Beaucoup de jeux comportent intrins&#xE8;quement des limites de temps et les supprimer nuirait au principe m&#xEA;me du jeu. Dans de tels cas, on peut dire que le contenu ne peut &#xEA;tre rendu accessible sans changer sa signification. Les r&#xE8;gles d&#x2019;accessibilit&#xE9; autorisent cette possibilit&#xE9;, du moment que le contenu est clairement d&#xE9;crit comme tel.</p>
<h2>Conclusion</h2>
<p>Nous venons de voir que l&#x2019;accessibilit&#xE9; de JavaScript peut se r&#xE9;sumer &#xE0; trois principes fondamentaux.</p>
<ul class="spip"><li> Toute fonctionnalit&#xE9; JavaScript doit prendre une forme qui peut &#xEA;tre interpr&#xE9;t&#xE9;e comme du texte.</li><li> Toute fonctionnalit&#xE9; JavaScript doit &#xEA;tre accessible au clavier.</li><li> Les activit&#xE9;s temporelles en JavaScript doivent pouvoir &#xEA;tre contr&#xF4;l&#xE9;es par l&#x2019;utilisateur, &#xE0; moins que cela ne change leur sens.</li></ul>
<p>La prochaine fois, nous nous &#xE9;loignerons de la th&#xE9;orie, pour voir quelques petites choses simples mais pratiques que vous pouvez mettre en &#x153;uvre d&#xE8;s &#xE0; pr&#xE9;sent pour rendre une fonctionnalit&#xE9; JavaScript plus accessible. Et nous ne parlons pas de techniques &#xE0; peine prises en charge, non test&#xE9;es ou avant-gardistes mais bien de ce que nous faisons d&#xE9;j&#xE0; depuis des ann&#xE9;es.</p> </div>]]></description>
      <link>http://www.pompage.net/traduction/introduction-a-l-accessibilite-de</link>
      <guid>http://www.pompage.net/traduction/introduction-a-l-accessibilite-de</guid>
      <pubDate>Mon, 04 Aug 2014 08:08:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Introduction à l'accessibilité de JavaScript]]></title>
      <description><![CDATA[<div id="article"> <p class="signature">Par <a href="http://www.brothercake.com/">James Edwards</a> </p> <p>Il fut un temps o&#xF9; l&#x2019;accessibilit&#xE9; de JavaScript signifiait simplement assurer une d&#xE9;gradation &#xE9;l&#xE9;gante lorsque JavaScript n&#x2019;&#xE9;tait pas disponible. Mais, avec la perc&#xE9;e d&#x2019;Ajax et des Applications Internet Riches (<abbr>RIA</abbr>), JavaScript n&#x2019;est plus seulement utilis&#xE9; pour am&#xE9;liorer l&#x2019;utilisabilit&#xE9; &#xE0; la marge, il constitue d&#xE9;sormais la base des applications web. De nos jours, parler de l&#x2019;accessibilit&#xE9; de JavaScript c&#x2019;est s&#x2019;assurer que le code JavaScript est accessible en lui-m&#xEA;me.</p>
<h2>Ce que nous r&#xE9;serve l&#x2019;avenir</h2>
<p>Le protocole d&#x2019;accessibilit&#xE9; des applications Internet riches (NdT&#xA0;: <abbr>ARIA</abbr> en anglais, pour <span>Accessible Rich Internet Applications</span>) est une des &#xE9;volutions les plus importantes de ces derni&#xE8;res ann&#xE9;es dans l&#x2019;accessibilit&#xE9; web. Il a &#xE9;t&#xE9; con&#xE7;u par le groupe Initiative pour l&#x2019;Accessibilit&#xE9; du Web (<abbr>WAI</abbr>) et d&#xE9;finit une s&#xE9;mantique permettant de rendre le contenu interactif accessible aux technologies d&#x2019;assistance telles que les lecteurs d&#x2019;&#xE9;cran. <abbr>WAI-ARIA</abbr> est apparu par n&#xE9;cessit&#xE9;, l&#x2019;explosion du Web 2.0 s&#x2019;&#xE9;tant faite presque sans aucune consid&#xE9;ration d&#x2019;accessibilit&#xE9;. JavaScript est d&#xE9;sormais utilis&#xE9; dans le code d&#x2019;applications web critiques et les technologies d&#x2019;assistance doivent donc imp&#xE9;rativement pouvoir interpr&#xE9;ter le contenu dynamique.</p>
<h2>Aujourd&#x2019;hui</h2>
<p>Malheureusement, <abbr>ARIA</abbr> n&#x2019;est pas encore tr&#xE8;s bien pris en charge. Seules les derni&#xE8;res versions des (tr&#xE8;s co&#xFB;teux) lecteurs d&#x2019;&#xE9;cran offrent un d&#xE9;but de prise en charge, et aucun d&#x2019;entre eux ne l&#x2019;offre int&#xE9;gralement. De plus, ce qui est support&#xE9; n&#x2019;est pas forc&#xE9;ment bien impl&#xE9;ment&#xE9;. Et m&#xEA;me quand <abbr>ARIA</abbr> sera largement pris en charge, ce ne sera pas pour autant la r&#xE9;ponse &#xE0; tout car l&#x2019;accessibilit&#xE9; de JavaScript ne se r&#xE9;sume pas &#xE0; ce qui est d&#xE9;fini par <abbr>ARIA</abbr>. Pour que les fondations de ce protocole soient solides, elles doivent associer une v&#xE9;ritable compr&#xE9;hension du besoin utilisateur et des d&#xE9;veloppements bas&#xE9;s sur les standards.</p>
<p>Sitepoint va consacrer <a href="http://www.sitepoint.com/category/javascript/" class="spip_out">plusieurs articles &#xE0; l&#x2019;accessibilit&#xE9; de JavaScript</a>. Nous commen&#xE7;ons par un aper&#xE7;u des choses simples que vous pouvez faire d&#xE8;s &#xE0; pr&#xE9;sent pour rendre votre JavaScript plus accessible. Plus tard, nous entrerons plus en d&#xE9;tails dans le monde d&#x2019;<abbr>ARIA</abbr>. Mais avant toute chose, nous devons revoir quelques concepts th&#xE9;oriques</p>
<h2>Le c&#x153;ur de l&#x2019;accessibilit&#xE9;</h2>
<p>L&#x2019;accessibilit&#xE9; de JavaScript peut &#xEA;tre divis&#xE9;e en trois grands groupes de besoins utilisateurs. Ce chapitre d&#xE9;crit ces groupes de mani&#xE8;re d&#xE9;taill&#xE9;e.</p>
<h2>Les utilisateurs de technologies d&#x2019;assistance</h2>
<p>Le premier groupe comprend les personnes qui utilisent des lecteurs d&#x2019;&#xE9;cran, plages Braille ou d&#x2019;autres aides techniques de ce genre. Les aveugles sont majoritaires dans ce groupe, mais il inclut &#xE9;galement les personnes souffrant de handicaps visuels ou cognitifs, pour qui les lecteurs d&#x2019;&#xE9;cran facilitent la lecture et la compr&#xE9;hension.</p>
<p>Les technologies d&#x2019;assistance pr&#xE9;sentent toutes les informations sous forme de texte structur&#xE9;. Par cons&#xE9;quent, toutes les fonctionnalit&#xE9;s JavaScript doivent adopter une forme qui puisse &#xEA;tre pr&#xE9;sent&#xE9;e textuellement. Une barre de progression script&#xE9;e telle qu&#x2019;illustr&#xE9;e ci-dessous fournit des informations visuelles, elle devrait donc &#xEA;tre compl&#xE9;t&#xE9;e par un texte fournissant les m&#xEA;mes informations.</p>
<dl class="spip_document_454 spip_documents spip_documents_center">
<dt><img src="https://www.pompage.net/traduction/IMG/png/javascript-a4a48.png" width="226" alt=""></dt>
<dd class="crayon document-descriptif-454 spip_doc_descriptif">Une barre de progressions dont la position, 76%, est indiqu&#xE9;e visuellement et &#xE0; l&#x2019;aide d&#x2019;un nombre en pourcentage.
</dd>
</dl>
<p>Le texte en lui-m&#xEA;me ne suffit pas, s&#x2019;il ne poss&#xE8;de pas de structure ou de liaisons interpr&#xE9;tables par les technologies d&#x2019;assistance. Un texte est souvent structur&#xE9; de fa&#xE7;on tr&#xE8;s simple, sous forme de listes et de tableaux. Les technologies d&#x2019;assistance comprennent ais&#xE9;ment ce type de structure, il ne nous reste donc qu&#x2019;&#xE0; les utiliser correctement.</p>
<p>En utilisant par exemple des listes non ordonn&#xE9;es et des libell&#xE9;s de structure comme base d&#x2019;un menu d&#xE9;roulant, les technologies d&#x2019;assistance peuvent interpr&#xE9;ter le sens &#xE0; partir de la s&#xE9;mantique et de la hi&#xE9;rarchie de ces &#xE9;l&#xE9;ments. Nous pouvons &#xE9;galement construire des widgets de calendrier o&#xF9; chaque mois est repr&#xE9;sent&#xE9; par un tableau <abbr>HTML</abbr>. Il suffit alors de d&#xE9;clencher son affichage par un bouton et de le d&#xE9;crire &#xE0; l&#x2019;aide d&#x2019;une l&#xE9;gende. Une s&#xE9;mantique solide des &#xE9;l&#xE9;ments doit constituer la base de tout contenu interactif.</p>
<h2>Les utilisateurs qui naviguent au clavier</h2>
<p>Le deuxi&#xE8;me groupe est form&#xE9; par les personnes qui utilisent uniquement le clavier. Ce groupe comprend les non-voyants utilisant un lecteur d&#x2019;&#xE9;cran, mais &#xE9;galement les personnes voyantes qui ne peuvent pas utiliser la souris en raison d&#x2019;un handicap moteur, ainsi que les personnes ayant une d&#xE9;ficience cognitive et pour suivre les &#xE9;l&#xE9;ments qui poss&#xE8;dent le focus aide &#xE0; se concentrer. Pour s&#x2019;adapter aux besoins de ce groupe, toutes les fonctionnalit&#xE9;s JavaScript doit &#xEA;tre accessibles au clavier. Les interactions par exemple doivent &#xEA;tre limit&#xE9;es aux touches les plus intuitives&#xA0;: tabulation, les fl&#xE8;ches, la touche Entr&#xE9;e et la touche d&#x2019;&#xE9;chappement.</p>
<p>La prise en charge du clavier se fait souvent &#xE0; moindre co&#xFB;t, pour peu que vous partiez du principe que le meilleur &#xE9;v&#xE9;nement est toujours celui qui est le plus ind&#xE9;pendant du p&#xE9;riph&#xE9;rique. Ainsi, la validation du formulaire doit &#xEA;tre li&#xE9;e &#xE0; l&#x2019;&#xE9;v&#xE9;nement <code>submit</code> du formulaire, tandis que les &#xE9;v&#xE9;nements d&#x2019;activation primaires devraient &#xEA;tre li&#xE9;s &#xE0; l&#x2019;&#xE9;v&#xE9;nement clic universel, plut&#xF4;t que des &#xE9;v&#xE9;nements sp&#xE9;cifiques comme <code>mousedown</code>, <code>touchstart</code> ou <code>KeyDown</code>.</p>
<p>Pour les interactions plus complexes, il est souvent n&#xE9;cessaire de combiner les &#xE9;v&#xE9;nements. Les R&#xE8;gles d&#x2019;Accessibilit&#xE9; pour les Contenus Web (<abbr>NdT</abbr>&#xA0;: <span>Web Content Accessibility Guidelines</span>, ou <abbr>WCAG</abbr> en anglais) parlent d&#x2019;association d&#x2019;&#xE9;v&#xE9;nements&#xA0;: il s&#x2019;agit de coupler les &#xE9;v&#xE9;nements souris avec leur &#xE9;quivalent clavier le plus similaire. Un exemple est le couplage des &#xE9;v&#xE9;nements <code>mousedown</code> et <code>keydown</code>. Ce n&#x2019;est toutefois pas la bonne fa&#xE7;on de voir les choses car on se concentre ici sur la technique plut&#xF4;t que sur la finalit&#xE9; d&#x2019;une action. Tant que l&#x2019;objectif est atteint, peu importe que les modalit&#xE9;s au clavier soient totalement diff&#xE9;rentes de l&#x2019;action &#xE0; la souris.</p>
<p>Pour le glisser-d&#xE9;poser par exemple, il n&#x2019;y a pas d&#x2019;&#xE9;quivalent &#xE0; l&#x2019;&#xE9;v&#xE9;nement <code>mousemove</code>, mais nous pouvons quand m&#xEA;me rendre cette fonctionnalit&#xE9; accessible au clavier. Il s&#x2019;agit en fait de deux interactions distinctes. La premi&#xE8;re permet de d&#xE9;placer des &#xE9;l&#xE9;ments vers le haut ou le bas pour les r&#xE9;organiser, ce qui peut tout simplement se faire gr&#xE2;ce aux fl&#xE8;ches haut et bas. La seconde interaction concerne l&#x2019;action d&#x2019;attraper et de d&#xE9;placer, pour d&#xE9;placer des fichiers d&#x2019;un dossier &#xE0; un autre par exemple. Cela peut se faire par exemple avec la touche Espace pour s&#xE9;lectionner l&#x2019;&#xE9;l&#xE9;ment, la touche Tabulation pour s&#xE9;lectionner la destination, et la touche Entr&#xE9;e pour d&#xE9;poser.</p>
<p>Lorsque des touches non-standard sont utilis&#xE9;es, un texte d&#x2019;accompagnement devrait figurer pour l&#x2019;expliquer. Dans les faits, certaines interactions seront immanquablement plus compliqu&#xE9;es que leur &#xE9;quivalent &#xE0; la souris. Mais ce n&#x2019;est pas bien grave, du moment que le r&#xE9;sultat est atteignable. L&#x2019;accessibilit&#xE9; c&#x2019;est l&#x2019;&#xE9;quivalence, pas l&#x2019;&#xE9;galit&#xE9;.</p>
<p>Une autre consid&#xE9;ration importante concernant l&#x2019;accessibilit&#xE9; au clavier est de garder un ordre logique du contenu. Des bulles d&#x2019;aide enrichies, par exemple, doivent &#xEA;tre ins&#xE9;r&#xE9;es imm&#xE9;diatement apr&#xE8;s l&#x2019;&#xE9;l&#xE9;ment qu&#x2019;elles concernent pour qu&#x2019;on y acc&#xE8;de directement en tabulant une seule fois, et afin que les lecteurs d&#x2019;&#xE9;cran puissent les lire dans la foul&#xE9;e.</p>
<h2>Les utilisateurs sensibles au clignotement ou aux limites de temps</h2>
<p>Le dernier groupe comprend les personnes sensibles aux clignotements ou aux brusques changements de luminosit&#xE9;, ou qui ne peuvent pas r&#xE9;agir aux &#xE9;v&#xE9;nements en temps r&#xE9;el comme les autres. Le contenu clignotant affecte les personnes souffrant d&#x2019;une &#xE9;pilepsie photosensible, chez qui cela peut provoquer une crise, ainsi que les personnes souffrant de d&#xE9;ficience cognitive, qui ont du mal &#xE0; se concentrer lorsque les choses bougent dans leur vision p&#xE9;riph&#xE9;rique. Les limitations sur les contenus qui clignotent sont assez bien formul&#xE9;es par les r&#xE8;gles d&#x2019;accessibilit&#xE9; pour les contenus web et synth&#xE9;tis&#xE9;es par le seuil de trois clignotements maximum.</p>
<p>Les limites temporelles peuvent &#xE9;galement s&#x2019;av&#xE9;rer probl&#xE9;matiques car &#xE9;couter un contenu vocalis&#xE9; prend plus de temps que de le lire. Naviguer au clavier prend &#xE9;galement plus de temps qu&#x2019;&#xE0; la souris. De ce fait, les actions JavaScript bas&#xE9;es sur le temps doivent &#xEA;tre contr&#xF4;lables par l&#x2019;utilisateur. Les limites sur des activit&#xE9;s temporelles ne sont pas trop sp&#xE9;cifiques, car il y a diff&#xE9;rents cas de figure &#xE0; prendre en consid&#xE9;ration.</p>
<p>Le grand principe pour les limites temporelles est que si une activit&#xE9; doit &#xEA;tre effectu&#xE9;e dans un certain laps de temps, l&#x2019;utilisateur est pr&#xE9;venu quand la limite est sur le point d&#x2019;expirer et se voit proposer une fa&#xE7;on de la rallonger. Par exemple, un site de banque en ligne peut avoir des limites de temps strictes sur l&#x2019;inactivit&#xE9; de session, mais l&#x2019;utilisateur doit pouvoir l&#x2019;allonger &#xE0; l&#x2019;aide d&#x2019;un simple dialogue de confirmation (comme ceux qu&#x2019;on peut voir sur les guichets automatiques qui vous demandent si vous avez besoin de davantage de temps).</p>
<p>Lorsque du contenu est anim&#xE9;, l&#x2019;animation ne devrait pas durer plus de cinq secondes, &#xE0; moins que l&#x2019;utilisateur ait un moyen de la contr&#xF4;ler. Une animation peut &#xEA;tre purement d&#xE9;corative, la limite de temps est donc utile pour les personnes qui souffrent de d&#xE9;ficience cognitive et pour qui une animation continue en p&#xE9;riph&#xE9;rie rend plus difficile le fait de se concentrer sur le contenu principal.</p>
<p>Pour une animation telle que le d&#xE9;filement ou le d&#xE9;placement d&#x2019;un contenu, la restriction impose de permettre aux utilisateurs de terminer leur t&#xE2;che sans changements de contexte inattendus. Un lecteur d&#x2019;actualit&#xE9;s qui d&#xE9;file automatiquement par exemple devrait avoir un bouton pause, pour laisser l&#x2019;utilisateur lire chaque actualit&#xE9; &#xE0; son propre rythme et en &#xE9;tant assur&#xE9; que les choses ne bougeront pas pendant qu&#x2019;il la lira&#xA0;! Cela est &#xE9;galement valable lorsque de grands blocs de contenus ou des pages enti&#xE8;res sont automatiquement recharg&#xE9;s. C&#x2019;est tr&#xE8;s courant sur les sites de bourse en ligne ou de r&#xE9;sultats sportifs. Vous ne devriez jamais faire cela, &#xE0; moins de fournir des contr&#xF4;les sp&#xE9;cifiques &#xE0; l&#x2019;utilisateur sur la fr&#xE9;quence de rafra&#xEE;chissement (qui devrait &#xEA;tre &#xE0; <code>never</code> (jamais) par d&#xE9;faut).</p>
<p>Mais les limites temporelles font souvent partie int&#xE9;grante des activit&#xE9;s pour lesquelles elles sont utilis&#xE9;es. Beaucoup de jeux comportent intrins&#xE8;quement des limites de temps et les supprimer nuirait au principe m&#xEA;me du jeu. Dans de tels cas, on peut dire que le contenu ne peut &#xEA;tre rendu accessible sans changer sa signification. Les r&#xE8;gles d&#x2019;accessibilit&#xE9; autorisent cette possibilit&#xE9;, du moment que le contenu est clairement d&#xE9;crit comme tel.</p>
<h2>Conclusion</h2>
<p>Nous venons de voir que l&#x2019;accessibilit&#xE9; de JavaScript peut se r&#xE9;sumer &#xE0; trois principes fondamentaux.</p>
<ul class="spip"><li> Toute fonctionnalit&#xE9; JavaScript doit prendre une forme qui peut &#xEA;tre interpr&#xE9;t&#xE9;e comme du texte.</li><li> Toute fonctionnalit&#xE9; JavaScript doit &#xEA;tre accessible au clavier.</li><li> Les activit&#xE9;s temporelles en JavaScript doivent pouvoir &#xEA;tre contr&#xF4;l&#xE9;es par l&#x2019;utilisateur, &#xE0; moins que cela ne change leur sens.</li></ul>
<p>La prochaine fois, nous nous &#xE9;loignerons de la th&#xE9;orie, pour voir quelques petites choses simples mais pratiques que vous pouvez mettre en &#x153;uvre d&#xE8;s &#xE0; pr&#xE9;sent pour rendre une fonctionnalit&#xE9; JavaScript plus accessible. Et nous ne parlons pas de techniques &#xE0; peine prises en charge, non test&#xE9;es ou avant-gardistes mais bien de ce que nous faisons d&#xE9;j&#xE0; depuis des ann&#xE9;es.</p> </div>]]></description>
      <link>https://www.pompage.net/traduction/introduction-a-l-accessibilite-de</link>
      <guid>https://www.pompage.net/traduction/introduction-a-l-accessibilite-de</guid>
      <pubDate>Mon, 04 Aug 2014 08:08:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Votre application me fait grossir]]></title>
      <description><![CDATA[<div id="article"><p class="signature">Par
<a href="http://seriouspony.com/">Kathy Sierra</a></p><p class="moreInfo">
L&apos;exp&#xE9;rience utilisateur vue &#xE0; travers le prisme de la psychologie comportementale... attention &#xE0; ne pas &#xE9;puiser les ressources cognitives de vos visiteurs!</p><p>En 1999, le professeur Baba Shiv (qui enseigne aujourd&#x2019;hui &#xE0; Stanford) et son co-auteur Alex Fedorikhin ont men&#xE9; une exp&#xE9;rience simple sur 165 &#xE9;tudiants. Ils ont demand&#xE9; &#xE0; la moiti&#xE9; d&#x2019;entre eux de m&#xE9;moriser un nombre de sept chiffres, et &#xE0; l&#x2019;autre moiti&#xE9; de m&#xE9;moriser un nombre de deux chiffres. Apr&#xE8;s cette t&#xE2;che de m&#xE9;morisation, on a dit aux participants que la t&#xE2;che &#xE9;tait termin&#xE9;e, et qu&#x2019;ils pouvaient prendre un en-cas&#xA0;: au choix, du g&#xE2;teau au chocolat ou de la salade de fruits.</p><p><span class="spip_document_469 spip_documents spip_documents_left">
<img src="http://www.pompage.net/traduction/IMG/jpg/fr_fixedmemorization.jpg-format=500w.jpg" alt=""></span></p><p>R&#xE9;sultat&#xA0;? <strong>Les participants qui devaient m&#xE9;moriser le nombre de sept chiffres &#xE9;taient 50&#xA0;% plus attir&#xE9;s par le g&#xE2;teau au chocolat que ne l&#x2019;&#xE9;taient les membres de l&#x2019;autre groupe.</strong></p><p>Les chercheurs, sid&#xE9;r&#xE9;s par les r&#xE9;sultats convergents d&#x2019;un grand nombre d&#x2019;exp&#xE9;riences, sont parvenus &#xE0; cette &#xE9;trange conclusion&#xA0;: <strong>le contr&#xF4;le de soi et les processus cognitifs sont aliment&#xE9;s par la m&#xEA;me r&#xE9;serve de ressources.</strong></p><p>Vous passez des heures au boulot concentr&#xE9; sur un probl&#xE8;me de design&#xA0;? Vous aurez plus de chance de faire une petite halte chez McDo en rentrant chez vous. Vous vous retenez de dire ce que vous pensez <i>vraiment</i> pendant une r&#xE9;union p&#xE9;nible et interminable&#xA0;? Vous aurez plus de mal &#xE0; coder plus tard dans la journ&#xE9;e.</p><p>Car la volont&#xE9;, le contr&#xF4;le de soi et les t&#xE2;ches cognitives puisent dans les m&#xEA;mes r&#xE9;serves. Si vous &#xE9;puisez ces r&#xE9;serves &#xE0; un moment donn&#xE9;, vous en paierez forc&#xE9;ment le prix un peu plus tard. Il n&#x2019;y a qu&#x2019;une seule r&#xE9;serve. Une r&#xE9;serve de ressources rares, pr&#xE9;cieuses et <i>tr&#xE8;s volatiles</i>. Si vous passez votre journ&#xE9;e &#xE0; vous contr&#xF4;ler (face &#xE0; des clients m&#xE9;contents ou &#xE0; des coll&#xE8;gues incapables), vous rentrez chez vous le soir avec la jauge &#xE0; z&#xE9;ro.</p><p>Le r&#xE9;servoir est vide. Et m&#xEA;me si vous adorez vous frotter &#xE0; des probl&#xE8;mes compliqu&#xE9;s quand vous &#xEA;tes au travail, cela n&#x2019;emp&#xEA;che pas du tout que vos ressources soient diminu&#xE9;es. Il n&#x2019;y a qu&#x2019;une seule r&#xE9;serve. Qu&#x2019;elle soit consomm&#xE9;e par des activit&#xE9;s que vous aimez ou que vous d&#xE9;testez n&#x2019;y change rien. Le r&#xE9;servoir de ressources cognitives s&#x2019;en fiche. Du coup, la moindre petite chose vous fait r&#xE2;ler contre vos enfants ou votre chien. Ou bien c&#x2019;est le chien qui vous grogne dessus.</p><p><span class="spip_document_468 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/jpg/fr_dogexperimentwebversion.jpg-format=500w.jpg" alt=""></span><br class="autobr">
Au cours d&#x2019;une exp&#xE9;rience, un premier groupe de chiens devait rester assis pendant quelques minutes sans rien faire, avant d&#x2019;&#xEA;tre autoris&#xE9;s &#xE0; jouer avec leur jouet &#xE0; croquettes &#xAB;&#xA0;intelligent&#xA0;&#xBB; (le genre de jouet o&#xF9; le chien doit fournir des efforts pour en extraire des croquettes). Les chiens de l&#x2019;autre groupe restaient tranquilles dans leurs cages avant de recevoir leur jouet.</p><p>Vous imaginez peut-&#xEA;tre d&#xE9;j&#xE0; la suite&#xA0;: les chiens qu&#x2019;on avait oblig&#xE9;s &#xE0; rester assis (et donc &#xE0; &#xEA;tre dans le contr&#xF4;le de soi) ont abandonn&#xE9; beaucoup plus t&#xF4;t leur jouet que ceux qui &#xE9;taient rest&#xE9;s tranquilles dans leurs cages. Les chiens qui n&#x2019;avaient PAS d&#xE9;pens&#xE9; de ressources cognitives en s&#x2019;effor&#xE7;ant d&#x2019;ob&#xE9;ir montraient davantage de d&#xE9;termination et d&#x2019;&#xE9;nergie mentale et &#xE9;motionnelle pour r&#xE9;soudre le probl&#xE8;me. Pensez-y la prochaine fois que vous demanderez &#xE0; Youki de patienter un peu. Car ses ressources cognitives &#xE0; lui s&#x2019;&#xE9;puisent tout aussi vite.</p><p>R&#xE9;fl&#xE9;chissons maintenant &#xE0; ce que nous faisons subir &#xE0; nos utilisateurs. Si l&#x2019;exp&#xE9;rience utilisateur les oblige &#xE0; faire des choix, et m&#xEA;me si ces choix sont &#xE0; la fois clairs et utiles, cet acte de d&#xE9;cision diminue leurs ressources cognitives. Et pas uniquement au moment du choix&#x2026; m&#xEA;me apr&#xE8;s ce moment, ils continuent &#xE0; consommer inconsciemment leurs ressources&#xA0;: &#xAB;&#xA0;Ai-je fait le bon choix&#xA0;?&#xA0;&#xBB;</p><p>Si votre application est compliqu&#xE9;e et si votre <abbr>FAQ</abbr> ou votre aide en ligne ne r&#xE9;pond pas &#xE0; mes besoins, vous faites baisser mon maigre niveau de ressources cognitives. Si votre application se comporte de fa&#xE7;on contre-intuitive (m&#xEA;me si &#xE7;a n&#x2019;arrive qu&#x2019;une seule fois), je perdrai une partie de mes ressources &#xE0; chaque nouvelle utilisation, parce que je me demanderai toujours&#xA0;: &#xAB;&#xA0;Attends, est-ce que &#xE7;a fait bien ce que je pensais&#xA0;?&#xA0;&#xBB;</p><p>Ou bien, imaginons que votre application soit vraiment hyper-facile &#xE0; utiliser mais que dans son design et dans son fonctionnement elle soit remplie d&#x2019;&#xE9;l&#xE9;ments motivateurs (des &#xAB;&#xA0;clins d&#x2019;&#x153;il&#xA0;&#xBB;, des aspects ludiques, des astuces de fonctionnement, etc.) qui ont &#xE9;t&#xE9; pens&#xE9;s pour me garder &#xAB;&#xA0;accroch&#xE9;&#xA0;&#xBB; dans votre int&#xE9;r&#xEA;t, pas dans le mien (oui Zynga, c&#x2019;est &#xE0; toi que je pense)... Eh bien, l&#xE0; aussi vous &#xE9;puisez mes ressources cognitives. Et que se passe-t-il quand je l&#xE2;che l&#x2019;&#xE9;cran pour aller dans la cuisine&#xA0;?...</p><p><strong>Votre application me fait grossir.</strong></p><p>Si notre travail fait perdre &#xE0; l&#x2019;utilisateur ses ressources cognitives, qu&#x2019;est-ce qu&#x2019;il perd&#xA0;? Qu&#x2019;est-ce qu&#x2019;il aurait pu faire d&#x2019;autre avec ces ressources si rares, si pr&#xE9;cieuses, si vite disparues&#xA0;? Peut-&#xEA;tre qu&#x2019;il avait dans l&#x2019;id&#xE9;e de suivre bien sagement son r&#xE9;gime. Ou de faire de la guitare. Ou de jouer avec ses enfants.</p><p>Dites-moi, ce nouvel &#xE9;l&#xE9;ment que vous venez d&#x2019;ajouter&#x2026; Cet &#xE9;l&#xE9;ment bling-bling, super-techno, ultra-cool&#x2026; est-ce qu&#x2019;il ne risque pas de co&#xFB;ter tr&#xE8;s cher &#xE0; votre utilisateur&#xA0;? Car si le r&#xE9;sultat de votre travail appauvrit ses ressources cognitives, on ne peut plus employer ces ressources &#xE0; d&#x2019;autres usages beaucoup plus importants. Le probl&#xE8;me ne r&#xE9;side pas dans le fait que vous accaparez le temps et l&#x2019;attention de vos utilisateurs pendant qu&#x2019;ils utilisent votre application. Il r&#xE9;side dans l&#x2019;&#xE9;puisement de leurs capacit&#xE9;s de pens&#xE9;e logique, de r&#xE9;solution de probl&#xE8;me et de ma&#xEE;trise de soi apr&#xE8;s avoir cliqu&#xE9;, balay&#xE9; ou touch&#xE9; un &#xE9;cran.</p><p>Bien entendu, ce n&#x2019;est pas un mal en soi si votre travail &#xE9;puise le r&#xE9;servoir de ressources d&#x2019;un utilisateur. C&#x2019;est peut-&#xEA;tre justement dans votre application que votre utilisateur veut d&#xE9;penser ces ressources. Mais d&#xE8;s lors que vous savez ce que co&#xFB;te une interaction avec votre produit, vous allez peut-&#xEA;tre faire des choix diff&#xE9;rents.</p><p>Vous allez peut-&#xEA;tre r&#xE9;fl&#xE9;chir davantage &#xE0; ce qui motive vraiment vos utilisateurs. Vous allez peut-&#xEA;tre vous demander, &#xE0; chaque r&#xE9;union de design&#xA0;: &#xAB;&#xA0;est-ce que cet &#xE9;l&#xE9;ment nous pousse &#xE0; choisir les fruits ou bien le g&#xE2;teau&#xA0;?&#xA0;&#xBB; afin de limiter les &#xE9;l&#xE9;ments qui m&#xE8;nent au g&#xE2;teau &#x2014; ceux qui co&#xFB;tent le plus &#x2014; &#xE0; ce pour quoi vos utilisateurs sont venus&#xA0;: utiliser votre application.</p><p>(Il est vrai que vous pouvez recharger vos ressources cognitives pendant la journ&#xE9;e en fournissant des glucides &#xE0; votre cerveau, mais allez-y doucement. Il vaut mieux prendre un en-cas prot&#xE9;in&#xE9; avec de temps en temps quelques petites gorg&#xE9;es de boisson &#xE9;nergisante).</p><p>Mais quand bien m&#xEA;me vous parvenez &#xE0; justifier l&#x2019;&#xE9;puisement des ressources cognitives de vos utilisateurs <i>pendant</i> qu&#x2019;ils utilisent votre produit, que dire alors de votre politique de <span>marketing</span>&#xA0;? Croyez-vous sinc&#xE8;rement que votre &#xAB;&#xA0;<span>marketing</span> de contenu&#xA0;&#xBB; constitue un bon usage de leurs ressources&#xA0;? &#xAB;&#xA0;Oui, parce qu&#x2019;on obtient de la valeur ajout&#xE9;e&#xA0;&#xBB;, direz-vous. Mais qu&#x2019;est-ce que &#xE7;a veut vraiment dire&#xA0;? Pouvez-vous honn&#xEA;tement affirmer que &#xAB;&#xA0;l&#x2019;engagement envers une marque&#xA0;&#xBB; constitue un usage sain et &#xE9;thique de leurs maigres et pr&#xE9;cieuses ressources cognitives&#xA0;? &#xAB;&#xA0;Oui, <i>parce que notre contenu est utile</i>&#xA0;&#xBB;.</p><p>Tout &#xE7;a est bien beau, tr&#xE8;s &#xAB;&#xA0;r&#xE9;seaux sociaux&#xA0;&#xBB;, tr&#xE8;s &#xAB;&#xA0;3.0&#xA0;&#xBB;, tout &#xE7;a, mais il y a quand m&#xEA;me un petit probl&#xE8;me&#xA0;: on est dans un jeu &#xE0; somme nulle. Ce que je consommerai au point A, je ne l&#x2019;aurai plus au point B. Et je n&#x2019;aurai pas juste perdu de l&#x2019;attention ou du temps, mais une capacit&#xE9; &#xE0; &#xEA;tre au meilleur de moi-m&#xEA;me. C&#x2019;est-&#xE0;-dire lorsque je dispose de g&#xE9;n&#xE9;reuses ressources cognitives. Lorsque je peux penser, r&#xE9;soudre des probl&#xE8;mes, et maintenir un bon contr&#xF4;le de moi-m&#xEA;me. Lorsque je sais cr&#xE9;er, &#xE9;tablir des liens et rester concentr&#xE9;.</p><p>Ce &#xAB;&#xA0;contenu&#xA0;&#xBB; en vaut-il la peine&#xA0;? C&#x2019;est possible. Mais au lieu de nous demander &#xAB;&#xA0;est-ce que c&#x2019;est vraiment utile&#xA0;?&#xA0;&#xBB;, nous devrions sans doute aller plus loin et nous demander &#xAB;&#xA0;est-ce qu&#x2019;ils vont vraiment l&#x2019;utiliser&#xA0;?&#xA0;&#xBB; (au fait, en &#xE9;crivant ceci je suis bien conscient que je suis en train de puiser dans vos ressources cognitives. Mais apr&#xE8;s tout, je ne me suis pas lanc&#xE9; dans <a href="http://seriouspony.com/" class="spip_out"><span>Serious Pony</span></a> pour pr&#xE9;server vos ressources cognitives&#xA0;: je voudrais plut&#xF4;t contribuer &#xE0; &#xE9;pargner celles de <i>vos utilisateurs</i>).</p><p>Je n&#x2019;ai rien contre le &#xAB;&#xA0;<span>marketing</span> de contenu&#xA0;&#xBB;. Bien au contraire, c&#x2019;est pratiquement la seule forme de <span>marketing</span>-&#xE9;puiseur-de-ressources qui puisse valoir le d&#xE9;tour. C&#x2019;est typiquement le genre de marketing qui peut pousser les gens &#xE0; devenir plus comp&#xE9;tents dans un domaine qui les int&#xE9;resse. C&#x2019;est le genre de <span>marketing</span> qui a la capacit&#xE9; de fournir aux utilisateurs un apprentissage &#x2014; ce que la plupart des entreprises ignorent royalement. Le <span>marketing</span> de contenu peut (et doit) &#xEA;tre &#xAB;&#xA0;le guide qui vous manquait&#xA0;&#xBB;. Il peut (et doit) repr&#xE9;senter une source d&#x2019;inspiration qui pousse nos utilisateurs &#xE0; apprendre, &#xE0; progresser (dans ce qui les int&#xE9;resse) et &#xE0; se connecter &#xE0; d&#x2019;autres utilisateurs.</p><p>Mais si on parle de &#xAB;&#xA0;contenu&#xA0;&#xBB; qui vise uniquement &#xE0; attirer les passants (&#xAB;&#xA0;D&#xE9;couvrez les 7 voies du succ&#xE8;s&#xA0;!&#xA0;&#xBB;) en esp&#xE9;rant les &#xAB;&#xA0;convertir&#xA0;&#xBB;, on leur fait du mal. Si l&#x2019;alibi pour leur balancer du &#xAB;&#xA0;contenu&#xA0;&#xBB;, c&#x2019;est la courbe de fr&#xE9;quence des visites, on leur fait du mal. L&#xE0;, en ce moment, je vous fais du mal. Mea culpa. C&#x2019;est pour &#xE7;a que j&#x2019;essaie d&#x2019;utiliser des images pour souligner l&#x2019;essentiel, pour vous &#xE9;viter d&#x2019;avoir &#xE0; lire l&#x2019;article (et aussi parce que j&#x2019;ai un c&#xF4;t&#xE9; verbeux, oui je sais, j&#x2019;y travaille&#x2026;).</p><p>J&#x2019;ai perdu mon p&#xE8;re brutalement la semaine derni&#xE8;re&#xA0;; et comme c&#x2019;est souvent le cas quand un proche vient de mourir, je me suis dit&#xA0;: &#xAB;&#xA0;Quand on est sur sur son lit de mort, on relativise beaucoup de choses.&#xA0;&#xBB; Dans mon travail de ces 20 derni&#xE8;res ann&#xE9;es, j&#x2019;ai cr&#xE9;&#xE9; des jeux de marketing interactif, des sites gamifi&#xE9;s (= con&#xE7;us selon une approche plus ludique, <abbr><i>NdT</i></abbr>) et des dizaines d&#x2019;autres projets qui &#xE9;taient soigneusement, finement et scientifiquement con&#xE7;us pour aspirer goul&#xFB;ment des ressources cognitives, mais&#x2026; pour pas grand-chose d&#x2019;important en fin de compte. Est-ce que mes visiteurs s&#x2019;y laissaient attirer de fa&#xE7;on volontaire&#xA0;? Bien s&#xFB;r que oui. Sauf que quand j&#x2019;&#xE9;cris &#xAB;&#xA0;bien s&#xFB;r&#xA0;&#xBB;, je me dis&#xA0;: &#xAB;&#xA0;pas si s&#xFB;r...&#xA0;&#xBB; Car c&#x2019;est ce que nous apprend la recherche en psychologie, en neurosciences ou en &#xE9;conomie comportementale de ces 50 derni&#xE8;res ann&#xE9;es. Mes visiteurs se faisaient aguicher, s&#xE9;duire, et finalement prendre au pi&#xE8;ge. Et j&#x2019;&#xE9;tais tr&#xE8;s fort &#xE0; ce petit jeu-l&#xE0;. Je suis vraiment, vraiment sinc&#xE8;rement d&#xE9;sol&#xE9;.</p><p>Avec <span>Serious Pony</span>, mon objectif est de donner &#xE0; tous des pistes pour prendre mieux soin des utilisateurs. Pas seulement pendant qu&#x2019;ils utilisent nos applications, nos sites ou nos produits, mais aussi apr&#xE8;s. Et pas seulement parce que ce sont nos utilisateurs, mais parce que ce sont d&#x2019;abord des personnes.</p><p>Parce que quand ils seront sur leur lit de mort, nos utilisateurs ne vont certainement pas se dire&#xA0;: &#xAB;&#xA0;Ah, si seulement j&#x2019;avais consacr&#xE9; plus de temps &#xE0; leurs marques&#xA0;!...&#xA0;&#xBB;</p><p>Aidez-les &#xE0; &#xE9;conomiser et &#xE0; bien g&#xE9;rer leurs ressources cognitives si maigres, si pr&#xE9;cieuses et si volatiles, pour qu&#x2019;elles soient consacr&#xE9;es &#xE0; ce qui est vraiment important. Important pour eux. Et puis, pensez &#xE0; vos propres ressources. Pensez aux enfants. Pensez &#xE0; Youki.</p><p><span class="spip_document_467 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/jpg/boinocrate.jpg-format=750w.jpg" alt=""></span></p></div>]]></description>
      <link>http://www.pompage.net/traduction/votre-application-me-fait-grossir</link>
      <guid>http://www.pompage.net/traduction/votre-application-me-fait-grossir</guid>
      <pubDate>Thu, 24 Jul 2014 10:07:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Votre application me fait grossir]]></title>
      <description><![CDATA[<div><div id="article"> <p class="signature">Par <a href="http://seriouspony.com/">Kathy Sierra</a> </p> <p class="moreInfo"> L&apos;exp&#xE9;rience utilisateur vue &#xE0; travers le prisme de la psychologie comportementale... attention &#xE0; ne pas &#xE9;puiser les ressources cognitives de vos visiteurs! </p> <p>En 1999, le professeur Baba Shiv (qui enseigne aujourd&#x2019;hui &#xE0; Stanford) et son co-auteur Alex Fedorikhin ont men&#xE9; une exp&#xE9;rience simple sur 165 &#xE9;tudiants. Ils ont demand&#xE9; &#xE0; la moiti&#xE9; d&#x2019;entre eux de m&#xE9;moriser un nombre de sept chiffres, et &#xE0; l&#x2019;autre moiti&#xE9; de m&#xE9;moriser un nombre de deux chiffres. Apr&#xE8;s cette t&#xE2;che de m&#xE9;morisation, on a dit aux participants que la t&#xE2;che &#xE9;tait termin&#xE9;e, et qu&#x2019;ils pouvaient prendre un en-cas&#xA0;: au choix, du g&#xE2;teau au chocolat ou de la salade de fruits.</p>
<p><span class="spip_document_469 spip_documents spip_documents_left">
<img src="http://www.pompage.net/traduction/IMG/jpg/fr_fixedmemorization.jpg-format=500w.jpg" width="461" alt=""></span></p>
<p>R&#xE9;sultat&#xA0;? <strong>Les participants qui devaient m&#xE9;moriser le nombre de sept chiffres &#xE9;taient 50&#xA0;% plus attir&#xE9;s par le g&#xE2;teau au chocolat que ne l&#x2019;&#xE9;taient les membres de l&#x2019;autre groupe.</strong></p>
<p>Les chercheurs, sid&#xE9;r&#xE9;s par les r&#xE9;sultats convergents d&#x2019;un grand nombre d&#x2019;exp&#xE9;riences, sont parvenus &#xE0; cette &#xE9;trange conclusion&#xA0;: <strong>le contr&#xF4;le de soi et les processus cognitifs sont aliment&#xE9;s par la m&#xEA;me r&#xE9;serve de ressources.</strong></p>
<p>Vous passez des heures au boulot concentr&#xE9; sur un probl&#xE8;me de design&#xA0;? Vous aurez plus de chance de faire une petite halte chez McDo en rentrant chez vous. Vous vous retenez de dire ce que vous pensez <i>vraiment</i> pendant une r&#xE9;union p&#xE9;nible et interminable&#xA0;? Vous aurez plus de mal &#xE0; coder plus tard dans la journ&#xE9;e.</p>
<p>Car la volont&#xE9;, le contr&#xF4;le de soi et les t&#xE2;ches cognitives puisent dans les m&#xEA;mes r&#xE9;serves. Si vous &#xE9;puisez ces r&#xE9;serves &#xE0; un moment donn&#xE9;, vous en paierez forc&#xE9;ment le prix un peu plus tard. Il n&#x2019;y a qu&#x2019;une seule r&#xE9;serve. Une r&#xE9;serve de ressources rares, pr&#xE9;cieuses et <i>tr&#xE8;s volatiles</i>. Si vous passez votre journ&#xE9;e &#xE0; vous contr&#xF4;ler (face &#xE0; des clients m&#xE9;contents ou &#xE0; des coll&#xE8;gues incapables), vous rentrez chez vous le soir avec la jauge &#xE0; z&#xE9;ro.</p>
<p>Le r&#xE9;servoir est vide. Et m&#xEA;me si vous adorez vous frotter &#xE0; des probl&#xE8;mes compliqu&#xE9;s quand vous &#xEA;tes au travail, cela n&#x2019;emp&#xEA;che pas du tout que vos ressources soient diminu&#xE9;es. Il n&#x2019;y a qu&#x2019;une seule r&#xE9;serve. Qu&#x2019;elle soit consomm&#xE9;e par des activit&#xE9;s que vous aimez ou que vous d&#xE9;testez n&#x2019;y change rien. Le r&#xE9;servoir de ressources cognitives s&#x2019;en fiche. Du coup, la moindre petite chose vous fait r&#xE2;ler contre vos enfants ou votre chien. Ou bien c&#x2019;est le chien qui vous grogne dessus.</p>
<p><span class="spip_document_468 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/jpg/fr_dogexperimentwebversion.jpg-format=500w.jpg" width="466" alt=""></span><br class="autobr">
Au cours d&#x2019;une exp&#xE9;rience, un premier groupe de chiens devait rester assis pendant quelques minutes sans rien faire, avant d&#x2019;&#xEA;tre autoris&#xE9;s &#xE0; jouer avec leur jouet &#xE0; croquettes &#xAB;&#xA0;intelligent&#xA0;&#xBB; (le genre de jouet o&#xF9; le chien doit fournir des efforts pour en extraire des croquettes). Les chiens de l&#x2019;autre groupe restaient tranquilles dans leurs cages avant de recevoir leur jouet.</p>
<p>Vous imaginez peut-&#xEA;tre d&#xE9;j&#xE0; la suite&#xA0;: les chiens qu&#x2019;on avait oblig&#xE9;s &#xE0; rester assis (et donc &#xE0; &#xEA;tre dans le contr&#xF4;le de soi) ont abandonn&#xE9; beaucoup plus t&#xF4;t leur jouet que ceux qui &#xE9;taient rest&#xE9;s tranquilles dans leurs cages. Les chiens qui n&#x2019;avaient PAS d&#xE9;pens&#xE9; de ressources cognitives en s&#x2019;effor&#xE7;ant d&#x2019;ob&#xE9;ir montraient davantage de d&#xE9;termination et d&#x2019;&#xE9;nergie mentale et &#xE9;motionnelle pour r&#xE9;soudre le probl&#xE8;me. Pensez-y la prochaine fois que vous demanderez &#xE0; Youki de patienter un peu. Car ses ressources cognitives &#xE0; lui s&#x2019;&#xE9;puisent tout aussi vite.</p>
<p>R&#xE9;fl&#xE9;chissons maintenant &#xE0; ce que nous faisons subir &#xE0; nos utilisateurs. Si l&#x2019;exp&#xE9;rience utilisateur les oblige &#xE0; faire des choix, et m&#xEA;me si ces choix sont &#xE0; la fois clairs et utiles, cet acte de d&#xE9;cision diminue leurs ressources cognitives. Et pas uniquement au moment du choix&#x2026; m&#xEA;me apr&#xE8;s ce moment, ils continuent &#xE0; consommer inconsciemment leurs ressources&#xA0;: &#xAB;&#xA0;Ai-je fait le bon choix&#xA0;?&#xA0;&#xBB;</p>
<p>Si votre application est compliqu&#xE9;e et si votre <abbr>FAQ</abbr> ou votre aide en ligne ne r&#xE9;pond pas &#xE0; mes besoins, vous faites baisser mon maigre niveau de ressources cognitives. Si votre application se comporte de fa&#xE7;on contre-intuitive (m&#xEA;me si &#xE7;a n&#x2019;arrive qu&#x2019;une seule fois), je perdrai une partie de mes ressources &#xE0; chaque nouvelle utilisation, parce que je me demanderai toujours&#xA0;: &#xAB;&#xA0;Attends, est-ce que &#xE7;a fait bien ce que je pensais&#xA0;?&#xA0;&#xBB;</p>
<p>Ou bien, imaginons que votre application soit vraiment hyper-facile &#xE0; utiliser mais que dans son design et dans son fonctionnement elle soit remplie d&#x2019;&#xE9;l&#xE9;ments motivateurs (des &#xAB;&#xA0;clins d&#x2019;&#x153;il&#xA0;&#xBB;, des aspects ludiques, des astuces de fonctionnement, etc.) qui ont &#xE9;t&#xE9; pens&#xE9;s pour me garder &#xAB;&#xA0;accroch&#xE9;&#xA0;&#xBB; dans votre int&#xE9;r&#xEA;t, pas dans le mien (oui Zynga, c&#x2019;est &#xE0; toi que je pense)... Eh bien, l&#xE0; aussi vous &#xE9;puisez mes ressources cognitives. Et que se passe-t-il quand je l&#xE2;che l&#x2019;&#xE9;cran pour aller dans la cuisine&#xA0;?...</p>
<p><strong>Votre application me fait grossir.</strong></p>
<p>Si notre travail fait perdre &#xE0; l&#x2019;utilisateur ses ressources cognitives, qu&#x2019;est-ce qu&#x2019;il perd&#xA0;? Qu&#x2019;est-ce qu&#x2019;il aurait pu faire d&#x2019;autre avec ces ressources si rares, si pr&#xE9;cieuses, si vite disparues&#xA0;? Peut-&#xEA;tre qu&#x2019;il avait dans l&#x2019;id&#xE9;e de suivre bien sagement son r&#xE9;gime. Ou de faire de la guitare. Ou de jouer avec ses enfants.</p>
<p>Dites-moi, ce nouvel &#xE9;l&#xE9;ment que vous venez d&#x2019;ajouter&#x2026; Cet &#xE9;l&#xE9;ment bling-bling, super-techno, ultra-cool&#x2026; est-ce qu&#x2019;il ne risque pas de co&#xFB;ter tr&#xE8;s cher &#xE0; votre utilisateur&#xA0;? Car si le r&#xE9;sultat de votre travail appauvrit ses ressources cognitives, on ne peut plus employer ces ressources &#xE0; d&#x2019;autres usages beaucoup plus importants. Le probl&#xE8;me ne r&#xE9;side pas dans le fait que vous accaparez le temps et l&#x2019;attention de vos utilisateurs pendant qu&#x2019;ils utilisent votre application. Il r&#xE9;side dans l&#x2019;&#xE9;puisement de leurs capacit&#xE9;s de pens&#xE9;e logique, de r&#xE9;solution de probl&#xE8;me et de ma&#xEE;trise de soi apr&#xE8;s avoir cliqu&#xE9;, balay&#xE9; ou touch&#xE9; un &#xE9;cran.</p>
<p>Bien entendu, ce n&#x2019;est pas un mal en soi si votre travail &#xE9;puise le r&#xE9;servoir de ressources d&#x2019;un utilisateur. C&#x2019;est peut-&#xEA;tre justement dans votre application que votre utilisateur veut d&#xE9;penser ces ressources. Mais d&#xE8;s lors que vous savez ce que co&#xFB;te une interaction avec votre produit, vous allez peut-&#xEA;tre faire des choix diff&#xE9;rents.</p>
<p>Vous allez peut-&#xEA;tre r&#xE9;fl&#xE9;chir davantage &#xE0; ce qui motive vraiment vos utilisateurs. Vous allez peut-&#xEA;tre vous demander, &#xE0; chaque r&#xE9;union de design&#xA0;: &#xAB;&#xA0;est-ce que cet &#xE9;l&#xE9;ment nous pousse &#xE0; choisir les fruits ou bien le g&#xE2;teau&#xA0;?&#xA0;&#xBB; afin de limiter les &#xE9;l&#xE9;ments qui m&#xE8;nent au g&#xE2;teau &#x2014; ceux qui co&#xFB;tent le plus &#x2014; &#xE0; ce pour quoi vos utilisateurs sont venus&#xA0;: utiliser votre application.</p>
<p>(Il est vrai que vous pouvez recharger vos ressources cognitives pendant la journ&#xE9;e en fournissant des glucides &#xE0; votre cerveau, mais allez-y doucement. Il vaut mieux prendre un en-cas prot&#xE9;in&#xE9; avec de temps en temps quelques petites gorg&#xE9;es de boisson &#xE9;nergisante).</p>
<p>Mais quand bien m&#xEA;me vous parvenez &#xE0; justifier l&#x2019;&#xE9;puisement des ressources cognitives de vos utilisateurs <i>pendant</i> qu&#x2019;ils utilisent votre produit, que dire alors de votre politique de <span>marketing</span>&#xA0;? Croyez-vous sinc&#xE8;rement que votre &#xAB;&#xA0;<span>marketing</span> de contenu&#xA0;&#xBB; constitue un bon usage de leurs ressources&#xA0;? &#xAB;&#xA0;Oui, parce qu&#x2019;on obtient de la valeur ajout&#xE9;e&#xA0;&#xBB;, direz-vous. Mais qu&#x2019;est-ce que &#xE7;a veut vraiment dire&#xA0;? Pouvez-vous honn&#xEA;tement affirmer que &#xAB;&#xA0;l&#x2019;engagement envers une marque&#xA0;&#xBB; constitue un usage sain et &#xE9;thique de leurs maigres et pr&#xE9;cieuses ressources cognitives&#xA0;? &#xAB;&#xA0;Oui, <i>parce que notre contenu est utile</i>&#xA0;&#xBB;.</p>
<p>Tout &#xE7;a est bien beau, tr&#xE8;s &#xAB;&#xA0;r&#xE9;seaux sociaux&#xA0;&#xBB;, tr&#xE8;s &#xAB;&#xA0;3.0&#xA0;&#xBB;, tout &#xE7;a, mais il y a quand m&#xEA;me un petit probl&#xE8;me&#xA0;: on est dans un jeu &#xE0; somme nulle. Ce que je consommerai au point A, je ne l&#x2019;aurai plus au point B. Et je n&#x2019;aurai pas juste perdu de l&#x2019;attention ou du temps, mais une capacit&#xE9; &#xE0; &#xEA;tre au meilleur de moi-m&#xEA;me. C&#x2019;est-&#xE0;-dire lorsque je dispose de g&#xE9;n&#xE9;reuses ressources cognitives. Lorsque je peux penser, r&#xE9;soudre des probl&#xE8;mes, et maintenir un bon contr&#xF4;le de moi-m&#xEA;me. Lorsque je sais cr&#xE9;er, &#xE9;tablir des liens et rester concentr&#xE9;.</p>
<p>Ce &#xAB;&#xA0;contenu&#xA0;&#xBB; en vaut-il la peine&#xA0;? C&#x2019;est possible. Mais au lieu de nous demander &#xAB;&#xA0;est-ce que c&#x2019;est vraiment utile&#xA0;?&#xA0;&#xBB;, nous devrions sans doute aller plus loin et nous demander &#xAB;&#xA0;est-ce qu&#x2019;ils vont vraiment l&#x2019;utiliser&#xA0;?&#xA0;&#xBB; (au fait, en &#xE9;crivant ceci je suis bien conscient que je suis en train de puiser dans vos ressources cognitives. Mais apr&#xE8;s tout, je ne me suis pas lanc&#xE9; dans <a href="http://seriouspony.com/" class="spip_out"><span>Serious Pony</span></a> pour pr&#xE9;server vos ressources cognitives&#xA0;: je voudrais plut&#xF4;t contribuer &#xE0; &#xE9;pargner celles de <i>vos utilisateurs</i>).</p>
<p>Je n&#x2019;ai rien contre le &#xAB;&#xA0;<span>marketing</span> de contenu&#xA0;&#xBB;. Bien au contraire, c&#x2019;est pratiquement la seule forme de <span>marketing</span>-&#xE9;puiseur-de-ressources qui puisse valoir le d&#xE9;tour. C&#x2019;est typiquement le genre de marketing qui peut pousser les gens &#xE0; devenir plus comp&#xE9;tents dans un domaine qui les int&#xE9;resse. C&#x2019;est le genre de <span>marketing</span> qui a la capacit&#xE9; de fournir aux utilisateurs un apprentissage &#x2014; ce que la plupart des entreprises ignorent royalement. Le <span>marketing</span> de contenu peut (et doit) &#xEA;tre &#xAB;&#xA0;le guide qui vous manquait&#xA0;&#xBB;. Il peut (et doit) repr&#xE9;senter une source d&#x2019;inspiration qui pousse nos utilisateurs &#xE0; apprendre, &#xE0; progresser (dans ce qui les int&#xE9;resse) et &#xE0; se connecter &#xE0; d&#x2019;autres utilisateurs.</p>
<p>Mais si on parle de &#xAB;&#xA0;contenu&#xA0;&#xBB; qui vise uniquement &#xE0; attirer les passants (&#xAB;&#xA0;D&#xE9;couvrez les 7 voies du succ&#xE8;s&#xA0;!&#xA0;&#xBB;) en esp&#xE9;rant les &#xAB;&#xA0;convertir&#xA0;&#xBB;, on leur fait du mal. Si l&#x2019;alibi pour leur balancer du &#xAB;&#xA0;contenu&#xA0;&#xBB;, c&#x2019;est la courbe de fr&#xE9;quence des visites, on leur fait du mal. L&#xE0;, en ce moment, je vous fais du mal. Mea culpa. C&#x2019;est pour &#xE7;a que j&#x2019;essaie d&#x2019;utiliser des images pour souligner l&#x2019;essentiel, pour vous &#xE9;viter d&#x2019;avoir &#xE0; lire l&#x2019;article (et aussi parce que j&#x2019;ai un c&#xF4;t&#xE9; verbeux, oui je sais, j&#x2019;y travaille&#x2026;).</p>
<p>J&#x2019;ai perdu mon p&#xE8;re brutalement la semaine derni&#xE8;re&#xA0;; et comme c&#x2019;est souvent le cas quand un proche vient de mourir, je me suis dit&#xA0;: &#xAB;&#xA0;Quand on est sur sur son lit de mort, on relativise beaucoup de choses.&#xA0;&#xBB; Dans mon travail de ces 20 derni&#xE8;res ann&#xE9;es, j&#x2019;ai cr&#xE9;&#xE9; des jeux de marketing interactif, des sites gamifi&#xE9;s (= con&#xE7;us selon une approche plus ludique, <abbr><i>NdT</i></abbr>) et des dizaines d&#x2019;autres projets qui &#xE9;taient soigneusement, finement et scientifiquement con&#xE7;us pour aspirer goul&#xFB;ment des ressources cognitives, mais&#x2026; pour pas grand-chose d&#x2019;important en fin de compte. Est-ce que mes visiteurs s&#x2019;y laissaient attirer de fa&#xE7;on volontaire&#xA0;? Bien s&#xFB;r que oui. Sauf que quand j&#x2019;&#xE9;cris &#xAB;&#xA0;bien s&#xFB;r&#xA0;&#xBB;, je me dis&#xA0;: &#xAB;&#xA0;pas si s&#xFB;r...&#xA0;&#xBB; Car c&#x2019;est ce que nous apprend la recherche en psychologie, en neurosciences ou en &#xE9;conomie comportementale de ces 50 derni&#xE8;res ann&#xE9;es. Mes visiteurs se faisaient aguicher, s&#xE9;duire, et finalement prendre au pi&#xE8;ge. Et j&#x2019;&#xE9;tais tr&#xE8;s fort &#xE0; ce petit jeu-l&#xE0;. Je suis vraiment, vraiment sinc&#xE8;rement d&#xE9;sol&#xE9;.</p>
<p>Avec <span>Serious Pony</span>, mon objectif est de donner &#xE0; tous des pistes pour prendre mieux soin des utilisateurs. Pas seulement pendant qu&#x2019;ils utilisent nos applications, nos sites ou nos produits, mais aussi apr&#xE8;s. Et pas seulement parce que ce sont nos utilisateurs, mais parce que ce sont d&#x2019;abord des personnes.</p>
<p>Parce que quand ils seront sur leur lit de mort, nos utilisateurs ne vont certainement pas se dire&#xA0;: &#xAB;&#xA0;Ah, si seulement j&#x2019;avais consacr&#xE9; plus de temps &#xE0; leurs marques&#xA0;!...&#xA0;&#xBB;</p>
<p>Aidez-les &#xE0; &#xE9;conomiser et &#xE0; bien g&#xE9;rer leurs ressources cognitives si maigres, si pr&#xE9;cieuses et si volatiles, pour qu&#x2019;elles soient consacr&#xE9;es &#xE0; ce qui est vraiment important. Important pour eux. Et puis, pensez &#xE0; vos propres ressources. Pensez aux enfants. Pensez &#xE0; Youki.</p>
<p><span class="spip_document_467 spip_documents spip_documents_center">
<img src="http://www.pompage.net/traduction/IMG/jpg/boinocrate.jpg-format=750w.jpg" width="750" alt=""></span></p> </div></div>]]></description>
      <link>http://www.pompage.net/traduction/votre-application-me-fait-grossir</link>
      <guid>http://www.pompage.net/traduction/votre-application-me-fait-grossir</guid>
      <pubDate>Thu, 24 Jul 2014 10:07:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Votre application me fait grossir]]></title>
      <description><![CDATA[<div><div id="article"> <p class="signature">Par <a href="http://seriouspony.com/">Kathy Sierra</a> </p> <p class="moreInfo"> L&apos;exp&#xE9;rience utilisateur vue &#xE0; travers le prisme de la psychologie comportementale... attention &#xE0; ne pas &#xE9;puiser les ressources cognitives de vos visiteurs! </p> <p>En 1999, le professeur Baba Shiv (qui enseigne aujourd&#x2019;hui &#xE0; Stanford) et son co-auteur Alex Fedorikhin ont men&#xE9; une exp&#xE9;rience simple sur 165 &#xE9;tudiants. Ils ont demand&#xE9; &#xE0; la moiti&#xE9; d&#x2019;entre eux de m&#xE9;moriser un nombre de sept chiffres, et &#xE0; l&#x2019;autre moiti&#xE9; de m&#xE9;moriser un nombre de deux chiffres. Apr&#xE8;s cette t&#xE2;che de m&#xE9;morisation, on a dit aux participants que la t&#xE2;che &#xE9;tait termin&#xE9;e, et qu&#x2019;ils pouvaient prendre un en-cas&#xA0;: au choix, du g&#xE2;teau au chocolat ou de la salade de fruits.</p>
<p><span class="spip_document_469 spip_documents spip_documents_left">
<img src="https://www.pompage.net/traduction/IMG/jpg/fr_fixedmemorization.jpg-format=500w.jpg" width="461" alt=""></span></p>
<p>R&#xE9;sultat&#xA0;? <strong>Les participants qui devaient m&#xE9;moriser le nombre de sept chiffres &#xE9;taient 50&#xA0;% plus attir&#xE9;s par le g&#xE2;teau au chocolat que ne l&#x2019;&#xE9;taient les membres de l&#x2019;autre groupe.</strong></p>
<p>Les chercheurs, sid&#xE9;r&#xE9;s par les r&#xE9;sultats convergents d&#x2019;un grand nombre d&#x2019;exp&#xE9;riences, sont parvenus &#xE0; cette &#xE9;trange conclusion&#xA0;: <strong>le contr&#xF4;le de soi et les processus cognitifs sont aliment&#xE9;s par la m&#xEA;me r&#xE9;serve de ressources.</strong></p>
<p>Vous passez des heures au boulot concentr&#xE9; sur un probl&#xE8;me de design&#xA0;? Vous aurez plus de chance de faire une petite halte chez McDo en rentrant chez vous. Vous vous retenez de dire ce que vous pensez <i>vraiment</i> pendant une r&#xE9;union p&#xE9;nible et interminable&#xA0;? Vous aurez plus de mal &#xE0; coder plus tard dans la journ&#xE9;e.</p>
<p>Car la volont&#xE9;, le contr&#xF4;le de soi et les t&#xE2;ches cognitives puisent dans les m&#xEA;mes r&#xE9;serves. Si vous &#xE9;puisez ces r&#xE9;serves &#xE0; un moment donn&#xE9;, vous en paierez forc&#xE9;ment le prix un peu plus tard. Il n&#x2019;y a qu&#x2019;une seule r&#xE9;serve. Une r&#xE9;serve de ressources rares, pr&#xE9;cieuses et <i>tr&#xE8;s volatiles</i>. Si vous passez votre journ&#xE9;e &#xE0; vous contr&#xF4;ler (face &#xE0; des clients m&#xE9;contents ou &#xE0; des coll&#xE8;gues incapables), vous rentrez chez vous le soir avec la jauge &#xE0; z&#xE9;ro.</p>
<p>Le r&#xE9;servoir est vide. Et m&#xEA;me si vous adorez vous frotter &#xE0; des probl&#xE8;mes compliqu&#xE9;s quand vous &#xEA;tes au travail, cela n&#x2019;emp&#xEA;che pas du tout que vos ressources soient diminu&#xE9;es. Il n&#x2019;y a qu&#x2019;une seule r&#xE9;serve. Qu&#x2019;elle soit consomm&#xE9;e par des activit&#xE9;s que vous aimez ou que vous d&#xE9;testez n&#x2019;y change rien. Le r&#xE9;servoir de ressources cognitives s&#x2019;en fiche. Du coup, la moindre petite chose vous fait r&#xE2;ler contre vos enfants ou votre chien. Ou bien c&#x2019;est le chien qui vous grogne dessus.</p>
<p><span class="spip_document_468 spip_documents spip_documents_center">
<img src="https://www.pompage.net/traduction/IMG/jpg/fr_dogexperimentwebversion.jpg-format=500w.jpg" width="466" alt=""></span><br class="autobr">
Au cours d&#x2019;une exp&#xE9;rience, un premier groupe de chiens devait rester assis pendant quelques minutes sans rien faire, avant d&#x2019;&#xEA;tre autoris&#xE9;s &#xE0; jouer avec leur jouet &#xE0; croquettes &#xAB;&#xA0;intelligent&#xA0;&#xBB; (le genre de jouet o&#xF9; le chien doit fournir des efforts pour en extraire des croquettes). Les chiens de l&#x2019;autre groupe restaient tranquilles dans leurs cages avant de recevoir leur jouet.</p>
<p>Vous imaginez peut-&#xEA;tre d&#xE9;j&#xE0; la suite&#xA0;: les chiens qu&#x2019;on avait oblig&#xE9;s &#xE0; rester assis (et donc &#xE0; &#xEA;tre dans le contr&#xF4;le de soi) ont abandonn&#xE9; beaucoup plus t&#xF4;t leur jouet que ceux qui &#xE9;taient rest&#xE9;s tranquilles dans leurs cages. Les chiens qui n&#x2019;avaient PAS d&#xE9;pens&#xE9; de ressources cognitives en s&#x2019;effor&#xE7;ant d&#x2019;ob&#xE9;ir montraient davantage de d&#xE9;termination et d&#x2019;&#xE9;nergie mentale et &#xE9;motionnelle pour r&#xE9;soudre le probl&#xE8;me. Pensez-y la prochaine fois que vous demanderez &#xE0; Youki de patienter un peu. Car ses ressources cognitives &#xE0; lui s&#x2019;&#xE9;puisent tout aussi vite.</p>
<p>R&#xE9;fl&#xE9;chissons maintenant &#xE0; ce que nous faisons subir &#xE0; nos utilisateurs. Si l&#x2019;exp&#xE9;rience utilisateur les oblige &#xE0; faire des choix, et m&#xEA;me si ces choix sont &#xE0; la fois clairs et utiles, cet acte de d&#xE9;cision diminue leurs ressources cognitives. Et pas uniquement au moment du choix&#x2026; m&#xEA;me apr&#xE8;s ce moment, ils continuent &#xE0; consommer inconsciemment leurs ressources&#xA0;: &#xAB;&#xA0;Ai-je fait le bon choix&#xA0;?&#xA0;&#xBB;</p>
<p>Si votre application est compliqu&#xE9;e et si votre <abbr>FAQ</abbr> ou votre aide en ligne ne r&#xE9;pond pas &#xE0; mes besoins, vous faites baisser mon maigre niveau de ressources cognitives. Si votre application se comporte de fa&#xE7;on contre-intuitive (m&#xEA;me si &#xE7;a n&#x2019;arrive qu&#x2019;une seule fois), je perdrai une partie de mes ressources &#xE0; chaque nouvelle utilisation, parce que je me demanderai toujours&#xA0;: &#xAB;&#xA0;Attends, est-ce que &#xE7;a fait bien ce que je pensais&#xA0;?&#xA0;&#xBB;</p>
<p>Ou bien, imaginons que votre application soit vraiment hyper-facile &#xE0; utiliser mais que dans son design et dans son fonctionnement elle soit remplie d&#x2019;&#xE9;l&#xE9;ments motivateurs (des &#xAB;&#xA0;clins d&#x2019;&#x153;il&#xA0;&#xBB;, des aspects ludiques, des astuces de fonctionnement, etc.) qui ont &#xE9;t&#xE9; pens&#xE9;s pour me garder &#xAB;&#xA0;accroch&#xE9;&#xA0;&#xBB; dans votre int&#xE9;r&#xEA;t, pas dans le mien (oui Zynga, c&#x2019;est &#xE0; toi que je pense)... Eh bien, l&#xE0; aussi vous &#xE9;puisez mes ressources cognitives. Et que se passe-t-il quand je l&#xE2;che l&#x2019;&#xE9;cran pour aller dans la cuisine&#xA0;?...</p>
<p><strong>Votre application me fait grossir.</strong></p>
<p>Si notre travail fait perdre &#xE0; l&#x2019;utilisateur ses ressources cognitives, qu&#x2019;est-ce qu&#x2019;il perd&#xA0;? Qu&#x2019;est-ce qu&#x2019;il aurait pu faire d&#x2019;autre avec ces ressources si rares, si pr&#xE9;cieuses, si vite disparues&#xA0;? Peut-&#xEA;tre qu&#x2019;il avait dans l&#x2019;id&#xE9;e de suivre bien sagement son r&#xE9;gime. Ou de faire de la guitare. Ou de jouer avec ses enfants.</p>
<p>Dites-moi, ce nouvel &#xE9;l&#xE9;ment que vous venez d&#x2019;ajouter&#x2026; Cet &#xE9;l&#xE9;ment bling-bling, super-techno, ultra-cool&#x2026; est-ce qu&#x2019;il ne risque pas de co&#xFB;ter tr&#xE8;s cher &#xE0; votre utilisateur&#xA0;? Car si le r&#xE9;sultat de votre travail appauvrit ses ressources cognitives, on ne peut plus employer ces ressources &#xE0; d&#x2019;autres usages beaucoup plus importants. Le probl&#xE8;me ne r&#xE9;side pas dans le fait que vous accaparez le temps et l&#x2019;attention de vos utilisateurs pendant qu&#x2019;ils utilisent votre application. Il r&#xE9;side dans l&#x2019;&#xE9;puisement de leurs capacit&#xE9;s de pens&#xE9;e logique, de r&#xE9;solution de probl&#xE8;me et de ma&#xEE;trise de soi apr&#xE8;s avoir cliqu&#xE9;, balay&#xE9; ou touch&#xE9; un &#xE9;cran.</p>
<p>Bien entendu, ce n&#x2019;est pas un mal en soi si votre travail &#xE9;puise le r&#xE9;servoir de ressources d&#x2019;un utilisateur. C&#x2019;est peut-&#xEA;tre justement dans votre application que votre utilisateur veut d&#xE9;penser ces ressources. Mais d&#xE8;s lors que vous savez ce que co&#xFB;te une interaction avec votre produit, vous allez peut-&#xEA;tre faire des choix diff&#xE9;rents.</p>
<p>Vous allez peut-&#xEA;tre r&#xE9;fl&#xE9;chir davantage &#xE0; ce qui motive vraiment vos utilisateurs. Vous allez peut-&#xEA;tre vous demander, &#xE0; chaque r&#xE9;union de design&#xA0;: &#xAB;&#xA0;est-ce que cet &#xE9;l&#xE9;ment nous pousse &#xE0; choisir les fruits ou bien le g&#xE2;teau&#xA0;?&#xA0;&#xBB; afin de limiter les &#xE9;l&#xE9;ments qui m&#xE8;nent au g&#xE2;teau &#x2014; ceux qui co&#xFB;tent le plus &#x2014; &#xE0; ce pour quoi vos utilisateurs sont venus&#xA0;: utiliser votre application.</p>
<p>(Il est vrai que vous pouvez recharger vos ressources cognitives pendant la journ&#xE9;e en fournissant des glucides &#xE0; votre cerveau, mais allez-y doucement. Il vaut mieux prendre un en-cas prot&#xE9;in&#xE9; avec de temps en temps quelques petites gorg&#xE9;es de boisson &#xE9;nergisante).</p>
<p>Mais quand bien m&#xEA;me vous parvenez &#xE0; justifier l&#x2019;&#xE9;puisement des ressources cognitives de vos utilisateurs <i>pendant</i> qu&#x2019;ils utilisent votre produit, que dire alors de votre politique de <span>marketing</span>&#xA0;? Croyez-vous sinc&#xE8;rement que votre &#xAB;&#xA0;<span>marketing</span> de contenu&#xA0;&#xBB; constitue un bon usage de leurs ressources&#xA0;? &#xAB;&#xA0;Oui, parce qu&#x2019;on obtient de la valeur ajout&#xE9;e&#xA0;&#xBB;, direz-vous. Mais qu&#x2019;est-ce que &#xE7;a veut vraiment dire&#xA0;? Pouvez-vous honn&#xEA;tement affirmer que &#xAB;&#xA0;l&#x2019;engagement envers une marque&#xA0;&#xBB; constitue un usage sain et &#xE9;thique de leurs maigres et pr&#xE9;cieuses ressources cognitives&#xA0;? &#xAB;&#xA0;Oui, <i>parce que notre contenu est utile</i>&#xA0;&#xBB;.</p>
<p>Tout &#xE7;a est bien beau, tr&#xE8;s &#xAB;&#xA0;r&#xE9;seaux sociaux&#xA0;&#xBB;, tr&#xE8;s &#xAB;&#xA0;3.0&#xA0;&#xBB;, tout &#xE7;a, mais il y a quand m&#xEA;me un petit probl&#xE8;me&#xA0;: on est dans un jeu &#xE0; somme nulle. Ce que je consommerai au point A, je ne l&#x2019;aurai plus au point B. Et je n&#x2019;aurai pas juste perdu de l&#x2019;attention ou du temps, mais une capacit&#xE9; &#xE0; &#xEA;tre au meilleur de moi-m&#xEA;me. C&#x2019;est-&#xE0;-dire lorsque je dispose de g&#xE9;n&#xE9;reuses ressources cognitives. Lorsque je peux penser, r&#xE9;soudre des probl&#xE8;mes, et maintenir un bon contr&#xF4;le de moi-m&#xEA;me. Lorsque je sais cr&#xE9;er, &#xE9;tablir des liens et rester concentr&#xE9;.</p>
<p>Ce &#xAB;&#xA0;contenu&#xA0;&#xBB; en vaut-il la peine&#xA0;? C&#x2019;est possible. Mais au lieu de nous demander &#xAB;&#xA0;est-ce que c&#x2019;est vraiment utile&#xA0;?&#xA0;&#xBB;, nous devrions sans doute aller plus loin et nous demander &#xAB;&#xA0;est-ce qu&#x2019;ils vont vraiment l&#x2019;utiliser&#xA0;?&#xA0;&#xBB; (au fait, en &#xE9;crivant ceci je suis bien conscient que je suis en train de puiser dans vos ressources cognitives. Mais apr&#xE8;s tout, je ne me suis pas lanc&#xE9; dans <a href="http://seriouspony.com/" class="spip_out"><span>Serious Pony</span></a> pour pr&#xE9;server vos ressources cognitives&#xA0;: je voudrais plut&#xF4;t contribuer &#xE0; &#xE9;pargner celles de <i>vos utilisateurs</i>).</p>
<p>Je n&#x2019;ai rien contre le &#xAB;&#xA0;<span>marketing</span> de contenu&#xA0;&#xBB;. Bien au contraire, c&#x2019;est pratiquement la seule forme de <span>marketing</span>-&#xE9;puiseur-de-ressources qui puisse valoir le d&#xE9;tour. C&#x2019;est typiquement le genre de marketing qui peut pousser les gens &#xE0; devenir plus comp&#xE9;tents dans un domaine qui les int&#xE9;resse. C&#x2019;est le genre de <span>marketing</span> qui a la capacit&#xE9; de fournir aux utilisateurs un apprentissage &#x2014; ce que la plupart des entreprises ignorent royalement. Le <span>marketing</span> de contenu peut (et doit) &#xEA;tre &#xAB;&#xA0;le guide qui vous manquait&#xA0;&#xBB;. Il peut (et doit) repr&#xE9;senter une source d&#x2019;inspiration qui pousse nos utilisateurs &#xE0; apprendre, &#xE0; progresser (dans ce qui les int&#xE9;resse) et &#xE0; se connecter &#xE0; d&#x2019;autres utilisateurs.</p>
<p>Mais si on parle de &#xAB;&#xA0;contenu&#xA0;&#xBB; qui vise uniquement &#xE0; attirer les passants (&#xAB;&#xA0;D&#xE9;couvrez les 7 voies du succ&#xE8;s&#xA0;!&#xA0;&#xBB;) en esp&#xE9;rant les &#xAB;&#xA0;convertir&#xA0;&#xBB;, on leur fait du mal. Si l&#x2019;alibi pour leur balancer du &#xAB;&#xA0;contenu&#xA0;&#xBB;, c&#x2019;est la courbe de fr&#xE9;quence des visites, on leur fait du mal. L&#xE0;, en ce moment, je vous fais du mal. Mea culpa. C&#x2019;est pour &#xE7;a que j&#x2019;essaie d&#x2019;utiliser des images pour souligner l&#x2019;essentiel, pour vous &#xE9;viter d&#x2019;avoir &#xE0; lire l&#x2019;article (et aussi parce que j&#x2019;ai un c&#xF4;t&#xE9; verbeux, oui je sais, j&#x2019;y travaille&#x2026;).</p>
<p>J&#x2019;ai perdu mon p&#xE8;re brutalement la semaine derni&#xE8;re&#xA0;; et comme c&#x2019;est souvent le cas quand un proche vient de mourir, je me suis dit&#xA0;: &#xAB;&#xA0;Quand on est sur sur son lit de mort, on relativise beaucoup de choses.&#xA0;&#xBB; Dans mon travail de ces 20 derni&#xE8;res ann&#xE9;es, j&#x2019;ai cr&#xE9;&#xE9; des jeux de marketing interactif, des sites gamifi&#xE9;s (= con&#xE7;us selon une approche plus ludique, <abbr><i>NdT</i></abbr>) et des dizaines d&#x2019;autres projets qui &#xE9;taient soigneusement, finement et scientifiquement con&#xE7;us pour aspirer goul&#xFB;ment des ressources cognitives, mais&#x2026; pour pas grand-chose d&#x2019;important en fin de compte. Est-ce que mes visiteurs s&#x2019;y laissaient attirer de fa&#xE7;on volontaire&#xA0;? Bien s&#xFB;r que oui. Sauf que quand j&#x2019;&#xE9;cris &#xAB;&#xA0;bien s&#xFB;r&#xA0;&#xBB;, je me dis&#xA0;: &#xAB;&#xA0;pas si s&#xFB;r...&#xA0;&#xBB; Car c&#x2019;est ce que nous apprend la recherche en psychologie, en neurosciences ou en &#xE9;conomie comportementale de ces 50 derni&#xE8;res ann&#xE9;es. Mes visiteurs se faisaient aguicher, s&#xE9;duire, et finalement prendre au pi&#xE8;ge. Et j&#x2019;&#xE9;tais tr&#xE8;s fort &#xE0; ce petit jeu-l&#xE0;. Je suis vraiment, vraiment sinc&#xE8;rement d&#xE9;sol&#xE9;.</p>
<p>Avec <span>Serious Pony</span>, mon objectif est de donner &#xE0; tous des pistes pour prendre mieux soin des utilisateurs. Pas seulement pendant qu&#x2019;ils utilisent nos applications, nos sites ou nos produits, mais aussi apr&#xE8;s. Et pas seulement parce que ce sont nos utilisateurs, mais parce que ce sont d&#x2019;abord des personnes.</p>
<p>Parce que quand ils seront sur leur lit de mort, nos utilisateurs ne vont certainement pas se dire&#xA0;: &#xAB;&#xA0;Ah, si seulement j&#x2019;avais consacr&#xE9; plus de temps &#xE0; leurs marques&#xA0;!...&#xA0;&#xBB;</p>
<p>Aidez-les &#xE0; &#xE9;conomiser et &#xE0; bien g&#xE9;rer leurs ressources cognitives si maigres, si pr&#xE9;cieuses et si volatiles, pour qu&#x2019;elles soient consacr&#xE9;es &#xE0; ce qui est vraiment important. Important pour eux. Et puis, pensez &#xE0; vos propres ressources. Pensez aux enfants. Pensez &#xE0; Youki.</p>
<p><span class="spip_document_467 spip_documents spip_documents_center">
<img src="https://www.pompage.net/traduction/IMG/jpg/boinocrate.jpg-format=750w.jpg" width="750" alt=""></span></p> </div></div>]]></description>
      <link>https://www.pompage.net/traduction/votre-application-me-fait-grossir</link>
      <guid>https://www.pompage.net/traduction/votre-application-me-fait-grossir</guid>
      <pubDate>Thu, 24 Jul 2014 10:07:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Traduit ailleurs : Continuum]]></title>
      <description><![CDATA[<section class="post-content">
<section class="post-description">
<p><span>Jeremy Keith, dans la continuit&#xE9; du c&#xE9;l&#xE8;bre Tao du Webdesign, d&#xE9;fend l&apos;id&#xE9;e du web comme un continuum - un espace ouvert &#xE0; l&apos;exp&#xE9;rimentation, soucieux d&apos;accessibilit&#xE9; au contenu. Engag&#xE9;, constructif, d&#xE9;finitif. </span></p>
</section>
<p><em>Par <span><span>Jeremy Keith</span></span></em></p>
<p>Arr&#xEA;tez-moi si vous l&#x2019;avez d&#xE9;j&#xE0; entendue&#xA0;: vous lisez un article sur <a href="http://www.smashingmagazine.com/">Smashing Magazine</a> ou <a href="http://alistapart.com/">A List Apart</a> ou autre, l&#x2019;article traite d&#x2019;une fonctionnalit&#xE9; sp&#xE9;cifique de CSS, ou peut-&#xEA;tre de JavaScript, ou explore une nouveaut&#xE9; de HTML. L&#x2019;article est bon. Il explique comment utiliser cette nouvelle fonctionnalit&#xE9; dans votre travail. Puis vous lisez les commentaires. Le premier d&#x2019;entre eux est invariablement &#xE9;crit par un lecteur qui se plaint de ne pouvoir utiliser cette fonction &#xE0; cause des <span>probl&#xE8;mes d&#x2019;incompatibilit&#xE9; navigateurs</span>. Plus pr&#xE9;cis&#xE9;ment, sur de vieilles versions d&#x2019;Internet Explorer, qu&#x2019;il est oblig&#xE9; de servir. En cons&#xE9;quence de quoi, l&#x2019;article est d&#xE9;clar&#xE9; <em>nul et non avenu</em>.</p>
<p>Cette attitude m&#x2019;irrite et me d&#xE9;prime au plus haut point. Elle me semble d&#xE9;montrer un d&#xE9;calage fondamental entre la fa&#xE7;on dont cette personne consid&#xE8;re <span>le m&#xE9;tier de d&#xE9;veloppeur web</span> et <span>la r&#xE9;alit&#xE9; du web</span>.</p>
<p>Il est tout &#xE0; fait possible &#x2014;&#xA0;non&#xA0;: souhaitable&#xA0;&#x2014; d&#x2019;utiliser ces fonctionnalit&#xE9;s bien avant qu&#x2019;elles ne soient support&#xE9;es par tous les navigateurs. C&#x2019;est ainsi que nous faisons avancer le web. Si nous avions attendu une compatibilit&#xE9; universelle, nous en serions encore &#xE0; CSS 1.0 et HTML 2.0.</p>
<p>Si vous utilisez une fonctionnalit&#xE9; CSS qui n&#x2019;est pas compatible avec tel ou tel navigateur &#x2014;&#xA0; par exemple avec une version ancienne d&#x2019;IE&#xA0;&#x2014; ce navigateur ignorera purement et simplement cette r&#xE8;gle CSS. Donc vous n&#x2019;aurez pas ce coin arrondi, cette ombre sous le texte... Les navigateurs traitent les erreurs de la m&#xEA;me fa&#xE7;on pour HTML&#xA0;: s&#x2019;ils voient quelque chose qu&#x2019;ils ne comprennent pas, ils l&#x2019;ignorent. Le navigateur n&#x2019;enverra pas d&#x2019;erreur, il n&#x2019;arr&#xEA;tera pas le processus de rendu de page. Les navigateurs sont tr&#xE8;s <a href="https://en.wikipedia.org/wiki/Robustness_principle">souples</a>.</p>
<p>C&#x2019;est un peu plus compliqu&#xE9; avec JavaScript&#xA0;: les navigateurs retourneront une erreur, ils bloqueront le script. C&#x2019;est pourquoi il est important d&#x2019;utiliser la d&#xE9;tection de fonctionnalit&#xE9;. C&#x2019;est pourquoi aussi il est si important de ne pas s&#x2019;en remettre &#xE0; JavaScript pour le rendu de votre contenu &#x2014;&#xA0;c&#x2019;est la couche la plus fragile dans l&#x2019;empilement front-end. Bon, je n&#x2019;ai pas dit qu&#x2019;il ne fallait pas <em>utiliser</em> JavaScript, je dis juste qu&#x2019;il ne faut pas trop s&#x2019;appuyer sur lui, sinon vous pourriez avoir affaire &#xE0; un SPOF (<a href="https://fr.wikipedia.org/wiki/Point_individuel_de_d%C3%A9faillance">Single Point of Failure</a>, un <span>point individuel de d&#xE9;faillance</span>).</p>
<p>Ce qu&#x2019;il est important de garder &#xE0; l&#x2019;esprit &#x2014;&#xA0;et j&#x2019;ai du mal &#xE0; croire qu&#x2019;on doive encore le r&#xE9;p&#xE9;ter apr&#xE8;s tant d&#x2019;ann&#xE9;es&#xA0;&#x2014; c&#x2019;est que <a href="http://dowebsitesneedtolookexactlythesameineverybrowser.com/">les sites web n&#x2019;ont pas besoin d&#x2019;&#xEA;tre identiques d&#x2019;un navigateur &#xE0; l&#x2019;autre</a>.</p>
<p>&#x201C;Mais mon client !&#x201D; crie le commentateur de Smashing Magazine, &#x201C;Mais mon patron !&#x201D; dit un autre...</p>
<p>Si votre client ou votre patron s&#x2019;attend &#xE0; ce qu&#x2019;un site web ait le m&#xEA;me look et le m&#xEA;me comportement sur chaque terminal, d&#x2019;o&#xF9; lui viennent ces id&#xE9;es&#xA0;? Plut&#xF4;t que de perdre votre temps &#xE0; tenter de satisfaire ces attentes, vous l&#x2019;utiliseriez mieux &#xE0; expliquer &#xE0; vos interlocuteurs pourquoi ces choses-l&#xE0; sont impossibles dans la r&#xE9;alit&#xE9; du web actuel.</p>
<p>Comme le dit <a href="https://www.abookapart.com/products/design-is-a-job">Mike Monteiro &#xE0; propos des clients</a>&#xA0;: S&#x2019;ils ne comprennent pas quelque chose dans votre design, ce n&#x2019;est pas leur faute, c&#x2019;est la v&#xF4;tre. Expliquer votre design fait partie int&#xE9;grante de votre m&#xE9;tier de designer. Idem pour le d&#xE9;veloppement web, c&#x2019;est notre m&#xE9;tier d&#x2019;expliquer comment &#xE7;a marche... et comment la r&#xE9;partition d&#xE9;s&#xE9;quilibr&#xE9;e des capacit&#xE9;s des navigateurs n&#x2019;est pas un bug, c&#x2019;est une caract&#xE9;ristique objective et incontournable.</p>
<p>Il y a d&#xE9;j&#xE0; 14 ans que John Allsopp a &#xE9;crit le <a href="http://www.pompage.net/traduction/dao">Tao du webdesign</a>, et son texte est toujours actuel. &#xC0; l&#x2019;&#xE9;poque, les designers et les d&#xE9;veloppeurs comparaient le web au monde de l&#x2019;imprimerie, et pensaient qu&#x2019;il lui &#xE9;tait inf&#xE9;rieur. Aujourd&#x2019;hui, ils le comparent au monde des applications natives et lui trouvent encore des manques. Dans les deux cas, mon sentiment est qu&#x2019;ils passent &#xE0; c&#xF4;t&#xE9; du point fondamental du web&#xA0;: vous pouvez <span>fournir un acc&#xE8;s universel au contenu</span> et aux t&#xE2;ches sans n&#xE9;cessairement fournir la m&#xEA;me exp&#xE9;rience &#xE0; chaque navigateur ou &#xE0; chaque terminal.</p>
<p>Paul Kinlan a publi&#xE9; <a href="http://paul.kinlan.me/this-is-the-web-platform/">un article</a> intitul&#xE9; &#x201C;Ce qu&#x2019;est la plateforme web&#x201D; dans lequel il met sous forme de tableau l&#x2019;&#xE9;tat actuel des compatibilit&#xE9;s navigateurs pour un certain nombre de fonctionnalit&#xE9;s. &#x201C;Assez accablant&#x201D; selon lui&#xA0;:</p>
<blockquote>
<p>la compatibilit&#xE9; omnipr&#xE9;sente sur le web est en r&#xE9;alit&#xE9; assez restreinte d&#xE8;s lors qu&#x2019;on doit supporter IE8.</p>
</blockquote>
<p>C&#x2019;est vrai... <a href="https://www.youtube.com/watch?v=pSOBeD1GC_Y">d&#x2019;un certain point de vue</a>. Mais cela d&#xE9;pend de votre d&#xE9;finition de la &#x201C;compatibilit&#xE9;&#x201D;. Si elle signifie &#x201C;avoir le m&#xEA;me look et les m&#xEA;mes fonctions que dans la derni&#xE8;re version de Chrome&#x201D;, alors oui, vous aurez un ensemble de fonctionnalit&#xE9;s plus r&#xE9;duit (et vous aurez &#xE9;galement une existence plus mis&#xE9;rable). Mais si votre d&#xE9;finition de la compatibilit&#xE9; est &#x201C;&#xEA;tre capable d&#x2019;acc&#xE9;der au contenu et d&#x2019;accomplir les t&#xE2;ches&#x201D;, alors tant que vous faites appel &#xE0; l&#x2019;<a href="https://la-cascade.io/articles/#progr">am&#xE9;lioration progressive</a> vous pourrez utiliser toutes les fonctionnalit&#xE9;s que vous voulez <em>et</em> supporter IE 8, 7, 6, 5... vous pouvez supporter n&#x2019;importe quel navigateur capable de se connecter &#xE0; internet.</p>
<p><a href="http://bradfrostweb.com/blog/mobile/support-vs-optimization/">Comme le dit Brad Frost</a>&#xA0;:</p>
<blockquote>
<p>Il y a une diff&#xE9;rence entre la compatibilit&#xE9; et l&#x2019;optimisation.</p>
</blockquote>
<p>Une partie du probl&#xE8;me vient probablement d&#x2019;incompr&#xE9;hensions langagi&#xE8;res. Nous parlons &#x201C;du navigateur&#x201D; quand nous devrions dire &#x201C;les navigateurs&#x201D;. Je suis coupable moi-m&#xEA;me. J&#x2019;utilise des expressions telles que &#x201C;design dans le navigateur&#x201D;, je parle de &#x201C;ce qu&#x2019;il est possible de faire dans le navigateur&#x201D;...</p>
<p>C&#x2019;est une petite subtilit&#xE9; <a href="http://georgelakoff.com/">Lakoffienne</a>, mais lorsque nous parlons &#x201C;du navigateur&#x201D; comme s&#x2019;il s&#x2019;agissait d&#x2019;une entit&#xE9; unique, nous sommes peut-&#xEA;tre en train de renforcer cette attente d&#x2019;un id&#xE9;al platonicien de rendu navigateur unique pour lequel nous voulons r&#xE9;aliser nos designs.</p>
<p>Il y a encore une phrase qui me g&#xEA;ne, c&#x2019;est celle que Paul utilise dans son article pr&#xE9;c&#xE9;demment cit&#xE9;. J&#x2019;en ai parl&#xE9; en novembre dernier dans ma pr&#xE9;sentation sur <a href="https://adactio.com/articles/6574/">le pouvoir de la simplicit&#xE9;</a>&#xA0;:</p>
<blockquote>
<p>Cette id&#xE9;e du web comme une plateforme, je la comprends bien d&#x2019;un point de vue marketing, et nous pourrions vouloir utiliser cette phrase pour mettre sur un pied d&#x2019;&#xE9;galit&#xE9; le web et les plateformes v&#xE9;ritables. Je dirais que Flash est une plateforme, et le monde natif&#xA0;: iOS, Android et toutes ces sortes de choses. Ce sont des plateformes, en ce sens que ce sont des suites logicielles, mais le web n&#x2019;est pas comme cela. Si vous utilisez la plateforme Flash, toute personne qui a le plug-in Flash peut acc&#xE9;der &#xE0; votre contenu. C&#x2019;est on/off, un ou z&#xE9;ro, binaire. Ou bien ils ont la plateforme, ou bien ils ne l&#x2019;ont pas. Ou bien ils peuvent acc&#xE9;der &#xE0; votre contenu ou bien ils ne peuvent pas. M&#xEA;me chose avec les applis natives. Si vous avez le bon t&#xE9;l&#xE9;phone, vous pouvez avoir mon appli. Toute mon appli. Pas juste une partie, non, mon appli tout enti&#xE8;re. Ou rien du tout parce que vous n&#x2019;avez pas le t&#xE9;l&#xE9;phone compatible. </p><p>
Mais le web n&#x2019;est pas ainsi. Le web n&#x2019;est pas binaire, un ou z&#xE9;ro, on/off. Ce n&#x2019;est pas une plateforme o&#xF9; vous avez 100% ou 0%. C&#x2019;est un continuum.</p></blockquote></section>]]></description>
      <link>https://la-cascade.io/continuum/</link>
      <guid>https://la-cascade.io/continuum/</guid>
      <pubDate>Fri, 11 Jul 2014 06:07:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[D'abord la structure. Le contenu suivra.]]></title>
      <description><![CDATA[<div><div id="article"><p class="signature">Par
<a href="http://markboulton.co.uk/">Mark Boulton</a></p><p>Il faut bien commencer quelque part. On ne peut pas partir de rien.</p><p>En 2001, j&#x2019;ai commenc&#xE9; &#xE0; travailler pour la <a href="http://www.bbc.co.uk/wales" class="spip_out">BBC</a> &#xE0; Cardiff. Quatre ann&#xE9;es durant j&#x2019;ai travaill&#xE9; aux c&#xF4;t&#xE9;s de journalistes et de chefs de projets sur toutes sortes de sites web et applications, du petit site de contenu de niche sur le surf jusqu&#x2019;&#xE0; la refonte de la page d&#x2019;accueil. Tout ces projets furent abord&#xE9;s selon l&#x2019;approche &quot;Contenu en premier&quot; (mais pas tel que <a href="http://adactio.com/journal/4523/" class="spip_out">d&#xE9;fini par Jeremy Keith</a>), mais nous n&#x2019;avons jamais eu le contenu en premier.</p><p>J&#x2019;ai travaill&#xE9; avec de nombreux m&#xE9;dias ces dix derni&#xE8;res ann&#xE9;es. J&#x2019;ai beaucoup appris sur de nombreux processus &#xE9;ditoriaux &#xE0; travers trois m&#xE9;dias&#xA0;: la t&#xE9;l&#xE9;vision, les journaux, et le web (et m&#xEA;me un petit peu de radio). Je me r&#xE9;jouis des points communs entre eux et me tords de douleur en constatant les diff&#xE9;rentes mani&#xE8;res de faire pour chacun d&#x2019;eux, tant dans les organisations elles-m&#xEA;mes que dans ce qu&#x2019;elles produisent. Certaines choses ont &#xE9;t&#xE9; directement transpos&#xE9;es sur le web avec succ&#xE8;s&#xA0;; d&#x2019;autres ont &#xE9;t&#xE9; des &#xE9;checs. Comme de fabriquer des sites web en singeant les CD-Roms, par exemple. Vous vous souvenez de cette &#xE9;poque&#xA0;?</p><p>Le mod&#xE8;le que nous avons emprunt&#xE9; &#xE0; l&#x2019;impression papier pour l&#x2019;appliquer aux premiers temps du Web &#x2014; le mod&#xE8;le de page et le syst&#xE8;me de publication &#x2014; est maintenant en danger. Il est menac&#xE9; par le postulat qu&#x2019;il faudrait avoir connaissance du contenu avant de lancer la conception. Quiconque a d&#xE9;j&#xE0; travaill&#xE9; dans l&#x2019;&#xE9;dition, cr&#xE9;&#xE9; un concept de marque &#xE0; grande &#xE9;chelle ou un syst&#xE8;me d&#x2019;orientation sait parfaitement que c&#x2019;est un non-sens. Nous n&#x2019;avons pas besoin de donner la priorit&#xE9; au contenu, mais &#xE0; la structure. Le contenu quand &#xE0; lui est toujours essentiel.</p><p>Soyons clair &#xE0; ce propos. Il est illusoire de vouloir &#xE9;crire votre contenu &#x2014; ou de demander &#xE0; votre client de l&#x2019;&#xE9;crire &#x2014; avant de concevoir la structure. Du moins en g&#xE9;n&#xE9;ral. Le contenu a besoin d&#x2019;&#xEA;tre structur&#xE9; et la structure modifie votre contenu, tout comme concevoir modifie le contenu. Ce n&#x2019;est donc pas &#xAB;&#xA0;contenu <i>puis</i> conception&#xA0;&#xBB;, ou &#xAB;&#xA0;contenu <i>ou</i> conception&#xA0;&#xBB;&#xA0;; c&#x2019;est &#xAB;&#xA0;contenu <i>et</i> conception&#xA0;&#xBB;.</p><p>Concevoir la maquette d&#x2019;un magazine ou d&#x2019;un journal papier n&#xE9;cessite d&#x2019;imposer des contraintes rigoureuses aux multiples types de contenu. Vous devez d&#xE9;finir, en &#xE9;troite collaboration avec l&#x2019;&#xE9;quipe &#xE9;ditoriale, les cat&#xE9;gories de contenu que vous devrez accommoder. Le gabarit d&#x2019;un article d&#x2019;information, d&#x2019;un &#xE9;ditorial ou d&#x2019;un dossier n&#xE9;cessite un traitement visuel diff&#xE9;rent pour indiquer aux lecteurs que le contenu n&#x2019;est pas de m&#xEA;me type. Les variations de mise en forme doivent &#xEA;tre assez limit&#xE9;es, d&#x2019;ailleurs. Pourquoi&#xA0;? Eh bien, surtout &#xE0; cause du facteur temps. Journaux et magazines subissent d&#x2019;&#xE9;normes contraintes de temps, et le contenu est litt&#xE9;ralement d&#xE9;vers&#xE9; dans un moule pr&#xE9;fabriqu&#xE9;&#xA0;&#x2014; on peut retoucher ou ajuster &#xE0; la marge, mais les maquettes et gabarits ne laissent pratiquement aucune libert&#xE9;. Et ce n&#x2019;est pas une mauvaise pratique, c&#x2019;est ainsi que les contenus vivent et respirent dans un environnement &#xE0; forte cadence &#xE9;ditoriale. La fluidit&#xE9; est privil&#xE9;gi&#xE9;e. Tout cela ne peut pas &#xEA;tre fig&#xE9; en amont. La priorit&#xE9; au contenu ne marcherait pas dans ce cas pr&#xE9;cis.</p><h2>Le contenu comme structure</h2><p>Nous avons vu r&#xE9;cemment l&#x2019;&#xE9;mergence d&#x2019;un raisonnement fallacieux dans notre domaine. L&#x2019;id&#xE9;e qu&#x2019;il n&#x2019;est pas possible de cr&#xE9;er une conception convenable sans avoir connaissance du contenu. <a href="http://www.markboulton.co.uk/journal/comments/a-richer-canvas" class="spip_out">Je l&#x2019;ai dit moi-m&#xEA;me</a> il y a quelque temps. Mais ce n&#x2019;est qu&#x2019;&#xE0; moiti&#xE9; vrai. Les journaux, les magazines et de nombreux autres p&#xE9;riodiques et publications issus de diff&#xE9;rents m&#xE9;dias d&#xE9;montrent quotidiennement que cette th&#xE9;orie ne tient pas.</p><p>Vous pouvez mettre en place une bonne exp&#xE9;rience utilisateur sans avoir connaissance du contenu. Ce que vous ne pouvez pas faire, c&#x2019;est mettre en place une bonne exp&#xE9;rience utilisateur sans conna&#xEE;tre la <i>structure</i> de votre contenu. La question n&#x2019;est pas de savoir ce qu&#x2019;est ce contenu, mais de comment il est constitu&#xE9;. Et c&#x2019;est une diff&#xE9;rence de taille.</p><p>Il faut donc commencer par la structure, pas par les mots. Qu&#x2019;est-ce qu&#x2019;un &#xAB;&#xA0;article d&#x2019;opinion&#xA0;&#xBB;&#xA0;? Quels sont les variables &#xE0; prendre en compte&#xA0;? Peut-on m&#xEA;me les d&#xE9;finir&#xA0;? Y aura-t-il des images&#xA0;? Combien&#xA0;? (La r&#xE9;ponse est toujours la m&#xEA;me&#xA0;: &#xAB;&#xA0;Je ne sais pas, &#xE7;a d&#xE9;pend&#xA0;!&#xA0;&#xBB;). Nous pouvons concevoir en privil&#xE9;giant la fluidit&#xE9;, mais cela signifie une perte de contr&#xF4;le. Encore. Comment faire, alors&#xA0;? Comment concevoir en privil&#xE9;giant la fluidit&#xE9;&#xA0;? Eh bien, nous d&#xE9;finissons la structure de notre contenu et les gabarits qu&#x2019;il occupera. Nous d&#xE9;finissons les r&#xE8;gles du syst&#xE8;me pour qu&#x2019;il affiche le contenu de diff&#xE9;rentes mani&#xE8;res (si possible) pour aider le lecteur &#xE0; mieux comprendre le contenu.</p><p>Comme le dit <a href="http://spiekermann.com/" class="spip_out">Erik Spiekermann</a>&#xA0;: &#xAB;&#xA0;on donne de la forme au contenu&#xA0;&#xBB;.</p><h2>Les concepteurs en tant que directeurs de contenu</h2><p>Les designers ont toujours &#xE9;t&#xE9; impliqu&#xE9;s par le contenu. Nous ne nous arr&#xEA;tons pas &#xE0; <a href="http://www.markboulton.co.uk/journal/comments/visual-design-is-not-a-thing" class="spip_out">l&#x2019;aspect visuel</a>. Mais comment le faire comprendre &#xE0; nos clients &#xE0; comprendre lorsque nous disons&#xA0;:</p><blockquote>&#xAB;&#xA0;Le contenu d&#x2019;abord&#xA0;!&#xA0;&#xBB;</blockquote><p>Ce n&#x2019;est pas pour dire&#xA0;:</p><blockquote>&#xAB;&#xA0;Je vais rester assis ici sans bouger jusqu&#x2019;&#xE0; ce que vous me donniez le contenu. Je dis bien le contenu finalis&#xE9;, valid&#xE9;, paraph&#xE9;, sign&#xE9;. Merci, j&#x2019;attends&#xA0;&#xBB;</blockquote><p>Non, bien s&#xFB;r. Il faut plut&#xF4;t comprendre&#xA0;:</p><blockquote>&#xAB;&#xA0;Nous aimerions bien comprendre le type et la structure des contenus pour ce projet. Ne vous inqui&#xE9;tez pas, vous n&#x2019;&#xEA;tes pas oblig&#xE9; de commencer &#xE0; l&#x2019;&#xE9;crire, aidez-nous seulement &#xE0; comprendre.&#xA0;&#xBB;</blockquote><p>Nous pouvons faire cela de nombreuses mani&#xE8;res mais r&#xE9;cemment, j&#x2019;ai remarqu&#xE9; que ces grands principes fonctionnaient bien pour moi&#xA0;:</p><ol class="spip"><li> <strong>Parler.</strong> Et utiliser des Post-It. Installez-vous dans une pi&#xE8;ce (ferm&#xE9;e &#xE0; clef de pr&#xE9;f&#xE9;rence) et discutez du site web ou de l&#x2019;application. Pas du contenu pour le moment. Pendant que vous &#xEA;tes en train de parler, &#xE9;crivez les mots qui r&#xE9;sonnent &#xE0; votre oreille. Apr&#xE8;s avoir discut&#xE9;, accrochez ces mots sur un mur et commencez &#xE0; les connecter entre eux. Nos confr&#xE8;res de l&#x2019;exp&#xE9;rience utilisateur ont s&#xFB;rement un nom qui claque pour qualifier cet exercice, mais je ne le connais pas.</li><li> <strong>Accepter le d&#xE9;sordre.</strong> Vous devriez vous retrouver avec tout un tas de mots vaguement reli&#xE9;s entre eux (ce n&#x2019;est toujours pas du contenu) &#xE0; propos de diff&#xE9;rents sujets. Ces sujets sont l&#x2019;ADN de votre site. L&#x2019;attitude, le ton, la marque, le message, ainsi que les points de d&#xE9;tail tels que les diff&#xE9;rents types de contenu, taxonomies, mots-cl&#xE9;s et autres aspects techniques. Maintenant, il faut ordonner tout cela.</li><li> <strong>It&#xE9;rer.</strong> &#xC0; un moment pendant le tri, vous aurez besoin de commencer &#xE0; d&#xE9;gager la structure. L&#xE0; aussi, j&#x2019;ai constat&#xE9; qu&#x2019;effectuer cette &#xE9;tape de mani&#xE8;re it&#xE9;rative et &#xE0; plusieurs est plus fructueux.</li><li> <strong>Structurer.</strong> Vous devriez maintenant avoir un d&#xE9;but de structure. &#xC0; l&#x2019;&#xE9;tape 3, il y a s&#xFB;rement un moment o&#xF9; votre client (ou vous-m&#xEA;me) dira en d&#xE9;signant un terme not&#xE9; sur un Post-it&#xA0;: &#xAB;&#xA0;Oui, mais qu&#x2019;est-ce que c&#x2019;est que <i>&#xE7;a</i>&#xA0;?&#xA0;&#xBB; Dessinez la structure sur un papier et qualifiez-la par un mot. C&#x2019;est l&#xE0; que vous allez entrer dans le d&#xE9;tail et t&#xE2;cher de donner du corps &#xE0; cette id&#xE9;e. C&#x2019;est ce qui d&#xE9;finit la structure de votre contenu. Et ce n&#x2019;est pas termin&#xE9;.</li><li> <strong>Pr&#xE9;voir.</strong> Utilisez un tableau de contenu. En gros, c&#x2019;est comme un tableur pour vos contenus. Remplissez-le, je vous conseille <a href="http://24ways.org/2011/extracting-the-content" class="spip_out">celui</a> de <a href="http://supernicestudio.com/" class="spip_out">Relly</a>, il est excellent. Cet outil peut vraiment aider vos clients plus tard quand arrive l&#x2019;&#xE9;tape &#xAB;&#xA0;Oh mon dieu, j&#x2019;ai tellement de contenu &#xE0; &#xE9;crire et je ne sais pas par o&#xF9; commencer&#xA0;&#xBB;. Cela permet de se concentrer sur ce qui compte.</li></ol><p>Arr&#xEA;tons de cloisonner le contenu. Nous avons d&#xE9;j&#xE0; fait cette erreur &#xE0; l&#x2019;&#xE9;poque o&#xF9; le web imitait les brochures imprim&#xE9;es&#xA0;; l&#x2019;approche &#xAB;&#xA0;Contenu en premier&#xA0;&#xBB; ne fait que d&#xE9;placer le probl&#xE8;me &#xE0; l&#x2019;autre bout du processus. Concentrons-nous donc sur la structure pour commencer, mais en gardant le contenu &#xE0; l&#x2019;esprit tout du long. La relation contenu-mise en forme est quasi symbiotique&#xA0;: ni l&#x2019;un ni l&#x2019;autre ne peut exister isol&#xE9;ment.</p><p>Commen&#xE7;ons par la structure. Et d&#xE9;couvrons de quoi le contenu est fait, plut&#xF4;t que de nous inqui&#xE9;ter de ce qu&#x2019;il est.</p></div><div id="similaires"><p>
Voici la liste des dix articles les plus r&#xE9;cents en rapport avec cet article&#xA0;:</p></div></div>]]></description>
      <link>http://www.pompage.net/traduction/structure-d-abord-le-contenu-suivra</link>
      <guid>http://www.pompage.net/traduction/structure-d-abord-le-contenu-suivra</guid>
      <pubDate>Tue, 08 Jul 2014 10:07:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[D'abord la structure. Le contenu suivra.]]></title>
      <description><![CDATA[<div><div id="article"> <p class="signature">Par <a href="http://markboulton.co.uk/">Mark Boulton</a> </p> <p>Il faut bien commencer quelque part. On ne peut pas partir de rien.</p>
<p>En 2001, j&#x2019;ai commenc&#xE9; &#xE0; travailler pour la <a href="http://www.bbc.co.uk/wales" class="spip_out">BBC</a> &#xE0; Cardiff. Quatre ann&#xE9;es durant j&#x2019;ai travaill&#xE9; aux c&#xF4;t&#xE9;s de journalistes et de chefs de projets sur toutes sortes de sites web et applications, du petit site de contenu de niche sur le surf jusqu&#x2019;&#xE0; la refonte de la page d&#x2019;accueil. Tout ces projets furent abord&#xE9;s selon l&#x2019;approche &quot;Contenu en premier&quot; (mais pas tel que <a href="http://adactio.com/journal/4523/" class="spip_out">d&#xE9;fini par Jeremy Keith</a>), mais nous n&#x2019;avons jamais eu le contenu en premier.</p>
<p>J&#x2019;ai travaill&#xE9; avec de nombreux m&#xE9;dias ces dix derni&#xE8;res ann&#xE9;es. J&#x2019;ai beaucoup appris sur de nombreux processus &#xE9;ditoriaux &#xE0; travers trois m&#xE9;dias&#xA0;: la t&#xE9;l&#xE9;vision, les journaux, et le web (et m&#xEA;me un petit peu de radio). Je me r&#xE9;jouis des points communs entre eux et me tords de douleur en constatant les diff&#xE9;rentes mani&#xE8;res de faire pour chacun d&#x2019;eux, tant dans les organisations elles-m&#xEA;mes que dans ce qu&#x2019;elles produisent. Certaines choses ont &#xE9;t&#xE9; directement transpos&#xE9;es sur le web avec succ&#xE8;s&#xA0;; d&#x2019;autres ont &#xE9;t&#xE9; des &#xE9;checs. Comme de fabriquer des sites web en singeant les CD-Roms, par exemple. Vous vous souvenez de cette &#xE9;poque&#xA0;?</p>
<p>Le mod&#xE8;le que nous avons emprunt&#xE9; &#xE0; l&#x2019;impression papier pour l&#x2019;appliquer aux premiers temps du Web &#x2014; le mod&#xE8;le de page et le syst&#xE8;me de publication &#x2014; est maintenant en danger. Il est menac&#xE9; par le postulat qu&#x2019;il faudrait avoir connaissance du contenu avant de lancer la conception. Quiconque a d&#xE9;j&#xE0; travaill&#xE9; dans l&#x2019;&#xE9;dition, cr&#xE9;&#xE9; un concept de marque &#xE0; grande &#xE9;chelle ou un syst&#xE8;me d&#x2019;orientation sait parfaitement que c&#x2019;est un non-sens. Nous n&#x2019;avons pas besoin de donner la priorit&#xE9; au contenu, mais &#xE0; la structure. Le contenu quand &#xE0; lui est toujours essentiel.</p>
<p>Soyons clair &#xE0; ce propos. Il est illusoire de vouloir &#xE9;crire votre contenu &#x2014; ou de demander &#xE0; votre client de l&#x2019;&#xE9;crire &#x2014; avant de concevoir la structure. Du moins en g&#xE9;n&#xE9;ral. Le contenu a besoin d&#x2019;&#xEA;tre structur&#xE9; et la structure modifie votre contenu, tout comme concevoir modifie le contenu. Ce n&#x2019;est donc pas &#xAB;&#xA0;contenu <i>puis</i> conception&#xA0;&#xBB;, ou &#xAB;&#xA0;contenu <i>ou</i> conception&#xA0;&#xBB;&#xA0;; c&#x2019;est &#xAB;&#xA0;contenu <i>et</i> conception&#xA0;&#xBB;.</p>
<p>Concevoir la maquette d&#x2019;un magazine ou d&#x2019;un journal papier n&#xE9;cessite d&#x2019;imposer des contraintes rigoureuses aux multiples types de contenu. Vous devez d&#xE9;finir, en &#xE9;troite collaboration avec l&#x2019;&#xE9;quipe &#xE9;ditoriale, les cat&#xE9;gories de contenu que vous devrez accommoder. Le gabarit d&#x2019;un article d&#x2019;information, d&#x2019;un &#xE9;ditorial ou d&#x2019;un dossier n&#xE9;cessite un traitement visuel diff&#xE9;rent pour indiquer aux lecteurs que le contenu n&#x2019;est pas de m&#xEA;me type. Les variations de mise en forme doivent &#xEA;tre assez limit&#xE9;es, d&#x2019;ailleurs. Pourquoi&#xA0;? Eh bien, surtout &#xE0; cause du facteur temps. Journaux et magazines subissent d&#x2019;&#xE9;normes contraintes de temps, et le contenu est litt&#xE9;ralement d&#xE9;vers&#xE9; dans un moule pr&#xE9;fabriqu&#xE9;&#xA0;&#x2014; on peut retoucher ou ajuster &#xE0; la marge, mais les maquettes et gabarits ne laissent pratiquement aucune libert&#xE9;. Et ce n&#x2019;est pas une mauvaise pratique, c&#x2019;est ainsi que les contenus vivent et respirent dans un environnement &#xE0; forte cadence &#xE9;ditoriale. La fluidit&#xE9; est privil&#xE9;gi&#xE9;e. Tout cela ne peut pas &#xEA;tre fig&#xE9; en amont. La priorit&#xE9; au contenu ne marcherait pas dans ce cas pr&#xE9;cis.</p>
<h2>Le contenu comme structure</h2>
<p>Nous avons vu r&#xE9;cemment l&#x2019;&#xE9;mergence d&#x2019;un raisonnement fallacieux dans notre domaine. L&#x2019;id&#xE9;e qu&#x2019;il n&#x2019;est pas possible de cr&#xE9;er une conception convenable sans avoir connaissance du contenu. <a href="http://www.markboulton.co.uk/journal/comments/a-richer-canvas" class="spip_out">Je l&#x2019;ai dit moi-m&#xEA;me</a> il y a quelque temps. Mais ce n&#x2019;est qu&#x2019;&#xE0; moiti&#xE9; vrai. Les journaux, les magazines et de nombreux autres p&#xE9;riodiques et publications issus de diff&#xE9;rents m&#xE9;dias d&#xE9;montrent quotidiennement que cette th&#xE9;orie ne tient pas.</p>
<p>Vous pouvez mettre en place une bonne exp&#xE9;rience utilisateur sans avoir connaissance du contenu. Ce que vous ne pouvez pas faire, c&#x2019;est mettre en place une bonne exp&#xE9;rience utilisateur sans conna&#xEE;tre la <i>structure</i> de votre contenu. La question n&#x2019;est pas de savoir ce qu&#x2019;est ce contenu, mais de comment il est constitu&#xE9;. Et c&#x2019;est une diff&#xE9;rence de taille.</p>
<p>Il faut donc commencer par la structure, pas par les mots. Qu&#x2019;est-ce qu&#x2019;un &#xAB;&#xA0;article d&#x2019;opinion&#xA0;&#xBB;&#xA0;? Quels sont les variables &#xE0; prendre en compte&#xA0;? Peut-on m&#xEA;me les d&#xE9;finir&#xA0;? Y aura-t-il des images&#xA0;? Combien&#xA0;? (La r&#xE9;ponse est toujours la m&#xEA;me&#xA0;: &#xAB;&#xA0;Je ne sais pas, &#xE7;a d&#xE9;pend&#xA0;!&#xA0;&#xBB;). Nous pouvons concevoir en privil&#xE9;giant la fluidit&#xE9;, mais cela signifie une perte de contr&#xF4;le. Encore. Comment faire, alors&#xA0;? Comment concevoir en privil&#xE9;giant la fluidit&#xE9;&#xA0;? Eh bien, nous d&#xE9;finissons la structure de notre contenu et les gabarits qu&#x2019;il occupera. Nous d&#xE9;finissons les r&#xE8;gles du syst&#xE8;me pour qu&#x2019;il affiche le contenu de diff&#xE9;rentes mani&#xE8;res (si possible) pour aider le lecteur &#xE0; mieux comprendre le contenu.</p>
<p>Comme le dit <a href="http://spiekermann.com/" class="spip_out">Erik Spiekermann</a>&#xA0;: &#xAB;&#xA0;on donne de la forme au contenu&#xA0;&#xBB;.</p>
<h2>Les concepteurs en tant que directeurs de contenu</h2>
<p>Les designers ont toujours &#xE9;t&#xE9; impliqu&#xE9;s par le contenu. Nous ne nous arr&#xEA;tons pas &#xE0; <a href="http://www.markboulton.co.uk/journal/comments/visual-design-is-not-a-thing" class="spip_out">l&#x2019;aspect visuel</a>. Mais comment le faire comprendre &#xE0; nos clients &#xE0; comprendre lorsque nous disons&#xA0;:</p>
<blockquote>&#xAB;&#xA0;Le contenu d&#x2019;abord&#xA0;!&#xA0;&#xBB;</blockquote>
<p>Ce n&#x2019;est pas pour dire&#xA0;:</p>
<blockquote>&#xAB;&#xA0;Je vais rester assis ici sans bouger jusqu&#x2019;&#xE0; ce que vous me donniez le contenu. Je dis bien le contenu finalis&#xE9;, valid&#xE9;, paraph&#xE9;, sign&#xE9;. Merci, j&#x2019;attends&#xA0;&#xBB;</blockquote>
<p>Non, bien s&#xFB;r. Il faut plut&#xF4;t comprendre&#xA0;:</p>
<blockquote>&#xAB;&#xA0;Nous aimerions bien comprendre le type et la structure des contenus pour ce projet. Ne vous inqui&#xE9;tez pas, vous n&#x2019;&#xEA;tes pas oblig&#xE9; de commencer &#xE0; l&#x2019;&#xE9;crire, aidez-nous seulement &#xE0; comprendre.&#xA0;&#xBB;</blockquote>
<p>Nous pouvons faire cela de nombreuses mani&#xE8;res mais r&#xE9;cemment, j&#x2019;ai remarqu&#xE9; que ces grands principes fonctionnaient bien pour moi&#xA0;:</p>
<ol class="spip"><li> <strong>Parler.</strong> Et utiliser des Post-It. Installez-vous dans une pi&#xE8;ce (ferm&#xE9;e &#xE0; clef de pr&#xE9;f&#xE9;rence) et discutez du site web ou de l&#x2019;application. Pas du contenu pour le moment. Pendant que vous &#xEA;tes en train de parler, &#xE9;crivez les mots qui r&#xE9;sonnent &#xE0; votre oreille. Apr&#xE8;s avoir discut&#xE9;, accrochez ces mots sur un mur et commencez &#xE0; les connecter entre eux. Nos confr&#xE8;res de l&#x2019;exp&#xE9;rience utilisateur ont s&#xFB;rement un nom qui claque pour qualifier cet exercice, mais je ne le connais pas.</li><li> <strong>Accepter le d&#xE9;sordre.</strong> Vous devriez vous retrouver avec tout un tas de mots vaguement reli&#xE9;s entre eux (ce n&#x2019;est toujours pas du contenu) &#xE0; propos de diff&#xE9;rents sujets. Ces sujets sont l&#x2019;ADN de votre site. L&#x2019;attitude, le ton, la marque, le message, ainsi que les points de d&#xE9;tail tels que les diff&#xE9;rents types de contenu, taxonomies, mots-cl&#xE9;s et autres aspects techniques. Maintenant, il faut ordonner tout cela.</li><li> <strong>It&#xE9;rer.</strong> &#xC0; un moment pendant le tri, vous aurez besoin de commencer &#xE0; d&#xE9;gager la structure. L&#xE0; aussi, j&#x2019;ai constat&#xE9; qu&#x2019;effectuer cette &#xE9;tape de mani&#xE8;re it&#xE9;rative et &#xE0; plusieurs est plus fructueux.</li><li> <strong>Structurer.</strong> Vous devriez maintenant avoir un d&#xE9;but de structure. &#xC0; l&#x2019;&#xE9;tape 3, il y a s&#xFB;rement un moment o&#xF9; votre client (ou vous-m&#xEA;me) dira en d&#xE9;signant un terme not&#xE9; sur un Post-it&#xA0;: &#xAB;&#xA0;Oui, mais qu&#x2019;est-ce que c&#x2019;est que <i>&#xE7;a</i>&#xA0;?&#xA0;&#xBB; Dessinez la structure sur un papier et qualifiez-la par un mot. C&#x2019;est l&#xE0; que vous allez entrer dans le d&#xE9;tail et t&#xE2;cher de donner du corps &#xE0; cette id&#xE9;e. C&#x2019;est ce qui d&#xE9;finit la structure de votre contenu. Et ce n&#x2019;est pas termin&#xE9;.</li><li> <strong>Pr&#xE9;voir.</strong> Utilisez un tableau de contenu. En gros, c&#x2019;est comme un tableur pour vos contenus. Remplissez-le, je vous conseille <a href="http://24ways.org/2011/extracting-the-content" class="spip_out">celui</a> de <a href="http://supernicestudio.com/" class="spip_out">Relly</a>, il est excellent. Cet outil peut vraiment aider vos clients plus tard quand arrive l&#x2019;&#xE9;tape &#xAB;&#xA0;Oh mon dieu, j&#x2019;ai tellement de contenu &#xE0; &#xE9;crire et je ne sais pas par o&#xF9; commencer&#xA0;&#xBB;. Cela permet de se concentrer sur ce qui compte.</li></ol>
<p>Arr&#xEA;tons de cloisonner le contenu. Nous avons d&#xE9;j&#xE0; fait cette erreur &#xE0; l&#x2019;&#xE9;poque o&#xF9; le web imitait les brochures imprim&#xE9;es&#xA0;; l&#x2019;approche &#xAB;&#xA0;Contenu en premier&#xA0;&#xBB; ne fait que d&#xE9;placer le probl&#xE8;me &#xE0; l&#x2019;autre bout du processus. Concentrons-nous donc sur la structure pour commencer, mais en gardant le contenu &#xE0; l&#x2019;esprit tout du long. La relation contenu-mise en forme est quasi symbiotique&#xA0;: ni l&#x2019;un ni l&#x2019;autre ne peut exister isol&#xE9;ment.</p>
<p>Commen&#xE7;ons par la structure. Et d&#xE9;couvrons de quoi le contenu est fait, plut&#xF4;t que de nous inqui&#xE9;ter de ce qu&#x2019;il est.</p> </div><div id="similaires"> <p> Voici la liste des dix articles les plus r&#xE9;cents en rapport avec cet article&#xA0;: </p> </div></div>]]></description>
      <link>http://www.pompage.net/traduction/structure-d-abord-le-contenu-suivra</link>
      <guid>http://www.pompage.net/traduction/structure-d-abord-le-contenu-suivra</guid>
      <pubDate>Tue, 08 Jul 2014 10:07:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[D'abord la structure. Le contenu suivra.]]></title>
      <description><![CDATA[<div><div id="article"> <p class="signature">Par <a href="http://markboulton.co.uk/">Mark Boulton</a> </p> <p>Il faut bien commencer quelque part. On ne peut pas partir de rien.</p>
<p>En 2001, j&#x2019;ai commenc&#xE9; &#xE0; travailler pour la <a href="http://www.bbc.co.uk/wales" class="spip_out">BBC</a> &#xE0; Cardiff. Quatre ann&#xE9;es durant j&#x2019;ai travaill&#xE9; aux c&#xF4;t&#xE9;s de journalistes et de chefs de projets sur toutes sortes de sites web et applications, du petit site de contenu de niche sur le surf jusqu&#x2019;&#xE0; la refonte de la page d&#x2019;accueil. Tout ces projets furent abord&#xE9;s selon l&#x2019;approche &quot;Contenu en premier&quot; (mais pas tel que <a href="http://adactio.com/journal/4523/" class="spip_out">d&#xE9;fini par Jeremy Keith</a>), mais nous n&#x2019;avons jamais eu le contenu en premier.</p>
<p>J&#x2019;ai travaill&#xE9; avec de nombreux m&#xE9;dias ces dix derni&#xE8;res ann&#xE9;es. J&#x2019;ai beaucoup appris sur de nombreux processus &#xE9;ditoriaux &#xE0; travers trois m&#xE9;dias&#xA0;: la t&#xE9;l&#xE9;vision, les journaux, et le web (et m&#xEA;me un petit peu de radio). Je me r&#xE9;jouis des points communs entre eux et me tords de douleur en constatant les diff&#xE9;rentes mani&#xE8;res de faire pour chacun d&#x2019;eux, tant dans les organisations elles-m&#xEA;mes que dans ce qu&#x2019;elles produisent. Certaines choses ont &#xE9;t&#xE9; directement transpos&#xE9;es sur le web avec succ&#xE8;s&#xA0;; d&#x2019;autres ont &#xE9;t&#xE9; des &#xE9;checs. Comme de fabriquer des sites web en singeant les CD-Roms, par exemple. Vous vous souvenez de cette &#xE9;poque&#xA0;?</p>
<p>Le mod&#xE8;le que nous avons emprunt&#xE9; &#xE0; l&#x2019;impression papier pour l&#x2019;appliquer aux premiers temps du Web &#x2014; le mod&#xE8;le de page et le syst&#xE8;me de publication &#x2014; est maintenant en danger. Il est menac&#xE9; par le postulat qu&#x2019;il faudrait avoir connaissance du contenu avant de lancer la conception. Quiconque a d&#xE9;j&#xE0; travaill&#xE9; dans l&#x2019;&#xE9;dition, cr&#xE9;&#xE9; un concept de marque &#xE0; grande &#xE9;chelle ou un syst&#xE8;me d&#x2019;orientation sait parfaitement que c&#x2019;est un non-sens. Nous n&#x2019;avons pas besoin de donner la priorit&#xE9; au contenu, mais &#xE0; la structure. Le contenu quand &#xE0; lui est toujours essentiel.</p>
<p>Soyons clair &#xE0; ce propos. Il est illusoire de vouloir &#xE9;crire votre contenu &#x2014; ou de demander &#xE0; votre client de l&#x2019;&#xE9;crire &#x2014; avant de concevoir la structure. Du moins en g&#xE9;n&#xE9;ral. Le contenu a besoin d&#x2019;&#xEA;tre structur&#xE9; et la structure modifie votre contenu, tout comme concevoir modifie le contenu. Ce n&#x2019;est donc pas &#xAB;&#xA0;contenu <i>puis</i> conception&#xA0;&#xBB;, ou &#xAB;&#xA0;contenu <i>ou</i> conception&#xA0;&#xBB;&#xA0;; c&#x2019;est &#xAB;&#xA0;contenu <i>et</i> conception&#xA0;&#xBB;.</p>
<p>Concevoir la maquette d&#x2019;un magazine ou d&#x2019;un journal papier n&#xE9;cessite d&#x2019;imposer des contraintes rigoureuses aux multiples types de contenu. Vous devez d&#xE9;finir, en &#xE9;troite collaboration avec l&#x2019;&#xE9;quipe &#xE9;ditoriale, les cat&#xE9;gories de contenu que vous devrez accommoder. Le gabarit d&#x2019;un article d&#x2019;information, d&#x2019;un &#xE9;ditorial ou d&#x2019;un dossier n&#xE9;cessite un traitement visuel diff&#xE9;rent pour indiquer aux lecteurs que le contenu n&#x2019;est pas de m&#xEA;me type. Les variations de mise en forme doivent &#xEA;tre assez limit&#xE9;es, d&#x2019;ailleurs. Pourquoi&#xA0;? Eh bien, surtout &#xE0; cause du facteur temps. Journaux et magazines subissent d&#x2019;&#xE9;normes contraintes de temps, et le contenu est litt&#xE9;ralement d&#xE9;vers&#xE9; dans un moule pr&#xE9;fabriqu&#xE9;&#xA0;&#x2014; on peut retoucher ou ajuster &#xE0; la marge, mais les maquettes et gabarits ne laissent pratiquement aucune libert&#xE9;. Et ce n&#x2019;est pas une mauvaise pratique, c&#x2019;est ainsi que les contenus vivent et respirent dans un environnement &#xE0; forte cadence &#xE9;ditoriale. La fluidit&#xE9; est privil&#xE9;gi&#xE9;e. Tout cela ne peut pas &#xEA;tre fig&#xE9; en amont. La priorit&#xE9; au contenu ne marcherait pas dans ce cas pr&#xE9;cis.</p>
<h2>Le contenu comme structure</h2>
<p>Nous avons vu r&#xE9;cemment l&#x2019;&#xE9;mergence d&#x2019;un raisonnement fallacieux dans notre domaine. L&#x2019;id&#xE9;e qu&#x2019;il n&#x2019;est pas possible de cr&#xE9;er une conception convenable sans avoir connaissance du contenu. <a href="http://www.markboulton.co.uk/journal/comments/a-richer-canvas" class="spip_out">Je l&#x2019;ai dit moi-m&#xEA;me</a> il y a quelque temps. Mais ce n&#x2019;est qu&#x2019;&#xE0; moiti&#xE9; vrai. Les journaux, les magazines et de nombreux autres p&#xE9;riodiques et publications issus de diff&#xE9;rents m&#xE9;dias d&#xE9;montrent quotidiennement que cette th&#xE9;orie ne tient pas.</p>
<p>Vous pouvez mettre en place une bonne exp&#xE9;rience utilisateur sans avoir connaissance du contenu. Ce que vous ne pouvez pas faire, c&#x2019;est mettre en place une bonne exp&#xE9;rience utilisateur sans conna&#xEE;tre la <i>structure</i> de votre contenu. La question n&#x2019;est pas de savoir ce qu&#x2019;est ce contenu, mais de comment il est constitu&#xE9;. Et c&#x2019;est une diff&#xE9;rence de taille.</p>
<p>Il faut donc commencer par la structure, pas par les mots. Qu&#x2019;est-ce qu&#x2019;un &#xAB;&#xA0;article d&#x2019;opinion&#xA0;&#xBB;&#xA0;? Quels sont les variables &#xE0; prendre en compte&#xA0;? Peut-on m&#xEA;me les d&#xE9;finir&#xA0;? Y aura-t-il des images&#xA0;? Combien&#xA0;? (La r&#xE9;ponse est toujours la m&#xEA;me&#xA0;: &#xAB;&#xA0;Je ne sais pas, &#xE7;a d&#xE9;pend&#xA0;!&#xA0;&#xBB;). Nous pouvons concevoir en privil&#xE9;giant la fluidit&#xE9;, mais cela signifie une perte de contr&#xF4;le. Encore. Comment faire, alors&#xA0;? Comment concevoir en privil&#xE9;giant la fluidit&#xE9;&#xA0;? Eh bien, nous d&#xE9;finissons la structure de notre contenu et les gabarits qu&#x2019;il occupera. Nous d&#xE9;finissons les r&#xE8;gles du syst&#xE8;me pour qu&#x2019;il affiche le contenu de diff&#xE9;rentes mani&#xE8;res (si possible) pour aider le lecteur &#xE0; mieux comprendre le contenu.</p>
<p>Comme le dit <a href="http://spiekermann.com/" class="spip_out">Erik Spiekermann</a>&#xA0;: &#xAB;&#xA0;on donne de la forme au contenu&#xA0;&#xBB;.</p>
<h2>Les concepteurs en tant que directeurs de contenu</h2>
<p>Les designers ont toujours &#xE9;t&#xE9; impliqu&#xE9;s par le contenu. Nous ne nous arr&#xEA;tons pas &#xE0; <a href="http://www.markboulton.co.uk/journal/comments/visual-design-is-not-a-thing" class="spip_out">l&#x2019;aspect visuel</a>. Mais comment le faire comprendre &#xE0; nos clients &#xE0; comprendre lorsque nous disons&#xA0;:</p>
<blockquote>&#xAB;&#xA0;Le contenu d&#x2019;abord&#xA0;!&#xA0;&#xBB;</blockquote>
<p>Ce n&#x2019;est pas pour dire&#xA0;:</p>
<blockquote>&#xAB;&#xA0;Je vais rester assis ici sans bouger jusqu&#x2019;&#xE0; ce que vous me donniez le contenu. Je dis bien le contenu finalis&#xE9;, valid&#xE9;, paraph&#xE9;, sign&#xE9;. Merci, j&#x2019;attends&#xA0;&#xBB;</blockquote>
<p>Non, bien s&#xFB;r. Il faut plut&#xF4;t comprendre&#xA0;:</p>
<blockquote>&#xAB;&#xA0;Nous aimerions bien comprendre le type et la structure des contenus pour ce projet. Ne vous inqui&#xE9;tez pas, vous n&#x2019;&#xEA;tes pas oblig&#xE9; de commencer &#xE0; l&#x2019;&#xE9;crire, aidez-nous seulement &#xE0; comprendre.&#xA0;&#xBB;</blockquote>
<p>Nous pouvons faire cela de nombreuses mani&#xE8;res mais r&#xE9;cemment, j&#x2019;ai remarqu&#xE9; que ces grands principes fonctionnaient bien pour moi&#xA0;:</p>
<ol class="spip"><li> <strong>Parler.</strong> Et utiliser des Post-It. Installez-vous dans une pi&#xE8;ce (ferm&#xE9;e &#xE0; clef de pr&#xE9;f&#xE9;rence) et discutez du site web ou de l&#x2019;application. Pas du contenu pour le moment. Pendant que vous &#xEA;tes en train de parler, &#xE9;crivez les mots qui r&#xE9;sonnent &#xE0; votre oreille. Apr&#xE8;s avoir discut&#xE9;, accrochez ces mots sur un mur et commencez &#xE0; les connecter entre eux. Nos confr&#xE8;res de l&#x2019;exp&#xE9;rience utilisateur ont s&#xFB;rement un nom qui claque pour qualifier cet exercice, mais je ne le connais pas.</li><li> <strong>Accepter le d&#xE9;sordre.</strong> Vous devriez vous retrouver avec tout un tas de mots vaguement reli&#xE9;s entre eux (ce n&#x2019;est toujours pas du contenu) &#xE0; propos de diff&#xE9;rents sujets. Ces sujets sont l&#x2019;ADN de votre site. L&#x2019;attitude, le ton, la marque, le message, ainsi que les points de d&#xE9;tail tels que les diff&#xE9;rents types de contenu, taxonomies, mots-cl&#xE9;s et autres aspects techniques. Maintenant, il faut ordonner tout cela.</li><li> <strong>It&#xE9;rer.</strong> &#xC0; un moment pendant le tri, vous aurez besoin de commencer &#xE0; d&#xE9;gager la structure. L&#xE0; aussi, j&#x2019;ai constat&#xE9; qu&#x2019;effectuer cette &#xE9;tape de mani&#xE8;re it&#xE9;rative et &#xE0; plusieurs est plus fructueux.</li><li> <strong>Structurer.</strong> Vous devriez maintenant avoir un d&#xE9;but de structure. &#xC0; l&#x2019;&#xE9;tape 3, il y a s&#xFB;rement un moment o&#xF9; votre client (ou vous-m&#xEA;me) dira en d&#xE9;signant un terme not&#xE9; sur un Post-it&#xA0;: &#xAB;&#xA0;Oui, mais qu&#x2019;est-ce que c&#x2019;est que <i>&#xE7;a</i>&#xA0;?&#xA0;&#xBB; Dessinez la structure sur un papier et qualifiez-la par un mot. C&#x2019;est l&#xE0; que vous allez entrer dans le d&#xE9;tail et t&#xE2;cher de donner du corps &#xE0; cette id&#xE9;e. C&#x2019;est ce qui d&#xE9;finit la structure de votre contenu. Et ce n&#x2019;est pas termin&#xE9;.</li><li> <strong>Pr&#xE9;voir.</strong> Utilisez un tableau de contenu. En gros, c&#x2019;est comme un tableur pour vos contenus. Remplissez-le, je vous conseille <a href="http://24ways.org/2011/extracting-the-content" class="spip_out">celui</a> de <a href="http://supernicestudio.com/" class="spip_out">Relly</a>, il est excellent. Cet outil peut vraiment aider vos clients plus tard quand arrive l&#x2019;&#xE9;tape &#xAB;&#xA0;Oh mon dieu, j&#x2019;ai tellement de contenu &#xE0; &#xE9;crire et je ne sais pas par o&#xF9; commencer&#xA0;&#xBB;. Cela permet de se concentrer sur ce qui compte.</li></ol>
<p>Arr&#xEA;tons de cloisonner le contenu. Nous avons d&#xE9;j&#xE0; fait cette erreur &#xE0; l&#x2019;&#xE9;poque o&#xF9; le web imitait les brochures imprim&#xE9;es&#xA0;; l&#x2019;approche &#xAB;&#xA0;Contenu en premier&#xA0;&#xBB; ne fait que d&#xE9;placer le probl&#xE8;me &#xE0; l&#x2019;autre bout du processus. Concentrons-nous donc sur la structure pour commencer, mais en gardant le contenu &#xE0; l&#x2019;esprit tout du long. La relation contenu-mise en forme est quasi symbiotique&#xA0;: ni l&#x2019;un ni l&#x2019;autre ne peut exister isol&#xE9;ment.</p>
<p>Commen&#xE7;ons par la structure. Et d&#xE9;couvrons de quoi le contenu est fait, plut&#xF4;t que de nous inqui&#xE9;ter de ce qu&#x2019;il est.</p> </div><div id="similaires"> <p> Voici la liste des dix articles les plus r&#xE9;cents en rapport avec cet article&#xA0;: </p> </div></div>]]></description>
      <link>https://www.pompage.net/traduction/structure-d-abord-le-contenu-suivra</link>
      <guid>https://www.pompage.net/traduction/structure-d-abord-le-contenu-suivra</guid>
      <pubDate>Tue, 08 Jul 2014 10:07:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Principes à connaître pour améliorer vos feuilles de styles]]></title>
      <description><![CDATA[<div id="article"><p class="signature">Par
<a href="http://hugogiraudel.com/">Hugo Giraudel</a></p><p class="moreInfo">
Cet article passe en revue quelques principes de base et astuces tir&#xE9;s de mon exp&#xE9;rience personnelle pour apprendre &#xE0; devenir meilleur en <abbr>CSS</abbr>. Dans cet article, je vais parler avant tout de ma propre exp&#xE9;rience et de ce que j&#x2019;ai appris sur <abbr>CSS</abbr> pendant pr&#xE8;s d&#x2019;un an et demi de pratique intensive.</p><p>Tout d&#x2019;abord, laissez-moi vous rappeler que <abbr>CSS</abbr> est un langage extr&#xEA;mement simple. Il peut se r&#xE9;sumer en 3 mots&#xA0;: s&#xE9;lecteur, propri&#xE9;t&#xE9;, valeur. Et c&#x2019;est &#xE0; peu pr&#xE8;s tout. C&#x2019;est pourquoi certaines personnes n&#x2019;aiment pas du tout <abbr>CSS</abbr> car elles ont l&#x2019;impression d&#x2019;&#xEA;tre comme des enfants qui jouent aux Legos.</p><p>En effet, il suffit d&#x2019;expliquer les bases de <abbr>CSS</abbr> &#xE0; un enfant de 9 ans pour qu&#x2019;il ou elle soit en mesure de cr&#xE9;er un site web. Pas un site compliqu&#xE9; bien entendu, mais peut-&#xEA;tre quelques pages avec des titres, des liens, du contenu, des images, quelque chose dans ce go&#xFB;t-l&#xE0;.</p><p>Toutefois, le fait que <abbr>CSS</abbr> soit un langage simple ne veut pas dire que tout le monde soit au m&#xEA;me niveau. Certaines personnes utilisent <abbr>CSS</abbr> comme un chimpanz&#xE9; se sert d&#x2019;une fourchette, certaines personnes se d&#xE9;brouillent pas mal avec et d&#x2019;autres peuvent faire des choses formidables.</p><p>De ce que je peux en dire, je m&#x2019;amuse avec <abbr>CSS</abbr> depuis pr&#xE8;s de deux ans maintenant et je pratique &#xE0; un niveau disons &#xAB;&#xA0;intensif&#xA0;&#xBB; depuis pr&#xE8;s de sept mois. Je suis encore loin de la perfection et il y a toujours des astuces que je ne connais pas ou que je ne comprends pas.</p><p>Quoi qu&#x2019;il en soit, voici quelques trucs que j&#x2019;ai compris au cours des mois &#xE9;coul&#xE9;s et que j&#x2019;aimerais partager avec vous. Encore une fois ce ne sont pas des bouts de code ou des astuces utiles, ce sont plut&#xF4;t des principes g&#xE9;n&#xE9;raux et des bonnes pratiques. Voici ce que je vais aborder&#xA0;:</p><ol class="spip"><li> Ne pas se ruer sur le code et faire simple</li><li> Apprendre les bases et quelques astuces</li><li> Ne pas se r&#xE9;p&#xE9;ter</li><li> <abbr>CSS</abbr> orient&#xE9; objet</li><li> <abbr>CSS</abbr>3&#xA0;: apprendre ce que l&#x2019;on peut faire et ce que l&#x2019;on peut utiliser</li><li> Am&#xE9;lioration progressive et d&#xE9;gradation &#xE9;l&#xE9;gante</li><li> Les pr&#xE9;processeurs <abbr>CSS</abbr></li><li> Garder un &#x153;il sur l&#x2019;avenir</li><li> Lire le code des autres</li><li> Pratiquer sans rel&#xE2;che</li></ol><p>Qu&#x2019;en dites-vous&#xA0;? Vous &#xEA;tes pr&#xEA;ts&#xA0;? Allez, c&#x2019;est parti.</p><h2>1. Ne vous ruez pas sur le code et faites au plus simple</h2><h3>Ne vous ruez pas sur le code</h3><p>C&#x2019;est plut&#xF4;t un conseil g&#xE9;n&#xE9;ral, qui n&#x2019;est pas sp&#xE9;cifique &#xE0; <abbr>CSS</abbr>. Quand vous &#xEA;tes sur le point de commencer &#xE0; d&#xE9;velopper,<strong> r&#xE9;fl&#xE9;chissez d&#x2019;abord &#xE0; ce que vous allez faire</strong>. Posez-vous quelques questions&#xA0;:</p><ul class="spip"><li> Comment vais-je faire &#xE7;a&#xA0;?</li><li> Y a-t-il une autre mani&#xE8;re de faire&#xA0;?</li><li> Comment puis-je l&#x2019;optimiser (pour que ce soit maintenable, propre, cool, etc.)&#xA0;?</li></ul><p>Commencer &#xE0; coder sans r&#xE9;fl&#xE9;chir peut vous faire perdre du temps. Imaginez-vous passer une heure &#xE0; cr&#xE9;er quelque chose pour vous apercevoir que c&#x2019;est sans issue et que vous devez tout recommencer depuis le d&#xE9;but&#xA0;? C&#x2019;est hors de question.</p><p>Passer des heures sur un diaporama en <abbr>CSS</abbr> pour finir avec SlidesJS ou Adaptor, c&#x2019;est vraiment nul. Non pas parce que vous avez &#xE9;chou&#xE9;, mais parce que c&#x2019;&#xE9;tait une perte de temps. Vous pourriez le payer tr&#xE8;s cher, le jour o&#xF9; vous serez soumis &#xE0; des d&#xE9;lais tr&#xE8;s serr&#xE9;s.</p><h3>Faites simple</h3><p><abbr>CSS</abbr> est un langage simple mais les choses peuvent facilement devenir complexes. Surtout si vous voulez qu&#x2019;elles le deviennent. <strong>Dans la plupart des cas, l&#x2019;id&#xE9;e la plus simple est souvent la meilleure</strong>. Quand vous devez r&#xE9;aliser quelque chose, demandez-vous toujours s&#x2019;il n&#x2019;y a pas un moyen plus simple de le faire. Vous seriez surpris du nombre de fois o&#xF9; la r&#xE9;ponse est &#xAB;&#xA0;oui&#xA0;&#xBB;.</p><p>Par exemple, si vous voulez coder une barre de navigation horizontale vraiment simple qui ne comporte que des liens, vous avez plusieurs fa&#xE7;ons de faire&#xA0;:</p><ul class="spip"><li> Faire flotter les &#xE9;l&#xE9;ments de la liste</li><li> Passer les &#xE9;l&#xE9;ments de la liste en ligne</li><li> Passer les &#xE9;l&#xE9;ments de la liste en blocs en ligne (<code>inline-block</code>)</li></ul><p>Choisissez le plus simple et transformez les &#xE9;l&#xE9;ments de liste en &#xE9;l&#xE9;ments en ligne. Pas besoin de <i>hack</i> pour nettoyer les flottants. Pas besoin de corriger l&#x2019;espacement des &#xE9;l&#xE9;ments en ligne. Il y a juste besoin d&#x2019;un espacement interne classique, rien de plus. Fin de chantier.</p><h2>2. Conna&#xEE;tre les bases et apprendre les astuces</h2><p>Pour devenir bon en <abbr>CSS</abbr> ou quoi que ce soit d&#x2019;autre dans la vie, vous devez conna&#xEE;tre les bases. Vous ne deviendrez jamais un expert si vous n&#x2019;&#xEA;tes pas &#xE0; l&#x2019;aise avec les bases de la discipline.</p><h3>Les bases de <abbr>CSS</abbr></h3><p>Quelles sont les bases de <abbr>CSS</abbr>&#xA0;? Selon les personnes, vous aurez droit &#xE0; diff&#xE9;rentes versions, c&#x2019;est plus de l&#x2019;ordre du ressenti, mais si vous voulez mon avis, il y a deux choses &#xE0; comprendre avant tout pour vraiment se familiariser avec <abbr>CSS</abbr>&#xA0;:</p><ul class="spip"><li> <strong>Le mod&#xE8;le de bo&#xEE;te</strong>. Chaque &#xE9;l&#xE9;ment en <abbr>CSS</abbr> est une bo&#xEE;te (de type bloc ou en ligne) avec une largeur, une hauteur, et &#xE9;ventuellement des espacements, des marges et des bordures. C&#x2019;est la chose la plus importante &#xE0; savoir. Vous en saurez davantage <a href="http://www.w3.org/TR/CSS2/box.html" class="spip_out">ici</a>.</li><li> <strong>La sp&#xE9;cificit&#xE9;</strong>. Pour pouvoir corriger vos <abbr>CSS</abbr>, il est essentiel de savoir quelle r&#xE8;gle est plus forte que quelle autre. Pour plus d&#x2019;informations sur le sujet, lisez les sp&#xE9;cifications&#xA0;: <a href="http://www.w3.org/TR/CSS2/cascade.html" class="spip_out">L&#x2019;assignation des valeurs des propri&#xE9;t&#xE9;s, la cascade et l&#x2019;h&#xE9;ritage</a>.</li></ul><h3>Les astuces</h3><p>Une fois que vous avez compris &#xE7;a, vous &#xEA;tes sur la bonne voie. &#xC0; partir de l&#xE0;, vous n&#x2019;aurez qu&#x2019;&#xE0; apprendre quelques astuces pour vous d&#xE9;brouiller avec les cas sp&#xE9;cifiques. Et vous n&#x2019;avez pas fini d&#x2019;en croiser. Laissez-moi vous en montrer quelques-unes.</p><p><i>Le coup du &#xAB;&#xA0;j&#x2019;ai oubli&#xE9; de positionner l&#x2019;&#xE9;l&#xE9;ment parent&#xA0;&#xBB;</i></p><pre><code>.enfant { position: absolute; top: 0; left: 0;
} /* Ceci a &#xE9;t&#xE9; oubli&#xE9; */
/*
.parent { position: relative; // Ou n&#x2019;importe quelle autre valeur que static.
}
*/</code></pre><p>Et c&#x2019;est l&#xE0; que vous vous dites&#xA0;: &#xAB;&#xA0;Hein&#xA0;?! Mais pourquoi est-ce que mon &#xE9;l&#xE9;ment est en haut &#xE0; gauche de la page&#xA0;?&#xA0;&#xBB; Eh oui&#xA0;: vous avez oubli&#xE9; de d&#xE9;finir la position de l&#x2019;&#xE9;l&#xE9;ment parent (<code>relative</code>, <code>absolute</code>, tout ce que vous voulez sauf <code>static</code>).</p><p><i>Le coup du &#xAB;&#xA0;contexte d&#x2019;imbrication&#xA0;&#xBB;</i></p><pre><code>.parent { z-index: 1; opacity: 0.5; transform: rotate(5deg);
} .enfant { z-index: -1;
}</code></pre><p>Tous les d&#xE9;veloppeurs au monde ont bataill&#xE9; au moins une fois sur le sujet de l&#x2019;imbrication de bo&#xEE;tes. En r&#xE9;sum&#xE9;, il est tout simplement impossible d&#x2019;appliquer un <code>z-index</code> &#xE0; un enfant d&#x2019;un &#xE9;l&#xE9;ment (ou d&#x2019;un pseudo-&#xE9;l&#xE9;ment) qui poss&#xE8;de d&#xE9;j&#xE0; un contexte d&#x2019;imbrication (d&#xE9;clench&#xE9; soit par <code>z-index</code>, opacity ou transform)&#xA0;; il n&#x2019;y a pas d&#x2019;autres possibilit&#xE9;s. Une fois que vous ma&#xEE;trisez &#xE7;a, impossible de l&#x2019;oublier, promis.</p><p><abbr>NB</abbr>&#xA0;: pour plus d&#x2019;information &#xE0; propos de <code>z-index</code> et de l&#x2019;imbrication <abbr>CSS</abbr>, je vous recommande<a href="http://www.vanseodesign.com/css/css-stack-z-index/" class="spip_out">ce superbe billet</a> de Steven Bradley.</p><p><i>Le coup du &#xAB;&#xA0;J&#x2019;ai oubli&#xE9; d&#x2019;effacer le flottant&#xA0;&#xBB;</i><br class="autobr">
Votre mise en page devient folle. Les blocs se baladent n&#x2019;importe o&#xF9;. Vous pleurez sans comprendre les raisons de cet affichage &#xE9;trange. Alors v&#xE9;rifiez vos flottants&#xA0;! Dans la plupart des cas, c&#x2019;est que vous avez oubli&#xE9; de les r&#xE9;initialiser.</p><p>Note&#xA0;: dans le cas o&#xF9; un parent contient uniquement des &#xE9;l&#xE9;ments flottants, il va se r&#xE9;duire &#xE0; moins que vous n&#x2019;annulez les flottants, ou alors que vous d&#xE9;finissiez une hauteur ou un <code>overflow</code> (<abbr>NdT</abbr>&#xA0;: propri&#xE9;t&#xE9; d&#xE9;finissant les d&#xE9;passements de blocs ou comment le contenu est rogn&#xE9;&#xA0;: si le contenu d&#xE9;passe les dimensions d&#x2019;un bloc, <code>overflow</code> permet de cacher le contenu, d&#x2019;afficher une barre de d&#xE9;filement ou pas).</p><p>Je pourrais continuer pendant des heures sur ces sujets, mais ce n&#x2019;est pas le but de cet article. Je dirais que <strong><abbr>CSS</abbr> pr&#xE9;sente un grand nombre de cas particuliers</strong> et on en d&#xE9;couvre encore chaque jour. Tant que vous ne vous serez pas cass&#xE9; les dents dessus, vous ne saurez pas qu&#x2019;ils existent&#xA0;; mais ensuite, vous saurez comment les traiter.</p><h2>3. DRY</h2><p>DRY est l&#x2019;acronyme de Don&#x2019;t Repeat Yourself (<i>Ne pas se r&#xE9;p&#xE9;ter</i>, <abbr>NdT</abbr>), et encore une fois ce n&#x2019;est pas sp&#xE9;cifique &#xE0; <abbr>CSS</abbr>. Il s&#x2019;agit plut&#xF4;t d&#x2019;une pratique r&#xE9;pandue lorsque vous codez, quel que soit le langage avec lequel vous avez &#xE0; composer.</p><p>Ainsi, l&#x2019;id&#xE9;e principale est d&#x2019;&#xE9;viter de r&#xE9;p&#xE9;ter les m&#xEA;mes bouts de code X fois alors qu&#x2019;une seule fois pourrait suffire. Dans certains langages, cela peut &#xE9;voquer l&#x2019;utilisation d&#x2019;une fonction, mais en <abbr>CSS</abbr>, cela signifie utiliser une classe plut&#xF4;t que cibler un &#xE9;l&#xE9;ment sp&#xE9;cifique (voir plus loin la section concernant OOCSS). Pourtant, parfois il existe une chose vraiment simple comme la mutualisation de son code (<i>refactoring</i>). Laissez-moi vous expliquer.</p><p>Si vous &#xEA;tes en pr&#xE9;sence d&#x2019;un bout de code qui est pr&#xE9;sent plusieurs fois dans votre feuille de style, il pourrait &#xEA;tre int&#xE9;ressant de le mutualiser (refactoriser) afin de n&#x2019;avoir plus qu&#x2019;une seule occurrence. Lisez ce qui suit&#xA0;:</p><pre><code>.navigation li { color: #333;
} .navigation li a { color: #333;
} /* Mutualis&#xE9; */ .navigation li,
.navigation li a { color: #333;
}</code></pre><p>Vous voyez&#xA0;? Vous vous demandez peut-&#xEA;tre quel est l&#x2019;int&#xE9;r&#xEA;t, puisque le r&#xE9;sultat est le m&#xEA;me. Il y a deux choses &#xE0; prendre en compte&#xA0;: <strong>la performance et la facilit&#xE9; de maintenance</strong>.</p><p>&#xC0; propos de la performance&#xA0;: moins de lignes de code signifie un parcours plus rapide de la <abbr>CSS</abbr> par le navigateur. Pour faire simple, le navigateur va appliquer la couleur aux deux r&#xE8;gles &#xE0; la fois au lieu de le faire deux fois.</p><p>&#xC0; propos de la maintenance, je pense que cela parle de soi-m&#xEA;me. En proc&#xE9;dant de la sorte, vous avez seulement une ligne &#xE0; changer alors qu&#x2019;avant vous deviez en changer deux pour modifier la couleur. Qu&#x2019;en est-il quand vous avez 50 fois ou 300 fois le m&#xEA;me code&#xA0;?</p><h4>Plus d&#x2019;informations sur DRY CSS</h4><h2>4. OOCSS</h2><h3>C&#x2019;est quoi ce truc&#xA0;?</h3><p>OOCSS est l&#x2019;acronyme d&#x2019;Object-Oriented CSS (<abbr>CSS</abbr> Orient&#xE9; Objet, <abbr>NdT</abbr>) . Vous avez probablement entendu parler de la programmation orient&#xE9;e objet. Il s&#x2019;agit tout bonnement d&#x2019;utiliser des &#xAB;&#xA0;objets&#xA0;&#xBB;, g&#xE9;n&#xE9;ralement des instances de classes (qui se composent d&#x2019;attributs et de m&#xE9;thodes). J&#x2019;imagine que vous vous demandez quel peut &#xEA;tre le rapport avec <abbr>CSS</abbr>&#xA0;?</p><p>Premi&#xE8;rement, disons que c&#x2019;est plus un concept ou une bonne pratique qu&#x2019;un vrai principe. <abbr>CSS</abbr> ne peut pas vraiment &#xEA;tre orient&#xE9; objet sachant que ce n&#x2019;est pas un langage de programmation&#xA0;: pas d&#x2019;espace de nommage, pas de fonctions, pas de m&#xE9;thodes, pas de classes de programmation, aucune des instructions conditionnelles, etc. C&#x2019;est pourquoi certaines personnes ricaneront quand vous parlerez d&#x2019;OOCSS.</p><p>M&#xEA;me si je suis d&#x2019;accord avec cela, malgr&#xE9; tout nous pouvons encore optimiser notre fa&#xE7;on de coder les <abbr>CSS</abbr> pour faciliter le processus, rendre les sites Web plus rapides et am&#xE9;liorer la maintenabilit&#xE9;.</p><h3>Comment faire&#xA0;?</h3><p>Pour le dire simplement, cela signifie utiliser des classes. Un grand nombre de classes. Pensez &#xE0; votre site comme s&#x2019;il poss&#xE9;dait des &#xAB;&#xA0;modules&#xA0;&#xBB; ou des &#xAB;&#xA0;composants&#xA0;&#xBB;, si vous voulez. Essayez de rep&#xE9;rer les mod&#xE8;les qui se r&#xE9;p&#xE8;tent pour en faire des &#xAB;&#xA0;objets&#xA0;&#xBB; (classes) afin de les r&#xE9;utiliser.</p><p>Pour &#xEA;tre un peu plus pr&#xE9;cis, cela signifie essentiellement deux choses&#xA0;:</p><ul class="spip"><li> S&#xE9;parer structure et apparence</li><li> S&#xE9;parer conteneurs et contenu</li></ul><h4>S&#xE9;parer structure et apparence</h4><p>S&#xE9;parer la structure et l&#x2019;apparence peut se r&#xE9;v&#xE9;ler important&#xA0;: vous savez que des &#xE9;l&#xE9;ments graphiques peuvent &#xEA;tre utilis&#xE9;s &#xE0; plusieurs endroits sur un site web et sur plusieurs types d&#x2019;&#xE9;l&#xE9;ments&#xAD;&#xAD;&#xAD;&#xAD;, n&#x2019;est-ce pas&#xA0;? Prenez le bout de code suivant, cela peut convenir &#xE0; un bouton, &#xE0; une image, ce que vous voulez&#xA0;:</p><pre><code>#mon-bouton,
.ma-boite
.ma-boite img { border: 1px solid #444; border-radius: 5px; box-shadow: 0 0 5px rgba(0,0,0,0.1);
}</code></pre><p>Maintenant, au lieu de ce qui pr&#xE9;c&#xE8;de, nous pourrions cr&#xE9;er une classe qu&#x2019;on appellerait &#xAB;&#xA0;habillage&#xA0;&#xBB; (<i>skin</i>) ou quelque chose comme &#xE7;a, et l&#x2019;appliquer aux &#xE9;l&#xE9;ments qui en ont besoin. Le r&#xE9;sultat est beaucoup plus compr&#xE9;hensible, la feuille de style plus maintenable et une interpr&#xE9;tation de classes plus rapide.</p><pre><code>.habillage { border: 1px solid #444; border-radius: 5px; box-shadow: 0 0 5px rgba(0,0,0,0.1);
}</code></pre><h4>S&#xE9;parer conteneurs et contenu</h4><p>Je pense que c&#x2019;est l&#x2019;une des r&#xE8;gles les plus importantes de OOCSS&#xA0;: coder des composants ind&#xE9;pendants, pas des bouts de code pour un &#xE9;l&#xE9;ment sp&#xE9;cifique de votre mod&#xE8;le. Les choses devraient &#xEA;tre r&#xE9;utilisables, quelle que soit leur place sur votre site Internet, sans les coder &#xE0; nouveau. Prenons l&#x2019;exemple suivant&#xA0;:</p><pre><code>#principal h2 { color: #343434; font-size: 25px; line-height: 20px; border-bottom: 1px solid rgba(0,0,0,0.2); box-shadow: 0 1px rgba(255,255,255,0.4);
}</code></pre><p>D&#x2019;accord. Maintenant, si je veux exactement le m&#xEA;me style sur un titre de niveau 2 plac&#xE9; dans le pied de page&#xA0;? Ou bien mettre en forme un titre de niveau 3 plac&#xE9; exactement de la m&#xEA;me mani&#xE8;re (quelle qu&#x2019;en soit la raison)&#xA0;? La meilleure fa&#xE7;on de faire consisterait &#xE0; cr&#xE9;er une classe et &#xE0; donner ces styles &#xE0; cette classe, pas aux &#xE9;l&#xE9;ments eux-m&#xEA;mes.</p><h3>Qu&#x2019;en est-il du &#xAB;&#xA0;ne jamais utiliser d&#x2019;ID&#xA0;&#xBB;&#xA0;?</h3><p>Quand Nicole Sullivan a d&#xE9;couvert le concept de <abbr>CSS</abbr> orient&#xE9;-objet, ce fut un sujet chaud. En effet <a href="http://csslint.net/" class="spip_out">CSSLint</a>, un outil de qualit&#xE9; du code <abbr>CSS</abbr> cr&#xE9;&#xE9; par Nicholas C. Zakas et Nicole Sullivan, d&#xE9;conseille l&#x2019;utilisation des s&#xE9;lecteurs d&#x2019;ID.</p><p>Pour comprendre le point de vue de Nicole, il est important de comprendre que les ID peuvent poser certains probl&#xE8;mes de priorit&#xE9;, car ils ont le score le plus &#xE9;lev&#xE9; dans ce domaine. Prenez le code suivant &#xE0; titre d&#x2019;exemple (&#xE0; voir sur <a href="http://csswizardry.com/2011/09/when-using-ids-can-be-a-pain-in-the-class/" class="spip_out">CSSWizardry</a> - <a href="http://jsfiddle.net/csswizardry/gTZGq/1/" class="spip_out">source ici</a>)&#xA0;:</p><pre><code>&lt;!-- HTML --&gt;
&lt;div id=&quot;en-tete&quot;&gt; &lt;p&gt; &lt;a href=&quot;#&quot;&gt;Foo&lt;/a&gt; &lt;a href=&quot;#&quot;&gt;Bar&lt;/a&gt; &lt;/p&gt; &lt;div class=&quot;tweet&quot;&gt; &lt;a href=&quot;#&quot;&gt;Suivez-moi sur twitter&lt;/a&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;tweet&quot;&gt; &lt;a href=&quot;#&quot;&gt;Suivez-moi sur twitter&lt;/a&gt;
&lt;/div&gt; /* CSS */
#en-tete a { color: #f90; }
.tweet a { color: #000; }</code></pre><p>Pour mettre le premier lien Twitter en noir, vous avez deux options&#xA0;: soit lui donner une ID, soit utiliser le lourdaud <code>&lt;important!&gt;</code>. Si <code>#en-tete</code> &#xE9;tait une classe au lieu d&#x2019;une ID, le probl&#xE8;me n&#x2019;aurait pas exist&#xE9;.</p><p>C&#x2019;est en partie la raison pour laquelle Nicole Sullivan a dit &#xAB;&#xA0;pas d&#x2019;ID&#xA0;&#xBB;.</p><p>Je finirai cette partie par la citation de <a href="http://csswizardry.com/2011/09/when-using-ids-can-be-a-pain-in-the-class/" class="spip_out">Harry Roberts</a> sur le sujet&#xA0;: &#xAB;&#xA0;[...] J&#x2019;ai d&#xE9;cid&#xE9; qu&#x2019;une interdiction g&#xE9;n&#xE9;rale &#xE9;tait l&#x2019;option la plus logique. &#xC9;pargnez-vous beaucoup de soucis&#xA0;: n&#x2019;utilisez jamais d&#x2019;ID dans vos fichiers <abbr>CSS</abbr>&#xA0;&#xBB;.</p><p>Bien s&#xFB;r, il est tout &#xE0; fait possible d&#x2019;utiliser des IDs qui restent parfaitement valides.</p><h3>Quel est mon sentiment sur OOCSS&#xA0;?</h3><p>En ce qui me concerne, je ne suis pas vraiment un expert sur le sujet. D&#x2019;abord parce que je n&#x2019;ai jamais travaill&#xE9; sur un site &#xE9;norme impliquant de nombreux d&#xE9;veloppeurs front-end. Ne nous leurrons pas, c&#x2019;est sans doute tr&#xE8;s utile pour les sites de grande importance, mais pas forc&#xE9;ment pour le petit site que vous faites pour votre boulanger.<br class="autobr">
Cependant, m&#xEA;me si je n&#x2019;utilise pas OOCSS dans mes projets, j&#x2019;essaie de me concentrer sur les choses importantes comme la r&#xE9;utilisation des composants, la maintenabilit&#xE9; de la feuille de style, la performance et autres. Ce sont les choses sur lesquelles OOCSS se concentre, donc d&#x2019;une certaine fa&#xE7;on, je ne suis pas si loin de la logique.</p><h4>Autres ressources sur OOCSS et les IDs</h4><h2>5. <abbr>CSS</abbr>3&#xA0;: d&#xE9;couvrez ce que vous pouvez faire et ce que vous pouvez utiliser</h2><p>Bon, assez de concepts. Parlons de choses s&#xE9;rieuses. Parlons un peu de <abbr>CSS</abbr>3. Bien qu&#x2019;en r&#xE9;alit&#xE9; <abbr>CSS</abbr>3 n&#x2019;existe pas en tant que tel&#xA0;:</p><blockquote class="spip"><p>Contrairement &#xE0; <abbr>CSS</abbr>2, qui est une importante sp&#xE9;cification d&#xE9;finissant diverses caract&#xE9;ristiques, <abbr>CSS</abbr>3 est divis&#xE9; en plusieurs documents s&#xE9;par&#xE9;s appel&#xE9;s &#xAB;&#xA0;modules&#xA0;&#xBB;. Chaque module ajoute de nouvelles fonctionnalit&#xE9;s ou &#xE9;tend les fonctions d&#xE9;finies dans <abbr>CSS</abbr>2, sur la pr&#xE9;servation de la r&#xE9;tro-compatibilit&#xE9;. [...] En raison de la modularisation, les diff&#xE9;rents modules sont plus ou moins stables et aboutis.</p></blockquote><p><br class="autobr">
<i>(Traduction de <a href="http://en.wikipedia.org/wiki/Cascading_Style_Sheets" class="spip_out">Cascading Style Sheets</a> sur Wikipedia EN)</i></p><p>Mais entendons-nous sur le fait que nous parlons des nouvelles fonctionnalit&#xE9;s que comprennent les navigateurs modernes.</p><p>De nos jours, <abbr>CSS</abbr>3 est partout&#xA0;: des bords arrondis aux d&#xE9;grad&#xE9;s, de la transparence aux ombres et pseudo-&#xE9;l&#xE9;ments.</p><h3>Que peut-on faire&#xA0;?</h3><p>&#xC0; mon avis, vous pouvez vous servir de <abbr>CSS</abbr>3 pour r&#xE9;duire le nombre de requ&#xEA;tes <abbr>HTTP</abbr> (images), le nombre de balises et la taille des fichiers JavaScript. Voyons cela de plus pr&#xE8;s&#xA0;:</p><ul class="spip"><li> Coin arrondi (<code>border-radius</code>)&#xA0;: 1 ligne de <abbr>CSS</abbr> au lieu de 4 conteneurs + 4 images</li><li> Opacit&#xE9; (<code>opacity</code>) et canal alpha de couleur&#xA0;: 1 ligne de <abbr>CSS</abbr> au lieu d&#x2019;un <abbr>PNG</abbr> semi-transparent</li><li> S&#xE9;lecteurs avanc&#xE9;s&#xA0;: pas besoin de JavaScript</li><li> Bo&#xEE;te flexible (<code>flexbox</code>)&#xA0;: quelques lignes de <abbr>CSS</abbr> au lieu de toute une biblioth&#xE8;que JavaScript</li><li> D&#xE9;grad&#xE9;s (<code>gradient</code>)&#xA0;: quelques lignes de <abbr>CSS</abbr> au lieu d&#x2019;une image d&#x2019;arri&#xE8;re-plan r&#xE9;p&#xE9;t&#xE9;e</li><li> Arri&#xE8;res-plans multiples (<code>background</code>)&#xA0;: pas besoin de plusieurs conteneurs</li><li> Pseudo-&#xE9;l&#xE9;ments (<code>pseudo-element</code>)&#xA0;: pas de balises suppl&#xE9;mentaires pour les &#xE9;l&#xE9;ments d&#xE9;coratifs</li></ul><p>Et je pourrais continuer longtemps mais je pense que vous avez compris. Ce que je veux faire passer comme message, c&#x2019;est ceci&#xA0;: lancez-vous, et d&#xE9;couvrez tout ce que vous pouvez faire avec <abbr>CSS</abbr>3. Vous devez cr&#xE9;er une table des mati&#xE8;res&#xA0;? Sachez que vous pouvez le faire uniquement avec <abbr>CSS</abbr> gr&#xE2;ce &#xE0; <a href="http://dev.opera.com/articles/view/automatic-numbering-with-css-counters/" class="spip_out">CSS counters</a>. Vous devez d&#xE9;finir une bordure originale personnalis&#xE9;e pour un site&#xA0;? Sachez qu&#x2019;il existe une propri&#xE9;t&#xE9; <a href="http://css-tricks.com/understanding-border-image/" class="spip_out"><code>border-image</code></a> pour l&#x2019;int&#xE9;grer.</p><p>Vous pouvez faire un million de choses avec <abbr>CSS</abbr>, et c&#x2019;est encore plus vrai quand il s&#x2019;agit de <abbr>CSS</abbr>3. Il est important de savoir ce que vous pouvez faire ou pas. Malheureusement, il n&#x2019;existe pas de potion magique pour cela, vous devez lire la documentation et faire des exp&#xE9;riences. &#xC0; partir de l&#xE0;, vous apprendrez que vous pouvez faire des calculs avec la propri&#xE9;t&#xE9; <code>calc ()</code>, mais vous ne pourrez pas obtenir 6 colonnes d&#x2019;&#xE9;gale hauteur sans avoir &#xE0; vous battre comme un beau diable.</p><h3>Apprendre ce que vous pouvez utiliser</h3><p>Le plus gros probl&#xE8;me avec <abbr>CSS</abbr>, c&#x2019;est que tous les navigateurs ne prennent pas en charge les m&#xEA;mes propri&#xE9;t&#xE9;s. Pire, certaines propri&#xE9;t&#xE9;s sont g&#xE9;r&#xE9;es de plusieurs mani&#xE8;res diff&#xE9;rentes quand il s&#x2019;agit de <abbr>CSS</abbr>3. Ce sera votre plus grande mal&#xE9;diction lors de l&#x2019;exp&#xE9;rimentation avec <abbr>CSS</abbr>3.</p><p>&#xC0; titre d&#x2019;exemple, prenez la propri&#xE9;t&#xE9; <abbr>CSS</abbr>3 la plus simple&#xA0;: <i>border-radius</i> (coin arrondi). Eh bien, il y a des navigateurs qui ne comprennent pas les coins arrondis (<abbr>IE</abbr>8 + version ant&#xE9;rieure et Opera Mini). En fait, m&#xEA;me Firefox et Chrome n&#x2019;interpr&#xE8;tent pas <code>border-radius</code> de la m&#xEA;me fa&#xE7;on (ou ne l&#x2019;ont pas toujours fait de la m&#xEA;me fa&#xE7;on).</p><p>Qu&#x2019;est-ce que cela signifie pour vous en tant que d&#xE9;veloppeur front-end&#xA0;? Cela veut dire que si vous devez afficher des coins arrondis dans tous les navigateurs, vous pouvez le faire &#xE0; l&#x2019;ancienne. Arri&#xE8;re-plans multiples + images multiples, ou alors adopter les deux solutions et servir l&#x2019;une ou l&#x2019;autre en fonction du navigateur.</p><p>Quand je dois faire quelque chose en <abbr>CSS</abbr>, voici le processus que je suis&#xA0;:</p><ol class="spip"><li> Comment vais-je faire cela&#xA0;?</li><li> D&#x2019;accord, je comprends. Fait-il partie de la sp&#xE9;cification <abbr>CSS</abbr>2.1&#xA0;?<ol class="spip"><li> Oui&#xA0;: fastoche, fin de l&#x2019;histoire.</li><li> Non, passez &#xE0; l&#x2019;&#xE9;tape 3.</li></ol></li><li> <a href="http://caniuse.com/" class="spip_out">Quelle est la qualit&#xE9; du rendu par les navigateurs&#xA0;?</a><ol class="spip"><li> Bonne&#xA0;: fastoche, fin de l&#x2019;histoire.</li><li> Mauvaise, passez &#xE0; l&#x2019;&#xE9;tape 4.</li></ol></li><li> Est-ce une am&#xE9;lioration ou une fonction vitale&#xA0;?<ol class="spip"><li> C&#x2019;est juste une am&#xE9;lioration. Je ne fais rien pour les navigateurs non pris en charge ou &#xE0; la limite j&#x2019;ajoute une solution de repli (fallback).</li><li> Il s&#x2019;agit d&#x2019;une caract&#xE9;ristique essentielle&#xA0;: passez &#xE0; l&#x2019;&#xE9;tape 5.</li></ol></li><li> Comment vais-je le faire fonctionner dans les navigateurs non pris en charge&#xA0;?</li></ol><p>Prenons un exemple r&#xE9;el, d&#x2019;accord&#xA0;? Avec quelque chose de simple, comme un d&#xE9;grad&#xE9;. Allons-y.</p><ol class="spip"><li> Comment vais-je faire cela&#xA0;?</li><li> D&#x2019;accord, je comprends. Fait-il partie de la sp&#xE9;cification <abbr>CSS</abbr>2.1&#xA0;?<ul class="spip"><li> Non, les d&#xE9;grad&#xE9;s appartiennent &#xE0; <abbr>CSS</abbr>3.</li></ul></li><li> <a href="http://caniuse.com/" class="spip_out">Quelle est la qualit&#xE9; du rendu par les navigateurs&#xA0;?</a><ul class="spip"><li> Pas mal, mais pas parfait. <abbr>IE</abbr>8 + versions ant&#xE9;rieures ainsi qu&#x2019;Opera Mini ne prennent pas en charge les d&#xE9;grad&#xE9;s <abbr>CSS</abbr>.</li></ul></li><li> Est-ce une am&#xE9;lioration ou une fonctionnalit&#xE9; vitale&#xA0;?<ol class="spip"><li> Il s&#x2019;agit plut&#xF4;t d&#x2019;une am&#xE9;lioration graphique, rien de fondamental. Je vais ajouter une couleur unie comme solution de repli.</li><li> C&#x2019;est un &#xE9;l&#xE9;ment graphique indispensable&#xA0;: je dois le faire fonctionner pour les navigateurs non support&#xE9;s.</li></ol></li><li> Comment vais-je faire pour les anciens navigateurs&#xA0;?<ul class="spip"><li> Je vais devoir recourir &#xE0; une image d&#x2019;arri&#xE8;re-plan.</li></ul></li></ol><p>Gr&#xE2;ce &#xE0; ce processus pas &#xE0; pas, vous savez comment faire quelque chose avec <abbr>CSS</abbr> (si c&#x2019;est faisable), si vous pouvez l&#x2019;utiliser en tenant compte du support des navigateurs et comment cr&#xE9;er des solutions de repli.</p><p><abbr>NB</abbr>&#xA0;: souvenez-vous toujours de l&#x2019;audience cible de votre site web ou de votre application. Si vous cr&#xE9;ez du contenu web pour une application iPad, vous pourrez utiliser de nombreuses propri&#xE9;t&#xE9;s <abbr>CSS</abbr>3 sans vous soucier des solutions de repli. Toutefois si vous cr&#xE9;ez un site pour une banque, rappelez-vous que beaucoup de gens utilisent encore IE8 ou des versions plus anciennes encore.</p><h3>Fournir des solutions de repli</h3><p>Selon la situation, fournir une solution de repli pour les navigateurs non pris en charge peut &#xEA;tre soit ridiculement simple soit extr&#xEA;mement p&#xE9;nible. En effet, il y a des cas diff&#xE9;rents. Regardons cela de plus pr&#xE8;s.</p><h4>Pas de solution de repli ou une solution de repli simple</h4><p>Quand il y a une am&#xE9;lioration de l&#x2019;exp&#xE9;rience utilisateur dont l&#x2019;absence de prise en charge est sans cons&#xE9;quences, vous n&#x2019;&#xEA;tes m&#xEA;me pas oblig&#xE9;s de fournir une solution de repli. C&#x2019;est appr&#xE9;ciable.</p><p>Il y a aussi quelques propri&#xE9;t&#xE9;s qui sont faciles &#xE0; traiter quand il s&#x2019;agit de solution de repli. En g&#xE9;n&#xE9;ral, vous devez seulement &#xE9;crire deux versions de cette propri&#xE9;t&#xE9;&#xA0;: d&#x2019;abord la solution de repli, puis la version correcte pour les navigateurs qui le supportent.</p><pre><code>.mon-element { border: 1px solid #666; border: 1px solid rgba(0,0,0,0.3); background: #708090; background: hsl(210, 13%, 50%);
}</code></pre><p>Dans ce cas, les navigateurs ne supportant pas <code>rgba</code> et <code>hsl</code> ne liront pas les lignes 3 et 5&#xA0;; de ce fait vous fournissez des versions alternatives aux lignes 2 et 4. Pour les navigateurs pris en charge, ils vont d&#x2019;abord appliquer la version alternative, puis la remplacer par la version correcte.</p><h4>Modernizr</h4><p>De nos jours, on ne peut gu&#xE8;re parler de <abbr>CSS</abbr>3 sans mentionner <a href="http://modernizr.com/" class="spip_out">Modernizr</a>. Il s&#x2019;agit d&#x2019;une biblioth&#xE8;que JavaScript qui teste la prise en charge des fonctionnalit&#xE9;s HTML5 et <abbr>CSS</abbr>3 au chargement de la page. Cela peut sembler lourd, mais il est bien optimis&#xE9; et assez rapide.</p><p>Quoi qu&#x2019;il en soit, parfois, il faut savoir pr&#xE9;cis&#xE9;ment si le navigateur prend en charge une fonctionnalit&#xE9; particuli&#xE8;re. Notamment pour fournir une version alternative n&#xE9;cessitant d&#x2019;autres propri&#xE9;t&#xE9;s <abbr>CSS</abbr>.</p><pre><code>/* Version normale */
.menu-deroulant { opacity: 0; pointer-events: none;
} .declencheur:hover .menu-deroulant { opacity: 1; pointer-events: auto;
} /* Solution de repli avec Modernizr */ .no-opacity .menu-deroulant,
.no-pointerevents .menu-deroulant { opacity: 1;
pointer-events: auto;
display: none;
} .no-opacity .declencheur:hover .menu-deroulant,
.no-pointerevents .declencheur:hover .menu-deroulant { display: block;
}</code></pre><p>Pour fournir une solution de repli de ce type, les classes ajout&#xE9;es par la biblioth&#xE8;que Javascript Modernizr vous seront d&#x2019;un grand secours (<code>.no-opacity</code> [sans-opacite] et <code>.no-pointerevents</code> [sans-evenementpointeur]). Vous ne pouvez pas avoir les deux versions simultan&#xE9;ment.</p><p>Quoi qu&#x2019;il en soit, n&#x2019;oubliez jamais de d&#xE9;finir une solution de repli, c&#x2019;est vraiment important. Les fonctionnalit&#xE9;s majeures doivent &#xEA;tre prises en charge par tous les navigateurs, tant les anciens que les nouveaux, et si ce n&#x2019;est pas le cas partout, vous devez avertir l&#x2019;utilisateur.</p><p>Donc, soit vous commencez avec une base simple et l&#x2019;am&#xE9;liorez pour les navigateurs r&#xE9;cents, soit vous commencez avec une base moderne et vous composez pour les navigateurs plus anciens. Voir la section suivante pour plus d&#x2019;informations.</p><h4>Autres ressources sur <abbr>CSS</abbr>3&#xA0;:</h4><h2>6. Am&#xE9;lioration progressive et d&#xE9;gradation &#xE9;l&#xE9;gante</h2><p>Ce sont deux termes dont vous avez probablement d&#xE9;j&#xE0; entendu parler, en particulier la d&#xE9;gradation &#xE9;l&#xE9;gante, mais il y a une diff&#xE9;rence subtile entre les deux.</p><h3>Am&#xE9;lioration progressive</h3><p>Le principe de l&#x2019;am&#xE9;lioration progressive est d&#x2019;&#xE9;tablir une base commune de fonctionnalit&#xE9;s et de fonctions disponibles, et ensuite, d&#x2019;am&#xE9;liorer l&#x2019;exp&#xE9;rience utilisateur en fonction de ce que le navigateur prend en charge.</p><p>Utiliser l&#x2019;attribut <abbr>HTML</abbr>5 <code>required</code> pour avertir l&#x2019;utilisateur qu&#x2019;un champ est manquant dans un formulaire avant de le soumettre peut &#xEA;tre consid&#xE9;r&#xE9; comme une am&#xE9;lioration progressive. Il s&#x2019;agit d&#x2019;une am&#xE9;lioration de l&#x2019;exp&#xE9;rience utilisateur rendue possible gr&#xE2;ce au moteur natif du navigateur.</p><h3>D&#xE9;gradation &#xE9;l&#xE9;gante</h3><p>Vous utilisez la d&#xE9;gradation &#xE9;l&#xE9;gante lorsque vous d&#xE9;clinez une version alternative ou inf&#xE9;rieure de vos fonctionnalit&#xE9;s au cas o&#xF9; elles ne sont pas prises en charge. Fondamentalement, on part du plus haut pour aller vers le plus bas.</p><p>Un exemple tr&#xE8;s simple serait l&#x2019;avertissement que vous mettez entre les balises <code>&lt;canvas&gt;</code> pour informer les utilisateurs de navigateurs qui ne les prennent pas en charge qu&#x2019;il y a quelque chose qu&#x2019;ils ne peuvent pas voir.</p><pre><code>&lt;canvas&gt;
Cette page utilise HTML5 Canvas. Veuillez utiliser un navigateur r&#xE9;cent pour voir ce contenu. Pour obtenir un autre navigateur, allez &#xE0; &lt;a href=&quot;http://browsehappy.com/&quot;&gt;BrowseHappy&lt;/a&gt;
&lt;/canvas&gt;</code></pre><h3>Quelle est la diff&#xE9;rence&#xA0;?</h3><p>En fin de compte, il n&#x2019;y en a pas. Vous avez des fonctionnalit&#xE9;s pour les navigateurs r&#xE9;cents et des fonctionnalit&#xE9;s ou des solutions de repli pour les plus anciens. C&#x2019;est plut&#xF4;t une question de proc&#xE9;dure&#xA0;: soit vous codez pour les navigateurs modernes tout en proposant une solution de repli pour les anciens, soit vous le faites dans l&#x2019;autre sens. C&#x2019;est un choix.</p><p>En tout cas, je veux redire ici que l&#x2019;exp&#xE9;rience utilisateur n&#x2019;est pas n&#xE9;cessairement la m&#xEA;me dans tous les navigateurs. En fait, ce n&#x2019;est m&#xEA;me pas possible, puisque les moteurs des navigateurs sont diff&#xE9;rents. Quoi qu&#x2019;il en soit, vous devez fournir des fonctionnalit&#xE9;s de base pour tout le monde, mais faites-moi plaisir&#xA0;: am&#xE9;liorez votre site web ou votre application pour les navigateurs modernes. Ils sont bien con&#xE7;us, ils fournissent des fonctionnalit&#xE9;s &#xE0; l&#x2019;&#xE9;tat natif&#xA0;: utilisez-les.</p><h4>Lectures compl&#xE9;mentaires sur l&#x2019;am&#xE9;lioration progressive et la d&#xE9;gradation &#xE9;l&#xE9;gante</h4><h2>7. Les pr&#xE9;processeurs <abbr>CSS</abbr></h2><p>Aaaah, les pr&#xE9;processeurs&#x2026; Le sujet chaud du moment. Sont-ils utiles&#xA0;? Pour quoi faire&#xA0;? Devrais-je en employer un&#xA0;? Lequel&#xA0;? Je pense que c&#x2019;est l&#x2019;un des sujets les plus d&#xE9;battus sur <abbr>CSS</abbr> en ce moment.</p><p>Je vais essayer d&#x2019;&#xEA;tre aussi objectif que possible dans cette partie. Permettez-moi de commencer par ceci&#xA0;: si vous ne voulez pas utiliser un pr&#xE9;processeur, alors ne le faites pas. Ce ne sera jamais un probl&#xE8;me. Vous ne serez pas un mauvais d&#xE9;veloppeur front-end pour autant. Cela ne vous rendra pas incapable de faire certaines choses. Mais vous devriez, n&#xE9;anmoins, essayer de vous faire votre propre opinion &#xE0; ce sujet.</p><p>Ok, j&#x2019;en ai fini avec les pr&#xE9;cautions. Qu&#x2019;est-ce qu&#x2019;un pr&#xE9;processeur, de mani&#xE8;re g&#xE9;n&#xE9;rale&#xA0;? Un pr&#xE9;processeur est une sorte d&#x2019;outil qui compile une syntaxe donn&#xE9;e dans une langue utilis&#xE9;e par un autre programme (dans le cas pr&#xE9;sent&#xA0;: le navigateur). Il y a des pr&#xE9;processeurs pour de nombreux languages&#xA0;: il y a Markdown ou Jade pour le <abbr>HTML</abbr>. Il y a LESS, Sass et Stylus pour <abbr>CSS</abbr>. Il existe CoffeeScript pour JavaScript. Il y a CakePHP pour <abbr>PHP</abbr> et ainsi de suite.</p><h3>De quoi parle-t-on&#xA0;?</h3><p>Un pr&#xE9;processeur <abbr>CSS</abbr> fournit aux <abbr>CSS</abbr> certaines particularit&#xE9;s &#xE0; partir de langages orient&#xE9;s objet. Des choses comme&#xA0;:</p><ul class="spip"><li> les variables</li><li> les fonctions (avec des param&#xE8;tres)</li><li> les espaces de nommages</li><li> l&#x2019;imbrication</li><li> les instructions conditionnelles</li><li> les op&#xE9;rations</li><li> etc.</li></ul><p>&#xC7;a a l&#x2019;air attrayant, non&#xA0;? Peut-&#xEA;tre que vous voulez un exemple pour comprendre la mani&#xE8;re dont cela fonctionne. Prenons le <abbr>CSS</abbr> suivant pour une barre de navigation.</p><pre><code>.navigation { width: 800px; width: calc(100%-150px);
}
.navigation li { color: #444;
}
.navigation li a { text-decoration: none;
}</code></pre><p>Et voici maintenant la version compil&#xE9;e (SCSS)&#xA0;:</p><pre><code>$couleur-principale: #444; .navigation { width: (100%-150px); li { color: $couleur-principale; a { text-decoration: none; } }
}</code></pre><p>En gros, un pr&#xE9;processeur va interpr&#xE9;ter ceci dans une version <abbr>CSS</abbr> standard. Ce sera exactement la m&#xEA;me chose, sauf pour le calcul. Il lancera l&#x2019;op&#xE9;ration elle-m&#xEA;me et affichera le r&#xE9;sultat correspondant sans qu&#x2019;il soit n&#xE9;cessaire d&#x2019;utiliser une fonction comme <code>calc()</code>.</p><p>Donc, vous vous retrouvez avec une feuille de style plus compr&#xE9;hensible (variables et imbrications) et plus facile &#xE0; maintenir (variables et fonctions). C&#x2019;&#xE9;tait un exemple tr&#xE8;s th&#xE9;orique, mais dans un projet r&#xE9;el, vous sentirez la diff&#xE9;rence.</p><h3>Comment le choisir&#xA0;?</h3><p>Il existe beaucoup de pr&#xE9;processeurs <abbr>CSS</abbr>, chacun avec ses avantages et ses particularit&#xE9;s. Quoi qu&#x2019;il en soit, chacun d&#x2019;entre eux fait plus ou moins la m&#xEA;me chose, donc le choix vous appartient. Voici les principales options quand il s&#x2019;agit de pr&#xE9;processeurs <abbr>CSS</abbr>&#xA0;:</p><ul class="spip"><li> <a href="http://sass-lang.com/" class="spip_out">Sass</a> (&#xE9;crit en Ruby)</li><li> <a href="http://lesscss.org/" class="spip_out">LESS</a> (&#xE9;crit en JavaScript)</li><li> <a href="http://learnboost.github.com/stylus/" class="spip_out">Stylus</a> (&#xE9;crit en JavaScript)</li><li> <a href="http://the-echoplex.net/csscrush/" class="spip_out">Crush</a> (&#xE9;crit en <abbr>PHP</abbr>)</li></ul><p>L&#x2019;id&#xE9;al, c&#x2019;est d&#x2019;apprendre &#xE0; les conna&#xEE;tre, de les tester et de voir ce qui r&#xE9;pond le mieux &#xE0; vos besoins et &#xE0; votre projet. Il y a plusieurs facteurs qui entrent en jeu&#xA0;; les &#xE9;num&#xE9;rer tous serait hors de la port&#xE9;e de cet article, mais vous pouvez trouver quelques ressources pertinentes ci-dessous.</p><h3>Mon sentiment sur les pr&#xE9;processeurs <abbr>CSS</abbr>&#xA0;?</h3><p>Je ne suis pas un expert quand il s&#x2019;agit de pr&#xE9;processeurs <abbr>CSS</abbr>, mais j&#x2019;en suis un partisan. Ils fournissent des fonctionnalit&#xE9;s tr&#xE8;s utiles mais qu&#x2019;on ne trouve pas dans les <abbr>CSS</abbr> comme les variables, les d&#xE9;clarations, l&#x2019;imbrication et les conditions.</p><p>J&#x2019;ai bricol&#xE9; un peu avec LESS, et il m&#x2019;a fait &#xE0; peu pr&#xE8;s ce que je voulais. Ou du moins, jusqu&#x2019;&#xE0; ce que je commence &#xE0; me lancer dans des choses un peu plus compliqu&#xE9;es que vous avez pu lire dans mon dernier article sur <a href="http://tympanus.net/codrops/2012/11/14/creative-css-loading-animations/" class="spip_out">CSS Loading Animations</a> (pour les boucles + pr&#xE9;fixes vendeurs + <i>keyframes</i>).</p><p>J&#x2019;ai aussi jet&#xE9; un coup d&#x2019;&#x153;il rapide &#xE0; Sass et Compass. &#xC0; ma grande surprise, c&#x2019;&#xE9;tait incroyablement facile &#xE0; installer et &#xE0; lancer gr&#xE2;ce &#xE0; Ruby. J&#x2019;avais peur, mais c&#x2019;est tr&#xE8;s tr&#xE8;s intuitif, croyez-moi. En fin de compte, je suis vraiment impressionn&#xE9; par l&#x2019;association Sass + Compass. Vous pouvez &#xE9;galement en savoir plus sur les raisons pour lesquelles je suis pass&#xE9; de LESS &#xE0; Sass dans <a href="http://hugogiraudel.com/blog/less-to-sass.html" class="spip_out">cet article</a> sur mon blog.</p><p>Quoi qu&#x2019;il en soit, je suis encore tout &#xE0; fait capable d&#x2019;&#xE9;crire des <abbr>CSS</abbr> classiques sans pr&#xE9;processeur, et la plupart du temps c&#x2019;est ce que je fais. Mais au final, je pense que nous allons tous en utiliser un, quel qu&#x2019;il soit. Il nous manque vraiment certains &#xE9;l&#xE9;ments tr&#xE8;s utiles avec les <abbr>CSS</abbr>, et les pr&#xE9;processeurs <abbr>CSS</abbr> sont l&#xE0; pour y rem&#xE9;dier.</p><h4>Lectures compl&#xE9;mentaires sur les pr&#xE9;processeurs <abbr>CSS</abbr></h4><h2>8. Garder un &#x153;il sur l&#x2019;avenir</h2><p>Les langages sont en constante &#xE9;volution. C&#x2019;est particuli&#xE8;rement vrai pour les <abbr>CSS</abbr>. Les sp&#xE9;cifications <abbr>CSS</abbr> bougent sans cesse, et les navigateurs ajoutent sans cesse de nouvelles fonctionnalit&#xE9;s &#xE0; leurs moteurs.</p><p>&#xC0; ce propos, mon premier conseil serait de rester &#xE0; l&#x2019;&#xE9;coute de ce qui se pr&#xE9;pare. Je sais que vous ne pouvez pas &#xEA;tre en mesure de tout utiliser d&#xE8;s son lancement, mais savoir quelle fonctionnalit&#xE9; est maintenant prise en charge par Canary Chrome, bient&#xF4;t par Chrome version stable et Safari, puis par Opera, Firefox et ainsi de suite, c&#x2019;est important afin de prendre du recul sur les probl&#xE8;mes <abbr>CSS</abbr> et les solutions possibles.</p><h4>Ressources pour garder un &#x153;il sur l&#x2019;avenir&#xA0;:</h4><h2>9. Lire le code des autres</h2><p>Une des meilleures fa&#xE7;ons d&#x2019;apprendre &#xE0; coder est de lire du code.</p><p>Heureusement, le <abbr>CSS</abbr> est visible c&#xF4;t&#xE9; client, ce qui vous permet de le lire sur n&#x2019;importe quel site avec un inspecteur web comme WebKit inspector, Dragonfly, Firebug, etc. De plus, l&#x2019;industrie du web est tr&#xE8;s orient&#xE9;e vers l&#x2019;open-source, ce qui signifie que les gens sont heureux de partager leurs sources avec vous.</p><p>Une autre excellente fa&#xE7;on d&#x2019;apprendre est de suivre des tutoriels. Prenez un tutoriel simple, et suivez-le &#xE9;tape par &#xE9;tape. Ensuite, essayez de le refaire &#xE0; partir de z&#xE9;ro. S&#x2019;il vous arrive d&#x2019;&#xEA;tre bloqu&#xE9;, jetez un coup d&#x2019;&#x153;il &#xE0; la solution, puis continuez par vous-m&#xEA;me.</p><p>Lorsque vous serez &#xE0; l&#x2019;aise avec <abbr>CSS</abbr> et que vous voudrez entrer finement dans les d&#xE9;tails, vous voudrez peut-&#xEA;tre jeter un &#x153;il &#xE0; des d&#xE9;monstrations et des exp&#xE9;riences qui ne sont pas comment&#xE9;es ni expliqu&#xE9;es. Les gens cr&#xE9;ent des choses tous les jours, et vous tomberez sans arr&#xEA;t sur des choses que vous ne connaissiez pas encore.</p><p>&#xC0; ce sujet, il y a quelques mois Chris Coyier, Tim Sabat et Alex Vazquez ont lanc&#xE9; <a href="http://codepen.io/" class="spip_out">CodePen</a>, une sorte de plate-forme pour cr&#xE9;er, partager et explorer du code (<abbr>HTML</abbr>, <abbr>CSS</abbr>, JavaScript). CodePen comprend &#xE9;galement un tas d&#x2019;outils comme les biblioth&#xE8;ques (jQuery, jQuery UI, MooTools, YUI, Prototype, Zepto, Dojo, Ext JS, PrefixFree, etc) et les pr&#xE9;processeurs (<abbr>HAML</abbr>, Markdown, Slim, LESS, SCSS, Sass, CoffeeScript) si vous en avez besoin.</p><h4>D&#x2019;autres ressources pour trouver des exemples de code cr&#xE9;&#xE9; par d&#x2019;autres personnes&#xA0;:</h4><ul class="spip"><li> <a href="http://codepen.io/" class="spip_out">CodePen</a></li><li> <a href="http://cssdeck.com/" class="spip_out">CSS Deck</a></li><li> <a href="http://dabblet.com/" class="spip_out">Dabblet</a></li><li> <a href="http://thecodeplayer.com/" class="spip_out">TheCodePlayer</a></li></ul><h2>10. Pratiquez sans rel&#xE2;che</h2><p>Vous savez ce qu&#x2019;on dit &#xE0; propos de l&#x2019;apprentissage&#xA0;: <strong>on apprend en faisant</strong>. Donc, mon meilleur conseil est de continuer &#xE0; pratiquer comme pour toute autre chose. Plus vous pratiquez, meilleur vous serez. La pratique ne signifie pas n&#xE9;cessairement faire un site web &#xE0; partir de z&#xE9;ro. Il suffit de choisir une capture simple sur Dribbble et d&#x2019;essayer de la refaire en <abbr>CSS</abbr>. Le r&#xE9;sultat ne sera peut-&#xEA;tre pas utile imm&#xE9;diatement, mais ce que vous avez appris vous sera utile un jour.</p><p>Et comme je l&#x2019;ai dit dans la partie &#xAB;&#xA0;Apprendre les bases et quelques astuces&#xA0;&#xBB; de cet article, <abbr>CSS</abbr> est plein de cas particuliers. Vous devrez apprendre &#xE0; les g&#xE9;rer si vous voulez &#xE9;crire des <abbr>CSS</abbr>. Et la seule fa&#xE7;on de conna&#xEE;tre ces cas particuliers consiste &#xE0; pratiquer, d&#xE9;couvrir de nouveaux cas, jeter un &#x153;il &#xE0; la solution, et continuer.</p><p>Je vous recommande aussi de partager votre code. Il est toujours utile d&#x2019;obtenir un retour constructif, alors assurez-vous de demander aux gens de v&#xE9;rifier votre code une fois qu&#x2019;il est presque fini. Il suffit de les d&#xE9;poser dans un <a href="http://jsfiddle.net/" class="spip_out">JSFiddle</a>, de partager et de demander des commentaires.</p><h2>Sommaire et cr&#xE9;dits</h2><p>Comme cet article mentionne un tas de liens et de ressources diverses, autant les rassembler tous au m&#xEA;me endroit&#xA0;:</p><p>Merci beaucoup d&#x2019;avoir lu cet article. J&#x2019;esp&#xE8;re qu&#x2019;il vous aidera d&#x2019;une mani&#xE8;re ou d&#x2019;une autre &#xE0; am&#xE9;liorer la fa&#xE7;on dont vous apprenez et utilisez les <abbr>CSS</abbr>.</p></div>]]></description>
      <link>http://www.pompage.net/traduction/ameliorer-vos-feuilles-de-styles</link>
      <guid>http://www.pompage.net/traduction/ameliorer-vos-feuilles-de-styles</guid>
      <pubDate>Thu, 19 Jun 2014 03:06:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[]]></title>
      <description><![CDATA[<div id="article"> <p class="signature">Par <a href="http://hugogiraudel.com/">Hugo Giraudel</a> </p> <p class="moreInfo"> Cet article passe en revue quelques principes de base et astuces tir&#xE9;s de mon exp&#xE9;rience personnelle pour apprendre &#xE0; devenir meilleur en <abbr>CSS</abbr>. Dans cet article, je vais parler avant tout de ma propre exp&#xE9;rience et de ce que j&#x2019;ai appris sur <abbr>CSS</abbr> pendant pr&#xE8;s d&#x2019;un an et demi de pratique intensive. </p> <p>Tout d&#x2019;abord, laissez-moi vous rappeler que <abbr>CSS</abbr> est un langage extr&#xEA;mement simple. Il peut se r&#xE9;sumer en 3 mots&#xA0;: s&#xE9;lecteur, propri&#xE9;t&#xE9;, valeur. Et c&#x2019;est &#xE0; peu pr&#xE8;s tout. C&#x2019;est pourquoi certaines personnes n&#x2019;aiment pas du tout <abbr>CSS</abbr> car elles ont l&#x2019;impression d&#x2019;&#xEA;tre comme des enfants qui jouent aux Legos.</p>
<p>En effet, il suffit d&#x2019;expliquer les bases de <abbr>CSS</abbr> &#xE0; un enfant de 9 ans pour qu&#x2019;il ou elle soit en mesure de cr&#xE9;er un site web. Pas un site compliqu&#xE9; bien entendu, mais peut-&#xEA;tre quelques pages avec des titres, des liens, du contenu, des images, quelque chose dans ce go&#xFB;t-l&#xE0;.</p>
<p>Toutefois, le fait que <abbr>CSS</abbr> soit un langage simple ne veut pas dire que tout le monde soit au m&#xEA;me niveau. Certaines personnes utilisent <abbr>CSS</abbr> comme un chimpanz&#xE9; se sert d&#x2019;une fourchette, certaines personnes se d&#xE9;brouillent pas mal avec et d&#x2019;autres peuvent faire des choses formidables.</p>
<p>De ce que je peux en dire, je m&#x2019;amuse avec <abbr>CSS</abbr> depuis pr&#xE8;s de deux ans maintenant et je pratique &#xE0; un niveau disons &#xAB;&#xA0;intensif&#xA0;&#xBB; depuis pr&#xE8;s de sept mois. Je suis encore loin de la perfection et il y a toujours des astuces que je ne connais pas ou que je ne comprends pas.</p>
<p>Quoi qu&#x2019;il en soit, voici quelques trucs que j&#x2019;ai compris au cours des mois &#xE9;coul&#xE9;s et que j&#x2019;aimerais partager avec vous. Encore une fois ce ne sont pas des bouts de code ou des astuces utiles, ce sont plut&#xF4;t des principes g&#xE9;n&#xE9;raux et des bonnes pratiques. Voici ce que je vais aborder&#xA0;:</p>
<ol class="spip"><li> Ne pas se ruer sur le code et faire simple</li><li> Apprendre les bases et quelques astuces</li><li> Ne pas se r&#xE9;p&#xE9;ter</li><li> <abbr>CSS</abbr> orient&#xE9; objet</li><li> <abbr>CSS</abbr>3&#xA0;: apprendre ce que l&#x2019;on peut faire et ce que l&#x2019;on peut utiliser</li><li> Am&#xE9;lioration progressive et d&#xE9;gradation &#xE9;l&#xE9;gante</li><li> Les pr&#xE9;processeurs <abbr>CSS</abbr></li><li> Garder un &#x153;il sur l&#x2019;avenir</li><li> Lire le code des autres</li><li> Pratiquer sans rel&#xE2;che</li></ol>
<p>Qu&#x2019;en dites-vous&#xA0;? Vous &#xEA;tes pr&#xEA;ts&#xA0;? Allez, c&#x2019;est parti.</p>
<h2>1. Ne vous ruez pas sur le code et faites au plus simple</h2><h3>Ne vous ruez pas sur le code</h3>
<p>C&#x2019;est plut&#xF4;t un conseil g&#xE9;n&#xE9;ral, qui n&#x2019;est pas sp&#xE9;cifique &#xE0; <abbr>CSS</abbr>. Quand vous &#xEA;tes sur le point de commencer &#xE0; d&#xE9;velopper,<strong> r&#xE9;fl&#xE9;chissez d&#x2019;abord &#xE0; ce que vous allez faire</strong>. Posez-vous quelques questions&#xA0;:</p>
<ul class="spip"><li> Comment vais-je faire &#xE7;a&#xA0;?</li><li> Y a-t-il une autre mani&#xE8;re de faire&#xA0;?</li><li> Comment puis-je l&#x2019;optimiser (pour que ce soit maintenable, propre, cool, etc.)&#xA0;?</li></ul>
<p>Commencer &#xE0; coder sans r&#xE9;fl&#xE9;chir peut vous faire perdre du temps. Imaginez-vous passer une heure &#xE0; cr&#xE9;er quelque chose pour vous apercevoir que c&#x2019;est sans issue et que vous devez tout recommencer depuis le d&#xE9;but&#xA0;? C&#x2019;est hors de question.</p>
<p>Passer des heures sur un diaporama en <abbr>CSS</abbr> pour finir avec SlidesJS ou Adaptor, c&#x2019;est vraiment nul. Non pas parce que vous avez &#xE9;chou&#xE9;, mais parce que c&#x2019;&#xE9;tait une perte de temps. Vous pourriez le payer tr&#xE8;s cher, le jour o&#xF9; vous serez soumis &#xE0; des d&#xE9;lais tr&#xE8;s serr&#xE9;s.</p>
<h3>Faites simple</h3>
<p><abbr>CSS</abbr> est un langage simple mais les choses peuvent facilement devenir complexes. Surtout si vous voulez qu&#x2019;elles le deviennent. <strong>Dans la plupart des cas, l&#x2019;id&#xE9;e la plus simple est souvent la meilleure</strong>. Quand vous devez r&#xE9;aliser quelque chose, demandez-vous toujours s&#x2019;il n&#x2019;y a pas un moyen plus simple de le faire. Vous seriez surpris du nombre de fois o&#xF9; la r&#xE9;ponse est &#xAB;&#xA0;oui&#xA0;&#xBB;.</p>
<p>Par exemple, si vous voulez coder une barre de navigation horizontale vraiment simple qui ne comporte que des liens, vous avez plusieurs fa&#xE7;ons de faire&#xA0;:</p>
<ul class="spip"><li> Faire flotter les &#xE9;l&#xE9;ments de la liste</li><li> Passer les &#xE9;l&#xE9;ments de la liste en ligne</li><li> Passer les &#xE9;l&#xE9;ments de la liste en blocs en ligne (<code>inline-block</code>)</li></ul>
<p>Choisissez le plus simple et transformez les &#xE9;l&#xE9;ments de liste en &#xE9;l&#xE9;ments en ligne. Pas besoin de <i>hack</i> pour nettoyer les flottants. Pas besoin de corriger l&#x2019;espacement des &#xE9;l&#xE9;ments en ligne. Il y a juste besoin d&#x2019;un espacement interne classique, rien de plus. Fin de chantier.</p>
<h2>2. Conna&#xEE;tre les bases et apprendre les astuces</h2>
<p>Pour devenir bon en <abbr>CSS</abbr> ou quoi que ce soit d&#x2019;autre dans la vie, vous devez conna&#xEE;tre les bases. Vous ne deviendrez jamais un expert si vous n&#x2019;&#xEA;tes pas &#xE0; l&#x2019;aise avec les bases de la discipline.</p>
<h3>Les bases de <abbr>CSS</abbr></h3>
<p>Quelles sont les bases de <abbr>CSS</abbr>&#xA0;? Selon les personnes, vous aurez droit &#xE0; diff&#xE9;rentes versions, c&#x2019;est plus de l&#x2019;ordre du ressenti, mais si vous voulez mon avis, il y a deux choses &#xE0; comprendre avant tout pour vraiment se familiariser avec <abbr>CSS</abbr>&#xA0;:</p>
<ul class="spip"><li> <strong>Le mod&#xE8;le de bo&#xEE;te</strong>. Chaque &#xE9;l&#xE9;ment en <abbr>CSS</abbr> est une bo&#xEE;te (de type bloc ou en ligne) avec une largeur, une hauteur, et &#xE9;ventuellement des espacements, des marges et des bordures. C&#x2019;est la chose la plus importante &#xE0; savoir. Vous en saurez davantage <a href="http://www.w3.org/TR/CSS2/box.html" class="spip_out">ici</a>.</li><li> <strong>La sp&#xE9;cificit&#xE9;</strong>. Pour pouvoir corriger vos <abbr>CSS</abbr>, il est essentiel de savoir quelle r&#xE8;gle est plus forte que quelle autre. Pour plus d&#x2019;informations sur le sujet, lisez les sp&#xE9;cifications&#xA0;: <a href="http://www.w3.org/TR/CSS2/cascade.html" class="spip_out">L&#x2019;assignation des valeurs des propri&#xE9;t&#xE9;s, la cascade et l&#x2019;h&#xE9;ritage</a>.</li></ul><h3>Les astuces</h3>
<p>Une fois que vous avez compris &#xE7;a, vous &#xEA;tes sur la bonne voie. &#xC0; partir de l&#xE0;, vous n&#x2019;aurez qu&#x2019;&#xE0; apprendre quelques astuces pour vous d&#xE9;brouiller avec les cas sp&#xE9;cifiques. Et vous n&#x2019;avez pas fini d&#x2019;en croiser. Laissez-moi vous en montrer quelques-unes.</p>
<p><i>Le coup du &#xAB;&#xA0;j&#x2019;ai oubli&#xE9; de positionner l&#x2019;&#xE9;l&#xE9;ment parent&#xA0;&#xBB;</i></p>
<pre><code>.enfant { position: absolute; top: 0; left: 0;
} /* Ceci a &#xE9;t&#xE9; oubli&#xE9; */
/*
.parent { position: relative; // Ou n&#x2019;importe quelle autre valeur que static.
}
*/</code></pre>
<p>Et c&#x2019;est l&#xE0; que vous vous dites&#xA0;: &#xAB;&#xA0;Hein&#xA0;?! Mais pourquoi est-ce que mon &#xE9;l&#xE9;ment est en haut &#xE0; gauche de la page&#xA0;?&#xA0;&#xBB; Eh oui&#xA0;: vous avez oubli&#xE9; de d&#xE9;finir la position de l&#x2019;&#xE9;l&#xE9;ment parent (<code>relative</code>, <code>absolute</code>, tout ce que vous voulez sauf <code>static</code>).</p>
<p><i>Le coup du &#xAB;&#xA0;contexte d&#x2019;imbrication&#xA0;&#xBB;</i></p>
<pre><code>.parent { z-index: 1; opacity: 0.5; transform: rotate(5deg);
} .enfant { z-index: -1;
}</code></pre>
<p>Tous les d&#xE9;veloppeurs au monde ont bataill&#xE9; au moins une fois sur le sujet de l&#x2019;imbrication de bo&#xEE;tes. En r&#xE9;sum&#xE9;, il est tout simplement impossible d&#x2019;appliquer un <code>z-index</code> &#xE0; un enfant d&#x2019;un &#xE9;l&#xE9;ment (ou d&#x2019;un pseudo-&#xE9;l&#xE9;ment) qui poss&#xE8;de d&#xE9;j&#xE0; un contexte d&#x2019;imbrication (d&#xE9;clench&#xE9; soit par <code>z-index</code>, opacity ou transform)&#xA0;; il n&#x2019;y a pas d&#x2019;autres possibilit&#xE9;s. Une fois que vous ma&#xEE;trisez &#xE7;a, impossible de l&#x2019;oublier, promis.</p>
<p><abbr>NB</abbr>&#xA0;: pour plus d&#x2019;information &#xE0; propos de <code>z-index</code> et de l&#x2019;imbrication <abbr>CSS</abbr>, je vous recommande<a href="http://www.vanseodesign.com/css/css-stack-z-index/" class="spip_out">ce superbe billet</a> de Steven Bradley.</p>
<p><i>Le coup du &#xAB;&#xA0;J&#x2019;ai oubli&#xE9; d&#x2019;effacer le flottant&#xA0;&#xBB;</i><br class="autobr">
Votre mise en page devient folle. Les blocs se baladent n&#x2019;importe o&#xF9;. Vous pleurez sans comprendre les raisons de cet affichage &#xE9;trange. Alors v&#xE9;rifiez vos flottants&#xA0;! Dans la plupart des cas, c&#x2019;est que vous avez oubli&#xE9; de les r&#xE9;initialiser.</p>
<p>Note&#xA0;: dans le cas o&#xF9; un parent contient uniquement des &#xE9;l&#xE9;ments flottants, il va se r&#xE9;duire &#xE0; moins que vous n&#x2019;annulez les flottants, ou alors que vous d&#xE9;finissiez une hauteur ou un <code>overflow</code> (<abbr>NdT</abbr>&#xA0;: propri&#xE9;t&#xE9; d&#xE9;finissant les d&#xE9;passements de blocs ou comment le contenu est rogn&#xE9;&#xA0;: si le contenu d&#xE9;passe les dimensions d&#x2019;un bloc, <code>overflow</code> permet de cacher le contenu, d&#x2019;afficher une barre de d&#xE9;filement ou pas).</p>
<p>Je pourrais continuer pendant des heures sur ces sujets, mais ce n&#x2019;est pas le but de cet article. Je dirais que <strong><abbr>CSS</abbr> pr&#xE9;sente un grand nombre de cas particuliers</strong> et on en d&#xE9;couvre encore chaque jour. Tant que vous ne vous serez pas cass&#xE9; les dents dessus, vous ne saurez pas qu&#x2019;ils existent&#xA0;; mais ensuite, vous saurez comment les traiter.</p>
<h2>3. DRY</h2>
<p>DRY est l&#x2019;acronyme de Don&#x2019;t Repeat Yourself (<i>Ne pas se r&#xE9;p&#xE9;ter</i>, <abbr>NdT</abbr>), et encore une fois ce n&#x2019;est pas sp&#xE9;cifique &#xE0; <abbr>CSS</abbr>. Il s&#x2019;agit plut&#xF4;t d&#x2019;une pratique r&#xE9;pandue lorsque vous codez, quel que soit le langage avec lequel vous avez &#xE0; composer.</p>
<p>Ainsi, l&#x2019;id&#xE9;e principale est d&#x2019;&#xE9;viter de r&#xE9;p&#xE9;ter les m&#xEA;mes bouts de code X fois alors qu&#x2019;une seule fois pourrait suffire. Dans certains langages, cela peut &#xE9;voquer l&#x2019;utilisation d&#x2019;une fonction, mais en <abbr>CSS</abbr>, cela signifie utiliser une classe plut&#xF4;t que cibler un &#xE9;l&#xE9;ment sp&#xE9;cifique (voir plus loin la section concernant OOCSS). Pourtant, parfois il existe une chose vraiment simple comme la mutualisation de son code (<i>refactoring</i>). Laissez-moi vous expliquer.</p>
<p>Si vous &#xEA;tes en pr&#xE9;sence d&#x2019;un bout de code qui est pr&#xE9;sent plusieurs fois dans votre feuille de style, il pourrait &#xEA;tre int&#xE9;ressant de le mutualiser (refactoriser) afin de n&#x2019;avoir plus qu&#x2019;une seule occurrence. Lisez ce qui suit&#xA0;:</p>
<pre><code>.navigation li { color: #333;
} .navigation li a { color: #333;
} /* Mutualis&#xE9; */ .navigation li,
.navigation li a { color: #333;
}</code></pre>
<p>Vous voyez&#xA0;? Vous vous demandez peut-&#xEA;tre quel est l&#x2019;int&#xE9;r&#xEA;t, puisque le r&#xE9;sultat est le m&#xEA;me. Il y a deux choses &#xE0; prendre en compte&#xA0;: <strong>la performance et la facilit&#xE9; de maintenance</strong>.</p>
<p>&#xC0; propos de la performance&#xA0;: moins de lignes de code signifie un parcours plus rapide de la <abbr>CSS</abbr> par le navigateur. Pour faire simple, le navigateur va appliquer la couleur aux deux r&#xE8;gles &#xE0; la fois au lieu de le faire deux fois.</p>
<p>&#xC0; propos de la maintenance, je pense que cela parle de soi-m&#xEA;me. En proc&#xE9;dant de la sorte, vous avez seulement une ligne &#xE0; changer alors qu&#x2019;avant vous deviez en changer deux pour modifier la couleur. Qu&#x2019;en est-il quand vous avez 50 fois ou 300 fois le m&#xEA;me code&#xA0;?</p>
<h4>Plus d&#x2019;informations sur DRY CSS</h4><h2>4. OOCSS</h2><h3>C&#x2019;est quoi ce truc&#xA0;?</h3>
<p>OOCSS est l&#x2019;acronyme d&#x2019;Object-Oriented CSS (<abbr>CSS</abbr> Orient&#xE9; Objet, <abbr>NdT</abbr>) . Vous avez probablement entendu parler de la programmation orient&#xE9;e objet. Il s&#x2019;agit tout bonnement d&#x2019;utiliser des &#xAB;&#xA0;objets&#xA0;&#xBB;, g&#xE9;n&#xE9;ralement des instances de classes (qui se composent d&#x2019;attributs et de m&#xE9;thodes). J&#x2019;imagine que vous vous demandez quel peut &#xEA;tre le rapport avec <abbr>CSS</abbr>&#xA0;?</p>
<p>Premi&#xE8;rement, disons que c&#x2019;est plus un concept ou une bonne pratique qu&#x2019;un vrai principe. <abbr>CSS</abbr> ne peut pas vraiment &#xEA;tre orient&#xE9; objet sachant que ce n&#x2019;est pas un langage de programmation&#xA0;: pas d&#x2019;espace de nommage, pas de fonctions, pas de m&#xE9;thodes, pas de classes de programmation, aucune des instructions conditionnelles, etc. C&#x2019;est pourquoi certaines personnes ricaneront quand vous parlerez d&#x2019;OOCSS.</p>
<p>M&#xEA;me si je suis d&#x2019;accord avec cela, malgr&#xE9; tout nous pouvons encore optimiser notre fa&#xE7;on de coder les <abbr>CSS</abbr> pour faciliter le processus, rendre les sites Web plus rapides et am&#xE9;liorer la maintenabilit&#xE9;.</p>
<h3>Comment faire&#xA0;?</h3>
<p>Pour le dire simplement, cela signifie utiliser des classes. Un grand nombre de classes. Pensez &#xE0; votre site comme s&#x2019;il poss&#xE9;dait des &#xAB;&#xA0;modules&#xA0;&#xBB; ou des &#xAB;&#xA0;composants&#xA0;&#xBB;, si vous voulez. Essayez de rep&#xE9;rer les mod&#xE8;les qui se r&#xE9;p&#xE8;tent pour en faire des &#xAB;&#xA0;objets&#xA0;&#xBB; (classes) afin de les r&#xE9;utiliser.</p>
<p>Pour &#xEA;tre un peu plus pr&#xE9;cis, cela signifie essentiellement deux choses&#xA0;:</p>
<ul class="spip"><li> S&#xE9;parer structure et apparence</li><li> S&#xE9;parer conteneurs et contenu</li></ul><h4>S&#xE9;parer structure et apparence</h4>
<p>S&#xE9;parer la structure et l&#x2019;apparence peut se r&#xE9;v&#xE9;ler important&#xA0;: vous savez que des &#xE9;l&#xE9;ments graphiques peuvent &#xEA;tre utilis&#xE9;s &#xE0; plusieurs endroits sur un site web et sur plusieurs types d&#x2019;&#xE9;l&#xE9;ments&#xAD;&#xAD;&#xAD;&#xAD;, n&#x2019;est-ce pas&#xA0;? Prenez le bout de code suivant, cela peut convenir &#xE0; un bouton, &#xE0; une image, ce que vous voulez&#xA0;:</p>
<pre><code>#mon-bouton,
.ma-boite
.ma-boite img { border: 1px solid #444; border-radius: 5px; box-shadow: 0 0 5px rgba(0,0,0,0.1);
}</code></pre>
<p>Maintenant, au lieu de ce qui pr&#xE9;c&#xE8;de, nous pourrions cr&#xE9;er une classe qu&#x2019;on appellerait &#xAB;&#xA0;habillage&#xA0;&#xBB; (<i>skin</i>) ou quelque chose comme &#xE7;a, et l&#x2019;appliquer aux &#xE9;l&#xE9;ments qui en ont besoin. Le r&#xE9;sultat est beaucoup plus compr&#xE9;hensible, la feuille de style plus maintenable et une interpr&#xE9;tation de classes plus rapide.</p>
<pre><code>.habillage { border: 1px solid #444; border-radius: 5px; box-shadow: 0 0 5px rgba(0,0,0,0.1);
}</code></pre><h4>S&#xE9;parer conteneurs et contenu</h4>
<p>Je pense que c&#x2019;est l&#x2019;une des r&#xE8;gles les plus importantes de OOCSS&#xA0;: coder des composants ind&#xE9;pendants, pas des bouts de code pour un &#xE9;l&#xE9;ment sp&#xE9;cifique de votre mod&#xE8;le. Les choses devraient &#xEA;tre r&#xE9;utilisables, quelle que soit leur place sur votre site Internet, sans les coder &#xE0; nouveau. Prenons l&#x2019;exemple suivant&#xA0;:</p>
<pre><code>#principal h2 { color: #343434; font-size: 25px; line-height: 20px; border-bottom: 1px solid rgba(0,0,0,0.2); box-shadow: 0 1px rgba(255,255,255,0.4);
}</code></pre>
<p>D&#x2019;accord. Maintenant, si je veux exactement le m&#xEA;me style sur un titre de niveau 2 plac&#xE9; dans le pied de page&#xA0;? Ou bien mettre en forme un titre de niveau 3 plac&#xE9; exactement de la m&#xEA;me mani&#xE8;re (quelle qu&#x2019;en soit la raison)&#xA0;? La meilleure fa&#xE7;on de faire consisterait &#xE0; cr&#xE9;er une classe et &#xE0; donner ces styles &#xE0; cette classe, pas aux &#xE9;l&#xE9;ments eux-m&#xEA;mes.</p>
<h3>Qu&#x2019;en est-il du &#xAB;&#xA0;ne jamais utiliser d&#x2019;ID&#xA0;&#xBB;&#xA0;?</h3>
<p>Quand Nicole Sullivan a d&#xE9;couvert le concept de <abbr>CSS</abbr> orient&#xE9;-objet, ce fut un sujet chaud. En effet <a href="http://csslint.net/" class="spip_out">CSSLint</a>, un outil de qualit&#xE9; du code <abbr>CSS</abbr> cr&#xE9;&#xE9; par Nicholas C. Zakas et Nicole Sullivan, d&#xE9;conseille l&#x2019;utilisation des s&#xE9;lecteurs d&#x2019;ID.</p>
<p>Pour comprendre le point de vue de Nicole, il est important de comprendre que les ID peuvent poser certains probl&#xE8;mes de priorit&#xE9;, car ils ont le score le plus &#xE9;lev&#xE9; dans ce domaine. Prenez le code suivant &#xE0; titre d&#x2019;exemple (&#xE0; voir sur <a href="http://csswizardry.com/2011/09/when-using-ids-can-be-a-pain-in-the-class/" class="spip_out">CSSWizardry</a> - <a href="http://jsfiddle.net/csswizardry/gTZGq/1/" class="spip_out">source ici</a>)&#xA0;:</p>
<pre><code>&lt;!-- HTML --&gt;
&lt;div id=&quot;en-tete&quot;&gt; &lt;p&gt; &lt;a href=&quot;#&quot;&gt;Foo&lt;/a&gt; &lt;a href=&quot;#&quot;&gt;Bar&lt;/a&gt; &lt;/p&gt; &lt;div class=&quot;tweet&quot;&gt; &lt;a href=&quot;#&quot;&gt;Suivez-moi sur twitter&lt;/a&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;tweet&quot;&gt; &lt;a href=&quot;#&quot;&gt;Suivez-moi sur twitter&lt;/a&gt;
&lt;/div&gt; /* CSS */
#en-tete a { color: #f90; }
.tweet a { color: #000; }</code></pre>
<p>Pour mettre le premier lien Twitter en noir, vous avez deux options&#xA0;: soit lui donner une ID, soit utiliser le lourdaud <code>&lt;important!&gt;</code>. Si <code>#en-tete</code> &#xE9;tait une classe au lieu d&#x2019;une ID, le probl&#xE8;me n&#x2019;aurait pas exist&#xE9;.</p>
<p>C&#x2019;est en partie la raison pour laquelle Nicole Sullivan a dit &#xAB;&#xA0;pas d&#x2019;ID&#xA0;&#xBB;.</p>
<p>Je finirai cette partie par la citation de <a href="http://csswizardry.com/2011/09/when-using-ids-can-be-a-pain-in-the-class/" class="spip_out">Harry Roberts</a> sur le sujet&#xA0;: &#xAB;&#xA0;[...] J&#x2019;ai d&#xE9;cid&#xE9; qu&#x2019;une interdiction g&#xE9;n&#xE9;rale &#xE9;tait l&#x2019;option la plus logique. &#xC9;pargnez-vous beaucoup de soucis&#xA0;: n&#x2019;utilisez jamais d&#x2019;ID dans vos fichiers <abbr>CSS</abbr>&#xA0;&#xBB;.</p>
<p>Bien s&#xFB;r, il est tout &#xE0; fait possible d&#x2019;utiliser des IDs qui restent parfaitement valides.</p>
<h3>Quel est mon sentiment sur OOCSS&#xA0;?</h3>
<p>En ce qui me concerne, je ne suis pas vraiment un expert sur le sujet. D&#x2019;abord parce que je n&#x2019;ai jamais travaill&#xE9; sur un site &#xE9;norme impliquant de nombreux d&#xE9;veloppeurs front-end. Ne nous leurrons pas, c&#x2019;est sans doute tr&#xE8;s utile pour les sites de grande importance, mais pas forc&#xE9;ment pour le petit site que vous faites pour votre boulanger.<br class="autobr">
Cependant, m&#xEA;me si je n&#x2019;utilise pas OOCSS dans mes projets, j&#x2019;essaie de me concentrer sur les choses importantes comme la r&#xE9;utilisation des composants, la maintenabilit&#xE9; de la feuille de style, la performance et autres. Ce sont les choses sur lesquelles OOCSS se concentre, donc d&#x2019;une certaine fa&#xE7;on, je ne suis pas si loin de la logique.</p>
<h4>Autres ressources sur OOCSS et les IDs</h4><h2>5. <abbr>CSS</abbr>3&#xA0;: d&#xE9;couvrez ce que vous pouvez faire et ce que vous pouvez utiliser</h2>
<p>Bon, assez de concepts. Parlons de choses s&#xE9;rieuses. Parlons un peu de <abbr>CSS</abbr>3. Bien qu&#x2019;en r&#xE9;alit&#xE9; <abbr>CSS</abbr>3 n&#x2019;existe pas en tant que tel&#xA0;:</p>
<blockquote class="spip">
<p>Contrairement &#xE0; <abbr>CSS</abbr>2, qui est une importante sp&#xE9;cification d&#xE9;finissant diverses caract&#xE9;ristiques, <abbr>CSS</abbr>3 est divis&#xE9; en plusieurs documents s&#xE9;par&#xE9;s appel&#xE9;s &#xAB;&#xA0;modules&#xA0;&#xBB;. Chaque module ajoute de nouvelles fonctionnalit&#xE9;s ou &#xE9;tend les fonctions d&#xE9;finies dans <abbr>CSS</abbr>2, sur la pr&#xE9;servation de la r&#xE9;tro-compatibilit&#xE9;. [...] En raison de la modularisation, les diff&#xE9;rents modules sont plus ou moins stables et aboutis.</p>
</blockquote>
<p><i>(Traduction de <a href="http://en.wikipedia.org/wiki/Cascading_Style_Sheets" class="spip_out">Cascading Style Sheets</a> sur Wikipedia EN)</i></p>
<p>Mais entendons-nous sur le fait que nous parlons des nouvelles fonctionnalit&#xE9;s que comprennent les navigateurs modernes.</p>
<p>De nos jours, <abbr>CSS</abbr>3 est partout&#xA0;: des bords arrondis aux d&#xE9;grad&#xE9;s, de la transparence aux ombres et pseudo-&#xE9;l&#xE9;ments.</p>
<h3>Que peut-on faire&#xA0;?</h3>
<p>&#xC0; mon avis, vous pouvez vous servir de <abbr>CSS</abbr>3 pour r&#xE9;duire le nombre de requ&#xEA;tes <abbr>HTTP</abbr> (images), le nombre de balises et la taille des fichiers JavaScript. Voyons cela de plus pr&#xE8;s&#xA0;:</p>
<ul class="spip"><li> Coin arrondi (<code>border-radius</code>)&#xA0;: 1 ligne de <abbr>CSS</abbr> au lieu de 4 conteneurs + 4 images</li><li> Opacit&#xE9; (<code>opacity</code>) et canal alpha de couleur&#xA0;: 1 ligne de <abbr>CSS</abbr> au lieu d&#x2019;un <abbr>PNG</abbr> semi-transparent</li><li> S&#xE9;lecteurs avanc&#xE9;s&#xA0;: pas besoin de JavaScript</li><li> Bo&#xEE;te flexible (<code>flexbox</code>)&#xA0;: quelques lignes de <abbr>CSS</abbr> au lieu de toute une biblioth&#xE8;que JavaScript</li><li> D&#xE9;grad&#xE9;s (<code>gradient</code>)&#xA0;: quelques lignes de <abbr>CSS</abbr> au lieu d&#x2019;une image d&#x2019;arri&#xE8;re-plan r&#xE9;p&#xE9;t&#xE9;e</li><li> Arri&#xE8;res-plans multiples (<code>background</code>)&#xA0;: pas besoin de plusieurs conteneurs</li><li> Pseudo-&#xE9;l&#xE9;ments (<code>pseudo-element</code>)&#xA0;: pas de balises suppl&#xE9;mentaires pour les &#xE9;l&#xE9;ments d&#xE9;coratifs</li></ul>
<p>Et je pourrais continuer longtemps mais je pense que vous avez compris. Ce que je veux faire passer comme message, c&#x2019;est ceci&#xA0;: lancez-vous, et d&#xE9;couvrez tout ce que vous pouvez faire avec <abbr>CSS</abbr>3. Vous devez cr&#xE9;er une table des mati&#xE8;res&#xA0;? Sachez que vous pouvez le faire uniquement avec <abbr>CSS</abbr> gr&#xE2;ce &#xE0; <a href="http://dev.opera.com/articles/view/automatic-numbering-with-css-counters/" class="spip_out">CSS counters</a>. Vous devez d&#xE9;finir une bordure originale personnalis&#xE9;e pour un site&#xA0;? Sachez qu&#x2019;il existe une propri&#xE9;t&#xE9; <a href="http://css-tricks.com/understanding-border-image/" class="spip_out"><code>border-image</code></a> pour l&#x2019;int&#xE9;grer.</p>
<p>Vous pouvez faire un million de choses avec <abbr>CSS</abbr>, et c&#x2019;est encore plus vrai quand il s&#x2019;agit de <abbr>CSS</abbr>3. Il est important de savoir ce que vous pouvez faire ou pas. Malheureusement, il n&#x2019;existe pas de potion magique pour cela, vous devez lire la documentation et faire des exp&#xE9;riences. &#xC0; partir de l&#xE0;, vous apprendrez que vous pouvez faire des calculs avec la propri&#xE9;t&#xE9; <code>calc ()</code>, mais vous ne pourrez pas obtenir 6 colonnes d&#x2019;&#xE9;gale hauteur sans avoir &#xE0; vous battre comme un beau diable.</p>
<h3>Apprendre ce que vous pouvez utiliser</h3>
<p>Le plus gros probl&#xE8;me avec <abbr>CSS</abbr>, c&#x2019;est que tous les navigateurs ne prennent pas en charge les m&#xEA;mes propri&#xE9;t&#xE9;s. Pire, certaines propri&#xE9;t&#xE9;s sont g&#xE9;r&#xE9;es de plusieurs mani&#xE8;res diff&#xE9;rentes quand il s&#x2019;agit de <abbr>CSS</abbr>3. Ce sera votre plus grande mal&#xE9;diction lors de l&#x2019;exp&#xE9;rimentation avec <abbr>CSS</abbr>3.</p>
<p>&#xC0; titre d&#x2019;exemple, prenez la propri&#xE9;t&#xE9; <abbr>CSS</abbr>3 la plus simple&#xA0;: <i>border-radius</i> (coin arrondi). Eh bien, il y a des navigateurs qui ne comprennent pas les coins arrondis (<abbr>IE</abbr>8 + version ant&#xE9;rieure et Opera Mini). En fait, m&#xEA;me Firefox et Chrome n&#x2019;interpr&#xE8;tent pas <code>border-radius</code> de la m&#xEA;me fa&#xE7;on (ou ne l&#x2019;ont pas toujours fait de la m&#xEA;me fa&#xE7;on).</p>
<p>Qu&#x2019;est-ce que cela signifie pour vous en tant que d&#xE9;veloppeur front-end&#xA0;? Cela veut dire que si vous devez afficher des coins arrondis dans tous les navigateurs, vous pouvez le faire &#xE0; l&#x2019;ancienne. Arri&#xE8;re-plans multiples + images multiples, ou alors adopter les deux solutions et servir l&#x2019;une ou l&#x2019;autre en fonction du navigateur.</p>
<p>Quand je dois faire quelque chose en <abbr>CSS</abbr>, voici le processus que je suis&#xA0;:</p>
<ol class="spip"><li> Comment vais-je faire cela&#xA0;?</li><li> D&#x2019;accord, je comprends. Fait-il partie de la sp&#xE9;cification <abbr>CSS</abbr>2.1&#xA0;?
<ol class="spip"><li> Oui&#xA0;: fastoche, fin de l&#x2019;histoire.</li><li> Non, passez &#xE0; l&#x2019;&#xE9;tape 3.</li></ol></li><li> <a href="http://caniuse.com/" class="spip_out">Quelle est la qualit&#xE9; du rendu par les navigateurs ?</a>
<ol class="spip"><li> Bonne&#xA0;: fastoche, fin de l&#x2019;histoire.</li><li> Mauvaise, passez &#xE0; l&#x2019;&#xE9;tape 4.</li></ol></li><li> Est-ce une am&#xE9;lioration ou une fonction vitale&#xA0;?
<ol class="spip"><li> C&#x2019;est juste une am&#xE9;lioration. Je ne fais rien pour les navigateurs non pris en charge ou &#xE0; la limite j&#x2019;ajoute une solution de repli (fallback).</li><li> Il s&#x2019;agit d&#x2019;une caract&#xE9;ristique essentielle&#xA0;: passez &#xE0; l&#x2019;&#xE9;tape 5.</li></ol></li><li> Comment vais-je le faire fonctionner dans les navigateurs non pris en charge&#xA0;?</li></ol>
<p>Prenons un exemple r&#xE9;el, d&#x2019;accord&#xA0;? Avec quelque chose de simple, comme un d&#xE9;grad&#xE9;. Allons-y.</p>
<ol class="spip"><li> Comment vais-je faire cela&#xA0;?</li><li> D&#x2019;accord, je comprends. Fait-il partie de la sp&#xE9;cification <abbr>CSS</abbr>2.1&#xA0;?
<ul class="spip"><li> Non, les d&#xE9;grad&#xE9;s appartiennent &#xE0; <abbr>CSS</abbr>3.</li></ul></li><li> <a href="http://caniuse.com/" class="spip_out">Quelle est la qualit&#xE9; du rendu par les navigateurs ?</a>
<ul class="spip"><li> Pas mal, mais pas parfait. <abbr>IE</abbr>8 + versions ant&#xE9;rieures ainsi qu&#x2019;Opera Mini ne prennent pas en charge les d&#xE9;grad&#xE9;s <abbr>CSS</abbr>.</li></ul></li><li> Est-ce une am&#xE9;lioration ou une fonctionnalit&#xE9; vitale&#xA0;?
<ol class="spip"><li> Il s&#x2019;agit plut&#xF4;t d&#x2019;une am&#xE9;lioration graphique, rien de fondamental. Je vais ajouter une couleur unie comme solution de repli.</li><li> C&#x2019;est un &#xE9;l&#xE9;ment graphique indispensable&#xA0;: je dois le faire fonctionner pour les navigateurs non support&#xE9;s.</li></ol></li><li> Comment vais-je faire pour les anciens navigateurs&#xA0;?
<ul class="spip"><li> Je vais devoir recourir &#xE0; une image d&#x2019;arri&#xE8;re-plan.</li></ul></li></ol>
<p>Gr&#xE2;ce &#xE0; ce processus pas &#xE0; pas, vous savez comment faire quelque chose avec <abbr>CSS</abbr> (si c&#x2019;est faisable), si vous pouvez l&#x2019;utiliser en tenant compte du support des navigateurs et comment cr&#xE9;er des solutions de repli.</p>
<p><abbr>NB</abbr>&#xA0;: souvenez-vous toujours de l&#x2019;audience cible de votre site web ou de votre application. Si vous cr&#xE9;ez du contenu web pour une application iPad, vous pourrez utiliser de nombreuses propri&#xE9;t&#xE9;s <abbr>CSS</abbr>3 sans vous soucier des solutions de repli. Toutefois si vous cr&#xE9;ez un site pour une banque, rappelez-vous que beaucoup de gens utilisent encore IE8 ou des versions plus anciennes encore.</p>
<h3>Fournir des solutions de repli</h3>
<p>Selon la situation, fournir une solution de repli pour les navigateurs non pris en charge peut &#xEA;tre soit ridiculement simple soit extr&#xEA;mement p&#xE9;nible. En effet, il y a des cas diff&#xE9;rents. Regardons cela de plus pr&#xE8;s.</p>
<h4>Pas de solution de repli ou une solution de repli simple</h4>
<p>Quand il y a une am&#xE9;lioration de l&#x2019;exp&#xE9;rience utilisateur dont l&#x2019;absence de prise en charge est sans cons&#xE9;quences, vous n&#x2019;&#xEA;tes m&#xEA;me pas oblig&#xE9;s de fournir une solution de repli. C&#x2019;est appr&#xE9;ciable.</p>
<p>Il y a aussi quelques propri&#xE9;t&#xE9;s qui sont faciles &#xE0; traiter quand il s&#x2019;agit de solution de repli. En g&#xE9;n&#xE9;ral, vous devez seulement &#xE9;crire deux versions de cette propri&#xE9;t&#xE9;&#xA0;: d&#x2019;abord la solution de repli, puis la version correcte pour les navigateurs qui le supportent.</p>
<pre><code>.mon-element { border: 1px solid #666; border: 1px solid rgba(0,0,0,0.3); background: #708090; background: hsl(210, 13%, 50%);
}</code></pre>
<p>Dans ce cas, les navigateurs ne supportant pas <code>rgba</code> et <code>hsl</code> ne liront pas les lignes 3 et 5&#xA0;; de ce fait vous fournissez des versions alternatives aux lignes 2 et 4. Pour les navigateurs pris en charge, ils vont d&#x2019;abord appliquer la version alternative, puis la remplacer par la version correcte.</p>
<h4>Modernizr</h4>
<p>De nos jours, on ne peut gu&#xE8;re parler de <abbr>CSS</abbr>3 sans mentionner <a href="http://modernizr.com/" class="spip_out">Modernizr</a>. Il s&#x2019;agit d&#x2019;une biblioth&#xE8;que JavaScript qui teste la prise en charge des fonctionnalit&#xE9;s HTML5 et <abbr>CSS</abbr>3 au chargement de la page. Cela peut sembler lourd, mais il est bien optimis&#xE9; et assez rapide.</p>
<p>Quoi qu&#x2019;il en soit, parfois, il faut savoir pr&#xE9;cis&#xE9;ment si le navigateur prend en charge une fonctionnalit&#xE9; particuli&#xE8;re. Notamment pour fournir une version alternative n&#xE9;cessitant d&#x2019;autres propri&#xE9;t&#xE9;s <abbr>CSS</abbr>.</p>
<pre><code>/* Version normale */
.menu-deroulant { opacity: 0; pointer-events: none;
} .declencheur:hover .menu-deroulant { opacity: 1; pointer-events: auto;
} /* Solution de repli avec Modernizr */ .no-opacity .menu-deroulant,
.no-pointerevents .menu-deroulant { opacity: 1;
pointer-events: auto;
display: none;
} .no-opacity .declencheur:hover .menu-deroulant,
.no-pointerevents .declencheur:hover .menu-deroulant { display: block;
}</code></pre>
<p>Pour fournir une solution de repli de ce type, les classes ajout&#xE9;es par la biblioth&#xE8;que Javascript Modernizr vous seront d&#x2019;un grand secours (<code>.no-opacity</code> [sans-opacite] et <code>.no-pointerevents</code> [sans-evenementpointeur]). Vous ne pouvez pas avoir les deux versions simultan&#xE9;ment.</p>
<p>Quoi qu&#x2019;il en soit, n&#x2019;oubliez jamais de d&#xE9;finir une solution de repli, c&#x2019;est vraiment important. Les fonctionnalit&#xE9;s majeures doivent &#xEA;tre prises en charge par tous les navigateurs, tant les anciens que les nouveaux, et si ce n&#x2019;est pas le cas partout, vous devez avertir l&#x2019;utilisateur.</p>
<p>Donc, soit vous commencez avec une base simple et l&#x2019;am&#xE9;liorez pour les navigateurs r&#xE9;cents, soit vous commencez avec une base moderne et vous composez pour les navigateurs plus anciens. Voir la section suivante pour plus d&#x2019;informations.</p>
<h4>Autres ressources sur <abbr>CSS</abbr>3&#xA0;:</h4><h2>6. Am&#xE9;lioration progressive et d&#xE9;gradation &#xE9;l&#xE9;gante</h2>
<p>Ce sont deux termes dont vous avez probablement d&#xE9;j&#xE0; entendu parler, en particulier la d&#xE9;gradation &#xE9;l&#xE9;gante, mais il y a une diff&#xE9;rence subtile entre les deux.</p>
<h3>Am&#xE9;lioration progressive</h3>
<p>Le principe de l&#x2019;am&#xE9;lioration progressive est d&#x2019;&#xE9;tablir une base commune de fonctionnalit&#xE9;s et de fonctions disponibles, et ensuite, d&#x2019;am&#xE9;liorer l&#x2019;exp&#xE9;rience utilisateur en fonction de ce que le navigateur prend en charge.</p>
<p>Utiliser l&#x2019;attribut <abbr>HTML</abbr>5 <code>required</code> pour avertir l&#x2019;utilisateur qu&#x2019;un champ est manquant dans un formulaire avant de le soumettre peut &#xEA;tre consid&#xE9;r&#xE9; comme une am&#xE9;lioration progressive. Il s&#x2019;agit d&#x2019;une am&#xE9;lioration de l&#x2019;exp&#xE9;rience utilisateur rendue possible gr&#xE2;ce au moteur natif du navigateur.</p>
<h3>D&#xE9;gradation &#xE9;l&#xE9;gante</h3>
<p>Vous utilisez la d&#xE9;gradation &#xE9;l&#xE9;gante lorsque vous d&#xE9;clinez une version alternative ou inf&#xE9;rieure de vos fonctionnalit&#xE9;s au cas o&#xF9; elles ne sont pas prises en charge. Fondamentalement, on part du plus haut pour aller vers le plus bas.</p>
<p>Un exemple tr&#xE8;s simple serait l&#x2019;avertissement que vous mettez entre les balises <code>&lt;canvas&gt;</code> pour informer les utilisateurs de navigateurs qui ne les prennent pas en charge qu&#x2019;il y a quelque chose qu&#x2019;ils ne peuvent pas voir.</p>
<pre><code>&lt;canvas&gt;
Cette page utilise HTML5 Canvas. Veuillez utiliser un navigateur r&#xE9;cent pour voir ce contenu. Pour obtenir un autre navigateur, allez &#xE0; &lt;a href=&quot;http://browsehappy.com/&quot;&gt;BrowseHappy&lt;/a&gt;
&lt;/canvas&gt;</code></pre><h3>Quelle est la diff&#xE9;rence&#xA0;?</h3>
<p>En fin de compte, il n&#x2019;y en a pas. Vous avez des fonctionnalit&#xE9;s pour les navigateurs r&#xE9;cents et des fonctionnalit&#xE9;s ou des solutions de repli pour les plus anciens. C&#x2019;est plut&#xF4;t une question de proc&#xE9;dure&#xA0;: soit vous codez pour les navigateurs modernes tout en proposant une solution de repli pour les anciens, soit vous le faites dans l&#x2019;autre sens. C&#x2019;est un choix.</p>
<p>En tout cas, je veux redire ici que l&#x2019;exp&#xE9;rience utilisateur n&#x2019;est pas n&#xE9;cessairement la m&#xEA;me dans tous les navigateurs. En fait, ce n&#x2019;est m&#xEA;me pas possible, puisque les moteurs des navigateurs sont diff&#xE9;rents. Quoi qu&#x2019;il en soit, vous devez fournir des fonctionnalit&#xE9;s de base pour tout le monde, mais faites-moi plaisir&#xA0;: am&#xE9;liorez votre site web ou votre application pour les navigateurs modernes. Ils sont bien con&#xE7;us, ils fournissent des fonctionnalit&#xE9;s &#xE0; l&#x2019;&#xE9;tat natif&#xA0;: utilisez-les.</p>
<h4>Lectures compl&#xE9;mentaires sur l&#x2019;am&#xE9;lioration progressive et la d&#xE9;gradation &#xE9;l&#xE9;gante</h4><h2>7. Les pr&#xE9;processeurs <abbr>CSS</abbr> </h2>
<p>Aaaah, les pr&#xE9;processeurs&#x2026; Le sujet chaud du moment. Sont-ils utiles&#xA0;? Pour quoi faire&#xA0;? Devrais-je en employer un&#xA0;? Lequel&#xA0;? Je pense que c&#x2019;est l&#x2019;un des sujets les plus d&#xE9;battus sur <abbr>CSS</abbr> en ce moment.</p>
<p>Je vais essayer d&#x2019;&#xEA;tre aussi objectif que possible dans cette partie. Permettez-moi de commencer par ceci&#xA0;: si vous ne voulez pas utiliser un pr&#xE9;processeur, alors ne le faites pas. Ce ne sera jamais un probl&#xE8;me. Vous ne serez pas un mauvais d&#xE9;veloppeur front-end pour autant. Cela ne vous rendra pas incapable de faire certaines choses. Mais vous devriez, n&#xE9;anmoins, essayer de vous faire votre propre opinion &#xE0; ce sujet.</p>
<p>Ok, j&#x2019;en ai fini avec les pr&#xE9;cautions. Qu&#x2019;est-ce qu&#x2019;un pr&#xE9;processeur, de mani&#xE8;re g&#xE9;n&#xE9;rale&#xA0;? Un pr&#xE9;processeur est une sorte d&#x2019;outil qui compile une syntaxe donn&#xE9;e dans une langue utilis&#xE9;e par un autre programme (dans le cas pr&#xE9;sent&#xA0;: le navigateur). Il y a des pr&#xE9;processeurs pour de nombreux languages&#xA0;: il y a Markdown ou Jade pour le <abbr>HTML</abbr>. Il y a LESS, Sass et Stylus pour <abbr>CSS</abbr>. Il existe CoffeeScript pour JavaScript. Il y a CakePHP pour <abbr>PHP</abbr> et ainsi de suite.</p>
<h3>De quoi parle-t-on&#xA0;?</h3>
<p>Un pr&#xE9;processeur <abbr>CSS</abbr> fournit aux <abbr>CSS</abbr> certaines particularit&#xE9;s &#xE0; partir de langages orient&#xE9;s objet. Des choses comme&#xA0;:</p>
<ul class="spip"><li> les variables</li><li> les fonctions (avec des param&#xE8;tres)</li><li> les espaces de nommages</li><li> l&#x2019;imbrication</li><li> les instructions conditionnelles</li><li> les op&#xE9;rations</li><li> etc.</li></ul>
<p>&#xC7;a a l&#x2019;air attrayant, non&#xA0;? Peut-&#xEA;tre que vous voulez un exemple pour comprendre la mani&#xE8;re dont cela fonctionne. Prenons le <abbr>CSS</abbr> suivant pour une barre de navigation.</p>
<pre><code>.navigation { width: 800px; width: calc(100%-150px);
}
.navigation li { color: #444;
}
.navigation li a { text-decoration: none;
}</code></pre>
<p>Et voici maintenant la version compil&#xE9;e (SCSS)&#xA0;:</p>
<pre><code>$couleur-principale: #444; .navigation { width: (100%-150px); li { color: $couleur-principale; a { text-decoration: none; } }
}</code></pre>
<p>En gros, un pr&#xE9;processeur va interpr&#xE9;ter ceci dans une version <abbr>CSS</abbr> standard. Ce sera exactement la m&#xEA;me chose, sauf pour le calcul. Il lancera l&#x2019;op&#xE9;ration elle-m&#xEA;me et affichera le r&#xE9;sultat correspondant sans qu&#x2019;il soit n&#xE9;cessaire d&#x2019;utiliser une fonction comme <code>calc()</code>.</p>
<p>Donc, vous vous retrouvez avec une feuille de style plus compr&#xE9;hensible (variables et imbrications) et plus facile &#xE0; maintenir (variables et fonctions). C&#x2019;&#xE9;tait un exemple tr&#xE8;s th&#xE9;orique, mais dans un projet r&#xE9;el, vous sentirez la diff&#xE9;rence.</p>
<h3>Comment le choisir&#xA0;?</h3>
<p>Il existe beaucoup de pr&#xE9;processeurs <abbr>CSS</abbr>, chacun avec ses avantages et ses particularit&#xE9;s. Quoi qu&#x2019;il en soit, chacun d&#x2019;entre eux fait plus ou moins la m&#xEA;me chose, donc le choix vous appartient. Voici les principales options quand il s&#x2019;agit de pr&#xE9;processeurs <abbr>CSS</abbr>&#xA0;:</p>
<ul class="spip"><li> <a href="http://sass-lang.com/" class="spip_out">Sass</a> (&#xE9;crit en Ruby)</li><li> <a href="http://lesscss.org/" class="spip_out">LESS</a> (&#xE9;crit en JavaScript)</li><li> <a href="http://learnboost.github.com/stylus/" class="spip_out">Stylus</a> (&#xE9;crit en JavaScript)</li><li> <a href="http://the-echoplex.net/csscrush/" class="spip_out">Crush</a> (&#xE9;crit en <abbr>PHP</abbr>)</li></ul>
<p>L&#x2019;id&#xE9;al, c&#x2019;est d&#x2019;apprendre &#xE0; les conna&#xEE;tre, de les tester et de voir ce qui r&#xE9;pond le mieux &#xE0; vos besoins et &#xE0; votre projet. Il y a plusieurs facteurs qui entrent en jeu&#xA0;; les &#xE9;num&#xE9;rer tous serait hors de la port&#xE9;e de cet article, mais vous pouvez trouver quelques ressources pertinentes ci-dessous.</p>
<h3>Mon sentiment sur les pr&#xE9;processeurs <abbr>CSS</abbr>&#xA0;?</h3>
<p>Je ne suis pas un expert quand il s&#x2019;agit de pr&#xE9;processeurs <abbr>CSS</abbr>, mais j&#x2019;en suis un partisan. Ils fournissent des fonctionnalit&#xE9;s tr&#xE8;s utiles mais qu&#x2019;on ne trouve pas dans les <abbr>CSS</abbr> comme les variables, les d&#xE9;clarations, l&#x2019;imbrication et les conditions.</p>
<p>J&#x2019;ai bricol&#xE9; un peu avec LESS, et il m&#x2019;a fait &#xE0; peu pr&#xE8;s ce que je voulais. Ou du moins, jusqu&#x2019;&#xE0; ce que je commence &#xE0; me lancer dans des choses un peu plus compliqu&#xE9;es que vous avez pu lire dans mon dernier article sur <a href="http://tympanus.net/codrops/2012/11/14/creative-css-loading-animations/" class="spip_out">CSS Loading Animations</a> (pour les boucles + pr&#xE9;fixes vendeurs + <i>keyframes</i>).</p>
<p>J&#x2019;ai aussi jet&#xE9; un coup d&#x2019;&#x153;il rapide &#xE0; Sass et Compass. &#xC0; ma grande surprise, c&#x2019;&#xE9;tait incroyablement facile &#xE0; installer et &#xE0; lancer gr&#xE2;ce &#xE0; Ruby. J&#x2019;avais peur, mais c&#x2019;est tr&#xE8;s tr&#xE8;s intuitif, croyez-moi. En fin de compte, je suis vraiment impressionn&#xE9; par l&#x2019;association Sass + Compass. Vous pouvez &#xE9;galement en savoir plus sur les raisons pour lesquelles je suis pass&#xE9; de LESS &#xE0; Sass dans <a href="http://hugogiraudel.com/blog/less-to-sass.html" class="spip_out">cet article</a> sur mon blog.</p>
<p>Quoi qu&#x2019;il en soit, je suis encore tout &#xE0; fait capable d&#x2019;&#xE9;crire des <abbr>CSS</abbr> classiques sans pr&#xE9;processeur, et la plupart du temps c&#x2019;est ce que je fais. Mais au final, je pense que nous allons tous en utiliser un, quel qu&#x2019;il soit. Il nous manque vraiment certains &#xE9;l&#xE9;ments tr&#xE8;s utiles avec les <abbr>CSS</abbr>, et les pr&#xE9;processeurs <abbr>CSS</abbr> sont l&#xE0; pour y rem&#xE9;dier.</p>
<h4>Lectures compl&#xE9;mentaires sur les pr&#xE9;processeurs <abbr>CSS</abbr></h4><h2>8. Garder un &#x153;il sur l&#x2019;avenir</h2>
<p>Les langages sont en constante &#xE9;volution. C&#x2019;est particuli&#xE8;rement vrai pour les <abbr>CSS</abbr>. Les sp&#xE9;cifications <abbr>CSS</abbr> bougent sans cesse, et les navigateurs ajoutent sans cesse de nouvelles fonctionnalit&#xE9;s &#xE0; leurs moteurs.</p>
<p>&#xC0; ce propos, mon premier conseil serait de rester &#xE0; l&#x2019;&#xE9;coute de ce qui se pr&#xE9;pare. Je sais que vous ne pouvez pas &#xEA;tre en mesure de tout utiliser d&#xE8;s son lancement, mais savoir quelle fonctionnalit&#xE9; est maintenant prise en charge par Canary Chrome, bient&#xF4;t par Chrome version stable et Safari, puis par Opera, Firefox et ainsi de suite, c&#x2019;est important afin de prendre du recul sur les probl&#xE8;mes <abbr>CSS</abbr> et les solutions possibles.</p>
<h4>Ressources pour garder un &#x153;il sur l&#x2019;avenir&#xA0;:</h4><h2>9. Lire le code des autres</h2>
<p>Une des meilleures fa&#xE7;ons d&#x2019;apprendre &#xE0; coder est de lire du code.</p>
<p>Heureusement, le <abbr>CSS</abbr> est visible c&#xF4;t&#xE9; client, ce qui vous permet de le lire sur n&#x2019;importe quel site avec un inspecteur web comme WebKit inspector, Dragonfly, Firebug, etc. De plus, l&#x2019;industrie du web est tr&#xE8;s orient&#xE9;e vers l&#x2019;open-source, ce qui signifie que les gens sont heureux de partager leurs sources avec vous.</p>
<p>Une autre excellente fa&#xE7;on d&#x2019;apprendre est de suivre des tutoriels. Prenez un tutoriel simple, et suivez-le &#xE9;tape par &#xE9;tape. Ensuite, essayez de le refaire &#xE0; partir de z&#xE9;ro. S&#x2019;il vous arrive d&#x2019;&#xEA;tre bloqu&#xE9;, jetez un coup d&#x2019;&#x153;il &#xE0; la solution, puis continuez par vous-m&#xEA;me.</p>
<p>Lorsque vous serez &#xE0; l&#x2019;aise avec <abbr>CSS</abbr> et que vous voudrez entrer finement dans les d&#xE9;tails, vous voudrez peut-&#xEA;tre jeter un &#x153;il &#xE0; des d&#xE9;monstrations et des exp&#xE9;riences qui ne sont pas comment&#xE9;es ni expliqu&#xE9;es. Les gens cr&#xE9;ent des choses tous les jours, et vous tomberez sans arr&#xEA;t sur des choses que vous ne connaissiez pas encore.</p>
<p>&#xC0; ce sujet, il y a quelques mois Chris Coyier, Tim Sabat et Alex Vazquez ont lanc&#xE9; <a href="http://codepen.io/" class="spip_out">CodePen</a>, une sorte de plate-forme pour cr&#xE9;er, partager et explorer du code (<abbr>HTML</abbr>, <abbr>CSS</abbr>, JavaScript). CodePen comprend &#xE9;galement un tas d&#x2019;outils comme les biblioth&#xE8;ques (jQuery, jQuery UI, MooTools, YUI, Prototype, Zepto, Dojo, Ext JS, PrefixFree, etc) et les pr&#xE9;processeurs (<abbr>HAML</abbr>, Markdown, Slim, LESS, SCSS, Sass, CoffeeScript) si vous en avez besoin.</p>
<h4>D&#x2019;autres ressources pour trouver des exemples de code cr&#xE9;&#xE9; par d&#x2019;autres personnes&#xA0;:</h4><ul class="spip"><li> <a href="http://codepen.io/" class="spip_out">CodePen</a></li><li> <a href="http://cssdeck.com/" class="spip_out">CSS Deck</a></li><li> <a href="http://dabblet.com/" class="spip_out">Dabblet</a></li><li> <a href="http://thecodeplayer.com/" class="spip_out">TheCodePlayer</a></li></ul><h2>10. Pratiquez sans rel&#xE2;che</h2>
<p>Vous savez ce qu&#x2019;on dit &#xE0; propos de l&#x2019;apprentissage&#xA0;: <strong>on apprend en faisant</strong>. Donc, mon meilleur conseil est de continuer &#xE0; pratiquer comme pour toute autre chose. Plus vous pratiquez, meilleur vous serez. La pratique ne signifie pas n&#xE9;cessairement faire un site web &#xE0; partir de z&#xE9;ro. Il suffit de choisir une capture simple sur Dribbble et d&#x2019;essayer de la refaire en <abbr>CSS</abbr>. Le r&#xE9;sultat ne sera peut-&#xEA;tre pas utile imm&#xE9;diatement, mais ce que vous avez appris vous sera utile un jour.</p>
<p>Et comme je l&#x2019;ai dit dans la partie &#xAB;&#xA0;Apprendre les bases et quelques astuces&#xA0;&#xBB; de cet article, <abbr>CSS</abbr> est plein de cas particuliers. Vous devrez apprendre &#xE0; les g&#xE9;rer si vous voulez &#xE9;crire des <abbr>CSS</abbr>. Et la seule fa&#xE7;on de conna&#xEE;tre ces cas particuliers consiste &#xE0; pratiquer, d&#xE9;couvrir de nouveaux cas, jeter un &#x153;il &#xE0; la solution, et continuer.</p>
<p>Je vous recommande aussi de partager votre code. Il est toujours utile d&#x2019;obtenir un retour constructif, alors assurez-vous de demander aux gens de v&#xE9;rifier votre code une fois qu&#x2019;il est presque fini. Il suffit de les d&#xE9;poser dans un <a href="http://jsfiddle.net/" class="spip_out">JSFiddle</a>, de partager et de demander des commentaires.</p>
<h2>Sommaire et cr&#xE9;dits</h2>
<p>Comme cet article mentionne un tas de liens et de ressources diverses, autant les rassembler tous au m&#xEA;me endroit&#xA0;:</p> <p>Merci beaucoup d&#x2019;avoir lu cet article. J&#x2019;esp&#xE8;re qu&#x2019;il vous aidera d&#x2019;une mani&#xE8;re ou d&#x2019;une autre &#xE0; am&#xE9;liorer la fa&#xE7;on dont vous apprenez et utilisez les <abbr>CSS</abbr>.</p> </div>]]></description>
      <link>http://www.pompage.net/traduction/ameliorer-vos-feuilles-de-styles</link>
      <guid>http://www.pompage.net/traduction/ameliorer-vos-feuilles-de-styles</guid>
      <pubDate>Thu, 19 Jun 2014 03:06:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Principes à connaître pour améliorer vos feuilles de styles]]></title>
      <description><![CDATA[<div id="article"> <p class="signature">Par <a href="http://hugogiraudel.com/">Hugo Giraudel</a> </p> <p class="moreInfo"> Cet article passe en revue quelques principes de base et astuces tir&#xE9;s de mon exp&#xE9;rience personnelle pour apprendre &#xE0; devenir meilleur en <abbr>CSS</abbr>. Dans cet article, je vais parler avant tout de ma propre exp&#xE9;rience et de ce que j&#x2019;ai appris sur <abbr>CSS</abbr> pendant pr&#xE8;s d&#x2019;un an et demi de pratique intensive. </p> <p>Tout d&#x2019;abord, laissez-moi vous rappeler que <abbr>CSS</abbr> est un langage extr&#xEA;mement simple. Il peut se r&#xE9;sumer en 3 mots&#xA0;: s&#xE9;lecteur, propri&#xE9;t&#xE9;, valeur. Et c&#x2019;est &#xE0; peu pr&#xE8;s tout. C&#x2019;est pourquoi certaines personnes n&#x2019;aiment pas du tout <abbr>CSS</abbr> car elles ont l&#x2019;impression d&#x2019;&#xEA;tre comme des enfants qui jouent aux Legos.</p>
<p>En effet, il suffit d&#x2019;expliquer les bases de <abbr>CSS</abbr> &#xE0; un enfant de 9 ans pour qu&#x2019;il ou elle soit en mesure de cr&#xE9;er un site web. Pas un site compliqu&#xE9; bien entendu, mais peut-&#xEA;tre quelques pages avec des titres, des liens, du contenu, des images, quelque chose dans ce go&#xFB;t-l&#xE0;.</p>
<p>Toutefois, le fait que <abbr>CSS</abbr> soit un langage simple ne veut pas dire que tout le monde soit au m&#xEA;me niveau. Certaines personnes utilisent <abbr>CSS</abbr> comme un chimpanz&#xE9; se sert d&#x2019;une fourchette, certaines personnes se d&#xE9;brouillent pas mal avec et d&#x2019;autres peuvent faire des choses formidables.</p>
<p>De ce que je peux en dire, je m&#x2019;amuse avec <abbr>CSS</abbr> depuis pr&#xE8;s de deux ans maintenant et je pratique &#xE0; un niveau disons &#xAB;&#xA0;intensif&#xA0;&#xBB; depuis pr&#xE8;s de sept mois. Je suis encore loin de la perfection et il y a toujours des astuces que je ne connais pas ou que je ne comprends pas.</p>
<p>Quoi qu&#x2019;il en soit, voici quelques trucs que j&#x2019;ai compris au cours des mois &#xE9;coul&#xE9;s et que j&#x2019;aimerais partager avec vous. Encore une fois ce ne sont pas des bouts de code ou des astuces utiles, ce sont plut&#xF4;t des principes g&#xE9;n&#xE9;raux et des bonnes pratiques. Voici ce que je vais aborder&#xA0;:</p>
<ol class="spip"><li> Ne pas se ruer sur le code et faire simple</li><li> Apprendre les bases et quelques astuces</li><li> Ne pas se r&#xE9;p&#xE9;ter</li><li> <abbr>CSS</abbr> orient&#xE9; objet</li><li> <abbr>CSS</abbr>3&#xA0;: apprendre ce que l&#x2019;on peut faire et ce que l&#x2019;on peut utiliser</li><li> Am&#xE9;lioration progressive et d&#xE9;gradation &#xE9;l&#xE9;gante</li><li> Les pr&#xE9;processeurs <abbr>CSS</abbr></li><li> Garder un &#x153;il sur l&#x2019;avenir</li><li> Lire le code des autres</li><li> Pratiquer sans rel&#xE2;che</li></ol>
<p>Qu&#x2019;en dites-vous&#xA0;? Vous &#xEA;tes pr&#xEA;ts&#xA0;? Allez, c&#x2019;est parti.</p>
<h2>1. Ne vous ruez pas sur le code et faites au plus simple</h2><h3>Ne vous ruez pas sur le code</h3>
<p>C&#x2019;est plut&#xF4;t un conseil g&#xE9;n&#xE9;ral, qui n&#x2019;est pas sp&#xE9;cifique &#xE0; <abbr>CSS</abbr>. Quand vous &#xEA;tes sur le point de commencer &#xE0; d&#xE9;velopper,<strong> r&#xE9;fl&#xE9;chissez d&#x2019;abord &#xE0; ce que vous allez faire</strong>. Posez-vous quelques questions&#xA0;:</p>
<ul class="spip"><li> Comment vais-je faire &#xE7;a&#xA0;?</li><li> Y a-t-il une autre mani&#xE8;re de faire&#xA0;?</li><li> Comment puis-je l&#x2019;optimiser (pour que ce soit maintenable, propre, cool, etc.)&#xA0;?</li></ul>
<p>Commencer &#xE0; coder sans r&#xE9;fl&#xE9;chir peut vous faire perdre du temps. Imaginez-vous passer une heure &#xE0; cr&#xE9;er quelque chose pour vous apercevoir que c&#x2019;est sans issue et que vous devez tout recommencer depuis le d&#xE9;but&#xA0;? C&#x2019;est hors de question.</p>
<p>Passer des heures sur un diaporama en <abbr>CSS</abbr> pour finir avec SlidesJS ou Adaptor, c&#x2019;est vraiment nul. Non pas parce que vous avez &#xE9;chou&#xE9;, mais parce que c&#x2019;&#xE9;tait une perte de temps. Vous pourriez le payer tr&#xE8;s cher, le jour o&#xF9; vous serez soumis &#xE0; des d&#xE9;lais tr&#xE8;s serr&#xE9;s.</p>
<h3>Faites simple</h3>
<p><abbr>CSS</abbr> est un langage simple mais les choses peuvent facilement devenir complexes. Surtout si vous voulez qu&#x2019;elles le deviennent. <strong>Dans la plupart des cas, l&#x2019;id&#xE9;e la plus simple est souvent la meilleure</strong>. Quand vous devez r&#xE9;aliser quelque chose, demandez-vous toujours s&#x2019;il n&#x2019;y a pas un moyen plus simple de le faire. Vous seriez surpris du nombre de fois o&#xF9; la r&#xE9;ponse est &#xAB;&#xA0;oui&#xA0;&#xBB;.</p>
<p>Par exemple, si vous voulez coder une barre de navigation horizontale vraiment simple qui ne comporte que des liens, vous avez plusieurs fa&#xE7;ons de faire&#xA0;:</p>
<ul class="spip"><li> Faire flotter les &#xE9;l&#xE9;ments de la liste</li><li> Passer les &#xE9;l&#xE9;ments de la liste en ligne</li><li> Passer les &#xE9;l&#xE9;ments de la liste en blocs en ligne (<code>inline-block</code>)</li></ul>
<p>Choisissez le plus simple et transformez les &#xE9;l&#xE9;ments de liste en &#xE9;l&#xE9;ments en ligne. Pas besoin de <i>hack</i> pour nettoyer les flottants. Pas besoin de corriger l&#x2019;espacement des &#xE9;l&#xE9;ments en ligne. Il y a juste besoin d&#x2019;un espacement interne classique, rien de plus. Fin de chantier.</p>
<h2>2. Conna&#xEE;tre les bases et apprendre les astuces</h2>
<p>Pour devenir bon en <abbr>CSS</abbr> ou quoi que ce soit d&#x2019;autre dans la vie, vous devez conna&#xEE;tre les bases. Vous ne deviendrez jamais un expert si vous n&#x2019;&#xEA;tes pas &#xE0; l&#x2019;aise avec les bases de la discipline.</p>
<h3>Les bases de <abbr>CSS</abbr></h3>
<p>Quelles sont les bases de <abbr>CSS</abbr>&#xA0;? Selon les personnes, vous aurez droit &#xE0; diff&#xE9;rentes versions, c&#x2019;est plus de l&#x2019;ordre du ressenti, mais si vous voulez mon avis, il y a deux choses &#xE0; comprendre avant tout pour vraiment se familiariser avec <abbr>CSS</abbr>&#xA0;:</p>
<ul class="spip"><li> <strong>Le mod&#xE8;le de bo&#xEE;te</strong>. Chaque &#xE9;l&#xE9;ment en <abbr>CSS</abbr> est une bo&#xEE;te (de type bloc ou en ligne) avec une largeur, une hauteur, et &#xE9;ventuellement des espacements, des marges et des bordures. C&#x2019;est la chose la plus importante &#xE0; savoir. Vous en saurez davantage <a href="http://www.w3.org/TR/CSS2/box.html" class="spip_out">ici</a>.</li><li> <strong>La sp&#xE9;cificit&#xE9;</strong>. Pour pouvoir corriger vos <abbr>CSS</abbr>, il est essentiel de savoir quelle r&#xE8;gle est plus forte que quelle autre. Pour plus d&#x2019;informations sur le sujet, lisez les sp&#xE9;cifications&#xA0;: <a href="http://www.w3.org/TR/CSS2/cascade.html" class="spip_out">L&#x2019;assignation des valeurs des propri&#xE9;t&#xE9;s, la cascade et l&#x2019;h&#xE9;ritage</a>.</li></ul><h3>Les astuces</h3>
<p>Une fois que vous avez compris &#xE7;a, vous &#xEA;tes sur la bonne voie. &#xC0; partir de l&#xE0;, vous n&#x2019;aurez qu&#x2019;&#xE0; apprendre quelques astuces pour vous d&#xE9;brouiller avec les cas sp&#xE9;cifiques. Et vous n&#x2019;avez pas fini d&#x2019;en croiser. Laissez-moi vous en montrer quelques-unes.</p>
<p><i>Le coup du &#xAB;&#xA0;j&#x2019;ai oubli&#xE9; de positionner l&#x2019;&#xE9;l&#xE9;ment parent&#xA0;&#xBB;</i></p>
<pre><code>.enfant { position: absolute; top: 0; left: 0;
} /* Ceci a &#xE9;t&#xE9; oubli&#xE9; */
/*
.parent { position: relative; // Ou n&#x2019;importe quelle autre valeur que static.
}
*/</code></pre>
<p>Et c&#x2019;est l&#xE0; que vous vous dites&#xA0;: &#xAB;&#xA0;Hein&#xA0;?! Mais pourquoi est-ce que mon &#xE9;l&#xE9;ment est en haut &#xE0; gauche de la page&#xA0;?&#xA0;&#xBB; Eh oui&#xA0;: vous avez oubli&#xE9; de d&#xE9;finir la position de l&#x2019;&#xE9;l&#xE9;ment parent (<code>relative</code>, <code>absolute</code>, tout ce que vous voulez sauf <code>static</code>).</p>
<p><i>Le coup du &#xAB;&#xA0;contexte d&#x2019;imbrication&#xA0;&#xBB;</i></p>
<pre><code>.parent { z-index: 1; opacity: 0.5; transform: rotate(5deg);
} .enfant { z-index: -1;
}</code></pre>
<p>Tous les d&#xE9;veloppeurs au monde ont bataill&#xE9; au moins une fois sur le sujet de l&#x2019;imbrication de bo&#xEE;tes. En r&#xE9;sum&#xE9;, il est tout simplement impossible d&#x2019;appliquer un <code>z-index</code> &#xE0; un enfant d&#x2019;un &#xE9;l&#xE9;ment (ou d&#x2019;un pseudo-&#xE9;l&#xE9;ment) qui poss&#xE8;de d&#xE9;j&#xE0; un contexte d&#x2019;imbrication (d&#xE9;clench&#xE9; soit par <code>z-index</code>, opacity ou transform)&#xA0;; il n&#x2019;y a pas d&#x2019;autres possibilit&#xE9;s. Une fois que vous ma&#xEE;trisez &#xE7;a, impossible de l&#x2019;oublier, promis.</p>
<p><abbr>NB</abbr>&#xA0;: pour plus d&#x2019;information &#xE0; propos de <code>z-index</code> et de l&#x2019;imbrication <abbr>CSS</abbr>, je vous recommande<a href="http://www.vanseodesign.com/css/css-stack-z-index/" class="spip_out">ce superbe billet</a> de Steven Bradley.</p>
<p><i>Le coup du &#xAB;&#xA0;J&#x2019;ai oubli&#xE9; d&#x2019;effacer le flottant&#xA0;&#xBB;</i><br class="autobr">
Votre mise en page devient folle. Les blocs se baladent n&#x2019;importe o&#xF9;. Vous pleurez sans comprendre les raisons de cet affichage &#xE9;trange. Alors v&#xE9;rifiez vos flottants&#xA0;! Dans la plupart des cas, c&#x2019;est que vous avez oubli&#xE9; de les r&#xE9;initialiser.</p>
<p>Note&#xA0;: dans le cas o&#xF9; un parent contient uniquement des &#xE9;l&#xE9;ments flottants, il va se r&#xE9;duire &#xE0; moins que vous n&#x2019;annulez les flottants, ou alors que vous d&#xE9;finissiez une hauteur ou un <code>overflow</code> (<abbr>NdT</abbr>&#xA0;: propri&#xE9;t&#xE9; d&#xE9;finissant les d&#xE9;passements de blocs ou comment le contenu est rogn&#xE9;&#xA0;: si le contenu d&#xE9;passe les dimensions d&#x2019;un bloc, <code>overflow</code> permet de cacher le contenu, d&#x2019;afficher une barre de d&#xE9;filement ou pas).</p>
<p>Je pourrais continuer pendant des heures sur ces sujets, mais ce n&#x2019;est pas le but de cet article. Je dirais que <strong><abbr>CSS</abbr> pr&#xE9;sente un grand nombre de cas particuliers</strong> et on en d&#xE9;couvre encore chaque jour. Tant que vous ne vous serez pas cass&#xE9; les dents dessus, vous ne saurez pas qu&#x2019;ils existent&#xA0;; mais ensuite, vous saurez comment les traiter.</p>
<h2>3. DRY</h2>
<p>DRY est l&#x2019;acronyme de Don&#x2019;t Repeat Yourself (<i>Ne pas se r&#xE9;p&#xE9;ter</i>, <abbr>NdT</abbr>), et encore une fois ce n&#x2019;est pas sp&#xE9;cifique &#xE0; <abbr>CSS</abbr>. Il s&#x2019;agit plut&#xF4;t d&#x2019;une pratique r&#xE9;pandue lorsque vous codez, quel que soit le langage avec lequel vous avez &#xE0; composer.</p>
<p>Ainsi, l&#x2019;id&#xE9;e principale est d&#x2019;&#xE9;viter de r&#xE9;p&#xE9;ter les m&#xEA;mes bouts de code X fois alors qu&#x2019;une seule fois pourrait suffire. Dans certains langages, cela peut &#xE9;voquer l&#x2019;utilisation d&#x2019;une fonction, mais en <abbr>CSS</abbr>, cela signifie utiliser une classe plut&#xF4;t que cibler un &#xE9;l&#xE9;ment sp&#xE9;cifique (voir plus loin la section concernant OOCSS). Pourtant, parfois il existe une chose vraiment simple comme la mutualisation de son code (<i>refactoring</i>). Laissez-moi vous expliquer.</p>
<p>Si vous &#xEA;tes en pr&#xE9;sence d&#x2019;un bout de code qui est pr&#xE9;sent plusieurs fois dans votre feuille de style, il pourrait &#xEA;tre int&#xE9;ressant de le mutualiser (refactoriser) afin de n&#x2019;avoir plus qu&#x2019;une seule occurrence. Lisez ce qui suit&#xA0;:</p>
<pre><code>.navigation li { color: #333;
} .navigation li a { color: #333;
} /* Mutualis&#xE9; */ .navigation li,
.navigation li a { color: #333;
}</code></pre>
<p>Vous voyez&#xA0;? Vous vous demandez peut-&#xEA;tre quel est l&#x2019;int&#xE9;r&#xEA;t, puisque le r&#xE9;sultat est le m&#xEA;me. Il y a deux choses &#xE0; prendre en compte&#xA0;: <strong>la performance et la facilit&#xE9; de maintenance</strong>.</p>
<p>&#xC0; propos de la performance&#xA0;: moins de lignes de code signifie un parcours plus rapide de la <abbr>CSS</abbr> par le navigateur. Pour faire simple, le navigateur va appliquer la couleur aux deux r&#xE8;gles &#xE0; la fois au lieu de le faire deux fois.</p>
<p>&#xC0; propos de la maintenance, je pense que cela parle de soi-m&#xEA;me. En proc&#xE9;dant de la sorte, vous avez seulement une ligne &#xE0; changer alors qu&#x2019;avant vous deviez en changer deux pour modifier la couleur. Qu&#x2019;en est-il quand vous avez 50 fois ou 300 fois le m&#xEA;me code&#xA0;?</p>
<h4>Plus d&#x2019;informations sur DRY CSS</h4><h2>4. OOCSS</h2><h3>C&#x2019;est quoi ce truc&#xA0;?</h3>
<p>OOCSS est l&#x2019;acronyme d&#x2019;Object-Oriented CSS (<abbr>CSS</abbr> Orient&#xE9; Objet, <abbr>NdT</abbr>) . Vous avez probablement entendu parler de la programmation orient&#xE9;e objet. Il s&#x2019;agit tout bonnement d&#x2019;utiliser des &#xAB;&#xA0;objets&#xA0;&#xBB;, g&#xE9;n&#xE9;ralement des instances de classes (qui se composent d&#x2019;attributs et de m&#xE9;thodes). J&#x2019;imagine que vous vous demandez quel peut &#xEA;tre le rapport avec <abbr>CSS</abbr>&#xA0;?</p>
<p>Premi&#xE8;rement, disons que c&#x2019;est plus un concept ou une bonne pratique qu&#x2019;un vrai principe. <abbr>CSS</abbr> ne peut pas vraiment &#xEA;tre orient&#xE9; objet sachant que ce n&#x2019;est pas un langage de programmation&#xA0;: pas d&#x2019;espace de nommage, pas de fonctions, pas de m&#xE9;thodes, pas de classes de programmation, aucune des instructions conditionnelles, etc. C&#x2019;est pourquoi certaines personnes ricaneront quand vous parlerez d&#x2019;OOCSS.</p>
<p>M&#xEA;me si je suis d&#x2019;accord avec cela, malgr&#xE9; tout nous pouvons encore optimiser notre fa&#xE7;on de coder les <abbr>CSS</abbr> pour faciliter le processus, rendre les sites Web plus rapides et am&#xE9;liorer la maintenabilit&#xE9;.</p>
<h3>Comment faire&#xA0;?</h3>
<p>Pour le dire simplement, cela signifie utiliser des classes. Un grand nombre de classes. Pensez &#xE0; votre site comme s&#x2019;il poss&#xE9;dait des &#xAB;&#xA0;modules&#xA0;&#xBB; ou des &#xAB;&#xA0;composants&#xA0;&#xBB;, si vous voulez. Essayez de rep&#xE9;rer les mod&#xE8;les qui se r&#xE9;p&#xE8;tent pour en faire des &#xAB;&#xA0;objets&#xA0;&#xBB; (classes) afin de les r&#xE9;utiliser.</p>
<p>Pour &#xEA;tre un peu plus pr&#xE9;cis, cela signifie essentiellement deux choses&#xA0;:</p>
<ul class="spip"><li> S&#xE9;parer structure et apparence</li><li> S&#xE9;parer conteneurs et contenu</li></ul><h4>S&#xE9;parer structure et apparence</h4>
<p>S&#xE9;parer la structure et l&#x2019;apparence peut se r&#xE9;v&#xE9;ler important&#xA0;: vous savez que des &#xE9;l&#xE9;ments graphiques peuvent &#xEA;tre utilis&#xE9;s &#xE0; plusieurs endroits sur un site web et sur plusieurs types d&#x2019;&#xE9;l&#xE9;ments&#xAD;&#xAD;&#xAD;&#xAD;, n&#x2019;est-ce pas&#xA0;? Prenez le bout de code suivant, cela peut convenir &#xE0; un bouton, &#xE0; une image, ce que vous voulez&#xA0;:</p>
<pre><code>#mon-bouton,
.ma-boite
.ma-boite img { border: 1px solid #444; border-radius: 5px; box-shadow: 0 0 5px rgba(0,0,0,0.1);
}</code></pre>
<p>Maintenant, au lieu de ce qui pr&#xE9;c&#xE8;de, nous pourrions cr&#xE9;er une classe qu&#x2019;on appellerait &#xAB;&#xA0;habillage&#xA0;&#xBB; (<i>skin</i>) ou quelque chose comme &#xE7;a, et l&#x2019;appliquer aux &#xE9;l&#xE9;ments qui en ont besoin. Le r&#xE9;sultat est beaucoup plus compr&#xE9;hensible, la feuille de style plus maintenable et une interpr&#xE9;tation de classes plus rapide.</p>
<pre><code>.habillage { border: 1px solid #444; border-radius: 5px; box-shadow: 0 0 5px rgba(0,0,0,0.1);
}</code></pre><h4>S&#xE9;parer conteneurs et contenu</h4>
<p>Je pense que c&#x2019;est l&#x2019;une des r&#xE8;gles les plus importantes de OOCSS&#xA0;: coder des composants ind&#xE9;pendants, pas des bouts de code pour un &#xE9;l&#xE9;ment sp&#xE9;cifique de votre mod&#xE8;le. Les choses devraient &#xEA;tre r&#xE9;utilisables, quelle que soit leur place sur votre site Internet, sans les coder &#xE0; nouveau. Prenons l&#x2019;exemple suivant&#xA0;:</p>
<pre><code>#principal h2 { color: #343434; font-size: 25px; line-height: 20px; border-bottom: 1px solid rgba(0,0,0,0.2); box-shadow: 0 1px rgba(255,255,255,0.4);
}</code></pre>
<p>D&#x2019;accord. Maintenant, si je veux exactement le m&#xEA;me style sur un titre de niveau 2 plac&#xE9; dans le pied de page&#xA0;? Ou bien mettre en forme un titre de niveau 3 plac&#xE9; exactement de la m&#xEA;me mani&#xE8;re (quelle qu&#x2019;en soit la raison)&#xA0;? La meilleure fa&#xE7;on de faire consisterait &#xE0; cr&#xE9;er une classe et &#xE0; donner ces styles &#xE0; cette classe, pas aux &#xE9;l&#xE9;ments eux-m&#xEA;mes.</p>
<h3>Qu&#x2019;en est-il du &#xAB;&#xA0;ne jamais utiliser d&#x2019;ID&#xA0;&#xBB;&#xA0;?</h3>
<p>Quand Nicole Sullivan a d&#xE9;couvert le concept de <abbr>CSS</abbr> orient&#xE9;-objet, ce fut un sujet chaud. En effet <a href="http://csslint.net/" class="spip_out">CSSLint</a>, un outil de qualit&#xE9; du code <abbr>CSS</abbr> cr&#xE9;&#xE9; par Nicholas C. Zakas et Nicole Sullivan, d&#xE9;conseille l&#x2019;utilisation des s&#xE9;lecteurs d&#x2019;ID.</p>
<p>Pour comprendre le point de vue de Nicole, il est important de comprendre que les ID peuvent poser certains probl&#xE8;mes de priorit&#xE9;, car ils ont le score le plus &#xE9;lev&#xE9; dans ce domaine. Prenez le code suivant &#xE0; titre d&#x2019;exemple (&#xE0; voir sur <a href="http://csswizardry.com/2011/09/when-using-ids-can-be-a-pain-in-the-class/" class="spip_out">CSSWizardry</a> - <a href="http://jsfiddle.net/csswizardry/gTZGq/1/" class="spip_out">source ici</a>)&#xA0;:</p>
<pre><code>&lt;!-- HTML --&gt;
&lt;div id=&quot;en-tete&quot;&gt; &lt;p&gt; &lt;a href=&quot;#&quot;&gt;Foo&lt;/a&gt; &lt;a href=&quot;#&quot;&gt;Bar&lt;/a&gt; &lt;/p&gt; &lt;div class=&quot;tweet&quot;&gt; &lt;a href=&quot;#&quot;&gt;Suivez-moi sur twitter&lt;/a&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;tweet&quot;&gt; &lt;a href=&quot;#&quot;&gt;Suivez-moi sur twitter&lt;/a&gt;
&lt;/div&gt; /* CSS */
#en-tete a { color: #f90; }
.tweet a { color: #000; }</code></pre>
<p>Pour mettre le premier lien Twitter en noir, vous avez deux options&#xA0;: soit lui donner une ID, soit utiliser le lourdaud <code>&lt;important!&gt;</code>. Si <code>#en-tete</code> &#xE9;tait une classe au lieu d&#x2019;une ID, le probl&#xE8;me n&#x2019;aurait pas exist&#xE9;.</p>
<p>C&#x2019;est en partie la raison pour laquelle Nicole Sullivan a dit &#xAB;&#xA0;pas d&#x2019;ID&#xA0;&#xBB;.</p>
<p>Je finirai cette partie par la citation de <a href="http://csswizardry.com/2011/09/when-using-ids-can-be-a-pain-in-the-class/" class="spip_out">Harry Roberts</a> sur le sujet&#xA0;: &#xAB;&#xA0;[...] J&#x2019;ai d&#xE9;cid&#xE9; qu&#x2019;une interdiction g&#xE9;n&#xE9;rale &#xE9;tait l&#x2019;option la plus logique. &#xC9;pargnez-vous beaucoup de soucis&#xA0;: n&#x2019;utilisez jamais d&#x2019;ID dans vos fichiers <abbr>CSS</abbr>&#xA0;&#xBB;.</p>
<p>Bien s&#xFB;r, il est tout &#xE0; fait possible d&#x2019;utiliser des IDs qui restent parfaitement valides.</p>
<h3>Quel est mon sentiment sur OOCSS&#xA0;?</h3>
<p>En ce qui me concerne, je ne suis pas vraiment un expert sur le sujet. D&#x2019;abord parce que je n&#x2019;ai jamais travaill&#xE9; sur un site &#xE9;norme impliquant de nombreux d&#xE9;veloppeurs front-end. Ne nous leurrons pas, c&#x2019;est sans doute tr&#xE8;s utile pour les sites de grande importance, mais pas forc&#xE9;ment pour le petit site que vous faites pour votre boulanger.<br class="autobr">
Cependant, m&#xEA;me si je n&#x2019;utilise pas OOCSS dans mes projets, j&#x2019;essaie de me concentrer sur les choses importantes comme la r&#xE9;utilisation des composants, la maintenabilit&#xE9; de la feuille de style, la performance et autres. Ce sont les choses sur lesquelles OOCSS se concentre, donc d&#x2019;une certaine fa&#xE7;on, je ne suis pas si loin de la logique.</p>
<h4>Autres ressources sur OOCSS et les IDs</h4><h2>5. <abbr>CSS</abbr>3&#xA0;: d&#xE9;couvrez ce que vous pouvez faire et ce que vous pouvez utiliser</h2>
<p>Bon, assez de concepts. Parlons de choses s&#xE9;rieuses. Parlons un peu de <abbr>CSS</abbr>3. Bien qu&#x2019;en r&#xE9;alit&#xE9; <abbr>CSS</abbr>3 n&#x2019;existe pas en tant que tel&#xA0;:</p>
<blockquote class="spip">
<p>Contrairement &#xE0; <abbr>CSS</abbr>2, qui est une importante sp&#xE9;cification d&#xE9;finissant diverses caract&#xE9;ristiques, <abbr>CSS</abbr>3 est divis&#xE9; en plusieurs documents s&#xE9;par&#xE9;s appel&#xE9;s &#xAB;&#xA0;modules&#xA0;&#xBB;. Chaque module ajoute de nouvelles fonctionnalit&#xE9;s ou &#xE9;tend les fonctions d&#xE9;finies dans <abbr>CSS</abbr>2, sur la pr&#xE9;servation de la r&#xE9;tro-compatibilit&#xE9;. [...] En raison de la modularisation, les diff&#xE9;rents modules sont plus ou moins stables et aboutis.</p>
</blockquote>
<p><i>(Traduction de <a href="http://en.wikipedia.org/wiki/Cascading_Style_Sheets" class="spip_out">Cascading Style Sheets</a> sur Wikipedia EN)</i></p>
<p>Mais entendons-nous sur le fait que nous parlons des nouvelles fonctionnalit&#xE9;s que comprennent les navigateurs modernes.</p>
<p>De nos jours, <abbr>CSS</abbr>3 est partout&#xA0;: des bords arrondis aux d&#xE9;grad&#xE9;s, de la transparence aux ombres et pseudo-&#xE9;l&#xE9;ments.</p>
<h3>Que peut-on faire&#xA0;?</h3>
<p>&#xC0; mon avis, vous pouvez vous servir de <abbr>CSS</abbr>3 pour r&#xE9;duire le nombre de requ&#xEA;tes <abbr>HTTP</abbr> (images), le nombre de balises et la taille des fichiers JavaScript. Voyons cela de plus pr&#xE8;s&#xA0;:</p>
<ul class="spip"><li> Coin arrondi (<code>border-radius</code>)&#xA0;: 1 ligne de <abbr>CSS</abbr> au lieu de 4 conteneurs + 4 images</li><li> Opacit&#xE9; (<code>opacity</code>) et canal alpha de couleur&#xA0;: 1 ligne de <abbr>CSS</abbr> au lieu d&#x2019;un <abbr>PNG</abbr> semi-transparent</li><li> S&#xE9;lecteurs avanc&#xE9;s&#xA0;: pas besoin de JavaScript</li><li> Bo&#xEE;te flexible (<code>flexbox</code>)&#xA0;: quelques lignes de <abbr>CSS</abbr> au lieu de toute une biblioth&#xE8;que JavaScript</li><li> D&#xE9;grad&#xE9;s (<code>gradient</code>)&#xA0;: quelques lignes de <abbr>CSS</abbr> au lieu d&#x2019;une image d&#x2019;arri&#xE8;re-plan r&#xE9;p&#xE9;t&#xE9;e</li><li> Arri&#xE8;res-plans multiples (<code>background</code>)&#xA0;: pas besoin de plusieurs conteneurs</li><li> Pseudo-&#xE9;l&#xE9;ments (<code>pseudo-element</code>)&#xA0;: pas de balises suppl&#xE9;mentaires pour les &#xE9;l&#xE9;ments d&#xE9;coratifs</li></ul>
<p>Et je pourrais continuer longtemps mais je pense que vous avez compris. Ce que je veux faire passer comme message, c&#x2019;est ceci&#xA0;: lancez-vous, et d&#xE9;couvrez tout ce que vous pouvez faire avec <abbr>CSS</abbr>3. Vous devez cr&#xE9;er une table des mati&#xE8;res&#xA0;? Sachez que vous pouvez le faire uniquement avec <abbr>CSS</abbr> gr&#xE2;ce &#xE0; <a href="http://dev.opera.com/articles/view/automatic-numbering-with-css-counters/" class="spip_out">CSS counters</a>. Vous devez d&#xE9;finir une bordure originale personnalis&#xE9;e pour un site&#xA0;? Sachez qu&#x2019;il existe une propri&#xE9;t&#xE9; <a href="http://css-tricks.com/understanding-border-image/" class="spip_out"><code>border-image</code></a> pour l&#x2019;int&#xE9;grer.</p>
<p>Vous pouvez faire un million de choses avec <abbr>CSS</abbr>, et c&#x2019;est encore plus vrai quand il s&#x2019;agit de <abbr>CSS</abbr>3. Il est important de savoir ce que vous pouvez faire ou pas. Malheureusement, il n&#x2019;existe pas de potion magique pour cela, vous devez lire la documentation et faire des exp&#xE9;riences. &#xC0; partir de l&#xE0;, vous apprendrez que vous pouvez faire des calculs avec la propri&#xE9;t&#xE9; <code>calc ()</code>, mais vous ne pourrez pas obtenir 6 colonnes d&#x2019;&#xE9;gale hauteur sans avoir &#xE0; vous battre comme un beau diable.</p>
<h3>Apprendre ce que vous pouvez utiliser</h3>
<p>Le plus gros probl&#xE8;me avec <abbr>CSS</abbr>, c&#x2019;est que tous les navigateurs ne prennent pas en charge les m&#xEA;mes propri&#xE9;t&#xE9;s. Pire, certaines propri&#xE9;t&#xE9;s sont g&#xE9;r&#xE9;es de plusieurs mani&#xE8;res diff&#xE9;rentes quand il s&#x2019;agit de <abbr>CSS</abbr>3. Ce sera votre plus grande mal&#xE9;diction lors de l&#x2019;exp&#xE9;rimentation avec <abbr>CSS</abbr>3.</p>
<p>&#xC0; titre d&#x2019;exemple, prenez la propri&#xE9;t&#xE9; <abbr>CSS</abbr>3 la plus simple&#xA0;: <i>border-radius</i> (coin arrondi). Eh bien, il y a des navigateurs qui ne comprennent pas les coins arrondis (<abbr>IE</abbr>8 + version ant&#xE9;rieure et Opera Mini). En fait, m&#xEA;me Firefox et Chrome n&#x2019;interpr&#xE8;tent pas <code>border-radius</code> de la m&#xEA;me fa&#xE7;on (ou ne l&#x2019;ont pas toujours fait de la m&#xEA;me fa&#xE7;on).</p>
<p>Qu&#x2019;est-ce que cela signifie pour vous en tant que d&#xE9;veloppeur front-end&#xA0;? Cela veut dire que si vous devez afficher des coins arrondis dans tous les navigateurs, vous pouvez le faire &#xE0; l&#x2019;ancienne. Arri&#xE8;re-plans multiples + images multiples, ou alors adopter les deux solutions et servir l&#x2019;une ou l&#x2019;autre en fonction du navigateur.</p>
<p>Quand je dois faire quelque chose en <abbr>CSS</abbr>, voici le processus que je suis&#xA0;:</p>
<ol class="spip"><li> Comment vais-je faire cela&#xA0;?</li><li> D&#x2019;accord, je comprends. Fait-il partie de la sp&#xE9;cification <abbr>CSS</abbr>2.1&#xA0;?
<ol class="spip"><li> Oui&#xA0;: fastoche, fin de l&#x2019;histoire.</li><li> Non, passez &#xE0; l&#x2019;&#xE9;tape 3.</li></ol></li><li> <a href="http://caniuse.com/" class="spip_out">Quelle est la qualit&#xE9; du rendu par les navigateurs ?</a>
<ol class="spip"><li> Bonne&#xA0;: fastoche, fin de l&#x2019;histoire.</li><li> Mauvaise, passez &#xE0; l&#x2019;&#xE9;tape 4.</li></ol></li><li> Est-ce une am&#xE9;lioration ou une fonction vitale&#xA0;?
<ol class="spip"><li> C&#x2019;est juste une am&#xE9;lioration. Je ne fais rien pour les navigateurs non pris en charge ou &#xE0; la limite j&#x2019;ajoute une solution de repli (fallback).</li><li> Il s&#x2019;agit d&#x2019;une caract&#xE9;ristique essentielle&#xA0;: passez &#xE0; l&#x2019;&#xE9;tape 5.</li></ol></li><li> Comment vais-je le faire fonctionner dans les navigateurs non pris en charge&#xA0;?</li></ol>
<p>Prenons un exemple r&#xE9;el, d&#x2019;accord&#xA0;? Avec quelque chose de simple, comme un d&#xE9;grad&#xE9;. Allons-y.</p>
<ol class="spip"><li> Comment vais-je faire cela&#xA0;?</li><li> D&#x2019;accord, je comprends. Fait-il partie de la sp&#xE9;cification <abbr>CSS</abbr>2.1&#xA0;?
<ul class="spip"><li> Non, les d&#xE9;grad&#xE9;s appartiennent &#xE0; <abbr>CSS</abbr>3.</li></ul></li><li> <a href="http://caniuse.com/" class="spip_out">Quelle est la qualit&#xE9; du rendu par les navigateurs ?</a>
<ul class="spip"><li> Pas mal, mais pas parfait. <abbr>IE</abbr>8 + versions ant&#xE9;rieures ainsi qu&#x2019;Opera Mini ne prennent pas en charge les d&#xE9;grad&#xE9;s <abbr>CSS</abbr>.</li></ul></li><li> Est-ce une am&#xE9;lioration ou une fonctionnalit&#xE9; vitale&#xA0;?
<ol class="spip"><li> Il s&#x2019;agit plut&#xF4;t d&#x2019;une am&#xE9;lioration graphique, rien de fondamental. Je vais ajouter une couleur unie comme solution de repli.</li><li> C&#x2019;est un &#xE9;l&#xE9;ment graphique indispensable&#xA0;: je dois le faire fonctionner pour les navigateurs non support&#xE9;s.</li></ol></li><li> Comment vais-je faire pour les anciens navigateurs&#xA0;?
<ul class="spip"><li> Je vais devoir recourir &#xE0; une image d&#x2019;arri&#xE8;re-plan.</li></ul></li></ol>
<p>Gr&#xE2;ce &#xE0; ce processus pas &#xE0; pas, vous savez comment faire quelque chose avec <abbr>CSS</abbr> (si c&#x2019;est faisable), si vous pouvez l&#x2019;utiliser en tenant compte du support des navigateurs et comment cr&#xE9;er des solutions de repli.</p>
<p><abbr>NB</abbr>&#xA0;: souvenez-vous toujours de l&#x2019;audience cible de votre site web ou de votre application. Si vous cr&#xE9;ez du contenu web pour une application iPad, vous pourrez utiliser de nombreuses propri&#xE9;t&#xE9;s <abbr>CSS</abbr>3 sans vous soucier des solutions de repli. Toutefois si vous cr&#xE9;ez un site pour une banque, rappelez-vous que beaucoup de gens utilisent encore IE8 ou des versions plus anciennes encore.</p>
<h3>Fournir des solutions de repli</h3>
<p>Selon la situation, fournir une solution de repli pour les navigateurs non pris en charge peut &#xEA;tre soit ridiculement simple soit extr&#xEA;mement p&#xE9;nible. En effet, il y a des cas diff&#xE9;rents. Regardons cela de plus pr&#xE8;s.</p>
<h4>Pas de solution de repli ou une solution de repli simple</h4>
<p>Quand il y a une am&#xE9;lioration de l&#x2019;exp&#xE9;rience utilisateur dont l&#x2019;absence de prise en charge est sans cons&#xE9;quences, vous n&#x2019;&#xEA;tes m&#xEA;me pas oblig&#xE9;s de fournir une solution de repli. C&#x2019;est appr&#xE9;ciable.</p>
<p>Il y a aussi quelques propri&#xE9;t&#xE9;s qui sont faciles &#xE0; traiter quand il s&#x2019;agit de solution de repli. En g&#xE9;n&#xE9;ral, vous devez seulement &#xE9;crire deux versions de cette propri&#xE9;t&#xE9;&#xA0;: d&#x2019;abord la solution de repli, puis la version correcte pour les navigateurs qui le supportent.</p>
<pre><code>.mon-element { border: 1px solid #666; border: 1px solid rgba(0,0,0,0.3); background: #708090; background: hsl(210, 13%, 50%);
}</code></pre>
<p>Dans ce cas, les navigateurs ne supportant pas <code>rgba</code> et <code>hsl</code> ne liront pas les lignes 3 et 5&#xA0;; de ce fait vous fournissez des versions alternatives aux lignes 2 et 4. Pour les navigateurs pris en charge, ils vont d&#x2019;abord appliquer la version alternative, puis la remplacer par la version correcte.</p>
<h4>Modernizr</h4>
<p>De nos jours, on ne peut gu&#xE8;re parler de <abbr>CSS</abbr>3 sans mentionner <a href="http://modernizr.com/" class="spip_out">Modernizr</a>. Il s&#x2019;agit d&#x2019;une biblioth&#xE8;que JavaScript qui teste la prise en charge des fonctionnalit&#xE9;s HTML5 et <abbr>CSS</abbr>3 au chargement de la page. Cela peut sembler lourd, mais il est bien optimis&#xE9; et assez rapide.</p>
<p>Quoi qu&#x2019;il en soit, parfois, il faut savoir pr&#xE9;cis&#xE9;ment si le navigateur prend en charge une fonctionnalit&#xE9; particuli&#xE8;re. Notamment pour fournir une version alternative n&#xE9;cessitant d&#x2019;autres propri&#xE9;t&#xE9;s <abbr>CSS</abbr>.</p>
<pre><code>/* Version normale */
.menu-deroulant { opacity: 0; pointer-events: none;
} .declencheur:hover .menu-deroulant { opacity: 1; pointer-events: auto;
} /* Solution de repli avec Modernizr */ .no-opacity .menu-deroulant,
.no-pointerevents .menu-deroulant { opacity: 1;
pointer-events: auto;
display: none;
} .no-opacity .declencheur:hover .menu-deroulant,
.no-pointerevents .declencheur:hover .menu-deroulant { display: block;
}</code></pre>
<p>Pour fournir une solution de repli de ce type, les classes ajout&#xE9;es par la biblioth&#xE8;que Javascript Modernizr vous seront d&#x2019;un grand secours (<code>.no-opacity</code> [sans-opacite] et <code>.no-pointerevents</code> [sans-evenementpointeur]). Vous ne pouvez pas avoir les deux versions simultan&#xE9;ment.</p>
<p>Quoi qu&#x2019;il en soit, n&#x2019;oubliez jamais de d&#xE9;finir une solution de repli, c&#x2019;est vraiment important. Les fonctionnalit&#xE9;s majeures doivent &#xEA;tre prises en charge par tous les navigateurs, tant les anciens que les nouveaux, et si ce n&#x2019;est pas le cas partout, vous devez avertir l&#x2019;utilisateur.</p>
<p>Donc, soit vous commencez avec une base simple et l&#x2019;am&#xE9;liorez pour les navigateurs r&#xE9;cents, soit vous commencez avec une base moderne et vous composez pour les navigateurs plus anciens. Voir la section suivante pour plus d&#x2019;informations.</p>
<h4>Autres ressources sur <abbr>CSS</abbr>3&#xA0;:</h4><h2>6. Am&#xE9;lioration progressive et d&#xE9;gradation &#xE9;l&#xE9;gante</h2>
<p>Ce sont deux termes dont vous avez probablement d&#xE9;j&#xE0; entendu parler, en particulier la d&#xE9;gradation &#xE9;l&#xE9;gante, mais il y a une diff&#xE9;rence subtile entre les deux.</p>
<h3>Am&#xE9;lioration progressive</h3>
<p>Le principe de l&#x2019;am&#xE9;lioration progressive est d&#x2019;&#xE9;tablir une base commune de fonctionnalit&#xE9;s et de fonctions disponibles, et ensuite, d&#x2019;am&#xE9;liorer l&#x2019;exp&#xE9;rience utilisateur en fonction de ce que le navigateur prend en charge.</p>
<p>Utiliser l&#x2019;attribut <abbr>HTML</abbr>5 <code>required</code> pour avertir l&#x2019;utilisateur qu&#x2019;un champ est manquant dans un formulaire avant de le soumettre peut &#xEA;tre consid&#xE9;r&#xE9; comme une am&#xE9;lioration progressive. Il s&#x2019;agit d&#x2019;une am&#xE9;lioration de l&#x2019;exp&#xE9;rience utilisateur rendue possible gr&#xE2;ce au moteur natif du navigateur.</p>
<h3>D&#xE9;gradation &#xE9;l&#xE9;gante</h3>
<p>Vous utilisez la d&#xE9;gradation &#xE9;l&#xE9;gante lorsque vous d&#xE9;clinez une version alternative ou inf&#xE9;rieure de vos fonctionnalit&#xE9;s au cas o&#xF9; elles ne sont pas prises en charge. Fondamentalement, on part du plus haut pour aller vers le plus bas.</p>
<p>Un exemple tr&#xE8;s simple serait l&#x2019;avertissement que vous mettez entre les balises <code>&lt;canvas&gt;</code> pour informer les utilisateurs de navigateurs qui ne les prennent pas en charge qu&#x2019;il y a quelque chose qu&#x2019;ils ne peuvent pas voir.</p>
<pre><code>&lt;canvas&gt;
Cette page utilise HTML5 Canvas. Veuillez utiliser un navigateur r&#xE9;cent pour voir ce contenu. Pour obtenir un autre navigateur, allez &#xE0; &lt;a href=&quot;http://browsehappy.com/&quot;&gt;BrowseHappy&lt;/a&gt;
&lt;/canvas&gt;</code></pre><h3>Quelle est la diff&#xE9;rence&#xA0;?</h3>
<p>En fin de compte, il n&#x2019;y en a pas. Vous avez des fonctionnalit&#xE9;s pour les navigateurs r&#xE9;cents et des fonctionnalit&#xE9;s ou des solutions de repli pour les plus anciens. C&#x2019;est plut&#xF4;t une question de proc&#xE9;dure&#xA0;: soit vous codez pour les navigateurs modernes tout en proposant une solution de repli pour les anciens, soit vous le faites dans l&#x2019;autre sens. C&#x2019;est un choix.</p>
<p>En tout cas, je veux redire ici que l&#x2019;exp&#xE9;rience utilisateur n&#x2019;est pas n&#xE9;cessairement la m&#xEA;me dans tous les navigateurs. En fait, ce n&#x2019;est m&#xEA;me pas possible, puisque les moteurs des navigateurs sont diff&#xE9;rents. Quoi qu&#x2019;il en soit, vous devez fournir des fonctionnalit&#xE9;s de base pour tout le monde, mais faites-moi plaisir&#xA0;: am&#xE9;liorez votre site web ou votre application pour les navigateurs modernes. Ils sont bien con&#xE7;us, ils fournissent des fonctionnalit&#xE9;s &#xE0; l&#x2019;&#xE9;tat natif&#xA0;: utilisez-les.</p>
<h4>Lectures compl&#xE9;mentaires sur l&#x2019;am&#xE9;lioration progressive et la d&#xE9;gradation &#xE9;l&#xE9;gante</h4><h2>7. Les pr&#xE9;processeurs <abbr>CSS</abbr> </h2>
<p>Aaaah, les pr&#xE9;processeurs&#x2026; Le sujet chaud du moment. Sont-ils utiles&#xA0;? Pour quoi faire&#xA0;? Devrais-je en employer un&#xA0;? Lequel&#xA0;? Je pense que c&#x2019;est l&#x2019;un des sujets les plus d&#xE9;battus sur <abbr>CSS</abbr> en ce moment.</p>
<p>Je vais essayer d&#x2019;&#xEA;tre aussi objectif que possible dans cette partie. Permettez-moi de commencer par ceci&#xA0;: si vous ne voulez pas utiliser un pr&#xE9;processeur, alors ne le faites pas. Ce ne sera jamais un probl&#xE8;me. Vous ne serez pas un mauvais d&#xE9;veloppeur front-end pour autant. Cela ne vous rendra pas incapable de faire certaines choses. Mais vous devriez, n&#xE9;anmoins, essayer de vous faire votre propre opinion &#xE0; ce sujet.</p>
<p>Ok, j&#x2019;en ai fini avec les pr&#xE9;cautions. Qu&#x2019;est-ce qu&#x2019;un pr&#xE9;processeur, de mani&#xE8;re g&#xE9;n&#xE9;rale&#xA0;? Un pr&#xE9;processeur est une sorte d&#x2019;outil qui compile une syntaxe donn&#xE9;e dans une langue utilis&#xE9;e par un autre programme (dans le cas pr&#xE9;sent&#xA0;: le navigateur). Il y a des pr&#xE9;processeurs pour de nombreux languages&#xA0;: il y a Markdown ou Jade pour le <abbr>HTML</abbr>. Il y a LESS, Sass et Stylus pour <abbr>CSS</abbr>. Il existe CoffeeScript pour JavaScript. Il y a CakePHP pour <abbr>PHP</abbr> et ainsi de suite.</p>
<h3>De quoi parle-t-on&#xA0;?</h3>
<p>Un pr&#xE9;processeur <abbr>CSS</abbr> fournit aux <abbr>CSS</abbr> certaines particularit&#xE9;s &#xE0; partir de langages orient&#xE9;s objet. Des choses comme&#xA0;:</p>
<ul class="spip"><li> les variables</li><li> les fonctions (avec des param&#xE8;tres)</li><li> les espaces de nommages</li><li> l&#x2019;imbrication</li><li> les instructions conditionnelles</li><li> les op&#xE9;rations</li><li> etc.</li></ul>
<p>&#xC7;a a l&#x2019;air attrayant, non&#xA0;? Peut-&#xEA;tre que vous voulez un exemple pour comprendre la mani&#xE8;re dont cela fonctionne. Prenons le <abbr>CSS</abbr> suivant pour une barre de navigation.</p>
<pre><code>.navigation { width: 800px; width: calc(100%-150px);
}
.navigation li { color: #444;
}
.navigation li a { text-decoration: none;
}</code></pre>
<p>Et voici maintenant la version compil&#xE9;e (SCSS)&#xA0;:</p>
<pre><code>$couleur-principale: #444; .navigation { width: (100%-150px); li { color: $couleur-principale; a { text-decoration: none; } }
}</code></pre>
<p>En gros, un pr&#xE9;processeur va interpr&#xE9;ter ceci dans une version <abbr>CSS</abbr> standard. Ce sera exactement la m&#xEA;me chose, sauf pour le calcul. Il lancera l&#x2019;op&#xE9;ration elle-m&#xEA;me et affichera le r&#xE9;sultat correspondant sans qu&#x2019;il soit n&#xE9;cessaire d&#x2019;utiliser une fonction comme <code>calc()</code>.</p>
<p>Donc, vous vous retrouvez avec une feuille de style plus compr&#xE9;hensible (variables et imbrications) et plus facile &#xE0; maintenir (variables et fonctions). C&#x2019;&#xE9;tait un exemple tr&#xE8;s th&#xE9;orique, mais dans un projet r&#xE9;el, vous sentirez la diff&#xE9;rence.</p>
<h3>Comment le choisir&#xA0;?</h3>
<p>Il existe beaucoup de pr&#xE9;processeurs <abbr>CSS</abbr>, chacun avec ses avantages et ses particularit&#xE9;s. Quoi qu&#x2019;il en soit, chacun d&#x2019;entre eux fait plus ou moins la m&#xEA;me chose, donc le choix vous appartient. Voici les principales options quand il s&#x2019;agit de pr&#xE9;processeurs <abbr>CSS</abbr>&#xA0;:</p>
<ul class="spip"><li> <a href="http://sass-lang.com/" class="spip_out">Sass</a> (&#xE9;crit en Ruby)</li><li> <a href="http://lesscss.org/" class="spip_out">LESS</a> (&#xE9;crit en JavaScript)</li><li> <a href="http://learnboost.github.com/stylus/" class="spip_out">Stylus</a> (&#xE9;crit en JavaScript)</li><li> <a href="http://the-echoplex.net/csscrush/" class="spip_out">Crush</a> (&#xE9;crit en <abbr>PHP</abbr>)</li></ul>
<p>L&#x2019;id&#xE9;al, c&#x2019;est d&#x2019;apprendre &#xE0; les conna&#xEE;tre, de les tester et de voir ce qui r&#xE9;pond le mieux &#xE0; vos besoins et &#xE0; votre projet. Il y a plusieurs facteurs qui entrent en jeu&#xA0;; les &#xE9;num&#xE9;rer tous serait hors de la port&#xE9;e de cet article, mais vous pouvez trouver quelques ressources pertinentes ci-dessous.</p>
<h3>Mon sentiment sur les pr&#xE9;processeurs <abbr>CSS</abbr>&#xA0;?</h3>
<p>Je ne suis pas un expert quand il s&#x2019;agit de pr&#xE9;processeurs <abbr>CSS</abbr>, mais j&#x2019;en suis un partisan. Ils fournissent des fonctionnalit&#xE9;s tr&#xE8;s utiles mais qu&#x2019;on ne trouve pas dans les <abbr>CSS</abbr> comme les variables, les d&#xE9;clarations, l&#x2019;imbrication et les conditions.</p>
<p>J&#x2019;ai bricol&#xE9; un peu avec LESS, et il m&#x2019;a fait &#xE0; peu pr&#xE8;s ce que je voulais. Ou du moins, jusqu&#x2019;&#xE0; ce que je commence &#xE0; me lancer dans des choses un peu plus compliqu&#xE9;es que vous avez pu lire dans mon dernier article sur <a href="http://tympanus.net/codrops/2012/11/14/creative-css-loading-animations/" class="spip_out">CSS Loading Animations</a> (pour les boucles + pr&#xE9;fixes vendeurs + <i>keyframes</i>).</p>
<p>J&#x2019;ai aussi jet&#xE9; un coup d&#x2019;&#x153;il rapide &#xE0; Sass et Compass. &#xC0; ma grande surprise, c&#x2019;&#xE9;tait incroyablement facile &#xE0; installer et &#xE0; lancer gr&#xE2;ce &#xE0; Ruby. J&#x2019;avais peur, mais c&#x2019;est tr&#xE8;s tr&#xE8;s intuitif, croyez-moi. En fin de compte, je suis vraiment impressionn&#xE9; par l&#x2019;association Sass + Compass. Vous pouvez &#xE9;galement en savoir plus sur les raisons pour lesquelles je suis pass&#xE9; de LESS &#xE0; Sass dans <a href="http://hugogiraudel.com/blog/less-to-sass.html" class="spip_out">cet article</a> sur mon blog.</p>
<p>Quoi qu&#x2019;il en soit, je suis encore tout &#xE0; fait capable d&#x2019;&#xE9;crire des <abbr>CSS</abbr> classiques sans pr&#xE9;processeur, et la plupart du temps c&#x2019;est ce que je fais. Mais au final, je pense que nous allons tous en utiliser un, quel qu&#x2019;il soit. Il nous manque vraiment certains &#xE9;l&#xE9;ments tr&#xE8;s utiles avec les <abbr>CSS</abbr>, et les pr&#xE9;processeurs <abbr>CSS</abbr> sont l&#xE0; pour y rem&#xE9;dier.</p>
<h4>Lectures compl&#xE9;mentaires sur les pr&#xE9;processeurs <abbr>CSS</abbr></h4><h2>8. Garder un &#x153;il sur l&#x2019;avenir</h2>
<p>Les langages sont en constante &#xE9;volution. C&#x2019;est particuli&#xE8;rement vrai pour les <abbr>CSS</abbr>. Les sp&#xE9;cifications <abbr>CSS</abbr> bougent sans cesse, et les navigateurs ajoutent sans cesse de nouvelles fonctionnalit&#xE9;s &#xE0; leurs moteurs.</p>
<p>&#xC0; ce propos, mon premier conseil serait de rester &#xE0; l&#x2019;&#xE9;coute de ce qui se pr&#xE9;pare. Je sais que vous ne pouvez pas &#xEA;tre en mesure de tout utiliser d&#xE8;s son lancement, mais savoir quelle fonctionnalit&#xE9; est maintenant prise en charge par Canary Chrome, bient&#xF4;t par Chrome version stable et Safari, puis par Opera, Firefox et ainsi de suite, c&#x2019;est important afin de prendre du recul sur les probl&#xE8;mes <abbr>CSS</abbr> et les solutions possibles.</p>
<h4>Ressources pour garder un &#x153;il sur l&#x2019;avenir&#xA0;:</h4><h2>9. Lire le code des autres</h2>
<p>Une des meilleures fa&#xE7;ons d&#x2019;apprendre &#xE0; coder est de lire du code.</p>
<p>Heureusement, le <abbr>CSS</abbr> est visible c&#xF4;t&#xE9; client, ce qui vous permet de le lire sur n&#x2019;importe quel site avec un inspecteur web comme WebKit inspector, Dragonfly, Firebug, etc. De plus, l&#x2019;industrie du web est tr&#xE8;s orient&#xE9;e vers l&#x2019;open-source, ce qui signifie que les gens sont heureux de partager leurs sources avec vous.</p>
<p>Une autre excellente fa&#xE7;on d&#x2019;apprendre est de suivre des tutoriels. Prenez un tutoriel simple, et suivez-le &#xE9;tape par &#xE9;tape. Ensuite, essayez de le refaire &#xE0; partir de z&#xE9;ro. S&#x2019;il vous arrive d&#x2019;&#xEA;tre bloqu&#xE9;, jetez un coup d&#x2019;&#x153;il &#xE0; la solution, puis continuez par vous-m&#xEA;me.</p>
<p>Lorsque vous serez &#xE0; l&#x2019;aise avec <abbr>CSS</abbr> et que vous voudrez entrer finement dans les d&#xE9;tails, vous voudrez peut-&#xEA;tre jeter un &#x153;il &#xE0; des d&#xE9;monstrations et des exp&#xE9;riences qui ne sont pas comment&#xE9;es ni expliqu&#xE9;es. Les gens cr&#xE9;ent des choses tous les jours, et vous tomberez sans arr&#xEA;t sur des choses que vous ne connaissiez pas encore.</p>
<p>&#xC0; ce sujet, il y a quelques mois Chris Coyier, Tim Sabat et Alex Vazquez ont lanc&#xE9; <a href="http://codepen.io/" class="spip_out">CodePen</a>, une sorte de plate-forme pour cr&#xE9;er, partager et explorer du code (<abbr>HTML</abbr>, <abbr>CSS</abbr>, JavaScript). CodePen comprend &#xE9;galement un tas d&#x2019;outils comme les biblioth&#xE8;ques (jQuery, jQuery UI, MooTools, YUI, Prototype, Zepto, Dojo, Ext JS, PrefixFree, etc) et les pr&#xE9;processeurs (<abbr>HAML</abbr>, Markdown, Slim, LESS, SCSS, Sass, CoffeeScript) si vous en avez besoin.</p>
<h4>D&#x2019;autres ressources pour trouver des exemples de code cr&#xE9;&#xE9; par d&#x2019;autres personnes&#xA0;:</h4><ul class="spip"><li> <a href="http://codepen.io/" class="spip_out">CodePen</a></li><li> <a href="http://cssdeck.com/" class="spip_out">CSS Deck</a></li><li> <a href="http://dabblet.com/" class="spip_out">Dabblet</a></li><li> <a href="http://thecodeplayer.com/" class="spip_out">TheCodePlayer</a></li></ul><h2>10. Pratiquez sans rel&#xE2;che</h2>
<p>Vous savez ce qu&#x2019;on dit &#xE0; propos de l&#x2019;apprentissage&#xA0;: <strong>on apprend en faisant</strong>. Donc, mon meilleur conseil est de continuer &#xE0; pratiquer comme pour toute autre chose. Plus vous pratiquez, meilleur vous serez. La pratique ne signifie pas n&#xE9;cessairement faire un site web &#xE0; partir de z&#xE9;ro. Il suffit de choisir une capture simple sur Dribbble et d&#x2019;essayer de la refaire en <abbr>CSS</abbr>. Le r&#xE9;sultat ne sera peut-&#xEA;tre pas utile imm&#xE9;diatement, mais ce que vous avez appris vous sera utile un jour.</p>
<p>Et comme je l&#x2019;ai dit dans la partie &#xAB;&#xA0;Apprendre les bases et quelques astuces&#xA0;&#xBB; de cet article, <abbr>CSS</abbr> est plein de cas particuliers. Vous devrez apprendre &#xE0; les g&#xE9;rer si vous voulez &#xE9;crire des <abbr>CSS</abbr>. Et la seule fa&#xE7;on de conna&#xEE;tre ces cas particuliers consiste &#xE0; pratiquer, d&#xE9;couvrir de nouveaux cas, jeter un &#x153;il &#xE0; la solution, et continuer.</p>
<p>Je vous recommande aussi de partager votre code. Il est toujours utile d&#x2019;obtenir un retour constructif, alors assurez-vous de demander aux gens de v&#xE9;rifier votre code une fois qu&#x2019;il est presque fini. Il suffit de les d&#xE9;poser dans un <a href="http://jsfiddle.net/" class="spip_out">JSFiddle</a>, de partager et de demander des commentaires.</p>
<h2>Sommaire et cr&#xE9;dits</h2>
<p>Comme cet article mentionne un tas de liens et de ressources diverses, autant les rassembler tous au m&#xEA;me endroit&#xA0;:</p> <p>Merci beaucoup d&#x2019;avoir lu cet article. J&#x2019;esp&#xE8;re qu&#x2019;il vous aidera d&#x2019;une mani&#xE8;re ou d&#x2019;une autre &#xE0; am&#xE9;liorer la fa&#xE7;on dont vous apprenez et utilisez les <abbr>CSS</abbr>.</p> </div>]]></description>
      <link>https://www.pompage.net/traduction/ameliorer-vos-feuilles-de-styles</link>
      <guid>https://www.pompage.net/traduction/ameliorer-vos-feuilles-de-styles</guid>
      <pubDate>Thu, 19 Jun 2014 03:06:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Quelles mesures CSS, pour quel usage ?]]></title>
      <description><![CDATA[<div id="article"><p class="signature">Par
<a href="http://demosthenes.info/">Dudley Storey</a></p><p class="moreInfo">
Confront&#xE9;s au foisonnement des syst&#xE8;mes de mesure CSS, les d&#xE9;veloppeurs web peuvent avoir du mal &#xE0; comprendre quelles unit&#xE9;s il faut utiliser dans leurs pages, et &#xE0; quel moment. On peut &#xEA;tre tent&#xE9; de toujours utiliser les m&#xEA;mes mesures, mais ce choix risque de limiter s&#xE9;rieusement l&#x2019;aboutissement de vos designs. Je propose ci-dessous une liste de suggestions, mais non pas de r&#xE8;gles absolues : libre &#xE0; vous de vous en &#xE9;carter si vous le jugez pr&#xE9;f&#xE9;rable.</p><p><strong>&#xC0; choisir pour</strong>&#xA0;: les traits de bordure et les &#xE9;l&#xE9;ments g&#xE9;n&#xE9;raux, lorsqu&#x2019;il s&#x2019;agit de designs &#xE0; largeur fixe&#xA0;; &#xE9;galement pour les valeurs des d&#xE9;calages des <a href="http://demosthenes.info/blog/css/shadows" class="spip_out">ombres port&#xE9;es en <abbr>CSS</abbr></a>. &#xC0; &#xE9;viter pour les points d&#x2019;arr&#xEA;t dans <a href="http://demosthenes.info/blog/154/CSS-media-queries" class="spip_out"><code>@media</code></a> car cela <a href="http://blog.cloudfour.com/the-ems-have-it-proportional-media-queries-ftw/" class="spip_out">casse la mise en page en cas de zoom</a>&#xA0;: mieux vaut employer <code>rem</code> ou <code>em</code>.<br class="autobr">
<strong>&#xC0; &#xE9;viter pour</strong>&#xA0;: la typographie, sauf s&#x2019;il s&#x2019;agit d&#x2019;&#xE9;tablir une taille de police de base dans un &#xAB;&#xA0;<a href="http://demosthenes.info/blog/210/CSS-Resets" class="spip_out">reset <abbr>CSS</abbr></a>&#xA0;&#xBB; (remise &#xE0; z&#xE9;ro des styles, <i><abbr>NdT</abbr></i>).</p><h2>Les pourcentages (<code>%</code>)</h2><p><strong>&#xC0; choisir pour</strong>&#xA0;: int&#xE9;grer des <a href="http://demosthenes.info/blog/586/CSS-Fluid-Image-Techniques-for-Responsive-Site-Design" class="spip_out">images</a> et des <a href="http://demosthenes.info/blog/627/Make-A-Responsive-CSS3-Image-Slider" class="spip_out">conteneurs</a> &#xE0; taille variable&#xA0;; et pour d&#xE9;finir la hauteur de la balise <code>body</code> dans certains cas.<br class="autobr">
<strong>&#xC0; &#xE9;viter pour</strong>&#xA0;: la typographie. (Exception&#xA0;: <a href="http://demosthenes.info/blog/300/CSS3-and-HTML5-Stylesheet-Reset" class="spip_out">la taille de police pour un reset <abbr>CSS</abbr></a>).</p><h2><code>em</code> et <code>ex</code></h2><p><strong>&#xC0; choisir pour</strong>&#xA0;: la typographie, et les &#xE9;l&#xE9;ments qui y sont li&#xE9;s (les marges, par exemple), mais sans perdre de vue que <code>em</code> et <code>ex</code> peuvent &#xEA;tre tr&#xE8;s d&#xE9;licats &#xE0; employer dans des mises en page complexes. L&#x2019;unit&#xE9; alternative <a href="http://demosthenes.info/blog/673/REM-Not-the-Band" class="spip_out"><code>rem</code></a> est plus appropri&#xE9;e dans ces cas-l&#xE0;.</p><h2>Les points et les picas</h2><p><strong>&#xC0; choisir pour</strong>&#xA0;: <a href="http://demosthenes.info/blog/css/print" class="spip_out">les feuilles de style d&#x2019;impression</a>.<br class="autobr">
<strong>&#xC0; &#xE9;viter pour</strong>&#xA0;: tout le reste.</p><h2>rem</h2><p><strong>&#xC0; choisir si</strong>&#xA0;: vous voulez une alternative plus solide et fiable aux solutions avec <code>em</code> ou <code>ex</code>, et pour les m&#xEA;mes usages, y compris les points d&#x2019;arr&#xEA;t dans les requ&#xEA;tes de m&#xE9;dias.<br class="autobr">
<strong>&#xC0; &#xE9;viter si</strong>&#xA0;: vous devez prendre en charge <abbr>IE</abbr>8 et les versions ant&#xE9;rieures. Sinon, utilisez cette unit&#xE9; mais pr&#xE9;voyez une solution de repli (en fournissant une alternative dans une unit&#xE9; plus courante avant la valeur en <code>rem</code>) ou encore un &#xAB;&#xA0;polyfill&#xA0;&#xBB; (c&#x2019;est-&#xE0;-dire un script effectuant le calcul dans les navigateurs ne comprenant pas cette unit&#xE9;, <i><abbr>NdT</abbr></i>).</p><h2>Unit&#xE9;s relatives &#xE0; la surface d&#x2019;affichage (<code>vh</code> et <code>vw</code>)</h2><p><strong>&#xC0; choisir pour</strong>&#xA0;: <a href="http://demosthenes.info/blog/739/Creating-Responsive-Hero-Text-With-vw-Units" class="spip_out">la typographie r&#xE9;active</a>&#xA0;; et pour des <a href="http://demosthenes.info/blog/738/Create-Perfect-Responsive-Shapes-With-CSS-vw-Units" class="spip_out">conteneurs r&#xE9;actifs &#xAB;&#xA0;parfaits&#xA0;&#xBB;</a>.<br class="autobr">
Difficile de savoir pour quel usage il faudrait <strong>&#xE9;viter</strong> ces unit&#xE9;s, car <code>vh</code> et <code>vw</code> sont tr&#xE8;s r&#xE9;cents et encore loin d&#x2019;avoir &#xE9;t&#xE9; totalement exploit&#xE9;s en design web. Attention toutefois &#xE0; l&#x2019;absence de prise en charge sous <abbr>IE</abbr>8&#xA0;: pr&#xE9;voyez donc des solutions de repli.</p><h2>Les pouces (<code>in</code>) et les centim&#xE8;tres (<code>cm</code>)</h2><p><strong>&#xC0; choisir dans</strong>&#xA0;: les feuilles de style d&#x2019;impression, et en particulier pour les marges des pages.<br class="autobr">
<strong>&#xC0; &#xE9;viter pour</strong>&#xA0;: tout le reste.</p><h2>Les caract&#xE8;res (<code>ch</code>)</h2><p><strong>&#xC0; choisir pour</strong>&#xA0;: dimensionner et positionner les polices &#xE0; espacement constant. Attention, le support navigateur est incomplet.</p><h2>Grille de texte (<code>gd</code>)</h2><p><strong>De pr&#xE9;f&#xE9;rence pour</strong>&#xA0;: des mises en page exp&#xE9;rimentales, car c&#x2019;est une unit&#xE9; qui n&#x2019;est prise en charge que par <abbr>IE</abbr>10+ au moment o&#xF9; j&#x2019;&#xE9;cris ces lignes. Des substituts de type &#xAB;&#xA0;<a href="https://github.com/codler/Grid-Layout-Polyfill" class="spip_out">polyfill</a>&#xA0;&#xBB; commencent n&#xE9;anmoins &#xE0; appara&#xEE;tre.</p><h2>Nombres bruts</h2><p>Bien que presque toutes les propri&#xE9;t&#xE9;s <abbr>CSS</abbr> exigent que l&#x2019;unit&#xE9; de mesure soit indiqu&#xE9;e dans la d&#xE9;claration, pour quelques-unes d&#x2019;entre elles il est pr&#xE9;f&#xE9;rable de n&#x2019;employer que des valeurs d&#x2019;entiers ou &#xE0; virgule flottante. En particulier, les propri&#xE9;t&#xE9;s <a href="http://demosthenes.info/blog/606/Molten-Leading-Exploring-The-CSS-Relationship-Between-Font-Size-Line-Height-and-Margin" class="spip_out"><code>line-height</code></a> (hauteur de ligne) et <a href="http://demosthenes.info/blog/438/CSS3-Border-Image-Explained" class="spip_out"><code>border-image</code></a> (image de bordure) sont plut&#xF4;t &#xE0; sp&#xE9;cifier &#xE0; l&#x2019;aide de nombres bruts.</p></div>]]></description>
      <link>http://www.pompage.net/traduction/css-unites-et-usages</link>
      <guid>http://www.pompage.net/traduction/css-unites-et-usages</guid>
      <pubDate>Wed, 09 Apr 2014 10:04:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Quelles mesures CSS, pour quel usage ?]]></title>
      <description><![CDATA[<div id="article"> <p class="signature">Par <a href="http://demosthenes.info/">Dudley Storey</a> </p> <p class="moreInfo"> Confront&#xE9;s au foisonnement des syst&#xE8;mes de mesure CSS, les d&#xE9;veloppeurs web peuvent avoir du mal &#xE0; comprendre quelles unit&#xE9;s il faut utiliser dans leurs pages, et &#xE0; quel moment. On peut &#xEA;tre tent&#xE9; de toujours utiliser les m&#xEA;mes mesures, mais ce choix risque de limiter s&#xE9;rieusement l&#x2019;aboutissement de vos designs. Je propose ci-dessous une liste de suggestions, mais non pas de r&#xE8;gles absolues : libre &#xE0; vous de vous en &#xE9;carter si vous le jugez pr&#xE9;f&#xE9;rable. </p> <p><strong>&#xC0; choisir pour</strong>&#xA0;: les traits de bordure et les &#xE9;l&#xE9;ments g&#xE9;n&#xE9;raux, lorsqu&#x2019;il s&#x2019;agit de designs &#xE0; largeur fixe&#xA0;; &#xE9;galement pour les valeurs des d&#xE9;calages des <a href="http://demosthenes.info/blog/css/shadows" class="spip_out">ombres port&#xE9;es en <abbr>CSS</abbr></a>. &#xC0; &#xE9;viter pour les points d&#x2019;arr&#xEA;t dans <a href="http://demosthenes.info/blog/154/CSS-media-queries" class="spip_out"><code>@media</code></a> car cela <a href="http://blog.cloudfour.com/the-ems-have-it-proportional-media-queries-ftw/" class="spip_out">casse la mise en page en cas de zoom</a>&#xA0;: mieux vaut employer <code>rem</code> ou <code>em</code>.<br class="autobr">
<strong>&#xC0; &#xE9;viter pour</strong>&#xA0;: la typographie, sauf s&#x2019;il s&#x2019;agit d&#x2019;&#xE9;tablir une taille de police de base dans un &#xAB;&#xA0;<a href="http://demosthenes.info/blog/210/CSS-Resets" class="spip_out">reset <abbr>CSS</abbr></a>&#xA0;&#xBB; (remise &#xE0; z&#xE9;ro des styles, <i><abbr>NdT</abbr></i>).</p>
<h2>Les pourcentages (<code>%</code>)</h2>
<p><strong>&#xC0; choisir pour</strong>&#xA0;: int&#xE9;grer des <a href="http://demosthenes.info/blog/586/CSS-Fluid-Image-Techniques-for-Responsive-Site-Design" class="spip_out">images</a> et des <a href="http://demosthenes.info/blog/627/Make-A-Responsive-CSS3-Image-Slider" class="spip_out">conteneurs</a> &#xE0; taille variable&#xA0;; et pour d&#xE9;finir la hauteur de la balise <code>body</code> dans certains cas.<br class="autobr">
<strong>&#xC0; &#xE9;viter pour</strong>&#xA0;: la typographie. (Exception&#xA0;: <a href="http://demosthenes.info/blog/300/CSS3-and-HTML5-Stylesheet-Reset" class="spip_out">la taille de police pour un reset <abbr>CSS</abbr></a>).</p>
<h2><code>em</code> et <code>ex</code></h2>
<p><strong>&#xC0; choisir pour</strong>&#xA0;: la typographie, et les &#xE9;l&#xE9;ments qui y sont li&#xE9;s (les marges, par exemple), mais sans perdre de vue que <code>em</code> et <code>ex</code> peuvent &#xEA;tre tr&#xE8;s d&#xE9;licats &#xE0; employer dans des mises en page complexes. L&#x2019;unit&#xE9; alternative <a href="http://demosthenes.info/blog/673/REM-Not-the-Band" class="spip_out"><code>rem</code></a> est plus appropri&#xE9;e dans ces cas-l&#xE0;.</p>
<h2>Les points et les picas</h2>
<p><strong>&#xC0; choisir pour</strong>&#xA0;: <a href="http://demosthenes.info/blog/css/print" class="spip_out">les feuilles de style d&#x2019;impression</a>.<br class="autobr">
<strong>&#xC0; &#xE9;viter pour</strong>&#xA0;: tout le reste.</p>
<h2>rem</h2>
<p><strong>&#xC0; choisir si</strong>&#xA0;: vous voulez une alternative plus solide et fiable aux solutions avec <code>em</code> ou <code>ex</code>, et pour les m&#xEA;mes usages, y compris les points d&#x2019;arr&#xEA;t dans les requ&#xEA;tes de m&#xE9;dias.<br class="autobr">
<strong>&#xC0; &#xE9;viter si</strong>&#xA0;: vous devez prendre en charge <abbr>IE</abbr>8 et les versions ant&#xE9;rieures. Sinon, utilisez cette unit&#xE9; mais pr&#xE9;voyez une solution de repli (en fournissant une alternative dans une unit&#xE9; plus courante avant la valeur en <code>rem</code>) ou encore un &#xAB;&#xA0;polyfill&#xA0;&#xBB; (c&#x2019;est-&#xE0;-dire un script effectuant le calcul dans les navigateurs ne comprenant pas cette unit&#xE9;, <i><abbr>NdT</abbr></i>).</p>
<h2>Unit&#xE9;s relatives &#xE0; la surface d&#x2019;affichage (<code>vh</code> et <code>vw</code>)</h2>
<p><strong>&#xC0; choisir pour</strong>&#xA0;: <a href="http://demosthenes.info/blog/739/Creating-Responsive-Hero-Text-With-vw-Units" class="spip_out">la typographie r&#xE9;active</a>&#xA0;; et pour des <a href="http://demosthenes.info/blog/738/Create-Perfect-Responsive-Shapes-With-CSS-vw-Units" class="spip_out">conteneurs r&#xE9;actifs &#xAB;&#xA0;parfaits&#xA0;&#xBB;</a>.<br class="autobr">
Difficile de savoir pour quel usage il faudrait <strong>&#xE9;viter</strong> ces unit&#xE9;s, car <code>vh</code> et <code>vw</code> sont tr&#xE8;s r&#xE9;cents et encore loin d&#x2019;avoir &#xE9;t&#xE9; totalement exploit&#xE9;s en design web. Attention toutefois &#xE0; l&#x2019;absence de prise en charge sous <abbr>IE</abbr>8&#xA0;: pr&#xE9;voyez donc des solutions de repli.</p>
<h2>Les pouces (<code>in</code>) et les centim&#xE8;tres (<code>cm</code>)</h2>
<p><strong>&#xC0; choisir dans</strong>&#xA0;: les feuilles de style d&#x2019;impression, et en particulier pour les marges des pages.<br class="autobr">
<strong>&#xC0; &#xE9;viter pour</strong>&#xA0;: tout le reste.</p>
<h2>Les caract&#xE8;res (<code>ch</code>)</h2>
<p><strong>&#xC0; choisir pour</strong>&#xA0;: dimensionner et positionner les polices &#xE0; espacement constant. Attention, le support navigateur est incomplet.</p>
<h2>Grille de texte (<code>gd</code>)</h2>
<p><strong>De pr&#xE9;f&#xE9;rence pour</strong>&#xA0;: des mises en page exp&#xE9;rimentales, car c&#x2019;est une unit&#xE9; qui n&#x2019;est prise en charge que par <abbr>IE</abbr>10+ au moment o&#xF9; j&#x2019;&#xE9;cris ces lignes. Des substituts de type &#xAB;&#xA0;<a href="https://github.com/codler/Grid-Layout-Polyfill" class="spip_out">polyfill</a>&#xA0;&#xBB; commencent n&#xE9;anmoins &#xE0; appara&#xEE;tre.</p>
<h2>Nombres bruts</h2>
<p>Bien que presque toutes les propri&#xE9;t&#xE9;s <abbr>CSS</abbr> exigent que l&#x2019;unit&#xE9; de mesure soit indiqu&#xE9;e dans la d&#xE9;claration, pour quelques-unes d&#x2019;entre elles il est pr&#xE9;f&#xE9;rable de n&#x2019;employer que des valeurs d&#x2019;entiers ou &#xE0; virgule flottante. En particulier, les propri&#xE9;t&#xE9;s <a href="http://demosthenes.info/blog/606/Molten-Leading-Exploring-The-CSS-Relationship-Between-Font-Size-Line-Height-and-Margin" class="spip_out"><code>line-height</code></a> (hauteur de ligne) et <a href="http://demosthenes.info/blog/438/CSS3-Border-Image-Explained" class="spip_out"><code>border-image</code></a> (image de bordure) sont plut&#xF4;t &#xE0; sp&#xE9;cifier &#xE0; l&#x2019;aide de nombres bruts.</p> </div>]]></description>
      <link>http://www.pompage.net/traduction/css-unites-et-usages</link>
      <guid>http://www.pompage.net/traduction/css-unites-et-usages</guid>
      <pubDate>Wed, 09 Apr 2014 10:04:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Quelles mesures CSS, pour quel usage ?]]></title>
      <description><![CDATA[<div id="article"> <p class="signature">Par <a href="http://demosthenes.info/">Dudley Storey</a> </p> <p class="moreInfo"> Confront&#xE9;s au foisonnement des syst&#xE8;mes de mesure CSS, les d&#xE9;veloppeurs web peuvent avoir du mal &#xE0; comprendre quelles unit&#xE9;s il faut utiliser dans leurs pages, et &#xE0; quel moment. On peut &#xEA;tre tent&#xE9; de toujours utiliser les m&#xEA;mes mesures, mais ce choix risque de limiter s&#xE9;rieusement l&#x2019;aboutissement de vos designs. Je propose ci-dessous une liste de suggestions, mais non pas de r&#xE8;gles absolues : libre &#xE0; vous de vous en &#xE9;carter si vous le jugez pr&#xE9;f&#xE9;rable. </p> <p><strong>&#xC0; choisir pour</strong>&#xA0;: les traits de bordure et les &#xE9;l&#xE9;ments g&#xE9;n&#xE9;raux, lorsqu&#x2019;il s&#x2019;agit de designs &#xE0; largeur fixe&#xA0;; &#xE9;galement pour les valeurs des d&#xE9;calages des <a href="http://demosthenes.info/blog/css/shadows" class="spip_out">ombres port&#xE9;es en <abbr>CSS</abbr></a>. &#xC0; &#xE9;viter pour les points d&#x2019;arr&#xEA;t dans <a href="http://demosthenes.info/blog/154/CSS-media-queries" class="spip_out"><code>@media</code></a> car cela <a href="http://blog.cloudfour.com/the-ems-have-it-proportional-media-queries-ftw/" class="spip_out">casse la mise en page en cas de zoom</a>&#xA0;: mieux vaut employer <code>rem</code> ou <code>em</code>.<br class="autobr">
<strong>&#xC0; &#xE9;viter pour</strong>&#xA0;: la typographie, sauf s&#x2019;il s&#x2019;agit d&#x2019;&#xE9;tablir une taille de police de base dans un &#xAB;&#xA0;<a href="http://demosthenes.info/blog/210/CSS-Resets" class="spip_out">reset <abbr>CSS</abbr></a>&#xA0;&#xBB; (remise &#xE0; z&#xE9;ro des styles, <i><abbr>NdT</abbr></i>).</p>
<h2>Les pourcentages (<code>%</code>)</h2>
<p><strong>&#xC0; choisir pour</strong>&#xA0;: int&#xE9;grer des <a href="http://demosthenes.info/blog/586/CSS-Fluid-Image-Techniques-for-Responsive-Site-Design" class="spip_out">images</a> et des <a href="http://demosthenes.info/blog/627/Make-A-Responsive-CSS3-Image-Slider" class="spip_out">conteneurs</a> &#xE0; taille variable&#xA0;; et pour d&#xE9;finir la hauteur de la balise <code>body</code> dans certains cas.<br class="autobr">
<strong>&#xC0; &#xE9;viter pour</strong>&#xA0;: la typographie. (Exception&#xA0;: <a href="http://demosthenes.info/blog/300/CSS3-and-HTML5-Stylesheet-Reset" class="spip_out">la taille de police pour un reset <abbr>CSS</abbr></a>).</p>
<h2><code>em</code> et <code>ex</code></h2>
<p><strong>&#xC0; choisir pour</strong>&#xA0;: la typographie, et les &#xE9;l&#xE9;ments qui y sont li&#xE9;s (les marges, par exemple), mais sans perdre de vue que <code>em</code> et <code>ex</code> peuvent &#xEA;tre tr&#xE8;s d&#xE9;licats &#xE0; employer dans des mises en page complexes. L&#x2019;unit&#xE9; alternative <a href="http://demosthenes.info/blog/673/REM-Not-the-Band" class="spip_out"><code>rem</code></a> est plus appropri&#xE9;e dans ces cas-l&#xE0;.</p>
<h2>Les points et les picas</h2>
<p><strong>&#xC0; choisir pour</strong>&#xA0;: <a href="http://demosthenes.info/blog/css/print" class="spip_out">les feuilles de style d&#x2019;impression</a>.<br class="autobr">
<strong>&#xC0; &#xE9;viter pour</strong>&#xA0;: tout le reste.</p>
<h2>rem</h2>
<p><strong>&#xC0; choisir si</strong>&#xA0;: vous voulez une alternative plus solide et fiable aux solutions avec <code>em</code> ou <code>ex</code>, et pour les m&#xEA;mes usages, y compris les points d&#x2019;arr&#xEA;t dans les requ&#xEA;tes de m&#xE9;dias.<br class="autobr">
<strong>&#xC0; &#xE9;viter si</strong>&#xA0;: vous devez prendre en charge <abbr>IE</abbr>8 et les versions ant&#xE9;rieures. Sinon, utilisez cette unit&#xE9; mais pr&#xE9;voyez une solution de repli (en fournissant une alternative dans une unit&#xE9; plus courante avant la valeur en <code>rem</code>) ou encore un &#xAB;&#xA0;polyfill&#xA0;&#xBB; (c&#x2019;est-&#xE0;-dire un script effectuant le calcul dans les navigateurs ne comprenant pas cette unit&#xE9;, <i><abbr>NdT</abbr></i>).</p>
<h2>Unit&#xE9;s relatives &#xE0; la surface d&#x2019;affichage (<code>vh</code> et <code>vw</code>)</h2>
<p><strong>&#xC0; choisir pour</strong>&#xA0;: <a href="http://demosthenes.info/blog/739/Creating-Responsive-Hero-Text-With-vw-Units" class="spip_out">la typographie r&#xE9;active</a>&#xA0;; et pour des <a href="http://demosthenes.info/blog/738/Create-Perfect-Responsive-Shapes-With-CSS-vw-Units" class="spip_out">conteneurs r&#xE9;actifs &#xAB;&#xA0;parfaits&#xA0;&#xBB;</a>.<br class="autobr">
Difficile de savoir pour quel usage il faudrait <strong>&#xE9;viter</strong> ces unit&#xE9;s, car <code>vh</code> et <code>vw</code> sont tr&#xE8;s r&#xE9;cents et encore loin d&#x2019;avoir &#xE9;t&#xE9; totalement exploit&#xE9;s en design web. Attention toutefois &#xE0; l&#x2019;absence de prise en charge sous <abbr>IE</abbr>8&#xA0;: pr&#xE9;voyez donc des solutions de repli.</p>
<h2>Les pouces (<code>in</code>) et les centim&#xE8;tres (<code>cm</code>)</h2>
<p><strong>&#xC0; choisir dans</strong>&#xA0;: les feuilles de style d&#x2019;impression, et en particulier pour les marges des pages.<br class="autobr">
<strong>&#xC0; &#xE9;viter pour</strong>&#xA0;: tout le reste.</p>
<h2>Les caract&#xE8;res (<code>ch</code>)</h2>
<p><strong>&#xC0; choisir pour</strong>&#xA0;: dimensionner et positionner les polices &#xE0; espacement constant. Attention, le support navigateur est incomplet.</p>
<h2>Grille de texte (<code>gd</code>)</h2>
<p><strong>De pr&#xE9;f&#xE9;rence pour</strong>&#xA0;: des mises en page exp&#xE9;rimentales, car c&#x2019;est une unit&#xE9; qui n&#x2019;est prise en charge que par <abbr>IE</abbr>10+ au moment o&#xF9; j&#x2019;&#xE9;cris ces lignes. Des substituts de type &#xAB;&#xA0;<a href="https://github.com/codler/Grid-Layout-Polyfill" class="spip_out">polyfill</a>&#xA0;&#xBB; commencent n&#xE9;anmoins &#xE0; appara&#xEE;tre.</p>
<h2>Nombres bruts</h2>
<p>Bien que presque toutes les propri&#xE9;t&#xE9;s <abbr>CSS</abbr> exigent que l&#x2019;unit&#xE9; de mesure soit indiqu&#xE9;e dans la d&#xE9;claration, pour quelques-unes d&#x2019;entre elles il est pr&#xE9;f&#xE9;rable de n&#x2019;employer que des valeurs d&#x2019;entiers ou &#xE0; virgule flottante. En particulier, les propri&#xE9;t&#xE9;s <a href="http://demosthenes.info/blog/606/Molten-Leading-Exploring-The-CSS-Relationship-Between-Font-Size-Line-Height-and-Margin" class="spip_out"><code>line-height</code></a> (hauteur de ligne) et <a href="http://demosthenes.info/blog/438/CSS3-Border-Image-Explained" class="spip_out"><code>border-image</code></a> (image de bordure) sont plut&#xF4;t &#xE0; sp&#xE9;cifier &#xE0; l&#x2019;aide de nombres bruts.</p> </div>]]></description>
      <link>https://www.pompage.net/traduction/css-unites-et-usages</link>
      <guid>https://www.pompage.net/traduction/css-unites-et-usages</guid>
      <pubDate>Wed, 09 Apr 2014 10:04:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Tests de contenu]]></title>
      <description><![CDATA[<div id="article"><p class="signature">Par
<a href="http://www.angelacolter.com/">Angela Colter</a></p><p class="moreInfo">
Personne n&#x2019;a besoin de vous convaincre qu&#x2019;il est important de tester le design et les interactions entre votre site et les personnes qui auront &#xE0; l&#x2019;utiliser, pas vrai ? Mais si vous vous limitez &#xE0; cela, vous passez &#xE0; c&#xF4;t&#xE9; de retours sur la partie la plus importante de votre site : le contenu.
Que le but de votre site soit de convaincre les gens d&#x2019;adopter un nouveau comportement, d&#x2019;acheter quelque chose ou simplement de les informer, si vous vous contentez de v&#xE9;rifier qu&apos;ils parviennent &#xE0; trouver l&apos;information ou bien &#xE0; r&#xE9;aliser une transaction, alors vous manquez l&apos;essentiel : le contenu est-il appropri&#xE9; au public ? Sont-ils capables de lire et de comprendre ce que vous avez &#xE9;crit ?</p><p>Prenez un site d&#x2019;information m&#xE9;dicale avec deux ensembles de fiches techniques&#xA0;: une version simplifi&#xE9;e pour le public de base et une version plus technique pour les m&#xE9;decins. Pendant les tests, un m&#xE9;decin participant qui lisait la version technique s&#x2019;est arr&#xEA;t&#xE9; pour nous dire&#xA0;: &#xAB;&#xA0;&#xC9;coutez. J&#x2019;ai cinq minutes entre deux patients pour comprendre l&#x2019;essentiel de ces informations. Je ne fais pas de recherche sur le sujet, je veux juste en savoir suffisamment pour pouvoir en parler &#xE0; mes patients. Si je n&#x2019;arrive pas &#xE0; comprendre rapidement, je ne peux pas l&#x2019;utiliser&#xA0;&#xBB;. Nous avions fait des suppositions incorrectes &#xE0; propos des besoins de chaque segment du public. Nous serions pass&#xE9; &#xE0; c&#xF4;t&#xE9; de cette r&#xE9;v&#xE9;lation importante si nous n&#x2019;avions pas test&#xE9; le contenu.</p><h2>Vous vous y prenez mal</h2><p>Avez-vous d&#xE9;j&#xE0; pos&#xE9; ces questions &#xE0; vos utilisateurs &#xE0; propos de votre contenu&#xA0;?</p><blockquote class="spip"><p>Ces informations vous ont-elles plu&#xA0;?<br class="autobr">
Avez-vous compris ce que vous avez lu&#xA0;?</p></blockquote><p>Il est tentant de poser ces questions mais elles ne vous aideront pas &#xE0; d&#xE9;couvrir si votre contenu est adapt&#xE9; &#xE0; votre public. La question de savoir si le contenu pla&#xEE;t est tr&#xE8;s appr&#xE9;ci&#xE9;e &#x2014;&#xA0;surtout dans les &#xE9;tudes de march&#xE9;&#xA0;&#x2014; mais elle n&#x2019;est pas pertinente dans l&#x2019;&#xE9;valuation de la conception car le fait que quelque chose plaise a tr&#xE8;s peu de rapport avec le fait de le comprendre et de l&#x2019;utiliser. Dan Formosa donne des explications tr&#xE8;s int&#xE9;ressantes qui expliquent pourquoi vous devriez <a href="http://interactions.acm.org/content/?p=1328" class="spip_out">&#xE9;viter de demander aux gens ce qu&#x2019;ils appr&#xE9;cient</a> pendant des recherches utilisateurs. Pour ce qui est de la question de la compr&#xE9;hension, il est utile d&#x2019;en savoir un minimum sur la fa&#xE7;on dont les gens lisent.</p><h2>Le processus de lecture</h2><p>La lecture est le fruit de deux processus cognitifs simultan&#xE9;s&#xA0;: le d&#xE9;codage et la compr&#xE9;hension.</p><p>Quand nous commen&#xE7;ons &#xE0; lire, nous apprenons que certains symboles repr&#xE9;sentent des concepts. Nous commen&#xE7;ons par reconna&#xEE;tre des lettres et par associer les formes aux sons qu&#x2019;elles repr&#xE9;sentent. Ensuite, nous passons &#xE0; l&#x2019;&#xE9;tape de la reconnaissance de mots entiers et de leur sens. Une fois que nous avons dig&#xE9;r&#xE9; ces mots de mani&#xE8;re individuelle, nous pouvons passer &#xE0; la compr&#xE9;hension&#xA0;: trouver ce que l&#x2019;auteur a voulu dire en attachant ces mots les uns aux autres. C&#x2019;est un travail difficile, en particulier si vous apprenez &#xE0; lire ou si vous faites partie des pr&#xE8;s de <a href="http://www.nationmaster.com/graph/edu_lit_adu_at_low_lit_lev-education-literacy-adults-low-level" class="spip_out">50% de la population</a> qui ont de faibles capacit&#xE9;s de lecture.</p><p>M&#xEA;me s&#x2019;il est tentant de faire lire le texte &#xE0; quelqu&#x2019;un et de lui demander s&#x2019;il l&#x2019;a compris, vous ne devriez pas vous appuyer sur un simple &#xAB;&#xA0;oui&#xA0;&#xBB;. Il est possible de reconna&#xEE;tre tous les mots (d&#xE9;coder), et avoir pourtant mal appr&#xE9;hend&#xE9; le sens (comprendre). Vous en avez probablement fait l&#x2019;exp&#xE9;rience vous-m&#xEA;me&#xA0;: avez-vous d&#xE9;j&#xE0; lu quelque chose jusqu&#x2019;au bout pour vous apercevoir que vous n&#x2019;aviez pas compris&#xA0;? Vous reconnaissez chaque mot, mais parce que le texte n&#x2019;est pas clair ou parce que vous &#xEA;tres fatigu&#xE9;s, le sens du passage vous &#xE9;chappe.</p><p>Alors comment d&#xE9;terminer si votre contenu est adapt&#xE9; &#xE0; pour vos utilisateurs&#xA0;? Voyons comment le pr&#xE9;dire (sans utilisateur) et comment le tester (avec des utilisateurs).</p><h2>Estimons-le</h2><p>Les formules de lisibilit&#xE9; mesurent les &#xE9;l&#xE9;ments quantifiables de l&#x2019;&#xE9;crit, tels que la longueur des mots et des phrases, pour pr&#xE9;dire le niveau de comp&#xE9;tence n&#xE9;cessaire pour les comprendre. Ils peuvent constituer une fa&#xE7;on rapide, facile, et bon march&#xE9; de d&#xE9;terminer si un texte sera trop difficile &#xE0; comprendre pour un public particulier. Les r&#xE9;sultats sont faciles &#xE0; comprendre&#xA0;: beaucoup donnent le niveau scolaire &#xE9;tats-uniens du texte.</p><p>Vous pouvez acheter des logiciels de lisibilit&#xE9;. Il existe &#xE9;galement des outils gratuits en ligne propos&#xE9;s par <a href="http://www.addedbytes.com/blog/code/readability-score/" class="spip_out">Added Bytes</a>, <a href="http://juicystudio.com/services/readability.php" class="spip_out">Juicy Studio</a>, et <a href="http://www.editcentral.com/gwt1/EditCentral.html#style_diction" class="spip_out">Edit Central</a>. Enfin, vous pouvez toujours vous rabattre sur la formule de gradation Flesch-Kincaid de Microsoft Word.</p><p>Cependant, il y a un gros probl&#xE8;me avec les formules de lisibilit&#xE9;&#xA0;: la plupart des propri&#xE9;t&#xE9;s qui rendent un texte facile &#xE0; comprendre comme le contenu, l&#x2019;organisation, ou la mise en page ne peuvent pas se mesurer de fa&#xE7;on math&#xE9;matique. Utiliser des mots courts et des phrases simples ne garantit en rien que le texte sera lisible. Les formules de lisibilit&#xE9; ne prennent pas en compte le sens. En aucun cas. Par exemple, prenons la phrase suivante de la page &#xAB;&#xA0;A propos&#xA0;&#xBB; de <i>A List Apart</i>. L&#x2019;<a href="http://www.harrymclaughlin.com/SMOG.htm" class="spip_out">index SMOG</a> estime qu&#x2019;il faut un niveau de troisi&#xE8;me pour la comprendre&#xA0;:</p><blockquote class="spip"><p>Nous recevons plus de courrier en une journ&#xE9;e que nous pourrions en lire en une semaine.</p></blockquote><p>Maintenant, r&#xE9;arrangeons les mots de fa&#xE7;on &#xE0; obscurcir le sens. Le r&#xE9;sultat&#xA0;: toujours compr&#xE9;hensible pour un &#xE9;l&#xE8;ve de troisi&#xE8;me.</p><blockquote class="spip"><p>En une journ&#xE9;e nous courrier plus qu&#x2019;en une semaine recevons plus que nous pourrions en lire.</p></blockquote><p>Les formules de lisibilit&#xE9; peuvent aider &#xE0; pr&#xE9;dire le niveau de difficult&#xE9; du texte et vous aider &#xE0; argumenter pour pouvoir le tester avec des utilisateurs. Mais ne les utilisez pas comme votre seule m&#xE9;thode d&#x2019;&#xE9;valuation, et ne r&#xE9;&#xE9;crivez pas vos textes juste pour satisfaire une formule. Rappelez-vous, les formules de lisibilit&#xE9; estiment le niveau de difficult&#xE9; d&#x2019;un texte. Elles ne peuvent pas vous enseigner comment r&#xE9;diger des textes compr&#xE9;hensibles.</p><h2>Faire un test d&#x2019;utilisabilit&#xE9; mod&#xE9;r&#xE9;</h2><p>Pour d&#xE9;terminer si les gens comprennent votre contenu, faites-leur lire et appliquer de nouvelles connaissances. En d&#x2019;autres termes, faites un test d&#x2019;utilisabilit&#xE9;&#xA0;! Voici comment cr&#xE9;er des sc&#xE9;narios de t&#xE2;ches dans lesquels les participants interpr&#xE8;tent et utilisent ce qu&#x2019;ils ont lu&#xA0;:</p><ul class="spip"><li> Identifiez les probl&#xE8;mes cruciaux pour vos utilisateurs et vos affaires.</li><li> Cr&#xE9;ez des t&#xE2;ches qui testent les connaissances des utilisateurs sur ces probl&#xE8;mes.</li><li> Dites bien aux participants que ce ne sont pas eux qui sont test&#xE9;s mais bien le contenu.</li></ul><p>Disons que vous testez <a href="http://septa.org/fares/pass/index.html" class="spip_out">SEPTA</a>, un site de transport en commun. Il offre plusieurs types d&#x2019;abonnement mensuels qui varient selon le moyen de transport utilis&#xE9; et la distance parcourue&#xA0;: par exemple, le TransPass permet de prendre le m&#xE9;tro, le bus ou le trolley. Un TrailPass vous permet aussi de prendre le train, etc. Si vous vouliez uniquement tester l&#x2019;interface, vous articuleriez la t&#xE2;che de la fa&#xE7;on suivante&#xA0;:</p><blockquote class="spip"><p>Achetez un TrailPass mensuel.</p></blockquote><p>Mais vous souhaitez tester avec quelle facilit&#xE9; le contenu explique la diff&#xE9;rence entre les abonnements pour que les gens puissent choisir celui qui leur convient le mieux. Ainsi, articulez la t&#xE2;che de cette fa&#xE7;on&#xA0;:</p><blockquote class="spip"><p>Achetez l&#x2019;abonnement le meilleur march&#xE9; qui r&#xE9;pond &#xE0; vos besoins.</p></blockquote><p>Vous voyez la diff&#xE9;rence&#xA0;? La premi&#xE8;re version ne requiert pas des participants qu&#x2019;ils prennent en compte le contenu du tout. Elle leur dit simplement quelle version choisir. La deuxi&#xE8;me version leur demande d&#x2019;utiliser le contenu pour d&#xE9;terminer quelle option est la meilleure pour eux. Soyez s&#xFB;r d&#x2019;obtenir des participants qu&#x2019;ils articulent explicitement leurs besoins pour que vous puissiez juger s&#x2019;ils ont choisi la meilleure option.</p><p>Demandez aux participants de penser &#xE0; haute voix pendant qu&#x2019;ils lisent le contenu. Vous obtiendrez de pr&#xE9;cieux indices sur ce qui leur para&#xEE;t confus et pourquoi. Id&#xE9;alement, vous souhaitez que vos utilisateurs comprennent le texte d&#xE8;s leur premi&#xE8;re lecture. S&#x2019;ils ont besoin de relire quoi que ce soit, vous devez clarifier le texte. Demandez aussi &#xE0; vos participants de paraphraser certaines portions&#xA0;; s&#x2019;ils ne comprennent pas l&#x2019;id&#xE9;e g&#xE9;n&#xE9;rale, vous feriez mieux de recommencer.</p><p>Pour d&#xE9;terminer quand les sc&#xE9;narii et les explications de texte sont corrects, vous devez savoir &#xE0; quoi ressemblent les bonnes r&#xE9;ponses. S&#x2019;il le faut, travaillez avec un expert sur le sujet pour cr&#xE9;er une feuille de r&#xE9;ponses avant de diriger les s&#xE9;ances. Vous pouvez organiser des s&#xE9;ances de test utilisateur mod&#xE9;r&#xE9;es en temps r&#xE9;el soit en personne soit &#xE0; distance. Mais vous pouvez &#xE9;galement utiliser des m&#xE9;thodes asynchrones.</p><h2>Faites un test d&#x2019;utilisabilit&#xE9; non mod&#xE9;r&#xE9;</h2><p>Si vous avez besoin d&#x2019;un panel plus cons&#xE9;quent, que vous avez un budget serr&#xE9; ou que le temps presse, essayez une &#xE9;tude &#xE0; distance sans mod&#xE9;rateur. Envoyez aux participants l&#x2019;un des outils de test utilisateur de votre choix comme <a href="http://www.loop11.com/" class="spip_out">Loop11</a> ou <a href="http://www.openhallway.com/" class="spip_out">OpenHallway</a>, donnez-leur des t&#xE2;ches &#xE0; r&#xE9;aliser et enregistrez leurs r&#xE9;ponses. Vous pouvez m&#xEA;me utiliser quelque chose comme <a href="https://surveymonkey.com/" class="spip_out">SurveyMonkey</a> et formater votre &#xE9;tude comme un test &#xE0; choix multiple&#xA0;: cela vous prendra plus de temps au d&#xE9;but que des questions ouvertes car vous devez d&#xE9;finir les r&#xE9;ponses possibles &#xE0; l&#x2019;avance mais ainsi l&#x2019;&#xE9;valuation quantitative sera plus rapide.</p><p>La cl&#xE9; du succ&#xE8;s d&#x2019;un test &#xE0; choix multiple r&#xE9;ussi est de cr&#xE9;er des questions sans &#xE9;quivoque.</p><ul class="spip"><li> Formulez votre question dans une forme affirmative et pas n&#xE9;gative.</li><li> Incluez seulement une seule r&#xE9;ponse correcte ou clairement meilleure.</li><li> Inventez entre deux et quatre r&#xE9;ponses incorrectes (des distracteurs) qui pourraient &#xEA;tre plausibles si vous ne compreniez pas le texte.</li><li> Assurez-vous que les alternatives s&#x2019;excluent mutuellement.</li><li> &#xC9;vitez de donner des indices dans les r&#xE9;ponses.</li><li> &#xC9;vitez d&#x2019;utiliser &#xAB;&#xA0;Toutes les options ci-dessus&#xA0;&#xBB; ou &#xAB;&#xA0;Aucune option ci-dessus&#xA0;&#xBB; en tant que choix.</li><li> &#xC9;vitez d&#x2019;utiliser &#xAB;&#xA0;jamais&#xA0;&#xBB;, &#xAB;&#xA0;toujours&#xA0;&#xBB;, et &#xAB;&#xA0;seulement&#xA0;&#xBB;.</li></ul><p>Pensez aussi &#xE0; ajouter la possibilit&#xE9; de r&#xE9;pondre &#xAB;&#xA0;Je ne sais pas&#xA0;&#xBB; pour &#xE9;viter que les participants ne cochent une r&#xE9;ponse au hasard juste pour passer la question. Il ne s&#x2019;agit pas du bac. Une r&#xE9;ponse choisie par d&#xE9;faut ne vous aidera pas &#xE0; analyser votre contenu.</p><blockquote class="spip"><p><strong>Sc&#xE9;nario de t&#xE2;ches&#xA0;:</strong></p><p>Vous souhaitez acheter des ch&#xE8;ques voyage avec votre carte de cr&#xE9;dit. Quel pourcentage s&#x2019;applique &#xE0; votre achat&#xA0;?</p><p><strong>R&#xE9;ponses possibles&#xA0;:</strong>
Le taux annuel standard de 10.99%
Le taux annuel pour avance de liquide de 24.24%*
Le taux de p&#xE9;nalit&#xE9; de 29.99%
Je ne sais pas.<p>
(* Cette r&#xE9;ponse est la r&#xE9;ponse correcte &#xE0; en croire le contrat de mon propre organisme de cr&#xE9;dit)</p></p></blockquote><p>Tout comme dans les tests mod&#xE9;r&#xE9;s, faites comprendre aux utilisateurs que le test concerne le contenu et non leurs capacit&#xE9;s.</p><h2>Utilisez un test de Cloze</h2><p>Un test de Cloze enl&#xE8;ve certains mots d&#x2019;une partie de votre texte et demande &#xE0; vos utilisateurs de remplir les mots manquants. Les participants au test doivent se r&#xE9;f&#xE9;rer au contexte ainsi qu&#x2019;&#xE0; leurs connaissances ant&#xE9;rieures du sujet pour identifier les mots effac&#xE9;s. C&#x2019;est bas&#xE9; sur la th&#xE9;orie de Gestalt de compl&#xE9;tude &#x2013;&#xA0;dans laquelle le cerveau essaie de remplir les pi&#xE8;ces manquantes&#xA0;&#x2013; et l&#x2019;applique &#xE0; l&#x2019;&#xE9;crit.</p><p>Cela ressemble &#xE0; ceci&#xA0;:</p><blockquote class="spip"><p>Si vous voulez _____ si les ______________ de votre site comprennent votre contenu, alors vous _____ le tester avec eux.</p></blockquote><p>Cela ressemble &#xE0; un exercice de remplissage, n&#x2019;est-ce pas&#xA0;? Mais au lieu d&#x2019;essayer d&#x2019;inventer la phrase la plus amusante, la plus &#xE9;trange ou la plus int&#xE9;ressante, comme dans le jeu am&#xE9;ricain Mad Libs, les participants doivent deviner le mot exact que l&#x2019;auteur a utilis&#xE9;. M&#xEA;me si les tests Cloze sont rares dans le champ de l&#x2019;exp&#xE9;rience utilisateur, les &#xE9;ducateurs les utilisent depuis des d&#xE9;cennies pour s&#x2019;assurer qu&#x2019;un texte est adapt&#xE9; &#xE0; leurs &#xE9;tudiants surtout dans les cours d&#x2019;anglais deuxi&#xE8;me langue.</p><p>Voil&#xE0; comment faire&#xA0;:</p><ul class="spip"><li> Prenez un extrait de texte de 125 &#xE0; 250 mots &#xE0; peu pr&#xE8;s.</li><li> Enlevez un mot sur cinq en le rempla&#xE7;ant par un espace blanc.</li><li> Demandez aux participants de remplir les espaces avec le mot qui, selon eux, a &#xE9;t&#xE9; enlev&#xE9;.</li><li> &#xC9;tablissez un score en comptant le nombre total de bonnes r&#xE9;ponses et en le divisant par le nombre total d&#x2019;espaces blancs.</li></ul><p>Un score de 60% ou mieux indique que le texte est appropri&#xE9; &#xE0; votre public. Les participants ayant obtenu entre 40 et 60% auront quelques difficult&#xE9;s &#xE0; comprendre le texte original. Ce n&#x2019;est pas r&#xE9;dhibitoire, mais cela veut dire que le public aura besoin d&#x2019;aide suppl&#xE9;mentaire pour comprendre votre contenu.<br class="autobr">
Un score de moins de 40% veut dire que les lecteurs seront frustr&#xE9;s par le texte et qu&#x2019;il devrait &#xEA;tre r&#xE9;&#xE9;crit.</p><p>Cela peut sembler farfelu, mais essayez cette m&#xE9;thode avant de l&#x2019;&#xE9;carter. Dans une &#xE9;tude gouvernementale sur la lisibilit&#xE9; d&#x2019;information li&#xE9;es aux services de sant&#xE9;, un panel d&#x2019;expert a cat&#xE9;goris&#xE9; des articles de sant&#xE9; comme &#xE9;tant faciles ou difficiles. Nous avons ensuite fait passer des tests Cloze en utilisant ces articles &#xE0; des participants dont le niveau d&#x2019;alphab&#xE9;tisation allait de bas &#xE0; moyen. Nous avons d&#xE9;couvert que les r&#xE9;sultats refl&#xE9;taient ceux du panel d&#x2019;expert. Le score moyen des articles dits &#xAB;&#xA0;faciles&#xA0;&#xBB; &#xE9;tait de 60, indiquant qu&#x2019;ils avaient &#xE9;t&#xE9; &#xE9;crits de mani&#xE8;re appropri&#xE9;e pour ce public. Le score moyen des articles dits &#xAB;&#xA0;difficiles&#xA0;&#xBB; &#xE9;tait de 39&#xA0;: trop difficile pour ce public.</p><p>Les tests Cloze sont facile &#xE0; cr&#xE9;er, administrer et &#xE9;valuer. Ils donnent une bonne id&#xE9;e de l&#x2019;ad&#xE9;quation entre le contenu et le public vis&#xE9;. Si vous utilisez des tests Cloze seuls ou en combinaison avec d&#x2019;autres tests utilisateurs, sachez que remplir ces blancs demande beaucoup d&#x2019;efforts cognitifs. Pr&#xE9;voyez 25 blancs minimum pour avoir une &#xE9;tude de qualit&#xE9;, mais sachez qu&#x2019;au-del&#xE0; de 50 le test devient vite fatiguant.</p><h2>Quand tester</h2><p>Testez votre contenu &#xE0; n&#x2019;importe quel moment dans le processus de d&#xE9;veloppement du site. D&#xE8;s que vous avez du contenu, vous pouvez le tester. Vous avez besoin de convaincre votre patron de budg&#xE9;ter les tests de contenu&#xA0;? Passez votre contenu dans une formule de lisibilit&#xE9;. Vous avez du contenu mais pas de wireframes ou de design visuel&#xA0;? Faites un test Cloze pour &#xE9;valuer le contenu. Est-ce que la compr&#xE9;hension contenu est cruciale pour terminer une t&#xE2;che ou un ensemble de t&#xE2;ches&#xA0;? Affichez le contenu lors de tests d&#x2019;ergonomie.</p><h2>Que tester</h2><p>Vous ne pouvez pas tester chaque phrase de votre site et vous n&#x2019;en avez pas besoin. Concentrez-vous sur les t&#xE2;ches importantes pour vos utilisateurs et votre produit. Par exemple, est-ce que votre centre de support re&#xE7;oit des appels concernant des informations qui devraient se trouver sur le site&#xA0;? Testez le contenu pour trouver si votre site laisse &#xE0; d&#xE9;sirer et &#xE0; quel endroit.</p><h2>N&#x2019;attendez plus&#xA0;: allez-y&#xA0;!</h2><p>Tout comme les tests d&#x2019;ergonomie se concentrent sur ce que les utilisateurs font et non pas ce qu&#x2019;ils disent faire, les tests de contenu d&#xE9;terminent ce que les utilisateurs comprennent et non pas ce qu&#x2019;ils disent comprendre.</p><p>Quel que soit votre budget, votre calendrier et votre acc&#xE8;s aux utilisateurs, il existe une m&#xE9;thode pour tester si votre contenu est appropri&#xE9; pour les personnes qui le lise. Donc, testez&#xA0;! Si votre contenu fonctionne, vous serez vraiment fix&#xE9;, sinon il ne vous restera plus qu&#x2019;&#xE0; le r&#xE9;&#xE9;crire.</p>
<span>Translated with the permission of <a href="http://www.alistapart.com/">A List Apart</a> and the author[s].</span></div>]]></description>
      <link>http://www.pompage.net/traduction/tests-de-contenu</link>
      <guid>http://www.pompage.net/traduction/tests-de-contenu</guid>
      <pubDate>Wed, 26 Mar 2014 11:03:00 +0100</pubDate>
    </item>
    <item>
      <title><![CDATA[Tests de contenu]]></title>
      <description><![CDATA[<div id="article"> <p class="signature">Par <a href="http://www.angelacolter.com/">Angela Colter</a> </p> <p class="moreInfo"> Personne n&#x2019;a besoin de vous convaincre qu&#x2019;il est important de tester le design et les interactions entre votre site et les personnes qui auront &#xE0; l&#x2019;utiliser, pas vrai ? Mais si vous vous limitez &#xE0; cela, vous passez &#xE0; c&#xF4;t&#xE9; de retours sur la partie la plus importante de votre site : le contenu.
Que le but de votre site soit de convaincre les gens d&#x2019;adopter un nouveau comportement, d&#x2019;acheter quelque chose ou simplement de les informer, si vous vous contentez de v&#xE9;rifier qu&apos;ils parviennent &#xE0; trouver l&apos;information ou bien &#xE0; r&#xE9;aliser une transaction, alors vous manquez l&apos;essentiel : le contenu est-il appropri&#xE9; au public ? Sont-ils capables de lire et de comprendre ce que vous avez &#xE9;crit ? </p> <p>Prenez un site d&#x2019;information m&#xE9;dicale avec deux ensembles de fiches techniques&#xA0;: une version simplifi&#xE9;e pour le public de base et une version plus technique pour les m&#xE9;decins. Pendant les tests, un m&#xE9;decin participant qui lisait la version technique s&#x2019;est arr&#xEA;t&#xE9; pour nous dire&#xA0;: &#xAB;&#xA0;&#xC9;coutez. J&#x2019;ai cinq minutes entre deux patients pour comprendre l&#x2019;essentiel de ces informations. Je ne fais pas de recherche sur le sujet, je veux juste en savoir suffisamment pour pouvoir en parler &#xE0; mes patients. Si je n&#x2019;arrive pas &#xE0; comprendre rapidement, je ne peux pas l&#x2019;utiliser&#xA0;&#xBB;. Nous avions fait des suppositions incorrectes &#xE0; propos des besoins de chaque segment du public. Nous serions pass&#xE9; &#xE0; c&#xF4;t&#xE9; de cette r&#xE9;v&#xE9;lation importante si nous n&#x2019;avions pas test&#xE9; le contenu.</p>
<h2>Vous vous y prenez mal</h2>
<p>Avez-vous d&#xE9;j&#xE0; pos&#xE9; ces questions &#xE0; vos utilisateurs &#xE0; propos de votre contenu&#xA0;?</p>
<blockquote class="spip">
<p>Ces informations vous ont-elles plu&#xA0;?<br class="autobr">
Avez-vous compris ce que vous avez lu&#xA0;?</p>
</blockquote>
<p>Il est tentant de poser ces questions mais elles ne vous aideront pas &#xE0; d&#xE9;couvrir si votre contenu est adapt&#xE9; &#xE0; votre public. La question de savoir si le contenu pla&#xEE;t est tr&#xE8;s appr&#xE9;ci&#xE9;e &#x2014;&#xA0;surtout dans les &#xE9;tudes de march&#xE9;&#xA0;&#x2014; mais elle n&#x2019;est pas pertinente dans l&#x2019;&#xE9;valuation de la conception car le fait que quelque chose plaise a tr&#xE8;s peu de rapport avec le fait de le comprendre et de l&#x2019;utiliser. Dan Formosa donne des explications tr&#xE8;s int&#xE9;ressantes qui expliquent pourquoi vous devriez <a href="http://interactions.acm.org/content/?p=1328" class="spip_out">&#xE9;viter de demander aux gens ce qu&#x2019;ils appr&#xE9;cient</a> pendant des recherches utilisateurs. Pour ce qui est de la question de la compr&#xE9;hension, il est utile d&#x2019;en savoir un minimum sur la fa&#xE7;on dont les gens lisent.</p>
<h2>Le processus de lecture</h2>
<p>La lecture est le fruit de deux processus cognitifs simultan&#xE9;s&#xA0;: le d&#xE9;codage et la compr&#xE9;hension.</p>
<p>Quand nous commen&#xE7;ons &#xE0; lire, nous apprenons que certains symboles repr&#xE9;sentent des concepts. Nous commen&#xE7;ons par reconna&#xEE;tre des lettres et par associer les formes aux sons qu&#x2019;elles repr&#xE9;sentent. Ensuite, nous passons &#xE0; l&#x2019;&#xE9;tape de la reconnaissance de mots entiers et de leur sens. Une fois que nous avons dig&#xE9;r&#xE9; ces mots de mani&#xE8;re individuelle, nous pouvons passer &#xE0; la compr&#xE9;hension&#xA0;: trouver ce que l&#x2019;auteur a voulu dire en attachant ces mots les uns aux autres. C&#x2019;est un travail difficile, en particulier si vous apprenez &#xE0; lire ou si vous faites partie des pr&#xE8;s de <a href="http://www.nationmaster.com/graph/edu_lit_adu_at_low_lit_lev-education-literacy-adults-low-level" class="spip_out">50% de la population</a> qui ont de faibles capacit&#xE9;s de lecture.</p>
<p>M&#xEA;me s&#x2019;il est tentant de faire lire le texte &#xE0; quelqu&#x2019;un et de lui demander s&#x2019;il l&#x2019;a compris, vous ne devriez pas vous appuyer sur un simple &#xAB;&#xA0;oui&#xA0;&#xBB;. Il est possible de reconna&#xEE;tre tous les mots (d&#xE9;coder), et avoir pourtant mal appr&#xE9;hend&#xE9; le sens (comprendre). Vous en avez probablement fait l&#x2019;exp&#xE9;rience vous-m&#xEA;me&#xA0;: avez-vous d&#xE9;j&#xE0; lu quelque chose jusqu&#x2019;au bout pour vous apercevoir que vous n&#x2019;aviez pas compris&#xA0;? Vous reconnaissez chaque mot, mais parce que le texte n&#x2019;est pas clair ou parce que vous &#xEA;tres fatigu&#xE9;s, le sens du passage vous &#xE9;chappe.</p>
<p>Alors comment d&#xE9;terminer si votre contenu est adapt&#xE9; &#xE0; pour vos utilisateurs&#xA0;? Voyons comment le pr&#xE9;dire (sans utilisateur) et comment le tester (avec des utilisateurs).</p>
<h2>Estimons-le</h2>
<p>Les formules de lisibilit&#xE9; mesurent les &#xE9;l&#xE9;ments quantifiables de l&#x2019;&#xE9;crit, tels que la longueur des mots et des phrases, pour pr&#xE9;dire le niveau de comp&#xE9;tence n&#xE9;cessaire pour les comprendre. Ils peuvent constituer une fa&#xE7;on rapide, facile, et bon march&#xE9; de d&#xE9;terminer si un texte sera trop difficile &#xE0; comprendre pour un public particulier. Les r&#xE9;sultats sont faciles &#xE0; comprendre&#xA0;: beaucoup donnent le niveau scolaire &#xE9;tats-uniens du texte.</p>
<p>Vous pouvez acheter des logiciels de lisibilit&#xE9;. Il existe &#xE9;galement des outils gratuits en ligne propos&#xE9;s par <a href="http://www.addedbytes.com/blog/code/readability-score/" class="spip_out">Added Bytes</a>, <a href="http://juicystudio.com/services/readability.php" class="spip_out">Juicy Studio</a>, et <a href="http://www.editcentral.com/gwt1/EditCentral.html#style_diction" class="spip_out">Edit Central</a>. Enfin, vous pouvez toujours vous rabattre sur la formule de gradation Flesch-Kincaid de Microsoft Word.</p>
<p>Cependant, il y a un gros probl&#xE8;me avec les formules de lisibilit&#xE9;&#xA0;: la plupart des propri&#xE9;t&#xE9;s qui rendent un texte facile &#xE0; comprendre comme le contenu, l&#x2019;organisation, ou la mise en page ne peuvent pas se mesurer de fa&#xE7;on math&#xE9;matique. Utiliser des mots courts et des phrases simples ne garantit en rien que le texte sera lisible. Les formules de lisibilit&#xE9; ne prennent pas en compte le sens. En aucun cas. Par exemple, prenons la phrase suivante de la page &#xAB;&#xA0;A propos&#xA0;&#xBB; de <i>A List Apart</i>. L&#x2019;<a href="http://www.harrymclaughlin.com/SMOG.htm" class="spip_out">index SMOG</a> estime qu&#x2019;il faut un niveau de troisi&#xE8;me pour la comprendre&#xA0;:</p>
<blockquote class="spip">
<p>Nous recevons plus de courrier en une journ&#xE9;e que nous pourrions en lire en une semaine.</p>
</blockquote>
<p>Maintenant, r&#xE9;arrangeons les mots de fa&#xE7;on &#xE0; obscurcir le sens. Le r&#xE9;sultat&#xA0;: toujours compr&#xE9;hensible pour un &#xE9;l&#xE8;ve de troisi&#xE8;me.</p>
<blockquote class="spip">
<p>En une journ&#xE9;e nous courrier plus qu&#x2019;en une semaine recevons plus que nous pourrions en lire.</p>
</blockquote>
<p>Les formules de lisibilit&#xE9; peuvent aider &#xE0; pr&#xE9;dire le niveau de difficult&#xE9; du texte et vous aider &#xE0; argumenter pour pouvoir le tester avec des utilisateurs. Mais ne les utilisez pas comme votre seule m&#xE9;thode d&#x2019;&#xE9;valuation, et ne r&#xE9;&#xE9;crivez pas vos textes juste pour satisfaire une formule. Rappelez-vous, les formules de lisibilit&#xE9; estiment le niveau de difficult&#xE9; d&#x2019;un texte. Elles ne peuvent pas vous enseigner comment r&#xE9;diger des textes compr&#xE9;hensibles.</p>
<h2>Faire un test d&#x2019;utilisabilit&#xE9; mod&#xE9;r&#xE9;</h2>
<p>Pour d&#xE9;terminer si les gens comprennent votre contenu, faites-leur lire et appliquer de nouvelles connaissances. En d&#x2019;autres termes, faites un test d&#x2019;utilisabilit&#xE9;&#xA0;! Voici comment cr&#xE9;er des sc&#xE9;narios de t&#xE2;ches dans lesquels les participants interpr&#xE8;tent et utilisent ce qu&#x2019;ils ont lu&#xA0;:</p>
<ul class="spip"><li> Identifiez les probl&#xE8;mes cruciaux pour vos utilisateurs et vos affaires.</li><li> Cr&#xE9;ez des t&#xE2;ches qui testent les connaissances des utilisateurs sur ces probl&#xE8;mes.</li><li> Dites bien aux participants que ce ne sont pas eux qui sont test&#xE9;s mais bien le contenu.</li></ul>
<p>Disons que vous testez <a href="http://septa.org/fares/pass/index.html" class="spip_out">SEPTA</a>, un site de transport en commun. Il offre plusieurs types d&#x2019;abonnement mensuels qui varient selon le moyen de transport utilis&#xE9; et la distance parcourue&#xA0;: par exemple, le TransPass permet de prendre le m&#xE9;tro, le bus ou le trolley. Un TrailPass vous permet aussi de prendre le train, etc. Si vous vouliez uniquement tester l&#x2019;interface, vous articuleriez la t&#xE2;che de la fa&#xE7;on suivante&#xA0;:</p>
<blockquote class="spip">
<p>Achetez un TrailPass mensuel.</p>
</blockquote>
<p>Mais vous souhaitez tester avec quelle facilit&#xE9; le contenu explique la diff&#xE9;rence entre les abonnements pour que les gens puissent choisir celui qui leur convient le mieux. Ainsi, articulez la t&#xE2;che de cette fa&#xE7;on&#xA0;:</p>
<blockquote class="spip">
<p>Achetez l&#x2019;abonnement le meilleur march&#xE9; qui r&#xE9;pond &#xE0; vos besoins.</p>
</blockquote>
<p>Vous voyez la diff&#xE9;rence&#xA0;? La premi&#xE8;re version ne requiert pas des participants qu&#x2019;ils prennent en compte le contenu du tout. Elle leur dit simplement quelle version choisir. La deuxi&#xE8;me version leur demande d&#x2019;utiliser le contenu pour d&#xE9;terminer quelle option est la meilleure pour eux. Soyez s&#xFB;r d&#x2019;obtenir des participants qu&#x2019;ils articulent explicitement leurs besoins pour que vous puissiez juger s&#x2019;ils ont choisi la meilleure option.</p>
<p>Demandez aux participants de penser &#xE0; haute voix pendant qu&#x2019;ils lisent le contenu. Vous obtiendrez de pr&#xE9;cieux indices sur ce qui leur para&#xEE;t confus et pourquoi. Id&#xE9;alement, vous souhaitez que vos utilisateurs comprennent le texte d&#xE8;s leur premi&#xE8;re lecture. S&#x2019;ils ont besoin de relire quoi que ce soit, vous devez clarifier le texte. Demandez aussi &#xE0; vos participants de paraphraser certaines portions&#xA0;; s&#x2019;ils ne comprennent pas l&#x2019;id&#xE9;e g&#xE9;n&#xE9;rale, vous feriez mieux de recommencer.</p>
<p>Pour d&#xE9;terminer quand les sc&#xE9;narii et les explications de texte sont corrects, vous devez savoir &#xE0; quoi ressemblent les bonnes r&#xE9;ponses. S&#x2019;il le faut, travaillez avec un expert sur le sujet pour cr&#xE9;er une feuille de r&#xE9;ponses avant de diriger les s&#xE9;ances. Vous pouvez organiser des s&#xE9;ances de test utilisateur mod&#xE9;r&#xE9;es en temps r&#xE9;el soit en personne soit &#xE0; distance. Mais vous pouvez &#xE9;galement utiliser des m&#xE9;thodes asynchrones.</p>
<h2>Faites un test d&#x2019;utilisabilit&#xE9; non mod&#xE9;r&#xE9;</h2>
<p>Si vous avez besoin d&#x2019;un panel plus cons&#xE9;quent, que vous avez un budget serr&#xE9; ou que le temps presse, essayez une &#xE9;tude &#xE0; distance sans mod&#xE9;rateur. Envoyez aux participants l&#x2019;un des outils de test utilisateur de votre choix comme <a href="http://www.loop11.com/" class="spip_out">Loop11</a> ou <a href="http://www.openhallway.com/" class="spip_out">OpenHallway</a>, donnez-leur des t&#xE2;ches &#xE0; r&#xE9;aliser et enregistrez leurs r&#xE9;ponses. Vous pouvez m&#xEA;me utiliser quelque chose comme <a href="https://surveymonkey.com/" class="spip_out">SurveyMonkey</a> et formater votre &#xE9;tude comme un test &#xE0; choix multiple&#xA0;: cela vous prendra plus de temps au d&#xE9;but que des questions ouvertes car vous devez d&#xE9;finir les r&#xE9;ponses possibles &#xE0; l&#x2019;avance mais ainsi l&#x2019;&#xE9;valuation quantitative sera plus rapide.</p>
<p>La cl&#xE9; du succ&#xE8;s d&#x2019;un test &#xE0; choix multiple r&#xE9;ussi est de cr&#xE9;er des questions sans &#xE9;quivoque.</p>
<ul class="spip"><li> Formulez votre question dans une forme affirmative et pas n&#xE9;gative.</li><li> Incluez seulement une seule r&#xE9;ponse correcte ou clairement meilleure.</li><li> Inventez entre deux et quatre r&#xE9;ponses incorrectes (des distracteurs) qui pourraient &#xEA;tre plausibles si vous ne compreniez pas le texte.</li><li> Assurez-vous que les alternatives s&#x2019;excluent mutuellement.</li><li> &#xC9;vitez de donner des indices dans les r&#xE9;ponses.</li><li> &#xC9;vitez d&#x2019;utiliser &#xAB;&#xA0;Toutes les options ci-dessus&#xA0;&#xBB; ou &#xAB;&#xA0;Aucune option ci-dessus&#xA0;&#xBB; en tant que choix.</li><li> &#xC9;vitez d&#x2019;utiliser &#xAB;&#xA0;jamais&#xA0;&#xBB;, &#xAB;&#xA0;toujours&#xA0;&#xBB;, et &#xAB;&#xA0;seulement&#xA0;&#xBB;.</li></ul>
<p>Pensez aussi &#xE0; ajouter la possibilit&#xE9; de r&#xE9;pondre &#xAB;&#xA0;Je ne sais pas&#xA0;&#xBB; pour &#xE9;viter que les participants ne cochent une r&#xE9;ponse au hasard juste pour passer la question. Il ne s&#x2019;agit pas du bac. Une r&#xE9;ponse choisie par d&#xE9;faut ne vous aidera pas &#xE0; analyser votre contenu.</p>
<blockquote class="spip">
<p><strong>Sc&#xE9;nario de t&#xE2;ches&#xA0;:</strong></p>
<p>Vous souhaitez acheter des ch&#xE8;ques voyage avec votre carte de cr&#xE9;dit. Quel pourcentage s&#x2019;applique &#xE0; votre achat&#xA0;?</p>
<p><strong>R&#xE9;ponses possibles&#xA0;:</strong>
Le taux annuel standard de 10.99%
Le taux annuel pour avance de liquide de 24.24%*
Le taux de p&#xE9;nalit&#xE9; de 29.99%
Je ne sais pas.<p>
(* Cette r&#xE9;ponse est la r&#xE9;ponse correcte &#xE0; en croire le contrat de mon propre organisme de cr&#xE9;dit)</p></p>
</blockquote>
<p>Tout comme dans les tests mod&#xE9;r&#xE9;s, faites comprendre aux utilisateurs que le test concerne le contenu et non leurs capacit&#xE9;s.</p>
<h2>Utilisez un test de Cloze</h2>
<p>Un test de Cloze enl&#xE8;ve certains mots d&#x2019;une partie de votre texte et demande &#xE0; vos utilisateurs de remplir les mots manquants. Les participants au test doivent se r&#xE9;f&#xE9;rer au contexte ainsi qu&#x2019;&#xE0; leurs connaissances ant&#xE9;rieures du sujet pour identifier les mots effac&#xE9;s. C&#x2019;est bas&#xE9; sur la th&#xE9;orie de Gestalt de compl&#xE9;tude &#x2013;&#xA0;dans laquelle le cerveau essaie de remplir les pi&#xE8;ces manquantes&#xA0;&#x2013; et l&#x2019;applique &#xE0; l&#x2019;&#xE9;crit.</p>
<p>Cela ressemble &#xE0; ceci&#xA0;:</p>
<blockquote class="spip">
<p>Si vous voulez _____ si les ______________ de votre site comprennent votre contenu, alors vous _____ le tester avec eux.</p>
</blockquote>
<p>Cela ressemble &#xE0; un exercice de remplissage, n&#x2019;est-ce pas&#xA0;? Mais au lieu d&#x2019;essayer d&#x2019;inventer la phrase la plus amusante, la plus &#xE9;trange ou la plus int&#xE9;ressante, comme dans le jeu am&#xE9;ricain Mad Libs, les participants doivent deviner le mot exact que l&#x2019;auteur a utilis&#xE9;. M&#xEA;me si les tests Cloze sont rares dans le champ de l&#x2019;exp&#xE9;rience utilisateur, les &#xE9;ducateurs les utilisent depuis des d&#xE9;cennies pour s&#x2019;assurer qu&#x2019;un texte est adapt&#xE9; &#xE0; leurs &#xE9;tudiants surtout dans les cours d&#x2019;anglais deuxi&#xE8;me langue.</p>
<p>Voil&#xE0; comment faire&#xA0;:</p>
<ul class="spip"><li> Prenez un extrait de texte de 125 &#xE0; 250 mots &#xE0; peu pr&#xE8;s.</li><li> Enlevez un mot sur cinq en le rempla&#xE7;ant par un espace blanc.</li><li> Demandez aux participants de remplir les espaces avec le mot qui, selon eux, a &#xE9;t&#xE9; enlev&#xE9;.</li><li> &#xC9;tablissez un score en comptant le nombre total de bonnes r&#xE9;ponses et en le divisant par le nombre total d&#x2019;espaces blancs.</li></ul>
<p>Un score de 60% ou mieux indique que le texte est appropri&#xE9; &#xE0; votre public. Les participants ayant obtenu entre 40 et 60% auront quelques difficult&#xE9;s &#xE0; comprendre le texte original. Ce n&#x2019;est pas r&#xE9;dhibitoire, mais cela veut dire que le public aura besoin d&#x2019;aide suppl&#xE9;mentaire pour comprendre votre contenu.<br class="autobr">
Un score de moins de 40% veut dire que les lecteurs seront frustr&#xE9;s par le texte et qu&#x2019;il devrait &#xEA;tre r&#xE9;&#xE9;crit.</p>
<p>Cela peut sembler farfelu, mais essayez cette m&#xE9;thode avant de l&#x2019;&#xE9;carter. Dans une &#xE9;tude gouvernementale sur la lisibilit&#xE9; d&#x2019;information li&#xE9;es aux services de sant&#xE9;, un panel d&#x2019;expert a cat&#xE9;goris&#xE9; des articles de sant&#xE9; comme &#xE9;tant faciles ou difficiles. Nous avons ensuite fait passer des tests Cloze en utilisant ces articles &#xE0; des participants dont le niveau d&#x2019;alphab&#xE9;tisation allait de bas &#xE0; moyen. Nous avons d&#xE9;couvert que les r&#xE9;sultats refl&#xE9;taient ceux du panel d&#x2019;expert. Le score moyen des articles dits &#xAB;&#xA0;faciles&#xA0;&#xBB; &#xE9;tait de 60, indiquant qu&#x2019;ils avaient &#xE9;t&#xE9; &#xE9;crits de mani&#xE8;re appropri&#xE9;e pour ce public. Le score moyen des articles dits &#xAB;&#xA0;difficiles&#xA0;&#xBB; &#xE9;tait de 39&#xA0;: trop difficile pour ce public.</p>
<p>Les tests Cloze sont facile &#xE0; cr&#xE9;er, administrer et &#xE9;valuer. Ils donnent une bonne id&#xE9;e de l&#x2019;ad&#xE9;quation entre le contenu et le public vis&#xE9;. Si vous utilisez des tests Cloze seuls ou en combinaison avec d&#x2019;autres tests utilisateurs, sachez que remplir ces blancs demande beaucoup d&#x2019;efforts cognitifs. Pr&#xE9;voyez 25 blancs minimum pour avoir une &#xE9;tude de qualit&#xE9;, mais sachez qu&#x2019;au-del&#xE0; de 50 le test devient vite fatiguant.</p>
<h2>Quand tester</h2>
<p>Testez votre contenu &#xE0; n&#x2019;importe quel moment dans le processus de d&#xE9;veloppement du site. D&#xE8;s que vous avez du contenu, vous pouvez le tester. Vous avez besoin de convaincre votre patron de budg&#xE9;ter les tests de contenu&#xA0;? Passez votre contenu dans une formule de lisibilit&#xE9;. Vous avez du contenu mais pas de wireframes ou de design visuel&#xA0;? Faites un test Cloze pour &#xE9;valuer le contenu. Est-ce que la compr&#xE9;hension contenu est cruciale pour terminer une t&#xE2;che ou un ensemble de t&#xE2;ches&#xA0;? Affichez le contenu lors de tests d&#x2019;ergonomie.</p>
<h2>Que tester</h2>
<p>Vous ne pouvez pas tester chaque phrase de votre site et vous n&#x2019;en avez pas besoin. Concentrez-vous sur les t&#xE2;ches importantes pour vos utilisateurs et votre produit. Par exemple, est-ce que votre centre de support re&#xE7;oit des appels concernant des informations qui devraient se trouver sur le site&#xA0;? Testez le contenu pour trouver si votre site laisse &#xE0; d&#xE9;sirer et &#xE0; quel endroit.</p>
<h2>N&#x2019;attendez plus&#xA0;: allez-y&#xA0;!</h2>
<p>Tout comme les tests d&#x2019;ergonomie se concentrent sur ce que les utilisateurs font et non pas ce qu&#x2019;ils disent faire, les tests de contenu d&#xE9;terminent ce que les utilisateurs comprennent et non pas ce qu&#x2019;ils disent comprendre.</p>
<p>Quel que soit votre budget, votre calendrier et votre acc&#xE8;s aux utilisateurs, il existe une m&#xE9;thode pour tester si votre contenu est appropri&#xE9; pour les personnes qui le lise. Donc, testez&#xA0;! Si votre contenu fonctionne, vous serez vraiment fix&#xE9;, sinon il ne vous restera plus qu&#x2019;&#xE0; le r&#xE9;&#xE9;crire.</p> <span>Translated with the permission of <a href="http://www.alistapart.com/">A List Apart</a> and the author[s].</span> </div>]]></description>
      <link>http://www.pompage.net/traduction/tests-de-contenu</link>
      <guid>http://www.pompage.net/traduction/tests-de-contenu</guid>
      <pubDate>Wed, 26 Mar 2014 11:03:00 +0100</pubDate>
    </item>
    <item>
      <title><![CDATA[Tests de contenu]]></title>
      <description><![CDATA[<div id="article"> <p class="signature">Par <a href="http://www.angelacolter.com/">Angela Colter</a> </p> <p class="moreInfo"> Personne n&#x2019;a besoin de vous convaincre qu&#x2019;il est important de tester le design et les interactions entre votre site et les personnes qui auront &#xE0; l&#x2019;utiliser, pas vrai ? Mais si vous vous limitez &#xE0; cela, vous passez &#xE0; c&#xF4;t&#xE9; de retours sur la partie la plus importante de votre site : le contenu.
Que le but de votre site soit de convaincre les gens d&#x2019;adopter un nouveau comportement, d&#x2019;acheter quelque chose ou simplement de les informer, si vous vous contentez de v&#xE9;rifier qu&apos;ils parviennent &#xE0; trouver l&apos;information ou bien &#xE0; r&#xE9;aliser une transaction, alors vous manquez l&apos;essentiel : le contenu est-il appropri&#xE9; au public ? Sont-ils capables de lire et de comprendre ce que vous avez &#xE9;crit ? </p> <p>Prenez un site d&#x2019;information m&#xE9;dicale avec deux ensembles de fiches techniques&#xA0;: une version simplifi&#xE9;e pour le public de base et une version plus technique pour les m&#xE9;decins. Pendant les tests, un m&#xE9;decin participant qui lisait la version technique s&#x2019;est arr&#xEA;t&#xE9; pour nous dire&#xA0;: &#xAB;&#xA0;&#xC9;coutez. J&#x2019;ai cinq minutes entre deux patients pour comprendre l&#x2019;essentiel de ces informations. Je ne fais pas de recherche sur le sujet, je veux juste en savoir suffisamment pour pouvoir en parler &#xE0; mes patients. Si je n&#x2019;arrive pas &#xE0; comprendre rapidement, je ne peux pas l&#x2019;utiliser&#xA0;&#xBB;. Nous avions fait des suppositions incorrectes &#xE0; propos des besoins de chaque segment du public. Nous serions pass&#xE9; &#xE0; c&#xF4;t&#xE9; de cette r&#xE9;v&#xE9;lation importante si nous n&#x2019;avions pas test&#xE9; le contenu.</p>
<h2>Vous vous y prenez mal</h2>
<p>Avez-vous d&#xE9;j&#xE0; pos&#xE9; ces questions &#xE0; vos utilisateurs &#xE0; propos de votre contenu&#xA0;?</p>
<blockquote class="spip">
<p>Ces informations vous ont-elles plu&#xA0;?<br class="autobr">
Avez-vous compris ce que vous avez lu&#xA0;?</p>
</blockquote>
<p>Il est tentant de poser ces questions mais elles ne vous aideront pas &#xE0; d&#xE9;couvrir si votre contenu est adapt&#xE9; &#xE0; votre public. La question de savoir si le contenu pla&#xEE;t est tr&#xE8;s appr&#xE9;ci&#xE9;e &#x2014;&#xA0;surtout dans les &#xE9;tudes de march&#xE9;&#xA0;&#x2014; mais elle n&#x2019;est pas pertinente dans l&#x2019;&#xE9;valuation de la conception car le fait que quelque chose plaise a tr&#xE8;s peu de rapport avec le fait de le comprendre et de l&#x2019;utiliser. Dan Formosa donne des explications tr&#xE8;s int&#xE9;ressantes qui expliquent pourquoi vous devriez <a href="http://interactions.acm.org/content/?p=1328" class="spip_out">&#xE9;viter de demander aux gens ce qu&#x2019;ils appr&#xE9;cient</a> pendant des recherches utilisateurs. Pour ce qui est de la question de la compr&#xE9;hension, il est utile d&#x2019;en savoir un minimum sur la fa&#xE7;on dont les gens lisent.</p>
<h2>Le processus de lecture</h2>
<p>La lecture est le fruit de deux processus cognitifs simultan&#xE9;s&#xA0;: le d&#xE9;codage et la compr&#xE9;hension.</p>
<p>Quand nous commen&#xE7;ons &#xE0; lire, nous apprenons que certains symboles repr&#xE9;sentent des concepts. Nous commen&#xE7;ons par reconna&#xEE;tre des lettres et par associer les formes aux sons qu&#x2019;elles repr&#xE9;sentent. Ensuite, nous passons &#xE0; l&#x2019;&#xE9;tape de la reconnaissance de mots entiers et de leur sens. Une fois que nous avons dig&#xE9;r&#xE9; ces mots de mani&#xE8;re individuelle, nous pouvons passer &#xE0; la compr&#xE9;hension&#xA0;: trouver ce que l&#x2019;auteur a voulu dire en attachant ces mots les uns aux autres. C&#x2019;est un travail difficile, en particulier si vous apprenez &#xE0; lire ou si vous faites partie des pr&#xE8;s de <a href="http://www.nationmaster.com/graph/edu_lit_adu_at_low_lit_lev-education-literacy-adults-low-level" class="spip_out">50% de la population</a> qui ont de faibles capacit&#xE9;s de lecture.</p>
<p>M&#xEA;me s&#x2019;il est tentant de faire lire le texte &#xE0; quelqu&#x2019;un et de lui demander s&#x2019;il l&#x2019;a compris, vous ne devriez pas vous appuyer sur un simple &#xAB;&#xA0;oui&#xA0;&#xBB;. Il est possible de reconna&#xEE;tre tous les mots (d&#xE9;coder), et avoir pourtant mal appr&#xE9;hend&#xE9; le sens (comprendre). Vous en avez probablement fait l&#x2019;exp&#xE9;rience vous-m&#xEA;me&#xA0;: avez-vous d&#xE9;j&#xE0; lu quelque chose jusqu&#x2019;au bout pour vous apercevoir que vous n&#x2019;aviez pas compris&#xA0;? Vous reconnaissez chaque mot, mais parce que le texte n&#x2019;est pas clair ou parce que vous &#xEA;tres fatigu&#xE9;s, le sens du passage vous &#xE9;chappe.</p>
<p>Alors comment d&#xE9;terminer si votre contenu est adapt&#xE9; &#xE0; pour vos utilisateurs&#xA0;? Voyons comment le pr&#xE9;dire (sans utilisateur) et comment le tester (avec des utilisateurs).</p>
<h2>Estimons-le</h2>
<p>Les formules de lisibilit&#xE9; mesurent les &#xE9;l&#xE9;ments quantifiables de l&#x2019;&#xE9;crit, tels que la longueur des mots et des phrases, pour pr&#xE9;dire le niveau de comp&#xE9;tence n&#xE9;cessaire pour les comprendre. Ils peuvent constituer une fa&#xE7;on rapide, facile, et bon march&#xE9; de d&#xE9;terminer si un texte sera trop difficile &#xE0; comprendre pour un public particulier. Les r&#xE9;sultats sont faciles &#xE0; comprendre&#xA0;: beaucoup donnent le niveau scolaire &#xE9;tats-uniens du texte.</p>
<p>Vous pouvez acheter des logiciels de lisibilit&#xE9;. Il existe &#xE9;galement des outils gratuits en ligne propos&#xE9;s par <a href="http://www.addedbytes.com/blog/code/readability-score/" class="spip_out">Added Bytes</a>, <a href="http://juicystudio.com/services/readability.php" class="spip_out">Juicy Studio</a>, et <a href="http://www.editcentral.com/gwt1/EditCentral.html#style_diction" class="spip_out">Edit Central</a>. Enfin, vous pouvez toujours vous rabattre sur la formule de gradation Flesch-Kincaid de Microsoft Word.</p>
<p>Cependant, il y a un gros probl&#xE8;me avec les formules de lisibilit&#xE9;&#xA0;: la plupart des propri&#xE9;t&#xE9;s qui rendent un texte facile &#xE0; comprendre comme le contenu, l&#x2019;organisation, ou la mise en page ne peuvent pas se mesurer de fa&#xE7;on math&#xE9;matique. Utiliser des mots courts et des phrases simples ne garantit en rien que le texte sera lisible. Les formules de lisibilit&#xE9; ne prennent pas en compte le sens. En aucun cas. Par exemple, prenons la phrase suivante de la page &#xAB;&#xA0;A propos&#xA0;&#xBB; de <i>A List Apart</i>. L&#x2019;<a href="http://www.harrymclaughlin.com/SMOG.htm" class="spip_out">index SMOG</a> estime qu&#x2019;il faut un niveau de troisi&#xE8;me pour la comprendre&#xA0;:</p>
<blockquote class="spip">
<p>Nous recevons plus de courrier en une journ&#xE9;e que nous pourrions en lire en une semaine.</p>
</blockquote>
<p>Maintenant, r&#xE9;arrangeons les mots de fa&#xE7;on &#xE0; obscurcir le sens. Le r&#xE9;sultat&#xA0;: toujours compr&#xE9;hensible pour un &#xE9;l&#xE8;ve de troisi&#xE8;me.</p>
<blockquote class="spip">
<p>En une journ&#xE9;e nous courrier plus qu&#x2019;en une semaine recevons plus que nous pourrions en lire.</p>
</blockquote>
<p>Les formules de lisibilit&#xE9; peuvent aider &#xE0; pr&#xE9;dire le niveau de difficult&#xE9; du texte et vous aider &#xE0; argumenter pour pouvoir le tester avec des utilisateurs. Mais ne les utilisez pas comme votre seule m&#xE9;thode d&#x2019;&#xE9;valuation, et ne r&#xE9;&#xE9;crivez pas vos textes juste pour satisfaire une formule. Rappelez-vous, les formules de lisibilit&#xE9; estiment le niveau de difficult&#xE9; d&#x2019;un texte. Elles ne peuvent pas vous enseigner comment r&#xE9;diger des textes compr&#xE9;hensibles.</p>
<h2>Faire un test d&#x2019;utilisabilit&#xE9; mod&#xE9;r&#xE9;</h2>
<p>Pour d&#xE9;terminer si les gens comprennent votre contenu, faites-leur lire et appliquer de nouvelles connaissances. En d&#x2019;autres termes, faites un test d&#x2019;utilisabilit&#xE9;&#xA0;! Voici comment cr&#xE9;er des sc&#xE9;narios de t&#xE2;ches dans lesquels les participants interpr&#xE8;tent et utilisent ce qu&#x2019;ils ont lu&#xA0;:</p>
<ul class="spip"><li> Identifiez les probl&#xE8;mes cruciaux pour vos utilisateurs et vos affaires.</li><li> Cr&#xE9;ez des t&#xE2;ches qui testent les connaissances des utilisateurs sur ces probl&#xE8;mes.</li><li> Dites bien aux participants que ce ne sont pas eux qui sont test&#xE9;s mais bien le contenu.</li></ul>
<p>Disons que vous testez <a href="http://septa.org/fares/pass/index.html" class="spip_out">SEPTA</a>, un site de transport en commun. Il offre plusieurs types d&#x2019;abonnement mensuels qui varient selon le moyen de transport utilis&#xE9; et la distance parcourue&#xA0;: par exemple, le TransPass permet de prendre le m&#xE9;tro, le bus ou le trolley. Un TrailPass vous permet aussi de prendre le train, etc. Si vous vouliez uniquement tester l&#x2019;interface, vous articuleriez la t&#xE2;che de la fa&#xE7;on suivante&#xA0;:</p>
<blockquote class="spip">
<p>Achetez un TrailPass mensuel.</p>
</blockquote>
<p>Mais vous souhaitez tester avec quelle facilit&#xE9; le contenu explique la diff&#xE9;rence entre les abonnements pour que les gens puissent choisir celui qui leur convient le mieux. Ainsi, articulez la t&#xE2;che de cette fa&#xE7;on&#xA0;:</p>
<blockquote class="spip">
<p>Achetez l&#x2019;abonnement le meilleur march&#xE9; qui r&#xE9;pond &#xE0; vos besoins.</p>
</blockquote>
<p>Vous voyez la diff&#xE9;rence&#xA0;? La premi&#xE8;re version ne requiert pas des participants qu&#x2019;ils prennent en compte le contenu du tout. Elle leur dit simplement quelle version choisir. La deuxi&#xE8;me version leur demande d&#x2019;utiliser le contenu pour d&#xE9;terminer quelle option est la meilleure pour eux. Soyez s&#xFB;r d&#x2019;obtenir des participants qu&#x2019;ils articulent explicitement leurs besoins pour que vous puissiez juger s&#x2019;ils ont choisi la meilleure option.</p>
<p>Demandez aux participants de penser &#xE0; haute voix pendant qu&#x2019;ils lisent le contenu. Vous obtiendrez de pr&#xE9;cieux indices sur ce qui leur para&#xEE;t confus et pourquoi. Id&#xE9;alement, vous souhaitez que vos utilisateurs comprennent le texte d&#xE8;s leur premi&#xE8;re lecture. S&#x2019;ils ont besoin de relire quoi que ce soit, vous devez clarifier le texte. Demandez aussi &#xE0; vos participants de paraphraser certaines portions&#xA0;; s&#x2019;ils ne comprennent pas l&#x2019;id&#xE9;e g&#xE9;n&#xE9;rale, vous feriez mieux de recommencer.</p>
<p>Pour d&#xE9;terminer quand les sc&#xE9;narii et les explications de texte sont corrects, vous devez savoir &#xE0; quoi ressemblent les bonnes r&#xE9;ponses. S&#x2019;il le faut, travaillez avec un expert sur le sujet pour cr&#xE9;er une feuille de r&#xE9;ponses avant de diriger les s&#xE9;ances. Vous pouvez organiser des s&#xE9;ances de test utilisateur mod&#xE9;r&#xE9;es en temps r&#xE9;el soit en personne soit &#xE0; distance. Mais vous pouvez &#xE9;galement utiliser des m&#xE9;thodes asynchrones.</p>
<h2>Faites un test d&#x2019;utilisabilit&#xE9; non mod&#xE9;r&#xE9;</h2>
<p>Si vous avez besoin d&#x2019;un panel plus cons&#xE9;quent, que vous avez un budget serr&#xE9; ou que le temps presse, essayez une &#xE9;tude &#xE0; distance sans mod&#xE9;rateur. Envoyez aux participants l&#x2019;un des outils de test utilisateur de votre choix comme <a href="http://www.loop11.com/" class="spip_out">Loop11</a> ou <a href="http://www.openhallway.com/" class="spip_out">OpenHallway</a>, donnez-leur des t&#xE2;ches &#xE0; r&#xE9;aliser et enregistrez leurs r&#xE9;ponses. Vous pouvez m&#xEA;me utiliser quelque chose comme <a href="https://surveymonkey.com/" class="spip_out">SurveyMonkey</a> et formater votre &#xE9;tude comme un test &#xE0; choix multiple&#xA0;: cela vous prendra plus de temps au d&#xE9;but que des questions ouvertes car vous devez d&#xE9;finir les r&#xE9;ponses possibles &#xE0; l&#x2019;avance mais ainsi l&#x2019;&#xE9;valuation quantitative sera plus rapide.</p>
<p>La cl&#xE9; du succ&#xE8;s d&#x2019;un test &#xE0; choix multiple r&#xE9;ussi est de cr&#xE9;er des questions sans &#xE9;quivoque.</p>
<ul class="spip"><li> Formulez votre question dans une forme affirmative et pas n&#xE9;gative.</li><li> Incluez seulement une seule r&#xE9;ponse correcte ou clairement meilleure.</li><li> Inventez entre deux et quatre r&#xE9;ponses incorrectes (des distracteurs) qui pourraient &#xEA;tre plausibles si vous ne compreniez pas le texte.</li><li> Assurez-vous que les alternatives s&#x2019;excluent mutuellement.</li><li> &#xC9;vitez de donner des indices dans les r&#xE9;ponses.</li><li> &#xC9;vitez d&#x2019;utiliser &#xAB;&#xA0;Toutes les options ci-dessus&#xA0;&#xBB; ou &#xAB;&#xA0;Aucune option ci-dessus&#xA0;&#xBB; en tant que choix.</li><li> &#xC9;vitez d&#x2019;utiliser &#xAB;&#xA0;jamais&#xA0;&#xBB;, &#xAB;&#xA0;toujours&#xA0;&#xBB;, et &#xAB;&#xA0;seulement&#xA0;&#xBB;.</li></ul>
<p>Pensez aussi &#xE0; ajouter la possibilit&#xE9; de r&#xE9;pondre &#xAB;&#xA0;Je ne sais pas&#xA0;&#xBB; pour &#xE9;viter que les participants ne cochent une r&#xE9;ponse au hasard juste pour passer la question. Il ne s&#x2019;agit pas du bac. Une r&#xE9;ponse choisie par d&#xE9;faut ne vous aidera pas &#xE0; analyser votre contenu.</p>
<blockquote class="spip">
<p><strong>Sc&#xE9;nario de t&#xE2;ches&#xA0;:</strong></p>
<p>Vous souhaitez acheter des ch&#xE8;ques voyage avec votre carte de cr&#xE9;dit. Quel pourcentage s&#x2019;applique &#xE0; votre achat&#xA0;?</p>
<p><strong>R&#xE9;ponses possibles&#xA0;:</strong>
Le taux annuel standard de 10.99%
Le taux annuel pour avance de liquide de 24.24%*
Le taux de p&#xE9;nalit&#xE9; de 29.99%
Je ne sais pas.<p>
(* Cette r&#xE9;ponse est la r&#xE9;ponse correcte &#xE0; en croire le contrat de mon propre organisme de cr&#xE9;dit)</p></p>
</blockquote>
<p>Tout comme dans les tests mod&#xE9;r&#xE9;s, faites comprendre aux utilisateurs que le test concerne le contenu et non leurs capacit&#xE9;s.</p>
<h2>Utilisez un test de Cloze</h2>
<p>Un test de Cloze enl&#xE8;ve certains mots d&#x2019;une partie de votre texte et demande &#xE0; vos utilisateurs de remplir les mots manquants. Les participants au test doivent se r&#xE9;f&#xE9;rer au contexte ainsi qu&#x2019;&#xE0; leurs connaissances ant&#xE9;rieures du sujet pour identifier les mots effac&#xE9;s. C&#x2019;est bas&#xE9; sur la th&#xE9;orie de Gestalt de compl&#xE9;tude &#x2013;&#xA0;dans laquelle le cerveau essaie de remplir les pi&#xE8;ces manquantes&#xA0;&#x2013; et l&#x2019;applique &#xE0; l&#x2019;&#xE9;crit.</p>
<p>Cela ressemble &#xE0; ceci&#xA0;:</p>
<blockquote class="spip">
<p>Si vous voulez _____ si les ______________ de votre site comprennent votre contenu, alors vous _____ le tester avec eux.</p>
</blockquote>
<p>Cela ressemble &#xE0; un exercice de remplissage, n&#x2019;est-ce pas&#xA0;? Mais au lieu d&#x2019;essayer d&#x2019;inventer la phrase la plus amusante, la plus &#xE9;trange ou la plus int&#xE9;ressante, comme dans le jeu am&#xE9;ricain Mad Libs, les participants doivent deviner le mot exact que l&#x2019;auteur a utilis&#xE9;. M&#xEA;me si les tests Cloze sont rares dans le champ de l&#x2019;exp&#xE9;rience utilisateur, les &#xE9;ducateurs les utilisent depuis des d&#xE9;cennies pour s&#x2019;assurer qu&#x2019;un texte est adapt&#xE9; &#xE0; leurs &#xE9;tudiants surtout dans les cours d&#x2019;anglais deuxi&#xE8;me langue.</p>
<p>Voil&#xE0; comment faire&#xA0;:</p>
<ul class="spip"><li> Prenez un extrait de texte de 125 &#xE0; 250 mots &#xE0; peu pr&#xE8;s.</li><li> Enlevez un mot sur cinq en le rempla&#xE7;ant par un espace blanc.</li><li> Demandez aux participants de remplir les espaces avec le mot qui, selon eux, a &#xE9;t&#xE9; enlev&#xE9;.</li><li> &#xC9;tablissez un score en comptant le nombre total de bonnes r&#xE9;ponses et en le divisant par le nombre total d&#x2019;espaces blancs.</li></ul>
<p>Un score de 60% ou mieux indique que le texte est appropri&#xE9; &#xE0; votre public. Les participants ayant obtenu entre 40 et 60% auront quelques difficult&#xE9;s &#xE0; comprendre le texte original. Ce n&#x2019;est pas r&#xE9;dhibitoire, mais cela veut dire que le public aura besoin d&#x2019;aide suppl&#xE9;mentaire pour comprendre votre contenu.<br class="autobr">
Un score de moins de 40% veut dire que les lecteurs seront frustr&#xE9;s par le texte et qu&#x2019;il devrait &#xEA;tre r&#xE9;&#xE9;crit.</p>
<p>Cela peut sembler farfelu, mais essayez cette m&#xE9;thode avant de l&#x2019;&#xE9;carter. Dans une &#xE9;tude gouvernementale sur la lisibilit&#xE9; d&#x2019;information li&#xE9;es aux services de sant&#xE9;, un panel d&#x2019;expert a cat&#xE9;goris&#xE9; des articles de sant&#xE9; comme &#xE9;tant faciles ou difficiles. Nous avons ensuite fait passer des tests Cloze en utilisant ces articles &#xE0; des participants dont le niveau d&#x2019;alphab&#xE9;tisation allait de bas &#xE0; moyen. Nous avons d&#xE9;couvert que les r&#xE9;sultats refl&#xE9;taient ceux du panel d&#x2019;expert. Le score moyen des articles dits &#xAB;&#xA0;faciles&#xA0;&#xBB; &#xE9;tait de 60, indiquant qu&#x2019;ils avaient &#xE9;t&#xE9; &#xE9;crits de mani&#xE8;re appropri&#xE9;e pour ce public. Le score moyen des articles dits &#xAB;&#xA0;difficiles&#xA0;&#xBB; &#xE9;tait de 39&#xA0;: trop difficile pour ce public.</p>
<p>Les tests Cloze sont facile &#xE0; cr&#xE9;er, administrer et &#xE9;valuer. Ils donnent une bonne id&#xE9;e de l&#x2019;ad&#xE9;quation entre le contenu et le public vis&#xE9;. Si vous utilisez des tests Cloze seuls ou en combinaison avec d&#x2019;autres tests utilisateurs, sachez que remplir ces blancs demande beaucoup d&#x2019;efforts cognitifs. Pr&#xE9;voyez 25 blancs minimum pour avoir une &#xE9;tude de qualit&#xE9;, mais sachez qu&#x2019;au-del&#xE0; de 50 le test devient vite fatiguant.</p>
<h2>Quand tester</h2>
<p>Testez votre contenu &#xE0; n&#x2019;importe quel moment dans le processus de d&#xE9;veloppement du site. D&#xE8;s que vous avez du contenu, vous pouvez le tester. Vous avez besoin de convaincre votre patron de budg&#xE9;ter les tests de contenu&#xA0;? Passez votre contenu dans une formule de lisibilit&#xE9;. Vous avez du contenu mais pas de wireframes ou de design visuel&#xA0;? Faites un test Cloze pour &#xE9;valuer le contenu. Est-ce que la compr&#xE9;hension contenu est cruciale pour terminer une t&#xE2;che ou un ensemble de t&#xE2;ches&#xA0;? Affichez le contenu lors de tests d&#x2019;ergonomie.</p>
<h2>Que tester</h2>
<p>Vous ne pouvez pas tester chaque phrase de votre site et vous n&#x2019;en avez pas besoin. Concentrez-vous sur les t&#xE2;ches importantes pour vos utilisateurs et votre produit. Par exemple, est-ce que votre centre de support re&#xE7;oit des appels concernant des informations qui devraient se trouver sur le site&#xA0;? Testez le contenu pour trouver si votre site laisse &#xE0; d&#xE9;sirer et &#xE0; quel endroit.</p>
<h2>N&#x2019;attendez plus&#xA0;: allez-y&#xA0;!</h2>
<p>Tout comme les tests d&#x2019;ergonomie se concentrent sur ce que les utilisateurs font et non pas ce qu&#x2019;ils disent faire, les tests de contenu d&#xE9;terminent ce que les utilisateurs comprennent et non pas ce qu&#x2019;ils disent comprendre.</p>
<p>Quel que soit votre budget, votre calendrier et votre acc&#xE8;s aux utilisateurs, il existe une m&#xE9;thode pour tester si votre contenu est appropri&#xE9; pour les personnes qui le lise. Donc, testez&#xA0;! Si votre contenu fonctionne, vous serez vraiment fix&#xE9;, sinon il ne vous restera plus qu&#x2019;&#xE0; le r&#xE9;&#xE9;crire.</p> <span>Translated with the permission of <a href="http://www.alistapart.com/">A List Apart</a> and the author[s].</span> </div>]]></description>
      <link>https://www.pompage.net/traduction/tests-de-contenu</link>
      <guid>https://www.pompage.net/traduction/tests-de-contenu</guid>
      <pubDate>Wed, 26 Mar 2014 11:03:00 +0100</pubDate>
    </item>
    <item>
      <title><![CDATA[Traduit ailleurs : Soin et alimentation des ingénieurs informatique]]></title>
      <description><![CDATA[<div>
<p><strong>Pr&#xE9;ambule</strong></p>
<p>Suite &#xE0; la lecture du billet <a class="reference external" href="http://www.nczonline.net/blog/2012/06/12/the-care-and-feeding-of-software-engineers-or-why-engineers-are-grumpy/">&quot;The care and feeding of software engineers (or, why engineers are grumpy)&quot;</a> &#xE9;crit par <a class="reference external" href="http://nczonline.net/">Nicholas C. Zakas</a>, <a class="reference external" href="http://www.tornil.me/">Bertrand Tornil</a> et moi-m&#xEA;me avons &#xE9;t&#xE9; frapp&#xE9;s par sa pertinence et avons d&#xE9;cid&#xE9;s de le diffuser autour de nous. Malheureusement, la barri&#xE8;re de la langue n&apos;a pas permis une diffusion aussi large que nous le voulions. C&apos;est pourquoi nous nous sommes attel&#xE9;s &#xE0; sa traduction que nous vous proposons ici.</p>
<p>Si vous avez des am&#xE9;liorations &#xE0; y apporter, n&apos;h&#xE9;sitez pas &#xE0; nous en faire part. Le meilleur moyen &#xE9;tant de proposer une (ou plusieurs) pull request sur le <a class="reference external" href="https://github.com/MaNDRaXe/ingenieurs-grincheux">projet github</a>. Bien que nous encouragions la diffusion de ce texte, et que nous mettions cette traduction &#xE0; disposition librement, nous ne sommes bien s&#xFB;r pas les d&#xE9;tenteurs des droits du texte original. R&#xE9;f&#xE9;rez-vous en &#xE0; l&apos;auteur original pour toute utilisation que vous voudriez en faire.</p> <p><strong>Mises &#xE0; jour</strong></p> <div class="section" id="id13"> <p>Il n&apos;y a pas si longtemps, Jenna Bilotta a &#xE9;crit un excellent article intitul&#xE9; &quot;How designers and engineers can play nice&quot; <a class="footnote-reference" href="http://blog.mandraxe.info/ingenieurs-grincheux.html#id16" id="id14">[1]</a> (NdT: Comment faire travailler main dans la main designers et d&#xE9;veloppeurs), dans lequel elle aborde les
fa&#xE7;ons de faire travailler ensemble plus productivement les designers et les ing&#xE9;nieurs. Ayant &#xE9;t&#xE9; confront&#xE9; aux m&#xEA;mes soucis en travaillant avec des designers (mais aussi avec des ing&#xE9;nieurs lorsque j&apos;&#xE9;tais du c&#xF4;t&#xE9; interface utilisateur), j&apos;ai appr&#xE9;ci&#xE9; l&apos;approche pragmatique qu&apos;elle sugg&#xE8;re. Il est toujours b&#xE9;n&#xE9;fique de respecter les m&#xE9;thodes de travail des autres intervenants et de comprendre leur fa&#xE7;on de penser lorsque l&apos;on travaille ensemble.</p>
<p>Elle pr&#xE9;conise notamment aux ing&#xE9;nieurs de ne pas dire &quot;non&quot; si vite. Cela m&apos;a interpell&#xE9; et m&apos;a trott&#xE9; dans la t&#xEA;te un moment. Ma premi&#xE8;re r&#xE9;action a &#xE9;t&#xE9; &quot;mais vous ne comprenez pas pourquoi nous disons non !&quot;. Puis un million d&apos;autres justifications me sont venues &#xE0; l&apos;esprit. En fait, elle a raison. Nous disons &quot;non&quot; tr&#xE8;s vite et pas seulement aux designers, mais &#xE0; tout. Cela m&apos;a amen&#xE9; &#xE0; r&#xE9;fl&#xE9;chir &#xE0; la psychologie des ing&#xE9;nieurs informatique et &#xE0; ce qui fait que nous fonctionnons comme nous le faisons.</p>
</div>
<div class="section" id="notre-reputation"> <p>Jouons carte sur table, les d&#xE9;veloppeurs ont g&#xE9;n&#xE9;ralement la r&#xE9;putation d&apos;&#xEA;tre arrogants, d&#xE9;sagr&#xE9;ables et lunatiques. Nous avons aussi la r&#xE9;putation de dire &quot;non&quot;, de d&#xE9;battre de d&#xE9;tails insignifiants et de pr&#xE9;tendre savoir mieux faire le travail de n&apos;importe qui d&apos;autre mieux qu&apos;eux. En g&#xE9;n&#xE9;ral cette r&#xE9;putation est justifi&#xE9;e. C&apos;est exactement ce que nous faisons presque tous les jours, tout comme nous codons tout en surveillant Twitter et Hacker News (NdT : site d&apos;information concernant le d&#xE9;veloppement informatique).</p>
<p>(Note : Certains diront que ce n&apos;est pas vrai de tous les d&#xE9;veloppeurs et ils auront raison. Il y a un petit nombre de d&#xE9;veloppeurs pour qui tout ou partie de ce qui vient d&apos;&#xEA;tre dit est faux. Mais s&apos;il vous pla&#xEE;t, avant de descendre en bas de cet article et poster un commentaire pour me dire &#xE0; quel point tout cela est stupide, continuez la lecture.)</p>
<p>Les r&#xE9;putations ne se font pas al&#xE9;atoirement, elles sont le fruit de l&apos;exp&#xE9;rience des gens. Ce qui me d&#xE9;range dans cette r&#xE9;putation est que je connais personnellement de nombreux d&#xE9;veloppeurs et qu&apos;ils aiment g&#xE9;n&#xE9;ralement s&apos;amuser, sont ouverts &#xE0; la discussion (si il ne s&apos;agit pas de sujet dogmatique) et sont d&apos;une compagnie agr&#xE9;able. Ils font partie des gens avec qui l&apos;on a envie de passer du temps hors du boulot. Alors comment ce fait-il que dans un environnement professionnel une autre personnalit&#xE9; apparaisse ?</p>
</div>
<div class="section" id="creatifs-pas-ouvriers"> <p>J&apos;ai une th&#xE9;orie. Cette th&#xE9;orie est que les d&#xE9;veloppeurs se per&#xE7;oivent d&apos;une fa&#xE7;on tr&#xE8;s diff&#xE9;rente de la fa&#xE7;on dont les per&#xE7;oivent ceux avec qui ils travaillent. J&apos;en suis arriv&#xE9; &#xE0; cette conclusion apr&#xE8;s plus d&apos;une d&#xE9;cennie de travail dans l&apos;industrie logicielle au sein de grandes et petites entreprises. Les entreprises (chefs de produit, designers, et managers) ont tendance &#xE0; voir les d&#xE9;veloppeurs comme des ouvriers. C&apos;est le travail du chef de produit d&apos;imaginer quoi fabriquer, le travail du designer de le rendre esth&#xE9;tique et le travail de l&apos;ing&#xE9;nieur de construire l&apos;aboutissement de leurs r&#xE9;flexions. Concr&#xE8;tement, les d&#xE9;veloppeurs sont vus comme les ex&#xE9;cutants de cette industrie.</p>
<p>Il s&apos;agit de quelque chose &#xE0; propos duquel mon tout premier responsable m&apos;a mis en garde. Lorsque la premi&#xE8;re entreprise dans laquelle j&apos;ai travaill&#xE9; a ferm&#xE9;, nous avons eu une discussion franche concernant ma carri&#xE8;re. Bien que nous n&apos;ayons pas toujours &#xE9;t&#xE9; en accord, il m&apos;a donn&#xE9; un excellent conseil (que je paraphrase ici) :</p>
<blockquote>
<em>Nicholas, tu vaux mieux que ton code. Quelque soit la suite de tes aventures, assure-toi de ne pas &#xEA;tre un simple ex&#xE9;cutant. N&apos;accepte pas un poste ou l&apos;on te dise exactement ce que tu dois faire et comment le faire. Tu as besoin de travailler dans un environnement qui appr&#xE9;cie tes propositions autant que ta capacit&#xE9; &#xE0; les r&#xE9;aliser.</em></blockquote>
<p>Il avait tout &#xE0; fait raison. De nombreuses soci&#xE9;t&#xE9;s veulent des ex&#xE9;cutants, ils veulent des programmeurs et des ouvriers qui marchent au pas et restent dans le rang. A vrai dire je dirais que la plupart des soci&#xE9;t&#xE9;s veulent &#xE7;a, qu&apos;elles soient grandes ou petites. Je ne pourrais d&#xE9;nombrer la quantit&#xE9; de start-ups qui m&apos;ont contact&#xE9; pour m&apos;offrir d&apos;&#xEA;tre associ&#xE9; en &#xE9;change du d&#xE9;veloppement de la vision du fondateur. Sous entendu : nous savons d&#xE9;j&#xE0; exactement ce que nous voulons faire, nous avons juste besoin de quelqu&apos;un pour l&apos;ex&#xE9;cuter.</p>
<p>Et c&apos;est bien l&#xE0; que se situe le noeud du probl&#xE8;me : les d&#xE9;veloppeurs ne sont pas des ouvriers. Les d&#xE9;veloppeurs sont des cr&#xE9;ateurs. Construire quelque chose c&apos;est ce que vous faites lorsque vous achetez un meuble chez Ikea et que vous le ramenez &#xE0; la maison. Les instructions de montage sont &#xE9;crites sur un papier et si vous les suivez &#xE9;tape par &#xE9;tape, vous obtiendrez la si jolie petite table que vous d&#xE9;siriez tant. Cr&#xE9;er est un tout autre processus qui donne naissance &#xE0; quelque chose sans indication ni instruction. Cela consiste &#xE0; partir d&apos;une feuille blanche pour aboutir &#xE0; une toile de ma&#xEE;tre. Les d&#xE9;veloppeurs ne se mettent pas au d&#xE9;veloppement parce qu&apos;ils veulent que quelqu&apos;un leur dise ce qu&apos;ils doivent faire, ils se mettent au d&#xE9;veloppement parce qu&apos;ils ont d&#xE9;couvert qu&apos;ils pouvaient cr&#xE9;er des choses utiles. Chaque d&#xE9;veloppeur tombe amoureux du d&#xE9;veloppement parce qu&apos;il a fait un jour un petit programme utile et qu&apos;il y est devenu accro.</p>
<p>Dans le triumvirat du logiciel constitu&#xE9; des chefs de produit, des designers et des d&#xE9;veloppeurs, il n&apos;y a que des d&#xE9;veloppeurs que l&apos;on attend qu&apos;ils fassent taire leur esprit cr&#xE9;atif et se contentent de produire. Les d&#xE9;veloppeurs ne sont pas stupides, ils le voient bien et se mettent &#xE0; &#xE9;prouver du ressentiment. Les d&#xE9;veloppeurs veulent faire partie du processus cr&#xE9;atif et cela leur est refus&#xE9;. En fin de compte vous vous retrouvez avec la personnalit&#xE9; typique des d&#xE9;veloppeurs agr&#xE9;ment&#xE9;e de mauvaise humeur.</p>
</div>
<div class="section" id="mais-alors-quel-est-le-probleme"> <p>Les chefs de produits sont des gens int&#xE9;ressants. Leurs id&#xE9;es ainsi que leur capacit&#xE9; &#xE0; comprendre le march&#xE9; sont impressionnants. Ils ont aussi une certaine tendance &#xE0; croire que leurs id&#xE9;es sont totalement abouties alors qu&apos;en r&#xE9;alit&#xE9; il y a des trous si grands que l&apos;on pourrait y faire passer des trains complets. Je le dis avec beaucoup d&apos;affection, car j&apos;ai de nombreux amis chefs de produit, mais ils savent bien ce que je pense car je le leur ai d&#xE9;j&#xE0; dit de vive voix &#xE0; un moment ou un autre. Il ne s&apos;agit pas l&#xE0; d&apos;une critique des chefs de produit, c&apos;est juste dans leur nature. Leur travail est cr&#xE9;atif et les id&#xE9;es n&apos;apparaissent jamais totalement abouties. Mais c&apos;est bien l&apos;un des &#xE9;l&#xE9;ments qui rend les d&#xE9;veloppeurs grincheux.</p>
<p>Les d&#xE9;veloppeurs aussi bien que les chefs de produits ont tendance &#xE0; croire, &#xE0; tort, que des sp&#xE9;cifications et pr&#xE9;requis &#xE9;quivalent &#xE0; un manuel de montage de chez Ikea. Dans les faits ces documents contiennent rarement assez d&apos;informations pour concr&#xE8;tement construire le produit et ne sont g&#xE9;n&#xE9;ralement qu&apos;un point de d&#xE9;part. Et cela pose un probl&#xE8;me crucial au d&#xE9;veloppeur.</p>
<p>Pour comprendre le probl&#xE8;me, imaginez-vous devoir construire une maison. Quelqu&apos;un a d&#xE9;cid&#xE9; qu&apos;il voulait construire une maison sur un certain terrain. La maison va avoir deux &#xE9;tages et un garage. Il y a m&#xEA;me un croquis de la fa&#xE7;ade gribouill&#xE9; sur un coin de nappe. Cette personne vient vous voir avec ces informations et son coin de nappe et vous dit &quot;&#xC7;a devrait te suffire pour commencer &#xE0; construire ?&quot;. &#xCA;tes-vous capable de commencer la construction ?</p>
<p>Normalement, vous ne devriez pas pouvoir commencer &#xE0; construire la maison avec ces &#xE9;l&#xE9;ments l&#xE0;. Vous ne connaissez pas la superficie, vous ne disposez pas des plans int&#xE9;rieurs, vous ne connaissez m&#xEA;me pas le code d&apos;urbanisme &#xE0; respecter pour la construction d&apos;une maison. Il n&apos;y a vraiment pas assez d&apos;information pour commencer, ne serait-ce qu&apos;&#xE0; creuser les fondations. A ce moment vous allez dire &#xE0; votre client qu&apos;il est inconscient et doit savoir exactement ce qu&apos;il veut. Maintenant, imaginez que vous ne puissiez pas le faire car quelqu&apos;un a d&#xE9;terminer une date de livraison que vous &#xEA;tes responsable de tenir.</p>
<p>&quot;H&#xE9; bien&quot;, dit le client, &quot;pourquoi ne commencez-vous donc pas &#xE0; construire et je vous fournirai les d&#xE9;tails au fur et &#xE0; mesure. Comme &#xE7;a on ne perd pas de temps.&quot;</p>
<p>Vous savez qu&apos;il vous manque des informations pour commencer la construction, mais que continuer &#xE0; questionner le client ne vous fournira pas plus d&apos;&#xE9;l&#xE9;ments dans l&apos;imm&#xE9;diat. Que faites-vous ? Vous commencez &#xE0; faire des suppositions.</p>
<p>L&apos;adage &quot;when you ASSUME, you make an ASS of U and ME&quot; (NdT: jeu de mot non transposable sur les termes &#xE9;crits en majuscule qui se traduirait litt&#xE9;ralement par &quot;en faisant des suppositions, tu fais de nous deux des imb&#xE9;ciles&quot;), est on ne peut plus vrai. Les suppositions sont dangereuses et souvent fausses. Cependant sans faire de suppositions, vous ne pouvez avancer. Alors c&apos;est ce que vous faites. Vous commencez par supposer que ce que vous savez est vrai, la maison aura deux &#xE9;tages et un garage. Le garage devrait-il &#xEA;tre mitoyen ou ind&#xE9;pendant. Quelle taille devrait-il faire ? Bon, disons qu&apos;il est ind&#xE9;pendant et qu&apos;il puisse contenir une voiture. Cela signifie que vous pouvez commencer le garage comme une structure ind&#xE9;pendante et que quand il y aura plus de d&#xE9;tails sur la maison vous pourrez continuer &#xE0; c&#xF4;t&#xE9; du garage.</p>
<p>Apr&#xE8;s une semaine de travail sur le garage, votre client revient avec plus de d&#xE9;tails. En fait la maison doit avoir trois &#xE9;tages (Ouf ! Heureusement que vous n&apos;avez pas commenc&#xE9; par l&#xE0;) et elle aura huit salles de bain. Il n&apos;y a pas plus d&apos;informations concernant le garage, mais la maison sera peinte en bleu. Vous supposez logiquement que le garage ind&#xE9;pendant sera &#xE9;galement peint en bleu et vous vous y attelez.</p>
<p>Quelques jours plus tard, le garage est presque termin&#xE9;. Vous &#xEA;tes plut&#xF4;t satisfait du r&#xE9;sultat avec le peu d&apos;informations dont vous disposiez. Vous &#xEA;tes maintenant pr&#xEA;t &#xE0; attaquer la maison lorsque le client revient avec plus de d&#xE9;tails. Le garage devra en fait contenir 2 voitures et doit &#xEA;tre mitoyen. Cela vous fend le coeur car vous venez juste d&apos;achever une belle construction mais qu&apos;il faut tout raser &#xE0; la pelleteuse afin de construire ce qui est r&#xE9;ellement demand&#xE9;. Pire encore, il vous reste maintenant moins de temps pour accomplir le projet complet, et cela vous rend grincheux.</p>
<p>Si cette analogie vous semble farfelue, c&apos;est que vous n&apos;avez probablement jamais travaill&#xE9; en tant que d&#xE9;veloppeur. Nous sommes vraiment confront&#xE9;s &#xE0; ce genre de situation chaque jour. Nous essayons de faire avancer les projets en faisant appel &#xE0; nos capacit&#xE9;s de cr&#xE9;ation pour finir par nous rendre compte que nous ne pouvons pas deviner ce que les gens ont en t&#xEA;te et que nous nous trompons &#xE0; propos de ce que nous devons r&#xE9;ellement b&#xE2;tir. Et pourtant si nous ne le faisions pas nous devrions rester &#xE0; attendre car personne n&apos;aime le mod&#xE8;le de d&#xE9;veloppement en cascade.</p>
<p>Dans presque toutes les autres industries de fabrication, il est convenu que tous les besoins et d&#xE9;tails sont discut&#xE9;s en amont et ent&#xE9;rin&#xE9;s avant le d&#xE9;but de la fabrication. Sauf dans le logiciel. Dans le logiciel, il n&apos;y a &quot;pas assez de temps&quot; pour mettre au point tous les &#xE9;l&#xE9;ments &#xE0; l&apos;avance. L&apos;importance d&apos;avancer nous est martel&#xE9;e d&#xE8;s le premier jour. Du coup, les ing&#xE9;nieurs apprennent &#xE0; remplir les blancs laiss&#xE9;s par les chefs de produit afin de faire avancer le projet. Les chefs de produit ont bien s&#xFB;r la r&#xE9;putation de changer souvent d&apos;avis, ce qui signifie que les suppositions des ing&#xE9;nieurs sont souvent invalid&#xE9;es au cours de la vie du projet.</p>
<p>Est-il surprenant que les d&#xE9;veloppeurs aient tendance &#xE0; s&apos;user rapidement et &#xE0; changer fr&#xE9;quemment d&apos;emploi ?</p>
</div>
<div class="section" id="priorites-numero-un"> <p>Le changement de contexte est l&apos;ennemi de tout cr&#xE9;atif. Une fois plong&#xE9; dans un mode cr&#xE9;atif, &quot;le flux&quot; comme certains l&apos;appellent, le fait d&apos;&#xEA;tre d&#xE9;rang&#xE9; pour se focaliser sur autre chose interrompt totalement le processus. Oui, &#xE9;crire du code est un processus cr&#xE9;atif. C&apos;est &#xE0; la fois logique et cr&#xE9;atif. Nous n&apos;&#xE9;crivons pas simplement du code, nous le forgeons.</p>
<p>Il semble commun&#xE9;ment admis chez les gens qui g&#xE8;re le temps de travail de d&#xE9;veloppeurs qu&apos;il est facile de passer d&apos;une t&#xE2;che &#xE0; une autre. Apr&#xE8;s tout, comme certains m&apos;ont d&#xE9;j&#xE0; dit, du travail c&apos;est du travail. Vous l&apos;orientez dans la direction n&#xE9;cessaire comme un canon et feu. Bien s&#xFB;r c&apos;est totalement erron&#xE9;. Si vous consacrez beaucoup de temps &#xE0; une t&#xE2;che et qu&apos;il vous est demand&#xE9; de la laisser de c&#xF4;t&#xE9; pour faire autre chose, il n&apos;est pas simple d&apos;y revenir et de reprendre l&#xE0; ou vous en &#xE9;tiez. Cela n&#xE9;cessite un temps de r&#xE9;-acclimatation en revenant sur la premi&#xE8;re t&#xE2;che pour se remettre dans le contexte, et c&apos;est l&#xE0; le co&#xFB;t du changement de contexte. M&#xEA;me si la nouvelle t&#xE2;che ne demande que quelques minutes, c&apos;est suffisant pour interrompre le flux et cela rend les d&#xE9;veloppeurs moins productifs.</p>
<p>Il s&apos;agit l&#xE0; de l&apos;une des choses qui rend les d&#xE9;veloppeurs le plus grincheux : changer constamment les priorit&#xE9;s. Si quelque chose est prioritaire un jour et qu&apos;autre chose l&apos;est le lendemain, cela signifie immanquablement un changement de contexte. Les cr&#xE9;atifs n&apos;aiment pas &#xEA;tre interrompus avant d&apos;avoir fini, c&apos;est pourquoi les d&#xE9;veloppeurs sont capables de travailler jusqu&apos;&#xE0; l&apos;aube pour terminer ce qu&apos;ils sont en train de faire. Interrompre le flux nous rend moins productif.</p>
<p>Les vraies priorit&#xE9;s ne changent pas, elles sont fig&#xE9;es. La fr&#xE9;quence &#xE0; laquelle les gens au dessus de nous changent d&apos;avis est incroyablement frustrant pour les d&#xE9;veloppeurs. Nous sommes, la plupart du temps, pr&#xEA;t &#xE0; monter au front pourvu que l&apos;on nous indique la direction &#xE0; suivre. Mais si vous nous dites un jour que l&apos;on construit une maison puis le lendemain que l&apos;on construit une voiture, il faut vous attendre &#xE0; quelques dissensions dans les rangs.</p>
</div>
<div class="section" id="le-defaut-des-developpeurs"> <p>Les d&#xE9;veloppeurs sont mis en position difficile tous les jours, mais nous ne sommes tout de m&#xEA;me pas des victimes, m&#xEA;me si les plus m&#xE9;lodramatiques d&apos;entre nous ont tendances &#xE0; agir comme tels. Si nous sommes grincheux c&apos;est en partie &#xE0; cause de nous m&#xEA;me et de quelque chose qui est profond&#xE9;ment ancr&#xE9; en la majorit&#xE9; des d&#xE9;veloppeurs. Nous sommes afflig&#xE9;s d&apos;un d&#xE9;faut tragique : nous surestimons nos connaissances et nos capacit&#xE9;s.</p>
<p>Ce d&#xE9;faut se manifeste de plusieurs mani&#xE8;res. La plus fr&#xE9;quente appara&#xEE;t dans les estimations de temps. Presque tous les ing&#xE9;nieurs que je connais sous-estiment syst&#xE9;matiquement le temps qu&apos;il leur sera n&#xE9;cessaire pour accomplir une t&#xE2;che ou une s&#xE9;rie de t&#xE2;ches. Seuls les meilleurs des meilleurs sont capables de fournir une estimation de temps pr&#xE9;cise et de s&apos;y tenir, alors que les autres se trompent parfois d&apos;un facteur 2 voir plus. Le probl&#xE8;me est qu&apos;en tant que cr&#xE9;atifs, les d&#xE9;veloppeurs n&apos;arrivent pas &#xE0; pr&#xE9;voir les probl&#xE8;mes qu&apos;ils vont rencontrer.</p>
<p>M&#xEA;me si de nombreux d&#xE9;veloppeurs se plaignent que les chef de produit changent d&apos;avis, presque aucun n&apos;en tient compte dans ses estimations. Aucun temps n&apos;est pr&#xE9;vu pour les r&#xE9;unions permettant de d&#xE9;tailler les sp&#xE9;cifications ou de faire des changements. Les bugs ? Notre code est parfait et ne comporte jamais de bugs, alors pas besoin de s&apos;en pr&#xE9;occuper (et puis apr&#xE8;s tout la Q&amp;A soul&#xE8;vera bien ce que nous pourrions avoir rat&#xE9;). Certains des autres d&#xE9;veloppeurs dont nous pourrions avoir besoin seront absents ? Pas de soucis, nous trouverons bien quelqu&apos;un pour compenser.</p>
<p>En cumulant tout cela on en arrive tr&#xE8;s rapidement &#xE0; ne pas tenir les d&#xE9;lais de livraison, et pourtant je n&apos;ai pas encore comptabilis&#xE9; la raison principale &#xE0; nos retards de livraison : la non prise en compte du temps d&apos;apprentissage. Cela nous ram&#xE8;ne directement &#xE0; notre d&#xE9;faut. Nous pensons que nous savons d&#xE9;j&#xE0; comment accomplir la t&#xE2;che qui nous est demand&#xE9;e alors que tr&#xE8;s souvent elle inclut des choses que nous n&apos;avons jamais faites. Les estimations partent d&apos;une hypoth&#xE8;se de parfaite connaissance, comme lorsque vous avez le manuel Ikea et n&apos;avez qu&apos;&#xE0; vous mettre au travail. En r&#xE9;alit&#xE9;, de nombreuses t&#xE2;ches nous demandent de faire des choses que nous n&apos;avons jamais faites auparavant.</p>
<p>Au cours de leurs &#xE9;tudes d&apos;informatique les ing&#xE9;nieurs se voient inculqu&#xE9;s un sentiment de s&#xE9;curit&#xE9; tout &#xE0; fait erron&#xE9;. Ils en sortent en pensant qu&apos;ils comprennent les logiciels et le processus de d&#xE9;veloppement de logiciel alors qu&apos;en fait, ils ne savent presque rien. Dans mon premier emploi, j&apos;&#xE9;tais ce jeune dipl&#xF4;m&#xE9; arrogant expliquant &#xE0; tout le monde qu&apos;ils s&apos;y prenaient mal. Ce n&apos;est que plusieurs ann&#xE9;es apr&#xE8;s que j&apos;ai enfin compris que je ne savais rien.</p>
<p>Les cours d&apos;informatique durant les &#xE9;tudes ne vous pr&#xE9;parent pas &#xE0; affronter les probl&#xE8;mes auxquels vous allez &#xEA;tre confront&#xE9;s dans votre vie professionnelle. Ils vous fournissent la connaissance d&apos;un large &#xE9;ventail de concepts afin que vous ne soyez pas totalement d&#xE9;sempar&#xE9;s lorsque vous les rencontrerez dans votre travail. Vous y apprenez ce que sont des variables, des fonctions et des objets car ce sont des choses que vous allez rencontrer tout le temps. Vous y apprenez les bases de donn&#xE9;es et le requ&#xE9;tage bien que les formes normales qui vous sont inculqu&#xE9;es soient presque totalement inutiles. Vous passez un temps incroyable sur les algorithmes de tri et les structures de donn&#xE9;es, ce qui est tr&#xE8;s &#xE9;loign&#xE9; de votre activit&#xE9; lorsque vous codez dans votre vie professionnelle. En r&#xE9;sum&#xE9;, les programmes d&apos;informatique vous fournissent les solutions &#xE0; des probl&#xE8;mes que vous ne rencontrerez pas dans votre activit&#xE9; professionnelle. Si j&apos;ai besoin de trier quelque chose aujourd&apos;hui, j&apos;utilise la m&#xE9;thode sort() (NdT : tri en fran&#xE7;ais). Si j&apos;ai besoin d&apos;une queue ou d&apos;une liste cha&#xEE;n&#xE9;e, j&apos;emploie l&apos;impl&#xE9;mentation native du langage que j&apos;utilise. Ces probl&#xE8;mes sont d&#xE9;j&#xE0; r&#xE9;solus.</p>
<p>Nous sortons donc des &#xE9;tudes en pensant que nous savons tout faire alors qu&apos;en r&#xE9;alit&#xE9; nous ne savons faire que ce qui a d&#xE9;j&#xE0; &#xE9;t&#xE9; fait. En fait, nous connaissons une petite partie de ce qui &#xE0; d&#xE9;j&#xE0; &#xE9;t&#xE9; fait. Et pourtant nous nous comportons comme si nous connaissions tout, supposant ainsi une connaissance parfaite, et fournissant des estimations de temps qui sont bien trop courtes car nous ne prenons pas en compte l&apos;apprentissage.</p>
<p>Une autre partie du probl&#xE8;me est nich&#xE9;e dans nos fragiles egos. Nous avons peur que si nous donnons une estimation &quot;trop longue&quot;, nous baissions dans l&apos;estime des gens. Ils nous disent que les &quot;bons d&#xE9;veloppeurs&quot; sont ceux qui travaillent le plus vite, et nous acquies&#xE7;ons. J&apos;ai toujours &#xE9;t&#xE9; fascin&#xE9; lorsqu&apos;une estimation est faite sur un projet et qu&apos;un non d&#xE9;veloppeur revient et dit que celle-ci est trop longue. Pour commencer, comme je l&apos;ai mentionn&#xE9; plus haut, elle est d&#xE9;j&#xE0; probablement trop courte &#xE0; cause de notre d&#xE9;faut. Ensuite, comment un non d&#xE9;veloppeur pourrait bien savoir combien de temps sera n&#xE9;cessaire pour impl&#xE9;menter quelque chose ? Et cela nous conduit &#xE0; un autre probl&#xE8;me.</p>
</div>
<div class="section" id="j-ai-deja-code"> <p>Peu de phrases ont le pouvoir d&apos;&#xE9;nerver un ing&#xE9;nieur plus que &quot;J&apos;ai d&#xE9;j&#xE0; cod&#xE9;&quot;. Qu&apos;elle vienne d&apos;un chef de produit, d&apos;un designer ou d&apos;un manager, cette phrase adress&#xE9;e &#xE0; un ing&#xE9;nieur n&apos;am&#xE8;nera rien de mieux que du d&#xE9;dain. J&apos;imagine que LeBron James me trouverait tout &#xE0; fait comique, si je venais lui donner des conseils sur la tactique, sous pr&#xE9;texte que j&apos;ai jou&#xE9; au basket dans la cour de r&#xE9;cr&#xE9;ation (NdT: LeBron James est un c&#xE9;l&#xE8;bre basketteur de NBA). Les d&#xE9;veloppeurs subissent cela tout le temps.</p>
<p>Voici quelques &#xE9;normit&#xE9;s &#xE9;nonc&#xE9;es par des non-d&#xE9;veloppeurs :</p>
<ul class="simple">
<li>Je ne comprends pas en quoi c&apos;est si compliqu&#xE9;. Ce ne sont que quelques lignes de code. (Techniquement, n&apos;importe quel d&#xE9;veloppement ne consiste qu&apos;en quelques lignes de code ; cela n&apos;en fait pas un d&#xE9;veloppement facile pour autant).</li>
<li>Untel nous dit que cela peut &#xEA;tre fait en x jours. (Ceci signifie que Untel a l&apos;exp&#xE9;rience sur le probl&#xE8;me et a une vision claire de la solution. Moi non ; je dois commencer par me mettre &#xE0; niveau)</li>
<li>Que peut-on faire pour rendre &#xE7;a plus rapide ? Est-ce qu&apos;il vous faut plus de d&#xE9;veloppeurs ? (Or, ajouter plus de d&#xE9;veloppeurs sur un probl&#xE8;me ne fait souvent qu&apos;empirer les choses. La seule fa&#xE7;on de d&#xE9;velopper quelque chose plus vite, c&apos;est de d&#xE9;velopper quelque chose de plus petit).</li>
</ul>
<p>La pire chose que vous puissiez faire &#xE0; un ing&#xE9;nieur, c&apos;est lui dire que vous avez d&#xE9;j&#xE0; d&#xE9;velopp&#xE9;. C&apos;est un peu diff&#xE9;rent pour quelqu&apos;un qui a r&#xE9;ellement &#xE9;t&#xE9; ing&#xE9;nieur dans sa carri&#xE8;re. Dans ce cas, la personne dispose d&apos;une cr&#xE9;dibilit&#xE9; naturelle, mais limit&#xE9;e dans le temps (disons 5 ans ; au del&#xE0;, tout aura chang&#xE9;). Mais quelqu&apos;un qui n&apos;a jamais d&#xE9;velopp&#xE9; professionnellement, ferait mieux de garder pour lui ses talents de bidouilleur, plut&#xF4;t que de s&apos;en servir pour donner son avis sur un d&#xE9;veloppement.</p>
<p>(Soyons honn&#xEA;tes, les designers sont &#xE9;galement touch&#xE9;s par le probl&#xE8;me. Chacun se pense expert en design car tout le monde aime les jolis choses. &#xC7;a ne fait pas de nous des experts pour designer quoi que ce soit).</p>
</div>
<div class="section" id="plus-de-cuistots"> <p>Les d&#xE9;veloppeurs sont en permanence confront&#xE9;s au probl&#xE8;me d&apos;avoir trop de plats sur le feu. Comme nous sous-estimons le temps n&#xE9;cessaire pour finir une t&#xE2;che, la plupart des d&#xE9;veloppements sont en retard. Cela vaut aussi bien pour les grandes que les petites entreprises, tout le monde a ce probl&#xE8;me. &#xCA;tre en retard m&#xE9;contente la hi&#xE9;rarchie et aboutit &#xE0; la conclusion qu&apos;il n&apos;y a pas assez de d&#xE9;veloppeurs. Engagez plus de d&#xE9;veloppeurs, disent-ils, et cela am&#xE9;liorera les choses.</p>
<p>Dans certains cas ajouter des ing&#xE9;nieurs fonctionnera. Dans la plupart des cas, cela ne fera qu&apos;empirer le probl&#xE8;me. Il est assez difficile de faire communiquer des gens cr&#xE9;atifs entre eux, ajouter des d&#xE9;veloppeurs ne fait qu&apos;amplifier le probl&#xE8;me. Les d&#xE9;veloppeurs n&apos;ont pas le droit d&apos;&#xEA;tre &#xE0; court de travail en g&#xE9;n&#xE9;ral. Si la hi&#xE9;rarchie d&#xE9;couvre que des ing&#xE9;nieurs sont inactifs, elle a tendance &#xE0; leur cr&#xE9;er du travail.</p>
<p>Cela m&apos;est arriv&#xE9; de fa&#xE7;on quasi caricaturale il y a quelques ann&#xE9;es. Nous concevions la nouvelle page d&apos;accueil de Yahoo, la reconstruisant compl&#xE8;tement avec un nombre r&#xE9;duit de gens. Il s&apos;agissait en fait d&apos;une situation id&#xE9;ale o&#xF9; un petit nombre d&apos;entre nous pouvions nous focaliser sur l&apos;architecture &#xE0; partir de laquelle la future page serait construite. La conception &#xE9;tait termin&#xE9;e et nous &#xE9;tions pr&#xEA;t &#xE0; d&#xE9;velopper le prototype quand tout &#xE0; coup on nous a donn&#xE9; huit d&#xE9;veloppeurs. Notre plan de marche ? Ces d&#xE9;veloppeurs devaient imm&#xE9;diatement commencer &#xE0; &#xE9;crire du code pour la nouvelle page d&apos;accueil. Sacr&#xE9; casse-t&#xEA;te &#xE9;tant donn&#xE9; que l&apos;architecture n&apos;existait pas encore. Mais les ing&#xE9;nieurs ne pouvaient pas rester sans travail, ils avaient &#xE9;t&#xE9; assign&#xE9;s au projet et devaient commencer &#xE0; faire quelque chose. Le probl&#xE8;me classique de la poule et de l&apos;oeuf.</p>
<p>Dans un monde id&#xE9;al, nous aurions pu r&#xE9;aliser un prototype de l&apos;architecture et alors re&#xE7;u des ing&#xE9;nieurs suppl&#xE9;mentaires pour nous aider &#xE0; l&apos;impl&#xE9;mentation. Dans cette situation nous &#xE9;tions coinc&#xE9;s. Ce que nous avons finalement fait est que nous avons utilis&#xE9; l&apos;architecture existante d&apos;un autre projet &#xE0; laquelle nous avons mise une fa&#xE7;ade simulant l&apos;existence de architecture que nous avions con&#xE7;ue. Les d&#xE9;veloppeurs ont ainsi pu commencer leur travail et nous avons pu travailler &#xE0; la construction de l&apos;architecture cible en parall&#xE8;le. C&apos;&#xE9;tait une tr&#xE8;s mauvaise solution &#xE0; un tr&#xE8;s mauvais probl&#xE8;me et cela a fini par se retourner contre nous lorsque les d&#xE9;veloppeurs ont atteint les limites de la fa&#xE7;ade que nous avions mise en place avec des fonctionnalit&#xE9;s qui auraient du &#xEA;tre impl&#xE9;ment&#xE9;es dans la nouvelle architecture mais qui n&apos;existaient pas encore. J&apos;ai finalement du dire au manager qu&apos;&#xE0; moins de nous donner le temps de construire la v&#xE9;ritable architecture le ch&#xE2;teau de carte que nous avions b&#xE2;ti allait s&apos;effondrer.</p>
<p>Avoir trop d&apos;ing&#xE9;nieurs sur un projet est un s&#xE9;rieux probl&#xE8;me. Ajouter des ing&#xE9;nieurs suppose qu&apos;il existe des t&#xE2;ches &#xE0; accomplir qui peuvent &#xEA;tre parall&#xE9;lis&#xE9;es, alors qu&apos;en r&#xE9;alit&#xE9; le nombre de t&#xE2;ches parall&#xE9;lisables sur un projet est faible et limit&#xE9;. Lorsqu&apos;il y a plus d&apos;ing&#xE9;nieurs que n&#xE9;cessaires sur un projet, le temps de d&#xE9;veloppement effectif diminue pour faire de la planification, de la synchronisation et de la coordination. Pour revenir &#xE0; ma m&#xE9;taphore pr&#xE9;c&#xE9;dente, vous ne pouvez b&#xE2;tir le second &#xE9;tage tant que le rez-de-chauss&#xE9;e n&apos;est pas termin&#xE9;. De nombreuses t&#xE2;che dans un projet de d&#xE9;veloppement sont en fait s&#xE9;quentielles et ajouter des ing&#xE9;nieurs n&apos;acc&#xE9;l&#xE8;re donc pas les choses. Ou comme le disait souvent l&apos;un de mes pr&#xE9;c&#xE9;dents coll&#xE8;gues, &quot;je m&apos;en fous du nombre de femmes vous me donnez, cela prend toujours neuf mois pour faire un b&#xE9;b&#xE9;.&quot;</p>
</div>
<div class="section" id="une-vraie-mauvaise-humeur"> <p>Si je r&#xE9;sume, sans assez d&apos;information, avec des pr&#xE9;requis qui changent, un socle de connaissances pas suffisamment solide pour faire le travail ais&#xE9;ment, et l&apos;obligation de baser notre travail sur des sp&#xE9;culations erron&#xE9;es, nous trouvons toujours le moyen de venir au travail tous les jours. &#xC9;tant des gens cr&#xE9;atifs, nous pouvons nous en accommoder parce que nous savons qu&apos;un jour des personnes utiliserons le fruit de notre travail. Voici ce qui fait avancer les ing&#xE9;nieurs plus que tout autre chose : l&apos;id&#xE9;e que des personnes que nous ne connaissons pas seront affect&#xE9;es par notre travail. Que vous travailliez sur un site web visit&#xE9; par des millions de personnes par jours, ou bien sur un syst&#xE8;me de point de vente pour restaurants, savoir que cela aura de l&apos;impact sur la vie des gens constitue un puissant stimulant</p>
<blockquote class="twitter-tweet"><p>I can&#x2019;t state this enough: Programmers don&#x2019;t burn out on hard work, they burn out on change-with-the-wind directives and not &#x2018;shipping&#x2019;.</p><p>&#x2014; Mark Berry (@markab) <a href="https://twitter.com/markab/status/181452969391292417">March 18, 2012</a></p></blockquote><p><strong>Traduction</strong> : <em>&quot;Je ne le dirai jamais assez : un ing&#xE9;nieur ne s&apos;&#xE9;puise pas &#xE0; cause d&apos;un travail trop dur, il s&apos;&#xE9;puise &#xE0; cause des changements de direction incessants, ainsi que sur le fait de ne pas livrer.&quot;</em></p>
<p>Quand il y a des retards &#xE0; cause de changement d&apos;avis, nous devenons grincheux. Incroyablement grincheux. Notre objectif de proposer le fruit de notre travail aux gens s&apos;en trouve diff&#xE9;r&#xE9;, et c&apos;est d&#xE9;moralisant. Et pourtant, un d&#xE9;veloppeur n&apos;a rien d&apos;un perfectionniste. Nous sommes souvent partant pour sortir quelque chose de juste bien, plut&#xF4;t que continuer &#xE0; travailler sur quelque chose de mieux, mais qui ne sort pas. Nous aimons construire des petites choses afin de les sortir rapidement, pour plus tard pouvoir les combiner ensemble en quelque chose de plus grand. Pourquoi ? Parce que c&apos;est ainsi que nous pouvons toucher les gens.</p>
<p>Maintenant, nous savons tous que les retards font partie int&#xE9;grante de l&apos;industrie logicielle. Les ing&#xE9;nieurs travailleront comme des malades si leur estimation de temps est d&#xE9;pass&#xE9;e, afin d&apos;essayer, et de parvenir &#xE0; faire fonctionner leur produit. Les ing&#xE9;nieurs ne d&#xE9;testent pas le dur labeur et les horaires &#xE0; rallonge ; nous d&#xE9;testons ne pas r&#xE9;gler les probl&#xE8;mes.</p>
</div>
<div class="section" id="quels-remerciements"> <p>En tant que d&#xE9;veloppeur, notre travail se d&#xE9;roule selon un rythme tr&#xE8;s diff&#xE9;rent des autres. Par exemple, ce n&apos;est pas un designer ou un chef de produit qui devra se lever au milieu de la nuit parce que quelque chose est cass&#xE9; en production (bien que j&apos;ai connu des chefs de produit qui tenaient &#xE0; &#xEA;tre appel&#xE9;s lorsque cela arrivait). Une fois j&apos;&#xE9;tais sur le point de partir de chez moi avec mon rendez-vous (NdT : rendez-vous galant) lorsque j&apos;ai re&#xE7;u un appel du travail &#xE0; propos d&apos;un probl&#xE8;me en production. Elle s&apos;est assise et a attendu patiemment durant une heure alors que j&apos;essayais fr&#xE9;n&#xE9;tiquement de r&#xE9;gler le probl&#xE8;me. Elle a fini par partir (et je ne peux l&apos;en bl&#xE2;mer) me laissant &#xE0; mon travail avec mes coll&#xE8;gues compatissant &#xE0; mon malheur sur IRC.</p>
<p>Pourtant vous entendrez rarement des ing&#xE9;nieurs se plaindre des horaires &#xE0; rallonge ou de devoir se lever au milieu de la nuit &#xE0; cause d&apos;un probl&#xE8;me en production. Le logiciel est notre b&#xE9;b&#xE9; et nous aimons en prendre soin. Cela signifie que si il faut le nourrir au milieu de la nuit, nous le faisons. Si il a besoin d&apos;un peu plus d&apos;attention pendant le week-end, nous le faisons aussi et tout cela avec le sourire car notre cr&#xE9;ation grandit.</p>
<p>Les d&#xE9;veloppeurs sont heureux quand ils mettent la touche finale aux derniers octets du code d&apos;une t&#xE2;che. Je n&apos;ai jamais vu un d&#xE9;veloppeur aussi joyeux que quand il envoie un email pour dire qu&apos;il a fini quelque chose et que c&apos;est pr&#xEA;t &#xE0; &#xEA;tre test&#xE9;. Pourtant cet joie se volatilise rapidement lorsqu&apos;au cours des dix minutes qui suivent, les rapports de bugs sont envoy&#xE9;s concernant son tout nouveau b&#xE9;b&#xE9;.</p>
<p>Essayez d&apos;imaginer cela une seconde. Vous avez travaill&#xE9; pendant une journ&#xE9;e, une semaine ou plusieurs semaines sur quelque chose et vous venez de le terminer. Vous &#xEA;tes fier car vous avez accompli la t&#xE2;che que l&apos;on vous avait confi&#xE9;, vous avez probablement appris des choses que vous ne connaissiez pas auparavant. Tout ce &#xE0; quoi vous aspirez c&apos;est de prendre un peu de temps pour admirer votre travail. Peut-&#xEA;tre m&#xEA;me que quelqu&apos;un vous dise &quot;bon boulot&quot;. Et qu&apos;obtenez vous ? Des bugs. Telle chose ne fonctionne pas, telle autre chose n&apos;est pas &#xE0; sa place et ainsi de suite. Notre bonne humeur s&apos;envole aussi vite que nous nous attelons &#xE0; r&#xE9;parer ce qui ne va pas.</p>
</div>
<div class="section" id="pourquoi-nous-disons-non"> <p>Compte tenu de tout ce que j&apos;ai d&#xE9;j&#xE0; mentionn&#xE9;, voici les raisons classiques pour lesquelles les ing&#xE9;nieurs disent non (ou bien semblent grincheux):</p>
<ul class="simple">
<li>La demande est venue tardivement au cours du d&#xE9;veloppement et il n&apos;y a pas assez de temps pour s&apos;adapter avant la date de livraison.</li>
<li>La demande annule une ou plusieurs hypoth&#xE8;ses qui ont &#xE9;t&#xE9; faites d&#xE8;s le d&#xE9;but du processus pour avancer le projet.</li>
<li>La demande va &#xE0; l&apos;encontre d&apos;une ou plusieurs demandes pr&#xE9;c&#xE9;dentes.</li>
<li>La demande augmente la quantit&#xE9; de travail qui doit &#xEA;tre fait avant la livraison.</li>
<li>Nous sommes tellement &#xE9;puis&#xE9;s que toute demande est per&#xE7;ue comme une tonne de travail suppl&#xE9;mentaire et nous ne voulons simplement pas en supporter plus.</li>
</ul>
<p>Gardez &#xE0; l&apos;esprit que toutes ces raisons, except&#xE9;e la derni&#xE8;re, sont li&#xE9;es au rapport qu&apos;entretient l&apos;ing&#xE9;nieur et la date de livraison de son projet. Nous voulons que les t&#xE2;ches se terminent, et la seule fa&#xE7;on d&apos;y parvenir, c&apos;est de ne pas les changer pendant que nous travaillons dessus. Quand un changement survient, c&apos;est l&#xE0; que nous devenons r&#xE9;ellement grincheux, et que le &quot;non&quot; arrive, sortant de nos bouches avant m&#xEA;me que vous ayez fini votre phrase.</p>
</div>
<div class="section" id="soin-et-alimentation"> <p>Alors, comment g&#xE9;rez-vous ces grincheux pourtant n&#xE9;cessaires dans votre entreprise ?</p>
<p>Revoyons un instant ce qui fait avancer les ing&#xE9;nieurs :</p>
<ul class="simple">
<li>&#xCA;tre cr&#xE9;atif</li>
<li>R&#xE9;soudre des probl&#xE8;mes</li>
<li>Avoir une incidence sur la vie des gens</li>
</ul>
<p>Notez une absente dans cette liste. L&apos;argent. Donner b&#xEA;tement de l&apos;argent &#xE0; un ing&#xE9;nieur ne le satisfera que rarement. Cela fait clich&#xE9;, mais &#xE7;a n&apos;a rien &#xE0; voir avec l&apos;argent. L&apos;argent permet de s&apos;amuser, mais ce qui nous int&#xE9;resse vraiment c&apos;est le code et la cr&#xE9;ation. Lorsque nous pouvons le faire dans un environnement sain, nous sommes heureux, et pour tr&#xE8;s longtemps.</p>
<p>Alors, comment allez-vous cr&#xE9;er un environnement sain pour les ing&#xE9;nieurs ?</p>
</div>
<div class="section" id="travailler-transversalement"> <p>Les ing&#xE9;nieurs logiciels sont cr&#xE9;atifs, &#xE0; l&apos;instar des chefs de produit, et des designers, c&apos;est pourquoi vous devriez veiller &#xE0; les inclure dans le processus de cr&#xE9;ation. Les ing&#xE9;nieurs constituent des atouts consid&#xE9;rables lors des sessions de brainstorming et pour revoir les conceptions initiales. Donnez &#xE0; chaque ing&#xE9;nieur l&apos;opportunit&#xE9; de rencontrer l&apos;&#xE9;quipe cr&#xE9;ative et de travailler directement avec elle (pas n&#xE9;cessairement tous en m&#xEA;me temps). Pour faire court, ins&#xE9;rez l&apos;ing&#xE9;nieur le plus t&#xF4;t possible dans le processus de cr&#xE9;ation. Aucun ing&#xE9;nieur n&apos;aime d&#xE9;couvrir les sp&#xE9;cifications et les maquettes jet&#xE9;es sur un mur, sans les comprendre.</p>
<p>Les ing&#xE9;nieurs sont tr&#xE8;s logiques. Ainsi, en &#xE9;tant dans ces r&#xE9;unions pr&#xE9;liminaires afin de saisir d&apos;o&#xF9; viennent les besoins, ils peuvent permettre d&apos;&#xE9;carter directement un certain nombre de probl&#xE8;mes. Quand les ing&#xE9;nieurs se sentent comme des ouvriers, ils posent des questions et cela ralentit le processus. Lorsque les ing&#xE9;nieurs sont co-cr&#xE9;ateurs, il y a moins de questions et donc moins de retards par la suite dans le processus.</p>
<p>De plus, les ing&#xE9;nieurs sont souvent tr&#xE8;s en avance en termes de connaissance de ce qui est possible. Si vous prenez les d&#xE9;veloppeurs d&apos;interfaces, nous savons ce que les navigateurs peuvent faire bien avant les chefs de produit ou les designers. Quand nous partageons ce savoir, nous donnons en fait &#xE0; tous de nouvelles id&#xE9;es sur comment construire un projet, partant de ce qu&apos;il est possible de faire. Imaginez si vous essayez de cr&#xE9;er un site de partage de photo, sans savoir que vous pouvez maintenant effectuer un glisser-d&#xE9;poser de fichiers depuis votre bureau vers le navigateur, afin d&apos;envoyer le fichier au serveur <a class="footnote-reference" href="http://blog.mandraxe.info/ingenieurs-grincheux.html#id17" id="id15">[2]</a> ? Sans cette information, imaginez &#xE0; quel point le produit final s&apos;en trouverait modifi&#xE9;.</p>
<p>Donc, invitez les ing&#xE9;nieurs dans le processus de cr&#xE9;ation, le plus t&#xF4;t possible. Laissez les vous faire un retour et vous donner des informations sur ce qu&apos;il est possible de faire. Moins notre conduite nous est dict&#xE9;e, plus nous sommes &#xE0; l&apos;&#xE9;coute et heureux dans notre travail. Nous donner le sentiment d&apos;avoir contribu&#xE9; &#xE0; la cr&#xE9;ation du produit est le seul moyen d&apos;y arriver vraiment.</p>
</div>
<div class="section" id="amenager-un-environnement-creatif"> <p>Pour faire suite au th&#xE8;me des d&#xE9;veloppeurs vus comme des cr&#xE9;atifs, essayez de nous offrir des opportunit&#xE9;s d&apos;&#xEA;tre cr&#xE9;atifs. Il y a une bonne raison si les hackdays et hackweeks (NdT : journ&#xE9;es ou semaines de bidouillage, i.e. activit&#xE9; de d&#xE9;veloppement libre regroupant les diff&#xE9;rents m&#xE9;tiers de l&apos;industrie logicielle) sont si populaires ; c&apos;est parce qu&apos;il s&apos;agit de l&apos;&#xE9;chappatoire cr&#xE9;atif qui permet aux d&#xE9;veloppeurs de recharger les batteries et red&#xE9;couvrir leur amour pour le code. Ces &#xE9;v&#xE9;nements de bidouillage sont des moments pendant lesquels les d&#xE9;veloppeurs peuvent &#xEA;tre compl&#xE8;tement cr&#xE9;atifs, car lib&#xE9;r&#xE9;s des contraintes de leur travail quotidien.</p>
<p>Un hack day chaque trimestre est suffisant pour enthousiasmer les gens. Vous voulez que les gens soient encore plus excit&#xE9;s ? Donner un th&#xE8;me au hack day. Donnez des r&#xE9;compenses au plus cr&#xE9;atif, &#xE0; celui qui a le plus de chances de passer en production et ainsi de suite. L&apos;objectif est d&apos;alimenter la cr&#xE9;ativit&#xE9; des d&#xE9;veloppeurs afin qu&apos;en revenant &#xE0; leur poste, ils se soient rafra&#xEE;chis les id&#xE9;es et soient de nouveau pr&#xEA;ts &#xE0; contribuer.</p>
<p>Gardez &#xE0; l&apos;esprit que les d&#xE9;veloppeurs ne sont pas uniques &#xE0; cet &#xE9;gard. Tout le monde a besoin de temps pour &#xEA;tre cr&#xE9;atif. D&apos;apr&#xE8;s mon exp&#xE9;rience, les chefs de produit et les designers ont tendance &#xE0; l&apos;obtenir plus fr&#xE9;quemment. Ils ont du temps pour des conf&#xE9;rences ou des ateliers hors du bureau alors que les d&#xE9;veloppeurs ont tendance &#xE0; &#xEA;tre oubli&#xE9;s.</p>
<p>D&apos;ailleurs, les &#xE9;v&#xE9;nements de bidouillage ne sont pas le seul moyen de faire cela, mais ils sont le meilleur moyen de commencer. Vous pouvez aussi allumer la flamme de la cr&#xE9;ativit&#xE9; en envoyant les ing&#xE9;nieurs &#xE0; des conf&#xE9;rences leur permettant d&apos;am&#xE9;liorer leurs comp&#xE9;tences. Permettre aux d&#xE9;veloppeurs d&apos;acheter des livres qui contribuent &#xE0; leur savoir sur les deniers de la soci&#xE9;t&#xE9;. Donner l&apos;opportunit&#xE9; aux d&#xE9;veloppeurs d&apos;exprimer leurs id&#xE9;es &#xE0; propos des projets sur lesquels ils travaillent. Google donne &#xE0; ses ing&#xE9;nieurs les fameux 20% de leur temps pour travailler &#xE0; des projets personnels. Tout cela participe grandement &#xE0; &#xE9;tablir une excellente relation avec vos ing&#xE9;nieurs.</p>
</div>
<div class="section" id="encouragez-les-temps-de-repos"> <p>&#xC9;tant donn&#xE9; le volume horaire et les exercices de concentration que nous faisons en g&#xE9;n&#xE9;ral, les d&#xE9;veloppeurs ont besoin de faire des pauses. Malheureusement, nous ne sommes pas tr&#xE8;s dou&#xE9;s pour planifier cela. Nous sommes si pris dans le processus que nous oublions de prendre des vacances. Durant les cinq premi&#xE8;res ann&#xE9;es de ma carri&#xE8;re, je pense avoir pris 7 jours de cong&#xE9;s. Je ne sais pas pourquoi, mais nous ne sommes pas tr&#xE8;s bons pour prendre le temps de d&#xE9;compresser. C&apos;est un probl&#xE8;me.</p>
<p>L&apos;usure du d&#xE9;veloppeur a cela de singulier que nous avons l&apos;habitude de passer outre. Quand l&apos;usure devient vraiment trop p&#xE9;nible, nous partons, &#xE0; la recherche de repos. Le pire c&apos;est que les d&#xE9;veloppeurs ne vous diront probablement jamais qu&apos;ils approchent de ce point ; nous sommes trop fiers pour cela. Dans ma derni&#xE8;re &#xE9;quipe, j&apos;ai dit aux d&#xE9;veloppeurs que d&#xE8;s la premi&#xE8;re fois o&#xF9; ils se sentent frustr&#xE9;s ils doivent venir me voir et m&apos;en parler. Je ne voulais pas qu&apos;ils attendent et que cela devienne si fort que la seule fa&#xE7;on d&apos;en &#xE9;chapper soit de partir. Je ne voulais pas qu&apos;ils partent, je voulais qu&apos;ils soient heureux et la seule fa&#xE7;on pour moi d&apos;y parvenir &#xE9;tait de savoir quand ils commen&#xE7;aient &#xE0; ne plus l&apos;&#xEA;tre.</p>
<p>Incitez les ing&#xE9;nieurs &#xE0; prendre du repos. Votre soci&#xE9;t&#xE9; donne des cong&#xE9;s, alors assurez vous que les d&#xE9;veloppeurs utilisent ces jours de vacances pendant l&apos;ann&#xE9;e. Une fois tous les 4 &#xE0; 5 mois au minimum. Les managers sont les mieux plac&#xE9;s pour g&#xE9;rer cela car ils connaissent les agendas des projets.</p>
<p>Lorsque les ing&#xE9;nieurs prennent des jours &#xE0; intervalle r&#xE9;gulier, cela restaure leur c&#xF4;t&#xE9; cr&#xE9;atif en les sortant de la rigueur n&#xE9;cessaire au respect des dates de livraison. Oui, il est possible que nous passions une partie de notre temps de repos &#xE0; coder, mais il s&apos;agit de nos propres cr&#xE9;ations et de ce fait c&apos;est assez diff&#xE9;rent de ce que l&apos;on fait au travail. C&apos;est un &#xE9;l&#xE9;ment important pour se changer les id&#xE9;es et se pr&#xE9;parer pour la prochaine bataille.</p>
</div>
<div class="section" id="laissez-les-coder"> <p>Aussi ironique que cela puisse para&#xEE;tre, de nombreuses soci&#xE9;t&#xE9;s recrutent des d&#xE9;veloppeurs mais ne les laissent pas vraiment coder. Au lieu de cela leurs journ&#xE9;es sont remplies de r&#xE9;unions inutiles qui brident la productivit&#xE9;. En g&#xE9;n&#xE9;ral, les d&#xE9;veloppeurs sont plus productifs lorsqu&apos;ils peuvent coder pendant au moins 4 heures d&apos;affil&#xE9;e sans interruption.</p>
<p>Il est difficile de rentrer dans un bon flux de d&#xE9;veloppement lorsque l&apos;on sait que l&apos;on a une r&#xE9;union dans une heure ou deux, cela vous trotte dans la t&#xEA;te pendant que vous codez. Il est incroyablement improductif de coder pendant une heure, s&apos;arr&#xEA;ter pendant une heure, coder pendant une heure, s&apos;arr&#xEA;ter pendant une heure, etc ... Vous ne pouvez rentrer dans le flux et &#xE0; peine commenc&#xE9; vous arr&#xEA;ter. Le cerveau des d&#xE9;veloppeurs doit basculer dans le bon &#xE9;tat d&apos;esprit pour coder et cette bascule prend du temps.</p>
<p>Assurez vous que vos d&#xE9;veloppeurs ont chaque jour une plage ininterrompue d&apos;au moins quatre heures d&#xE9;di&#xE9;e au d&#xE9;veloppement. C&apos;est l&#xE0; le secret pour que le travail avance plus vite. Cela semble assez logique : si les gens font habituellement une journ&#xE9;e de huit heures, au moins la moiti&#xE9; de leur temps devrait &#xEA;tre allou&#xE9;e &#xE0; l&apos;activit&#xE9; principale. Je m&apos;&#xE9;tais rendu compte que j&apos;&#xE9;tais plus productif entre 13h et 17h. Je savais que si j&apos;avais ce cr&#xE9;neau chaque jour je pouvais facilement accomplir mes t&#xE2;ches. Quand ce cr&#xE9;neau commen&#xE7;ait &#xE0; &#xEA;tre interrompu par des r&#xE9;unions, je savais que je ne produirais pas beaucoup.</p>
<p>T&#xE2;chez aussi d&apos;avoir au moins une journ&#xE9;e sans r&#xE9;union par semaine. Pas m&#xEA;me de stand-up quotidien (NdT : courte r&#xE9;union quotidienne au cours de laquelle les participants &#xE0; un projet disent ce qu&apos;ils sont en train de faire ; cette r&#xE9;union a lieu debout afin d&apos;en limiter la dur&#xE9;e, d&apos;o&#xF9; le nom). Contentez-vous de laisser aux d&#xE9;veloppeurs le soin de g&#xE9;rer leur temps par eux-m&#xEA;me ce jour l&#xE0; et de faire ce qui doit l&apos;&#xEA;tre. Il est absolument incroyable tout ce que l&apos;on peut faire en une journ&#xE9;e lorsqu&apos;il n&apos;y a aucune interruption. A une certaine p&#xE9;riode de ma carri&#xE8;re, mon responsable m&apos;a impos&#xE9; de travailler de chez moi deux jours par semaine parce que j&apos;&#xE9;tais constamment interrompu lorsque j&apos;&#xE9;tais au bureau. R&#xE9;sultat : je terminais mon travail tr&#xE8;s vite.</p>
</div>
<div class="section" id="exprimer-votre-satisfaction"> <p>Il s&apos;agit l&#xE0; de quelque chose qui peut &#xEA;tre mis en oeuvre imm&#xE9;diatement et qui est vraiment efficace. J&apos;ai mentionn&#xE9; pr&#xE9;c&#xE9;demment la frustration de suer pour terminer une t&#xE2;che et de ne recevoir comme retour que des rapports de bug. En tant que d&#xE9;veloppeurs nous avons rarement l&apos;opportunit&#xE9; de nous enfoncer dans notre fauteuil, admirer le r&#xE9;sultat de notre travail et recevoir une tape dans le dos de quelqu&apos;un.</p>
<p>Quand un d&#xE9;veloppeur termine une t&#xE2;che, surtout une longue, un petit mot pour dire merci aura un tr&#xE8;s grand effet. Un simple &quot;H&#xE9;, merci d&apos;avoir termin&#xE9;. On va jeter un oeil&quot; fera dispara&#xEE;tre la position d&#xE9;fensive qui appara&#xEE;t typiquement lorsque les rapports de bugs commencent &#xE0; arriver. Se sentir appr&#xE9;ci&#xE9; est important pour les d&#xE9;veloppeurs car la plupart des retours que nous recevons sont n&#xE9;gatifs, sous la forme de bugs, de probl&#xE8;mes d&apos;exploitation ou autre. Un peu de retour positif rend le reste moins pesant.</p>
<p>Si vous voulez faire encore mieux, d&#xE9;cidez d&apos;une r&#xE9;compense qui est attribu&#xE9;e chaque trimestre au d&#xE9;veloppeur qui a eu le plus gros impact ou qui a le plus am&#xE9;lior&#xE9; les choses ou quoique ce soit d&apos;autre. La r&#xE9;compense ne doit pas n&#xE9;cessairement &#xEA;tre quelque chose d&apos;important ou d&#xE9;sirable comme un iPad (m&#xEA;me si nous accepterions avec plaisir cela ainsi que d&apos;autres gadgets), cela peut-&#xEA;tre un petit troph&#xE9;e et un email &#xE0; toute l&apos;&#xE9;quipe ou le d&#xE9;partement qui reconnait l&apos;effort.</p>
<p>Et s&apos;il vous pla&#xEE;t, lorsque vous remerciez les gens pour leur travail, n&apos;oubliez pas les d&#xE9;veloppeurs. J&apos;ai assist&#xE9; &#xE0; de nombreuses r&#xE9;unions sur de nombreux projets lors desquelles les gens remercient ouvertement les &#xE9;quipes produits ou les designers pour leur travail sur le projet sans mentionner les ing&#xE9;nieurs dont le sang, la sueur et les larmes ont produit le travail concret. Le succ&#xE8;s ou l&apos;&#xE9;chec de chaque produit est le r&#xE9;sultat du travail des trois groupes, aucun ne pourrait le faire seul. Assurez vous que votre entreprise exprime toujours sa reconnaissance envers toute l&apos;&#xE9;quipe et pas seulement une partie.</p>
</div>
<div class="section" id="conclusion"> <p>Nous, les d&#xE9;veloppeurs, sommes une esp&#xE8;ce int&#xE9;ressante. Nous sommes dot&#xE9;s d&apos;une personnalit&#xE9; particuli&#xE8;re, et d&#xE9;sirons vraiment faire les choses du mieux possible. Si vous arr&#xEA;tez de nous traiter comme des ex&#xE9;cutants et commencez &#xE0; nous traiter comme faisant partie du processus cr&#xE9;atif, vous obtiendrez probablement plus et bien plus vite. Les &#xE9;quipes dans lesquelles j&apos;ai travaill&#xE9; ont toutes connues des frictions &#xE0; divers degr&#xE9;s par manque de compr&#xE9;hension de l&apos;&#xE9;tat d&apos;esprit des d&#xE9;veloppeurs et de ce qui les motive. J&apos;esp&#xE8;re sinc&#xE8;rement que cet article permettra une meilleure communication entre les ing&#xE9;nieurs et ceux qui travaillent avec. Ce n&apos;est vraiment pas si difficile. Nous voulons tous faire partie de la solution plut&#xF4;t que d&apos;&#xEA;tre une abeille ouvri&#xE8;re.</p>
</div>
<h2>R&#xE9;f&#xE9;rences</h2> </div>]]></description>
      <link>http://blog.mandraxe.info/ingenieurs-grincheux.html</link>
      <guid>http://blog.mandraxe.info/ingenieurs-grincheux.html</guid>
      <pubDate>Tue, 04 Feb 2014 11:02:00 +0100</pubDate>
    </item>
    <item>
      <title><![CDATA[Traduit ailleurs : Responsive Webdesign – présent et futur de l'adaptation mobile]]></title>
      <description><![CDATA[<div id="page"> <p id="content"> <article> <div class="article"> <img src="http://www.alsacreations.com/xmedia/pictos/10.png" alt="Design" class="right picto"> <div class="doc-abstract"><p>La probl&#xE9;matique du responsive est bien plus complexe que ce qu&apos;on peut lire sur certains blogs qui essaient de nous faire croire qu&apos;il suffit aujourd&apos;hui, pour optimiser un site pour mobile, d&apos;ajouter 2 Media Queries pour l&apos;iPhone et l&apos;iPad et redimensionner toutes les images. Le Responsive Web Design est une technique toute jeune, loin d&apos;&#xEA;tre parfaite et en constante &#xE9;volution. Beaucoup de choses sont aujourd&apos;hui possible, mais h&#xE9;las il reste encore pas mal de chemin &#xE0; parcourir dans le domaine.</p></div> <div class="auteur "> <img src="http://forum.alsacreations.com/avatars/small/29058-150.jpg" alt="" class="avatar"> <p>Article par <a href="http://www.alsacreations.com/profil/lire/29058-stphanie-w.html"><span>St&#xE9;phanie W.</span></a> (Designer Web &amp; Mobile sp&#xE9;cialis&#xE9;e en UI and UX design, Partout dans le monde :))<br> </p> </div> <div class="doc-content"><p class="warning"> Apr&#xE8;s plusieurs mois de recherche sur le sujet, j&apos;ai enfin publi&#xE9; mon article sur <strong><a href="http://www.smashingmagazine.com/">Smashing Magazine</a>&#xA0;</strong>qui s&apos;intitule &quot;<strong><a href="http://mobile.smashingmagazine.com/2013/05/29/the-state-of-responsive-web-design/">The State Of Responsive Web Design</a></strong>&quot;. Ce qui suit en est la traduction. </p><p> Avertissement avant la lecture : Je n&apos;ai pas la pr&#xE9;tention de changer le monde, d&apos;avoir la v&#xE9;rit&#xE9; absolue. Dans cet article &#x2013; qui est long, je le sais &#x2013; je souhaitais juste rendre attentif le lecteur au reste de ce gigantesque iceberg dont les Media Queries n&apos;en sont que la surface. <strong>Le responsive webdesign reste une technique et une infime partie de ce qui est aujourd&apos;hui appel&#xE9; &quot;<a href="http://viljamis.com/blog/2012/adaptive-vs-responsive-whats-the-difference.php">Adaptive Webdesign</a>&quot;</strong>.&#xA0;Le but de l&apos;article n&apos;est pas non plus de d&#xE9;courager les gens qui optimisent des sites pour mobile, mais de<strong> mettre le doigt sur ce qui aujourd&apos;hui pose probl&#xE8;me, est bancal, pour ensemble, trouver des solutions &#xE0; ces diff&#xE9;rents probl&#xE8;mes.</strong> Pour un peu plus de <a href="http://www.inpixelitrust.fr/blog/sur-smashing-magazine-responsive-webdesign-present-et-futur-de-ladaptation-mobile/">d&#xE9;tails sur le pourquoi de l&apos;article, je vous renvoie &#xE0; mon blog</a>.</p></div></div></article></p>
<p> On entend parler de &quot;Responsive Webdesign&quot; depuis plusieurs ann&#xE9;es maintenant, et le sujet s&apos;est vraiment d&#xE9;mocratis&#xE9; et popularis&#xE9; en 2012. <a href="http://bradfrostweb.com/">Brad Frost</a>, <a href="http://www.lukew.com/">Luke Wroblewski</a> et d&apos;autres grands noms commencent &#xE0; avoir une certaine exp&#xE9;rience du sujet, et aident au quotidien par leurs publications &#xE0; son am&#xE9;lioration. Cependant, beaucoup reste encore &#xE0; faire.</p>
<p class="center"> <img alt="Iceberg" src="http://www.alsacreations.com/xmedia/doc/full/responsive.jpg"></p>
<p> Dans cet article, nous allons nous int&#xE9;resser &#xE0; ce qui est <strong>aujourd&apos;hui</strong> d&#xE9;j&#xE0; possible en terme d&apos;optimisation de sites pour mobiles, mais &#xE9;galement &#xE0; ce qui sera possible dans le <strong>futur</strong>. Nous parlerons de propri&#xE9;t&#xE9;s non encore standardis&#xE9;es comme CSS level 4, HTML5 et d&apos;APIs, ainsi que de techniques qui restent &#xE0; &#xEA;tre am&#xE9;lior&#xE9;es. Cet article est loin d&apos;&#xEA;tre exhaustif et nous n&apos;aurons pas le temps d&apos;approfondir chaque technique mentionn&#xE9;e, mais vous aurez &#xE0; la fin de la lecture &#xE0; votre disposition suffisamment de liens pour pouvoir continuer l&apos;exploration par vous-m&#xEA;me.</p>
<h3> L&apos;&#xE9;tat des images dans le responsive webdesign</h3>
<p> Quelle meilleure mani&#xE8;re d&apos;aborder le sujet que de commencer par ce qui pose un gros souci : la gestion des images. Ce sujet n&apos;est pas nouveau, il prend de plus en plus d&apos;ampleur avec l&apos;arriv&#xE9;e d&apos;&#xE9;crans dits &quot;haute d&#xE9;finition&quot;. Par ce terme j&apos;entends des &#xE9;crans avec un <em>ratio</em> de pixel sup&#xE9;rieur &#xE0; 2; ils sont appel&#xE9;s <strong>Retina</strong> chez Apple (iOS) ou encore <strong>XHDPI</strong> chez Google (Android). Quand on commence &#xE0; s&apos;int&#xE9;resser aux images dans le domaine du responsive, on se retrouve confront&#xE9; &#xE0; deux difficult&#xE9;s : la taille (entendez par l&#xE0; leur poids en octets) et la performance.</p>
<figure class="center"> <img alt="" src="http://www.alsacreations.com/xmedia/doc/full/screensizes.png"> <figcaption>Le site <a href="http://screensiz.es/">screensiz.es</a> fait l&apos;inventaire de la densit&#xE9; de pixels</figcaption></figure>
<p> Beaucoup de designers adorent le &quot;pixel-perfect&quot;, mais les images de taille &quot;normale&quot; sont souvent &quot;pixelis&#xE9;es&quot; lorsqu&apos;elles sont affich&#xE9;es sur des &#xE9;crans haute d&#xE9;finition. L&apos;id&#xE9;e plut&#xF4;t simpliste de proposer des images qui auraient deux fois (voire plus) la taille de d&#xE9;part pour &#xE9;viter la d&#xE9;gradation visuelle sur ce genre d&apos;appareil semble bien tentante. Mais qu&apos;en est-il des probl&#xE9;matiques de performance ? Des images dont les dimensions seraient doubl&#xE9;es verraient leur poids multipl&#xE9; math&#xE9;matiquement par 4, et mettraient plus de temps &#xE0; charger. M&#xEA;me si vos utilisateurs ont un &#xE9;cran haute d&#xE9;finition, ils n&apos;ont pas forc&#xE9;ment, &#xE0; l&apos;instant o&#xF9; ils consultent votre page, la connexion qui va avec pour t&#xE9;l&#xE9;charger des images plus lourdes. En fonction du pays o&#xF9; se trouvent vos utilisateurs, la bande passante est d&apos;ailleurs plus ou moins co&#xFB;teuse.</p>
<p> Le second probl&#xE8;me est li&#xE9; aux petits appareils : pourquoi un t&#xE9;l&#xE9;phone mobile devrait avoir &#xE0; t&#xE9;l&#xE9;charger une image de 750 pixels de large, alors qu&apos;il n&apos;a que 320 pixels physiques sur son &#xE9;cran pour l&apos;afficher ? Et comment faire pour recadrer ces petites images, pour aller &#xE0; l&apos;essentiel et mettre en avant seulement la partie que l&apos;on juge importante ?</p>
<h4> Deux solutions du c&#xF4;t&#xE9; du code : l&apos;&#xE9;l&#xE9;ment &lt;picture&gt; et l&apos;attribut srcset</h4>
<p> On pourrait trouver dans le code que nous utilisons quotidiennement pour afficher les images un d&#xE9;but de solution au sujet &#xE9;pineux des images <em>responsive</em>.</p>
<p> Le <a href="http://responsiveimages.org/">Responsive Images Community Group</a>&#xA0;soutient une proposition d&apos;un nouvel &#xE9;l&#xE9;ment HTML&#xA0;<code>&lt;picture&gt;</code> plus flexible que ce que l&apos;on utilise pour le moment. L&apos;id&#xE9;e est d&apos;utiliser la syntaxe des <a href="http://www.alsacreations.com/article/lire/930-css3-media-queries.html">Media Queries</a> que l&apos;on commence &#xE0; bien conna&#xEE;tre pour faire t&#xE9;l&#xE9;charger des images diff&#xE9;rentes en fonction de l&apos;appareil, de sorte que des petits &#xE9;crans r&#xE9;cup&#xE9;reraient des images plus petites. La syntaxe de l&apos;&#xE9;l&#xE9;ment est proche de celle de <code>&lt;video&gt;</code>, chaque image &#xE9;tant r&#xE9;f&#xE9;renc&#xE9;e dans un sous &#xE9;l&#xE9;ment <code>&lt;source&gt;</code>.</p>
<p> Voici &#xE0; quoi ressemble le code de cette proposition :</p>
<pre class="code">
<code class="html">&lt;picture width=&quot;500&quot; height=&quot;500&quot;&gt; &lt;source media=&quot;(min-width: 45em)&quot; src=&quot;large.jpg&quot;&gt; &lt;source media=&quot;(min-width: 18em)&quot; src=&quot;med.jpg&quot;&gt; &lt;source src=&quot;small.jpg&quot;&gt; &lt;img src=&quot;small.jpg&quot; alt=&quot;&quot;&gt; &lt;p&gt;Texte accessible&lt;/p&gt;
&lt;/picture&gt;</code></pre>
<p> On imagine ais&#xE9;ment qu&apos;il serait ainsi facile de proposer la m&#xEA;me image en diff&#xE9;rentes tailles, mais on peut aussi imager proposer plusieurs images pour mettre l&apos;accent sur diff&#xE9;rents &#xE9;l&#xE9;ments en fonction de la taille de l&apos;appareil. Le <em><span>use-case</span></em> &#x201C;<a href="http://usecases.responsiveimages.org/#art-direction">Art Direction</a>&#x201D; du W3C illustre en quelques exemples de ce qu&apos;il serait alors possible de r&#xE9;aliser.</p>
<p class="center"> <img alt="Choix de DA pour la balise picture" src="http://www.alsacreations.com/xmedia/doc/full/pictureelement.jpg"></p>
<p> Cette proposition est en cours de discussion aupr&#xE8;s du <a href="http://www.w3.org/community/respimg/">W3C Responsive Images Community Group</a> mais n&apos;est &#xE0; l&apos;heure actuelle utilisable dans aucun navigateur. Un <em>polyfill</em> appel&#xE9; <a href="https://github.com/scottjehl/picturefill">Picturefill</a> est disponible et permet d&apos;&#xE9;muler <code>&lt;picture&gt;</code>&#xA0;en JavaScript &#xE0; l&apos;aide de <code>&lt;div&gt;</code> et de <code>data-attribute</code> pour &#xE9;viter les conflits de syntaxe le jour o&#xF9; <code>&lt;picture&gt;</code> sera standardis&#xE9;.</p>
<p> En parall&#xE8;le, Apple a &#xE9;galement fait une proposition pour la syntaxe d&apos;images responsives au W3C : <a href="http://www.w3.org/html/wg/drafts/srcset/w3c-srcset/">The srcset Attribute</a>. Elle est l&apos;&#xE9;quivalent en HTML de la proposition CSS Level 4 <a href="http://dev.w3.org/csswg/css4-images/#image-set-notation">image-set()</a>. D&apos;apr&#xE8;s les sp&#xE9;cifications, le but de cet attribut est de forcer le navigateur (User Agent) &#xE0; charger la ressource appropri&#xE9;e, plut&#xF4;t que de lui proposer une liste de diff&#xE9;rentes ressources. Il ne s&apos;agit donc ici non pas d&apos;une nouvelle balise, mais de conserver <code>&lt;img&gt;</code> et de lui ajouter un nouvel attribut <code>srcset</code>. Voici la syntaxe d&#xE9;crite dans les sp&#xE9;cifications :&#xA0;</p>
<pre class="code">
<code class="html">&lt;img alt=&quot;The Breakfast Combo&quot; src=&quot;banner.jpeg&quot; srcset=&quot;banner-HD.jpeg 2x, banner-phone.jpeg 640w, banner-phone-HD.jpeg 640w 2x&quot;&gt;</code></pre>
<p> Vous l&apos;aurez remarqu&#xE9;, elle est loin d&apos;&#xEA;tre intuitive. Les valeurs sont donn&#xE9;es dans des cha&#xEE;nes de caract&#xE8;re s&#xE9;par&#xE9;es par des virgules. A l&apos;int&#xE9;rieur de ces cha&#xEE;nes on retrouve le chemin vers l&apos;image, une valeur de densit&#xE9; de pixels de l&apos;appareil, et la taille maximum de viewport pour laquelle cette image devrait &#xEA;tre utilis&#xE9;e.</p>
<p> En fran&#xE7;ais dans le texte, voici ce que donne le code ci-dessus :</p>
<ul> <li> Par d&#xE9;faut l&apos;image utilis&#xE9;e est <code>banner.jpeg</code></li> <li> Les appareils qui ont un ratio de pixel sup&#xE9;rieur &#xE0; 2 utiliseront <code>banner-HD.jpeg</code></li> <li> Les appareils avec un viewport inf&#xE9;rieur &#xE0;&#xA0;640px&#xA0;utiliseront&#xA0;<code>banner-phone.jpeg</code></li> <li> Les appareils avec un viewport inf&#xE9;rieur &#xE0;&#xA0;640px ET un ratio de pixel sup&#xE9;rieur &#xE0; 2 utiliseront <code>banner-phone-HD.jpeg</code></li>
</ul>
<p> La premi&#xE8;re source donn&#xE9;e dans <code>src</code> est l&apos;image utilis&#xE9;e par d&#xE9;faut si cet attribut n&apos;est pas support&#xE9;. Le suffixe <code>2x</code> pour <code>banner-HD.jpeg</code> signifie que cette image doit &#xEA;tre utilis&#xE9;e pour les &#xE9;crans avec un ratio de pixel sup&#xE9;rieur &#xE0; <strong>2</strong>. La valeur <code>640w</code> pour <code>banner-phone.jpeg</code> repr&#xE9;sente la taille maximum du <a href="http://www.alsacreations.com/article/lire/1490-comprendre-le-viewport-dans-le-web-mobile.html">viewport</a> pour laquelle cette image sera utilis&#xE9;e. En raison de la complexit&#xE9; technique de sa mise en place, cette syntaxe n&apos;a pas encore &#xE9;t&#xE9; impl&#xE9;ment&#xE9;e dans nos navigateurs.</p>
<p> La syntaxe de <code>image-set()</code> en CSS fonctionne de la m&#xEA;me mani&#xE8;re et permet de charger des images de fond qui vont d&#xE9;pendre des m&#xEA;mes crit&#xE8;res :&#xA0;</p>
<pre class="code">
<code class="css">background-image: image-set( &quot;foo.png&quot; 1x, &quot;foo-2x.png&quot; 2x, &quot;foo-print.png&quot; 600dpi );</code></pre>
<p> La proposition pour la version CSS est pour le moment dans l&apos;&#xE9;tat Editor&#x2019;s Draft au W3C et fonctionne dans Safari 6+ and Chrome 21+. Un <a href="http://www.creativejuiz.fr/blog/veille-technologique/css-retina-hd-webkit-image-set-picture-srcset">article sur <code>picture</code>, <code>src-set</code> et <code>image-set</code> </a>est disponible en fran&#xE7;ais sur le blog Creative Juiz.</p>
<h4> Format d&apos;image, compression et SVG : changer la fa&#xE7;on dont on travail avec les images sur le web</h4>
<p> Vous aurez constat&#xE9; que ces deux propositions de syntaxe pour les images sont encore au stade exp&#xE9;rimental. Ce qui pose la probl&#xE9;matique du format d&apos;image en tant que tel : un d&#xE9;but de solution serait-il &#xE0; trouver de c&#xF4;t&#xE9; l&#xE0; ?</p>
<p> La premi&#xE8;re &#xE9;tape serait de jeter un &#x153;il du c&#xF4;t&#xE9; des formats alternatifs d&apos;image qui proposent un meilleur taux de compression. Google par exemple a d&#xE9;velopp&#xE9; de son c&#xF4;t&#xE9; un nouveau format, le <a href="https://developers.google.com/speed/webp/">WebP</a> qui propose des compressions plus importantes pour des images 26% plus petites que le PNG et 25 &#xE0; 34% plus petites que le JPEG. Ce format est support&#xE9; dans Chrome, Opera, Yandex, le navigateur natif Android et Safari. Il peut &#xEA;tre activ&#xE9; pour Internet Explorer en utilisant le plugin <a href="http://www.google.com/chromeframe?quickenable=true">Google Chrome Frame</a>&#xA0;. Cependant, Firefox ne pr&#xE9;voit pas d&apos;impl&#xE9;menter ce format. En sachant cela, il est donc peu probable de voir (actuellement) le WebP &#xEA;tre massivement utilis&#xE9;.</p>
<p> Une autre id&#xE9;e qui gagne de plus en plus en popularit&#xE9; est l&apos;utilisation d&apos;images en JPEG progressif. Comme son nom le sugg&#xE8;re, l&apos;image est affich&#xE9;e progressivement; le premier rendu est quelque peu flou, puis l&apos;image s&apos;affine et devient plus nette au fur et &#xE0; mesure de son t&#xE9;l&#xE9;chargement. Par comparaison, les fichiers JPEG non progressifs s&apos;affichent de haut en bas. Ann Robson met en avant dans son article <a href="http://calendar.perfplanet.com/2012/progressive-jpegs-a-new-best-practice/">Progressive JPEGs: A New Best Practice</a>&#xA0;le fait que cette compression d&apos;image donne &#xE0; l&apos;utilisateur une plus grande impression de vitesse que les JPEG classiques. Elle permet &#xE0; l&apos;utilisateur d&apos;avoir un premier aper&#xE7;u global de l&apos;image sans avoir &#xE0; attendre qu&apos;elle soit totalement charg&#xE9;e. Cette technique ne r&#xE9;sout en rien les probl&#xE8;mes techniques de performance et poids de chargement des images, mais am&#xE9;liore, d&apos;apr&#xE8;s son auteur, l&apos;exp&#xE9;rience utilisateur.</p>
<p> Une derni&#xE8;re solution (du moins dans cet article) propos&#xE9;e pour tenter d&apos;am&#xE9;liorer l&apos;optimisation des images est de jouer sur leur taux de compression. Pendant longtemps beaucoup pensaient qu&apos;&#xE0; trop augmenter le taux de compression d&apos;une image, on perdait (trop) en qualit&#xE9;. Daan Jobsis a fait des recherches plus approfondies sur le sujet et partage ses trouvailles dans son article <a href="http://blog.netvlies.nl/design-interactie/retina-revolution/">Retina Revolution</a>. Dans cette exp&#xE9;rience, il a test&#xE9; diff&#xE9;rentes tailles d&apos;image et taux de compression pour arriver &#xE0; une solution int&#xE9;ressante : en doublant la taille des images de d&#xE9;part tout en utilisant un taux de compression tr&#xE8;s &#xE9;lev&#xE9;, l&apos;image finale a un poids plus petit que l&apos;originale et restera nette sur les &#xE9;crans &quot;normaux&quot; et haute d&#xE9;finition. Avec cette technique, il a &#xE9;t&#xE9; capable de r&#xE9;duire &#xE0; 75% du poids des images qu&apos;il a test&#xE9;.</p>
<p class="center"> <img alt="La d&#xE9;monstration de la compression de Daan Jobsis" src="http://www.alsacreations.com/xmedia/doc/full/imagecompression.jpg"></p>
<p> Vu le casse-t&#xEA;te que repr&#xE9;sente l&apos;optimisation des images pour un site responsive, devenir ind&#xE9;pendant des pixels absolus est une id&#xE9;e qui s&#xE9;duit de plus en plus les designers et int&#xE9;grateurs. Le <a href="http://www.alsacreations.com/tuto/lire/1421-svg-initiation-syntaxe-outils.html">format SVG</a> propose par exemple une excellente alternative, et permet de cr&#xE9;er des &#xE9;l&#xE9;ments d&apos;interface vectoriels qui vont s&apos;adapter &#xE0; n&apos;importe quelle r&#xE9;solution d&apos;&#xE9;cran. Les &#xE9;l&#xE9;ments cr&#xE9;&#xE9;s en SVG vont &#xEA;tre facilement r&#xE9;duits et agrandis sans perte pour les &#xE9;crans &#xE0; haute r&#xE9;solution. &#xC0; cette tendance s&apos;ajoute celle des <a href="http://www.alsacreations.com/tuto/lire/1547-police-font-icone-vectorielle-webdesign.html">font-icons</a> qui permet de remplacer les glyphes d&apos;une police d&apos;&#xE9;criture par des ic&#xF4;nes, tout en conservant la flexibilit&#xE9; de la police.</p>
<p> Ces solutions n&apos;&#xE9;tant cependant pas envisageables pour des photos, un meilleur format d&apos;image, ou une syntaxe plus flexibles sont donc attendus avec impatience pour le futur.</p>
<h3> D&#xE9;fis de mise en page : r&#xE9;arranger le contenu sans toucher au HTML c&apos;est possible ?</h3>
<p> Pour commencer, arr&#xEA;tons de nous voiler la face plus longtemps : les grilles fluides construites en flottants et &#xE9;l&#xE9;ments en <code>inline-block</code> que l&apos;on utilise aujourd&apos;hui ne sont que des patchs plus ou moins solides, dans l&apos;attente d&apos;une meilleure solution. Jouer avec la mise en page et totalement r&#xE9;arranger les blocs d&apos;une page pour un &#xE9;cran plus petit sans recourir au JavaScript est &#xE0; l&apos;heure actuelle cauchemardesque. Toutes les solutions &#xE0; notre disposition manquent cruellement de flexibilit&#xE9;. Et c&apos;est encore plus vrai quand on commence &#xE0; travailler avec des sites cr&#xE9;&#xE9;s sous un CMS : il est impensable de devoir modifier le HTML pour chaque taille d&apos;&#xE9;cran, alors comment peut-on am&#xE9;liorer tout &#xE7;a ?</p>
<h4> Une mise en page plus flexible gr&#xE2;ce &#xE0; 4 solutions utilisant des propri&#xE9;t&#xE9;s CSS3</h4>
<h5> La solution flexbox</h5>
<p> La premi&#xE8;re solution qui nous vient &#xE0; l&apos;esprit lorsque l&apos;on pense au concept de mise en page est le module <a href="http://www.w3.org/TR/css3-flexbox/">CSS3 flexible box layout model</a> aussi connu sous le nom de <em>flexbox</em>. Pour le moment il a le statut de &quot;Candidate Recommendation&quot; au W3C mais est d&#xE9;j&#xE0; support&#xE9; <a href="http://caniuse.com/#feat=flexbox">par la plupart des navigateurs r&#xE9;cents</a> (y compris &#xE0; partir de IE10). Le support des navigateurs mobiles est d&apos;ailleurs particuli&#xE8;rement bon pour ce module. Ce mod&#xE8;le de bo&#xEE;te permet de r&#xE9;ordonner les &#xE9;l&#xE9;ments &#xE0; l&apos;&#xE9;cran de mani&#xE8;re simple et totalement ind&#xE9;pendante de leur placement dans le code HTML. Il est &#xE9;galement possible de changer l&apos;orientation des bo&#xEE;tes (<em>box orientation</em>), la fa&#xE7;on dont elles se suivent (<em>box flow</em>) et distribuer l&apos;espace restant et les alignements en fonction du contexte sur la page.</p>
<p> L&apos;image ci-dessous pr&#xE9;sente ce qui peut &#xEA;tre accompli pour une mise en page sur mobile &#xE0; partir de la version desktop (navigateur classique de &quot;bureau&quot;). Et la syntaxe pour y parvenir ressemblerait &#xE0; quelque chose comme ceci :</p>
<pre class="code">
<code class="css">.parent { display: flex; flex-flow: column; /* afficher les &#xE9;l&#xE9;ments en colonne */
} .children { order: 1; /* modifie l&apos;ordre des &#xE9;l&#xE9;ments */
}</code></pre>
<p class="center"> <img alt="Illustration de flexbox" src="http://www.alsacreations.com/xmedia/doc/full/flexbox.jpg"></p>
<p> L&apos;article en anglais <a href="http://coding.smashingmagazine.com/2011/09/19/css3-flexible-box-layout-explained/">CSS3 Flexible Box Layout Explained</a> ainsi que l&apos;article <a href="http://www.alsacreations.com/tuto/lire/1493-css3-flexbox-layout-module.html">CSS3 Flexbox Layout module</a> devraient vous aider &#xE0; creuser un peu le sujet. Une autre solution proche de flexbox existe en JavaScript pour r&#xE9;-ordonner les blocs dans une page : <a href="https://github.com/edenspiekermann/minwidth-relocate">Relocate</a>.</p>
<h5> La solution Multi Column Layout</h5>
<p> Une seconde technique CSS3 qui est utilisable aujourd&apos;hui pour une mise en page <em>responsive </em>est le <a href="http://www.w3.org/TR/css3-multicol/">CSS3 Multi Column Layout.</a> Ce module est pass&#xE9; en &quot;Candidate Recommendation&quot; et fonctionne pour la majorit&#xE9; des navigateurs r&#xE9;cents, &#xE0; l&apos;exception de IE9 et versions inf&#xE9;rieures. L&apos;atout principal de ce module est la possibilit&#xE9; d&apos;avoir du contenu qui va automatiquement glisser d&apos;une colonne &#xE0; une autre de mani&#xE8;re tr&#xE8;s flexible en fonction de la taille du parent. Pour une optimisation mobile, il est donc tr&#xE8;s facile de changer la taille de la police en fonction de la taille du viewport.</p>
<p> Il est possible de donner une taille fixe &#xE0; chaque colonne, et laisser au navigateur le soin de calculer le nombre de colonnes qui vont pouvoir rentrer dans l&apos;espace disponible. Il est &#xE9;galement possible de faire l&apos;inverse : fixer un nombre de colonnes pr&#xE9;d&#xE9;fini, avec ou sans espace entre et laisser au navigateur le soin de calculer la largeur optimale pour chacune d&apos;entre elles.</p>
<p class="center"> <img alt="CSS multi colonnes" src="http://www.alsacreations.com/xmedia/doc/full/responsicecolumns.jpg"></p>
<p> Voici &#xE0; quoi ressemble la syntaxe :</p>
<pre class="code">
<code class="css">.container { column-width: 10em ; /* le navigateur cr&#xE9;e des colonnes de 10em, le nombre d&#xE9;pend de l&apos;espace disponible */
}
.container { columns: 5; /* Le navigateur cr&#xE9;e 5 colonnes dont la taille d&#xE9;pend de l&apos;espace disponible */ column-gap: 2em;
}</code></pre>
<p> Pour en savoir plus sur ce module je vous conseille l&apos;excellent article de David Walsh : <a href="http://davidwalsh.name/css-columns">CSS Columns</a> et retrouvez &#xE9;galement un article en fran&#xE7;ais sur Alsacreations :&#xA0;<a href="http://www.alsacreations.com/tuto/lire/1557-les-multicolonnes-en-css3.html">Les multicolonnes en CSS3</a>.</p>
<h5> La solution Grid Layout</h5>
<p> Une troisi&#xE8;me propri&#xE9;t&#xE9; qui m&#xE9;riterait plus d&apos;attention dans le futur est le module <a href="http://dev.w3.org/csswg/css3-grid-layout/">CSS3 grid layout</a> qui propose aux designers et d&#xE9;veloppeurs un syst&#xE8;me de grilles flexibles avec lesquelles ils peuvent travailler pour construire diff&#xE9;rentes mises en page. Les &#xE9;l&#xE9;ments peuvent &#xEA;tre affich&#xE9;s en colonnes et en lignes sans avoir besoin de d&#xE9;finir une structure au pr&#xE9;alable. La premi&#xE8;re chose &#xE0; faire est de d&#xE9;clarer une grille sur le parent, puis de placer les &#xE9;l&#xE9;ments enfants sur cette grille &quot;virtuelle&quot;. Il est ensuite tr&#xE8;s facile de changer la grille pour des &#xE9;crans plus petits, ou de changer la position de ces &#xE9;l&#xE9;ments sur la grille. Combin&#xE9; &#xE0; des Media Queries, ceci permettrait une gigantesque flexibilit&#xE9; pour l&apos;optimisation mobile mais &#xE9;galement les changements d&apos;orientation.</p>
<p> La syntaxe du Working Draft est la suivante (&#xE0; la date du 2 avril 2013) :</p>
<pre class="code">
<code class="css">.parent { display: grid; /* d&#xE9;clarer la grille */ grid-definition-columns: 1stgridsize 2ndgridsize &#x2026;; grid-definition-rows: 1strowsize 2ndrowsize &#x2026;;
}
.element { grid-column: 1; grid-row: 1
} .element2 { grid-column: 1; grid-row: 3;
}</code></pre>
<p> <a href="http://www.w3.org/TR/css3-grid-layout/#grid-definition-columns">Comme pr&#xE9;cis&#xE9; dans les sp&#xE9;cifications</a>, plusieurs unit&#xE9;s sont utilisables pour exprimer la taille des lignes et colonnes de cette grille virtuelle. Pour placer les &#xE9;l&#xE9;ments sur la grille on va sp&#xE9;cifier le num&#xE9;ro de colonne (<code>grid-column</code>) dans lequel on veut le placer, puis le num&#xE9;ro de la ligne (<code>grid-row</code>). Si l&apos;&#xE9;l&#xE9;ment s&apos;&#xE9;tend sur plusieurs lignes, il est possible d&apos;utiliser la valeur <code>span</code> pour pr&#xE9;ciser le nombre de lignes &#xE0; &#xE9;tendre.</p>
<p> Ce syst&#xE8;me &#xE0; l&apos;air prometteur, mais il n&apos;est h&#xE9;las <a href="http://caniuse.com/#feat=css-grid">support&#xE9; pour le moment que sur IE10</a>. Si vous souhaitez n&#xE9;anmoins en savoir plus sur cette mise en page, vous pouvez lire l&apos;article de Rachel Andrew intitul&#xE9; <a href="http://24ways.org/2012/css3-grid-layout/">Giving Content Priority With CSS3 Grid Layout</a>. Notez &#xE9;galement que les sp&#xE9;cifications pour cette syntaxe ont chang&#xE9; le 2 avril 2013 et que Rachel a r&#xE9;dig&#xE9; une mise &#xE0; jour se son article intitul&#xE9;e <a href="http://www.rachelandrew.co.uk/archives/2013/04/10/css-grid-layout---what-has-changed/">CSS Grid Layout: What Has Changed?</a>&#xA0;Retrouvez &#xE9;galement en fran&#xE7;ais un article de Rapha&#xEB;l Goetter : <a href="http://www.alsacreations.com/article/lire/1388-css3-grid-layout.html">CSS3 Grid layout</a>.</p>
<h5> La solution Template layout</h5>
<p> La derni&#xE8;re technique de mise en page qui pourrait devenir int&#xE9;ressante dans le futur si un navigateur se d&#xE9;cidait &#xE0; l&apos;impl&#xE9;menter est le module <a href="http://www.w3.org/TR/2009/WD-css3-layout-20090402/">CSS3 template layout</a>. Il permet d&apos;associer un &#xE9;l&#xE9;ment avec une zone de mise en page que l&apos;on aura au pr&#xE9;alable pris la peine de nommer, puis d&apos;organiser visuellement ces &#xE9;l&#xE9;ments sur une grille invisible, encore une fois. Cette grille peut &#xEA;tre soit fixe, soit flexible en fonction de la taille du viewport.</p>
<p> Voici ce &#xE0; quoi ressemble la syntaxe pour le moment :</p>
<pre class="code">
<code class="css">.parent { display: &quot;ab&quot; &quot;cd&quot; /* cr&#xE9;er la grille invisible */
}
.child1 { position: a;
}
.child2 { position: b;
}
.child3 { position: c;
}
.child4 { position: d;
}</code></pre>
<p> Ce qui visuellement donnerait ceci :&#xA0;</p>
<p class="center"> <img alt="CSS grid layout en action" src="http://www.alsacreations.com/xmedia/doc/full/templatelayout.jpg"></p>
<p> H&#xE9;las, comme vous l&apos;aurez devin&#xE9; &#xE0; mon introduction, le support de cette propri&#xE9;t&#xE9; est pour le moment inexistante. Si des designers, d&#xE9;veloppeurs et int&#xE9;grateurs montrent de l&apos;int&#xE9;r&#xEA;t pour cette syntaxe, peut-&#xEA;tre sera-elle un jour impl&#xE9;ment&#xE9;e (avec des pr&#xE9;fixes navigateurs ?), mais en attendant vous pouvez toujours, si elle vous int&#xE9;resse, la tester avec un <a href="http://code.google.com/p/css-template-layout/">polyfill</a>.</p>
<h4> De nouvelles unit&#xE9;s relatives au viewport et la fin de la mise en page bas&#xE9;e sur des pixels ?</h4>
<p> Les unit&#xE9;s comme <code>vw</code>, <code>vh</code>, <code>vm</code>, <code>vmin</code> et <code>vmax</code> sont propos&#xE9;es dans la partie &quot;<a href="http://www.w3.org/TR/css3-values/#viewport-relative-lengths">Viewport-based percentage lengths</a>&quot; des sp&#xE9;cifications et sont des unit&#xE9;s de mesure relatives &#xE0; la dimension du viewport.</p>
<p> Un <code>vw</code> est par exemple &#xE9;gal &#xE0; 1% de la largeur du conteneur initial. Si la largeur du viewport est de 320px, <code>1vw</code> est &#xE9;gal &#xE0; 1x320/100 soit 3,2pixels.</p>
<p> L&apos;unit&#xE9; <code>vh</code> fonctionne de la m&#xEA;me mani&#xE8;re mais est relative &#xE0; la hauteur du viewport. <code>50vh</code> sont donc &#xE9;quivalents &#xE0; 50% de la hauteur du document. Vous vous demandez sans doute maintenant ce qu&apos;est la diff&#xE9;rence avec le fait d&apos;utiliser directement une hauteur en pourcentage. Les unit&#xE9;s en pourcentage sont relatives &#xE0; la taille de leur parents, alors que <code>vh</code> et <code>vw</code> seront toujours relatives &#xE0; la taille du viewport, quelle que soit la taille de leurs &#xE9;l&#xE9;ments HTML parents.</p>
<p> Cela devient particuli&#xE8;rement int&#xE9;ressant si vous souhaitez par exemple cr&#xE9;er une bo&#xEE;te et &#xEA;tre s&#xFB;r qu&apos;elle ne pourra jamais passer sous la hauteur du viewport (la ligne de flottaison), pour faire en sorte que l&apos;utilisateur n&apos;ait jamais besoin de faire d&#xE9;filer le contenu pour la voir. Cela permettrait &#xE9;galement en th&#xE9;orie de cr&#xE9;er des mises en page avec des &#xE9;l&#xE9;ments qui feraient 100% de la taille du navigateur mobile (donc viewport) sans avoir besoin de passer par des <em>hacks </em>de 100% sur tous leurs parents.</p>
<p> L&apos;unit&#xE9; <code>vmin</code> est quant &#xE0; elle &#xE9;gale &#xE0; la plus petite d&apos;entre&#xA0;<code>vm</code> ou <code>vh</code>, alors que <code>vmax</code> est &#xE9;gale &#xE0; la plus grande. Ces unit&#xE9;s sont donc flexibles aux changement d&apos;orientation de l&apos;appareil.</p>
<p> H&#xE9;las pour le moment ces unit&#xE9; ne sont <strong>pas</strong> support&#xE9;es pour les mobiles sur les <a href="http://caniuse.com/#feat=viewport-units">navigateurs Android natifs.</a> Il va donc peut-&#xEA;tre falloir attendre un peu avant de pouvoir les utiliser correctement.</p>
<p> Retrouvez <a href="http://www.creativejuiz.fr/blog/veille-technologique/taille-police-en-fonction-largeur-ecran-viewport">quelques tests de ces unit&#xE9;s</a> (sur des &#xE9;l&#xE9;ments textuels et un bloc flexible) en fran&#xE7;ais sur Creative Juiz.</p>
<h4> &#xC0; propos d&apos;une typographie qui s&apos;adapte</h4>
<p> Au final, la mise en page d&apos;un site reste tr&#xE8;s d&#xE9;pendante du contenu que l&apos;on va y mettre. Je ne pouvais donc pas conclure une section d&#xE9;di&#xE9;e aux possibilit&#xE9;s de mise en page sans vous parler de typographie. CSS3 propose une nouvelle unit&#xE9; particuli&#xE8;rement utile pour la gestion de la typographie : <a href="http://www.w3.org/TR/css3-values/#font-relative-lengths">l&apos;unit&#xE9; rem</a>. L&#xE0; o&#xF9; la taille d&apos;une police exprim&#xE9;e en <code>em</code> est relative &#xE0; la taille de la police de ses anc&#xEA;tres, la taille d&apos;une police exprim&#xE9;e en <code>rem</code> est, et sera toujours relative &#xE0; la taille de la police de l&apos;&#xE9;l&#xE9;ment racine (&#xE0; savoir <code>&lt;html&gt;</code>). Pour un site responsive, il est donc possible d&apos;&#xE9;crire le code suivant, puis d&apos;adapter la taille de toutes les polices du site d&apos;un coup en changeant la taille de police de l&apos;&#xE9;l&#xE9;ment html :</p>
<pre class="code">
<code class="css">html { font-size: 14px;
}
p { font-size: 1rem /* 14px */
} @media screen and (max-width:380px) { html { font-size: 12px; /* rendre les polices plus petites pour mobile */ } p { font-size: 1rem /* cet &#xE9;l&#xE9;ment est d&#xE9;sormais &#xE9;quivalent &#xE0; 12px */ } }</code></pre>
<p> En dehors d&apos;IE8 et Opera mini, le&#xA0;<a href="http://caniuse.com/#search=rem">support pour rem</a> est plut&#xF4;t bon. Si en savoir plus sur les unit&#xE9;s rem vous int&#xE9;resse, l&apos;article de Matthew Lettini <a href="http://techtime.getharvest.com/blog/in-defense-of-rem-units">In Defense of Rem Units</a> est une excellente ressource.&#xA0;Retrouvez &#xE9;galement une ressource sur le sujet en fran&#xE7;ais chez Pompage.net : <a href="http://www.pompage.net/traduction/dimensionner-ses-fontes-avec-rem">dimensionner ses fontes avec rem</a>.</p>
<h3> Trouver un meilleur moyen de g&#xE9;rer d&apos;autres types de contenus complexes</h3>
<p> Nous commen&#xE7;ons tout doucement &#xE0; trouver de meilleures solutions pour g&#xE9;rer les images et les mises en page responsive, mais il faut encore trouver d&apos;autres solutions pour les contenus plus complexes.</p>
<h4> G&#xE9;rer les formulaires sur un site responsive</h4>
<p> De mani&#xE8;re g&#xE9;n&#xE9;rale la gestion de formulaire, et tout particuli&#xE8;rement de longs formulaires, est un d&#xE9;fi en &quot;mobilit&#xE9;&quot; (entendez par l&#xE0; &quot;dans l&apos;univers du mobile&quot;). Plus long sera le formulaire, plus il sera compliqu&#xE9; &#xE0; adapter pour des petits appareils. L&apos;adaptation physique visuelle n&apos;est pas bien compliqu&#xE9;e ; la plupart des designers vont simplement placer les &#xE9;l&#xE9;ments les uns sous les autres en une seule colonne et &#xE9;largir les champs pour qu&apos;ils prennent toute la taille de l&apos;&#xE9;cran. Mais rendre ces formulaires visuellement attractifs n&apos;est pas suffisant : il nous faut &#xE9;galement les rendre facile d&apos;utilisation sur mobile.</p>
<p> <a href="http://uxdesign.smashingmagazine.com/2010/03/11/forms-on-mobile-devices-modern-solutions/">Luke Wroblewski</a> conseille d&apos;&#xE9;viter les champs texte quand c&apos;est possible, et de proposer des cases &#xE0; cocher, boutons radios et menus d&#xE9;roulants de s&#xE9;lection de sorte que l&apos;utilisateur ait &#xE0; entrer le moins d&apos;informations possible au clavier. Un autre conseil important est de proposer &#xE0; l&apos;utilisateur les retours quant &#xE0; la validit&#xE9; des champs avant qu&apos;il appuie sur le bouton &quot;envoyer&quot;. V&#xE9;rifier les erreurs au fur et &#xE0; mesure de la saisie est important sur mobile, car la plupart des formulaires d&#xE9;passent la hauteur de l&apos;&#xE9;cran. Si l&apos;utilisateur a mal rempli un champ et doit attendre l&apos;envoi pour le savoir, il y a de fortes chances qu&apos;il ait du mal &#xE0; retrouver o&#xF9; se trouve le(s) champ(s) mal rempli(s).</p>
<p> Les nouveaux types de champs et attributs HTML5 vont &#xEA;tre d&apos;une grande aide dans le futur pour construire des formulaires faciles d&apos;utilisation, sans besoins d&apos;avoir recours &#xE0; (trop) de JavaScript. Il est par exemple possible d&apos;utiliser l&apos;attribut HTML <a href="http://www.alsacreations.com/tuto/lire/1391-formulaire-html5-placeholder-required-pattern.html">required</a> pour proposer un retour &#xE0; l&apos;utilisateur sur un champs qu&apos;il doit obligatoirement remplir. H&#xE9;las <a href="http://caniuse.com/#search=required">le support mobile</a> de cet attribut est pour le moment tr&#xE8;s limit&#xE9;.</p>
<p> L&apos;attribut <a href="http://www.w3.org/TR/2011/WD-html5-20110525/common-input-element-attributes.html#the-autocomplete-attribute">autocomplete</a>&#xA0;peut &#xE9;galement &#xEA;tre utilis&#xE9; pour am&#xE9;liorer l&apos;exp&#xE9;rience utilisateur lors de la saisie des champs.&#xA0;Dans la mesure o&#xF9; un appareil mobile (de type smartphone) est un objet personnel, on peut imaginer que des donn&#xE9;es comme le nom, ou encore l&apos;adresse postale ne changeront pas souvent pour son propri&#xE9;taire. En utilisant l&apos;attribut <code>autocomplete</code>, il serait donc possible d&apos;am&#xE9;liorer la saisie de ces champs pour que l&apos;utilisateur n&apos;ait pas besoin de taper encore une fois en entier ce genre de donn&#xE9;es.</p>
<p> Il existe &#xE9;galement une liste enti&#xE8;re de <a href="http://www.w3.org/wiki/HTML5_form_additions#New_form_controls">nouveaux types d&apos;inputs HTML5</a> qui pourront &#xEA;tre utilis&#xE9;s dans un futur plus ou moins proche pour aider &#xE0; l&apos;optimisation des formulaires.</p>
<p> Le cas des dates est un bon exemple de ce qui peut &#xEA;tre am&#xE9;lior&#xE9; &#xE0; l&apos;aide de HTML5. Nous avons longtemps mis en place des <em>datepickers</em> (calendriers) en JavaScript, facilement utilisables sur navigateur de bureau, mais tr&#xE8;s difficiles &#xE0; manier pour un appareil tactile. Appuyer sur la bonne date avec un doigt peut s&apos;av&#xE9;rer assez difficile voire impossible si les zones sont tr&#xE8;s petites.</p>
<p class="center"> <img alt="Date-picker ou selecteur de date" src="http://www.alsacreations.com/xmedia/doc/full/datepicker-jquery.jpg"></p>
<p class="center"> <em>Comment suis-je suppos&#xE9;e arriver &#xE0; ne toucher qu&apos;une date quand la zone est si petite ? </em></p>
<p> Les nouveaux types de champs HTML5&#xA0;<a href="http://www.alsacreations.com/tuto/lire/1407-formulaire-html5-type-date-time-local.html">input type=&quot;date&quot;, input type=&quot;datetime&quot;, etc</a>&#xA0;qui permettent de cr&#xE9;er une cha&#xEE;ne de caract&#xE8;re au format de date/heure offrent des possibilit&#xE9;s prometteuses ici.&#xA0;Le gros avantage de ces nouveaux types de champs est que leur rendu visuel est contr&#xF4;l&#xE9; par le navigateur et le syst&#xE8;me. De cette mani&#xE8;re, leur UI (apparence graphique pour l&apos;utilisateur) est automatiquement optimis&#xE9;e au mieux pour le p&#xE9;riph&#xE9;rique utilis&#xE9;.</p>
<p class="center"> <img alt="Rendu de l&apos;input date" src="http://www.alsacreations.com/xmedia/doc/full/mobile-input-type-date.jpg"></p>
<p class="center"> <em>Rendu de input type=&quot;date&quot; dans diff&#xE9;rents navigateurs</em></p>
<p> Notons &#xE9;galement que l&apos;UI s&apos;adapte &#xE9;galement &#xE0; la langue du navigateur. Utiliser des composants natifs permet donc &#xE9;galement une adaptation linguistique automatique de certains contenus.</p>
<p> Pour le moment le support de <a href="http://caniuse.com/input-datetime">input type=&quot;date&quot;</a> est presque absent pour les navigateurs de bureau, &#xE0; part Opera et Chrome. Les navigateurs natifs Android ne le supportent pas non plus, par contre Chrome pour Android et Safari sur iOS le font. Il va donc falloir encore attendre un peu avant de pouvoir utiliser totalement le potentiel de ces nouveaux champs pour une solution mobile. Si vous &#xEA;tes impatients, vous pouvez cependant utiliser un polyfill comme <a href="http://demo.mobiscroll.com/calendar/calendartime">Mobiscroll</a> qui va imiter le comportement natif de ces champs en JavaScript.</p>
<p> Au-del&#xE0; des solutions natives de champs HTML5 d&apos;autres exp&#xE9;riences ont &#xE9;t&#xE9; men&#xE9;es pour proposer des patterns de designs plus adapt&#xE9;es comme &quot;<a href="http://www.lukew.com/ff/entry.asp?1653">Mobile Design Details: Hide/Show Passwords</a>&quot; ou encore &quot;<a href="http://www.lukew.com/ff/entry.asp?756">Input Masks Design</a>&quot;. Notons ne qu&apos;il s&apos;agit encore une fois que de solutions exp&#xE9;rimentales et que l&#xE0; encore, la solution parfaite pour g&#xE9;rer les formulaires en responsive webdesign n&apos;existe pas pour le moment. Il reste encore beaucoup de chemin &#xE0; parcourir de ce c&#xF4;t&#xE9;.</p>
<p> Consultez &#xE9;galement l&apos;article <a href="http://www.alsacreations.com/tuto/lire/1372-formulaires-html5-nouveaux-types-champs-input.html">les &#xE9;l&#xE9;ments de formulaire HTML5</a> sur Alsacr&#xE9;ations pour aller plus loin.</p>
<h4> La gestion des tableaux sur un site responsive.</h4>
<p> Les tableaux sont un autre type de contenu qui reste difficilement g&#xE9;rable. La plupart des tableaux ont une orientation verticale pour pr&#xE9;senter le plus de donn&#xE9;es possibles, il est donc difficile de faire rentrer toutes ces donn&#xE9;es sur un petit &#xE9;cran. Les tableaux HTML sont plut&#xF4;t flexibles, il est possible d&apos;utiliser des pourcentages pour la largeur des colonnes. Cependant le contenu en devient tr&#xE8;s vite illisible.</p>
<p> Personne n&apos;a pour le moment trouv&#xE9; la solution id&#xE9;ale pour g&#xE9;rer les tableaux sur un site <em>responsive</em>, mais quelques suggestions int&#xE9;ressantes ont &#xE9;t&#xE9; faites.</p>
<p> Une premi&#xE8;re approche consisterait &#xE0; cacher ce qui pourrait &#xEA;tre consid&#xE9;r&#xE9; comme des colonnes &quot;moins importantes&quot;, et proposer un syst&#xE8;me de checkboxes &#xE0; l&apos;utilisateur pour qu&apos;il puisse choisir lesquelles il souhaite afficher. Toutes les colonnes seraient affich&#xE9;es sur un navigateur de bureau, alors que sur mobile, leur nombre d&#xE9;prendrait de la taille disponible &#xE0; l&apos;&#xE9;cran. Le Filament Group <a href="http://filamentgroup.com/lab/responsive_design_approach_for_complex_multicolumn_data_tables/">explique et propose une d&#xE9;monstration de cette approche dans un de leurs articles</a>. C&apos;est &#xE9;galement cette solution qui est propos&#xE9; dans le module <a href="http://jquerymobile.com/branches/tables/docs/tables/table-column-toggle.html">table column toggle de jQuery Mobile</a>.</p>
<p class="center"> <img alt="Quelques exemples de tableaux responsive." src="http://www.alsacreations.com/xmedia/doc/full/responsivedatable01.jpg"></p>
<p> Une seconde approche est bas&#xE9;e sur l&apos;id&#xE9;e de tableaux qui d&#xE9;filent. Elle consiste &#xE0; fixer une seule colonne &#xE0; gauche, et laisser une barre de d&#xE9;filement sur une petite partie du tableau &#xE0; droite pour que l&apos;utilisateur puisse afficher le reste des donn&#xE9;es. <a href="http://dbushell.com/2012/01/05/responsive-tables-2/">David Bushell impl&#xE9;mente cette id&#xE9;e </a>&#xA0;dans un article en utilisant du CSS pour afficher tout le contenu du <code>&lt;thead&gt;</code> sur la partie gauche du tableau, laisse l&apos;utilisateur faire d&#xE9;filer le reste sur la partie de droite. <a href="http://zurb.com/playground/responsive-tables">Zurb utilise la m&#xEA;me id&#xE9;e dans leur plugin </a>&#xA0;mais au lieu de coller le header &#xE0; gauche, c&apos;est la premi&#xE8;re colonne qui est dupliqu&#xE9;e en JavaScript et le reste du tableau passe en dessous de sorte que l&apos;utilisateur voit &#xE0; gauche une colonne fixe, et &#xE0; droite le reste des colonnes qu&apos;il peut encore une fois faire d&#xE9;filer.</p>
<p class="center"> <img alt="Deux exemples de tableaux que l&apos;on peut faire d&#xE9;filer" src="http://www.alsacreations.com/xmedia/doc/full/responsivetable02.jpg"></p>
<p class="center"> <em>Deux exemples de tableaux que l&apos;on peut faire d&#xE9;filer</em></p>
<p> Le gros probl&#xE8;me avec la propri&#xE9;t&#xE9; CSS <code>overflow:auto</code> est que la barre de d&#xE9;filement cr&#xE9;&#xE9;e n&apos;est pas visible sur certains appareils mobiles et tablettes. L&apos;utilisateur peut toujours faire d&#xE9;filer la partie de droite, mais il n&apos;a aucune indication visuelle qu&apos;il peut s&apos;y cacher plus de contenu que ce qu&apos;il voit. Il faut donc, si on utilise ces techniques, trouver un moyen d&apos;indiquer visuellement &#xE0; l&apos;utilisateur qu&apos;il peut faire d&#xE9;filer le contenu &#xE0; droite.</p>
<p> Une troisi&#xE8;me approche est de r&#xE9;-agencer les tableaux et de d&#xE9;couper les colonnes en ce qui ressemble &#xE0; des listes avec des titres. Cette technique est utilis&#xE9;e pour le <a href="http://view.jquerymobile.com/1.3.2/dist/demos/widgets/table-reflow/">&#x201C;reflow mode&#x201D;</a> de jQuery mobile et est expliqu&#xE9;e par Chris Coyier dans son article &#x201C;<a href="http://css-tricks.com/responsive-data-tables/">Responsive Data Tables</a>.&#x201D;</p>
<p class="center"> <img alt="Des tableaux r&#xE9;-agenc&#xE9;s" src="http://www.alsacreations.com/xmedia/doc/full/responsivetable03.jpg"></p>
<p> Il existe encore <a href="http://css-tricks.com/responsive-data-table-roundup/">plusieurs autres techniques</a> et l&apos;utilisation de l&apos;une ou de l&apos;autre d&#xE9;pendra de votre projet. Aucun projet n&apos;est identique, donc je peux seulement vous montrer ici ce que d&apos;autres personnes ont cr&#xE9;&#xE9; pour contourner le probl&#xE8;me des tableaux. Si vous avez vous aussi une solution &#xE0; proposer, partagez-la avec tout le monde, dans les commentaires, sur Twitter, Github ou n&apos;importe o&#xF9;. Nous sommes dans cette gal&#xE8;re ensemble, les tableaux en mobilit&#xE9; sont une plaie, &#xE0; nous de les am&#xE9;liorer !</p>
<h4> Encapsuler des contenus tiers : le probl&#xE8;me des iframes</h4>
<p> Le contenu de beaucoup de sites d&#xE9;pend aujourd&apos;hui d&apos;applications et services tiers : Youtube ou Vimeo pour les vid&#xE9;os, des pr&#xE9;sentations Slideshare, des widgets Facebook, des flux Twitter, des cartes Google maps, etc. Beaucoup de ces services tiers utilisent aujourd&apos;hui des iframes pour proposer leur contenu sur d&apos;autres sites. Mais ne nous voilons pas la face : les iframes sont encore une fois une plaie &#xE0; utiliser dans un contexte de mobilit&#xE9;. Les largeurs et hauteurs sont fix&#xE9;es en direct dans le code HTML. Forcer une largeur de 100% sur <code>&lt;iframe&gt;</code> pourrait marcher, mais cela voudrait dire perdre le ratio du contenu embarqu&#xE9;. Les vid&#xE9;os sont souvent en 16:9 par exemple, pour garder ce ratio il va falloir trouver des solutions alternatives.</p>
<h5> Du bricolage HTML et CSS</h5>
<p> <a href="http://www.tjkdesign.com/">Thierry Koblentz</a>&#xA0;a &#xE9;crit un tr&#xE8;s bon article intitul&#xE9; &#x201C;<a href="http://alistapart.com/article/creating-intrinsic-ratios-for-video">Creating Intrinsic Ratios for Video</a>&#x201D; dans lequel il propose une m&#xE9;thode pour avoir des vid&#xE9;os dans des iframes tout en pr&#xE9;servant le ratio 16:9 de d&#xE9;part. Cette solution peut &#xEA;tre &#xE9;tendue &#xE0; toutes sortes d&apos;iframe : vid&#xE9;os, pr&#xE9;sentations SlideShare et m&#xEA;me cartes GoogleMaps.</p>
<p> Koblentz entoure son iframe d&apos;un conteneur auquel il va donner une classe pour lui appliquer ensuite du CSS. Ce conteneur permet d&apos;avoir un <em>iframe fluid</em>, m&#xEA;me si les valeurs de largeur et hauteur sont donn&#xE9;es en pixels et en dur dans le HTML. Voici &#xE0; quoi ressemble <a href="http://amobil.se/2011/11/responsive-embeds/">ce code adapt&#xE9; par Anders M. Andrers</a> :</p>
<pre class="code">
<code class="css">.embed-container { position: relative; padding-bottom: 56.25%; /* 16:9 ratio */ padding-top: 30px; /* IE 6 workaround*/ height: 0; overflow: hidden;
} .embed-container iframe,
.embed-container object,
.embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%;
}</code></pre>
<p> Ce code va fonctionner pour tous les iframes, &#xE0; partir du moment o&#xF9; vous les aurez entour&#xE9;es de <code>&lt;div class=&quot;embed-container&quot;&gt;iframe&lt;/div&gt;</code>.</p>
<p> M&#xEA;me si cette solution peut-&#xEA;tre facilement mise en place sur un site sur lequel on a un contr&#xF4;le total, il est difficilement envisageable de demande &#xE0; un client sans comp&#xE9;tences techniques d&apos;ajouter ce HTML &#xE0; chaque fois qu&apos;il va r&#xE9;cup&#xE9;rer une vid&#xE9;o sur Youtube. Il serait bien s&#xFB;r possible d&apos;utiliser du JavaScript pour d&#xE9;tecter tous les iframes de la page et les encapsuler automatiquement dans notre code. Mais il s&apos;agit h&#xE9;las encore une fois de bricolage et non pas d&apos;une solution p&#xE9;renne.</p>
<h4> La gestion des vid&#xE9;os responsive dans le futur</h4>
<p> HTML5 propose de nouvelles possibilit&#xE9;s pour les vid&#xE9;os avec l&apos;&#xE9;l&#xE9;ment <a href="http://www.w3.org/wiki/HTML/Elements/video">video</a>. La bonne nouvelle : <a href="http://caniuse.com/#feat=video">son support est &#xE9;tonnamment bon pour les mobiles</a>. En dehors d&apos;Opera Mini, la majorit&#xE9; des navigateurs supportent la balise <code>&lt;video&gt;</code>. L&apos;autre bonne nouvelle : cette balise est tr&#xE8;s flexible en CSS. Pour pr&#xE9;senter une vid&#xE9;o responsive, il suffirait d&apos;&#xE9;crire :</p>
<pre class="code">
<code class="css">video { max-width: 100%; height: auto;
}</code></pre>
<p> Et l&#xE0; vous vous demandez : o&#xF9; est le probl&#xE8;me alors ?</p>
<p> Le probl&#xE8;me vient tout simplement des plateformes qui vont proposer les contenus. M&#xEA;me si Youtube ou encore Vimeo supportent la balise video, ils produisent toujours cet horrible &lt;iframe&gt; lorsque l&apos;on veut afficher la vid&#xE9;o sur son site. Nous sommes donc condamn&#xE9;s &#xE0; trouver des bidouilles et des bricolages comme ceux &#xE9;voqu&#xE9;s plus hauts tant que Youtube, Vimeo ou Dailymotion ne se d&#xE9;cident pas &#xE0; proposer un moyen plus propre d&apos;afficher leurs vid&#xE9;os sans utiliser d&apos;iframe. En attendant ce jour, Chris Coyier propose un plugin jQuery appel&#xE9; <a href="http://fitvidsjs.com/">FitVids.js</a> qui utilise la technique propos&#xE9;e plus haut et se charge de faire l&apos;encapsulage de l&apos;iframe dans un conteneur pour am&#xE9;liorer sa fluidit&#xE9; tout en pr&#xE9;servant le ratio de la vid&#xE9;o.</p>
<h4> Afficher les cartes Google Maps (ou &#xE9;quivalent)</h4>
<p> Si vous d&#xE9;cidez &#xE0; afficher pour votre site une carte Google Maps, la technique d&#xE9;crite plus haut avec le conteneur va fonctionner. Mais encore une fois, c&apos;est une bidouille pas propre du tout. En plus dans le cas des cartes, elles vont se redimensionner en gardant leurs proportions ce qui veut dire que sur un petit &#xE9;cran, vous risquez de vous retrouver avec une carte toute petite qui aura perdu le focus sur l&apos;endroit que vous vouliez montrer &#xE0; l&apos;utilisateur. La documentation officielle de <a href="https://developers.google.com/maps/mobile-apps">Google Maps pour mobile</a> stipule qu&apos;il vaut mieux utiliser <a href="https://developers.google.com/maps/documentation/staticmaps/">l&apos;API de cartes statiques&#xA0;</a>pour un affichage sur mobile. Et en effet, utiliser une carte statique (via une balise <code>&lt;img&gt;</code>) fera disparaitre notre souci d&apos;iframe. Brad Frost a &#xE9;crit un excellent article sur le sujet intitul&#xE9; <a href="http://bradfrostweb.com/blog/post/adaptive-maps/">adaptive maps</a> dans lequel il propose une d&#xE9;monstration qui illustre cette technique. Un JavaScript d&#xE9;tecte la taille de l&apos;&#xE9;cran et en fonction va remplacer l&apos;iframe par une carte statique sur les petits &#xE9;crans. Et encore une fois en l&apos;absence de meilleure solution native (propos&#xE9;e par Google par exemple), nous avons recours &#xE0; une bidouille pour pouvoir nous d&#xE9;barrasser de notre probl&#xE8;me d&apos;iframe.</p>
<h4> Il nous FAUT de meilleures APIS !</h4>
<p> J&apos;ai jusque l&#xE0; parl&#xE9; de bidouille, de bricolage : existe-t-il une meilleurs solution ? Le plus gros souci des iframes est notre manque de contr&#xF4;le en tant que designers et int&#xE9;grateurs sur le code et design qu&apos;elles vont g&#xE9;n&#xE9;rer. Nous sommes totalement d&#xE9;pendants de ces services tiers et par extension, du HTML et CSS qu&apos;ils veulent bien nous fournir. Dans la mesure o&#xF9; le nombre de services et sites qui proposent ce genre de contenus tierces est en constante augmentation, il va rapidement nous falloir de meilleures solutions que les iframes pour afficher leur contenus sur nos sites.</p>
<p> Soyons r&#xE9;alistes deux secondes : utiliser le widget Facebook pour afficher les <em>likes</em> sur son site est une plaie. Le peu de contr&#xF4;le sur le CSS g&#xE9;n&#xE9;r&#xE9; par Facebook rend notre travail hasardeux et peut aller jusqu&apos;&#xE0; ruiner un joli design. Le web est un endroit libre et ouvert, il est donc peut-&#xEA;tre enfin temps de commencer &#xE0; penser en terme d&apos;APIs! Dans le futur, nous aurons &#xE0; la fois besoin de plus d&apos;APIs (Application Programming Interface) pour r&#xE9;cup&#xE9;rer ces contenus, mais enfin et surtout, besoin d&apos;APIs plus flexibles et surtout d&apos;APIs plus simples d&apos;utilisation pour r&#xE9;cup&#xE9;rer ces contenus sans les iframes. Mais jusqu&apos;&#xE0; ce que ces grands services se d&#xE9;cident &#xE0; nous cr&#xE9;er ces APIs, nous sommes coinc&#xE9;s avec des iframes hasardeux et condamn&#xE9;s au bricolage et &#xE0; la bidouille.</p>
<h3> La navigation responsive: tour d&apos;horizon des techniques actuelles</h3>
<p> Un autre gros d&#xE9;fi quand on parle de responsive et d&apos;optimisation est la navigation du site. Point souvent critique pour l&apos;utilisateur, plus elle est complexe et dense, plus il va falloir ruser d&apos;inventivit&#xE9; pour proposer une exp&#xE9;rience agr&#xE9;able et simple d&apos;utilisation.</p>
<p> Lorsque le Responsive Web Design n&apos;en &#xE9;tait qu&apos;&#xE0; ses d&#xE9;buts, une premi&#xE8;re solution &#xE9;tait de <a href="http://css-tricks.com/convert-menu-to-dropdown/">transformer la navigation en listes d&#xE9;roulantes</a>. Cette solution est h&#xE9;las loin d&apos;&#xEA;tre id&#xE9;ale. Elle devient tr&#xE8;s compliqu&#xE9;e d&#xE8;s que l&apos;on a plusieurs niveaux de navigation, et peut poser des soucis d&apos;accessibilit&#xE9;. Je vous conseille de lire l&apos;excellent article <a href="http://uxmovement.com/forms/stop-misusing-select-menus/">Stop Misusing Select Menus</a> pour en apprendre un peu plus sur cette technique et les probl&#xE8;mes li&#xE9;s.</p>
<p> Quelques personnes comme&#xA0;<a href="http://bradfrostweb.com/blog/web/responsive-nav-patterns/">Brad Frost</a>&#xA0;ou encore Luke Wroblewski ont alors essay&#xE9; de proposer diff&#xE9;rentes solutions &#xE0; ce casse t&#xEA;te. Brad Frost compile quelques techniques de navigation responsive sur son site <a href="http://bradfrost.github.com/this-is-responsive/patterns.html#navigation">This Is Responsive</a>.</p>
<p> La navigation qu&apos;il appelle &quot;Toggle&quot; consiste &#xE0; cacher la navigation pour les petits appareils sous un lien &quot;menu&quot;. Quand l&apos;utilisateur clique sur ce lien, le reste de la navigation apparait sous forme de blocs juste en-dessous, poussant le contenu plus bas dans la page.</p>
<p> Une variante de cette technique a &#xE9;t&#xE9; inspir&#xE9;e par les navigations d&apos;applications natives comme celle de Facebook et est appel&#xE9;e <a href="http://coding.smashingmagazine.com/2013/01/15/off-canvas-navigation-for-responsive-website/">off-canvas</a>. Encore une fois on cache la navigation sous une ic&#xF4;ne &quot;menu&quot;. Quand l&apos;utilisateur clique sur cette ic&#xF4;ne, la navigation sort d&apos;un panneau &#xE0; gauche ou &#xE0; droite du site, poussant le contenu de l&apos;autre c&#xF4;t&#xE9;.</p>
<p class="center"> <img alt="Exemples de navigation toggle" src="http://www.alsacreations.com/xmedia/doc/full/navigations-mobile.jpg"></p>
<p> Le &quot;probl&#xE8;me&quot; de ces techniques est que la navigation reste en haut de l&apos;&#xE9;cran. Dans son article &#x201C;<a href="http://www.lukew.com/ff/entry.asp?1649">Responsive Navigation: Optimizing for Touch Across Devices</a>,&#x201D; Luke Wroblewski illustre de mani&#xE8;re visuelle les zones faciles d&apos;acc&#xE8;s sur diff&#xE9;rents appareils. La partie en haut &#xE0; gauche est la plus compliqu&#xE9;e &#xE0; atteindre sur mobile.</p>
<p class="center"> <img alt="Les zones de l&apos;ecran plus ou moins facilement accessibles" src="http://www.alsacreations.com/xmedia/doc/full/touchaccess.jpg"></p>
<p> En se basant sur ces recherches, Jason Weaver cr&#xE9;a quelques d&#xE9;monstrations <a href="http://jasonweaver.name/lab/touchnav/v2/">de navigations avec les boutons en bas de l&apos;&#xE9;cran</a>. Une des solutions propos&#xE9;es est d&apos;avoir la <a href="http://jasonweaver.name/lab/touchnav/v2/">navigation en pied de page</a>, et d&apos;y renvoyer l&apos;utilisateur lorsqu&apos;il clique sur le bouton &quot;menu&quot; &#xE0; l&apos;aide d&apos;un syst&#xE8;me d&apos;ancres HTML.</p>
<p> <a href="http://codepen.io/bradfrost/full/orJwL">Bien</a> <a href="http://codepen.io/bradfrost/full/vcuem">d&apos;autres</a> <a href="http://codepen.io/bradfrost/full/qwJvF">solutions</a>&#xA0;ont &#xE9;t&#xE9; propos&#xE9;es pour tenter de r&#xE9;gler le probl&#xE8;me de la navigation responsive. Comme vous pouvez le voir, encore une fois, il n&apos;existe pas de solution id&#xE9;ale et cela va l&#xE0; encore d&#xE9;pendre non seulement de votre projet, mais &#xE9;galement du niveau de profondeur de votre navigation. Heureusement qu&apos;il existe des gens comme ceux cit&#xE9;s plus haut qui exp&#xE9;rimentent et partagent les exp&#xE9;riences avec la communaut&#xE9;.</p>
<p> Il nous faut &#xE9;galement encore trouver quelles ic&#xF4;nes choisir pour montrer &#xE0; l&apos;utilisateur de mani&#xE8;re pertinente qu&apos;il y a un menu, et qu&apos;il se cache des &#xE9;l&#xE9;ments suppl&#xE9;mentaires en dessous. Certains sites utilisent le symbole (+), d&apos;autres une grille, d&apos;autres encore utilisent un symbole de liste ordonn&#xE9;e, ou encore le symbole des 3 lignes (ou <em>burger icon</em>).</p>
<p class="center"> <img alt="ic&#xF4;ne de menu" src="http://www.alsacreations.com/xmedia/doc/full/navigationicons.jpg"></p>
<p> Pour voir ces ic&#xF4;nes en utilisation je vous conseille l&apos;excellent article &#x201C;<a href="http://stuffandnonsense.co.uk/blog/about/we_need_a_standard_show_navigation_icon_for_responsive_web_design">We Need a Standard &#x2018;Show Navigation&#x2019; Icon for Responsive Web Design</a>.&#x201D;</p>
<p> Reste &#xE0; trouver laquelle de ces ic&#xF4;nes est la plus facilement identifiable par un utilisateur comme &#xE9;tant un menu. Si tout le monde s&apos;accordait sur l&apos;utilisation d&apos;une d&apos;entre elles, les utilisateurs (de tous pays) seraient-ils capables de la comprendre ? Et laquelle choisir ? Je suis tr&#xE8;s curieuse de savoir quelle ic&#xF4;nes vous utilisez sur vos sites, donc n&apos;h&#xE9;sitez pas &#xE0; partager votre exp&#xE9;rience dans les commentaires ci-dessous.</p>
<h3> Les sp&#xE9;cificit&#xE9;s du mobile : &quot;Mon utilisateur est-il sur un appareil mobile? Et que peut-il y faire?&quot;</h3>
<p> Le monde des mobiles et tablettes est tout nouveau pour nous, loin des navigateurs de bureaux, et avec ses propres r&#xE8;gles, comportements et capacit&#xE9;s. Il va donc nous falloir penser &#xE0; adapter nos design &#xE0; toutes ces nouvelles possibilit&#xE9;s.</p>
<h4> D&#xE9;tecter la possibilit&#xE9; d&apos;&#xE9;v&#xE8;nement &quot;touch&quot; en JavaScript natif</h4>
<p> Je pense que si vous demandez dans la rue &#xE0; quelqu&apos;un de vous donner la diff&#xE9;rence entre un navigateur de bureau et mobile, en dehors de la taille, il y a fort &#xE0; parier que cette personne va vous r&#xE9;pondre l&apos;utilisation avec les doigts. Il n&apos;y a pas de souris sur les mobiles (ha bon ? ;)) et en dehors de quelques rares appareils hybrides et ajouts en bluetooth sur des tablettes, il n&apos;est pas possible d&apos;avoir des &#xE9;v&#xE8;nements de souris sur un mobile ou une tablette. Cela implique qu&apos;en fonction du navigateur, la pseudo-classe <code>:hover</code> fonctionnera diff&#xE9;remment. Certains navigateurs sont sympatiques et &quot;&#xE9;mulent&quot; cette fonctionnalit&#xE9;, traduisant un effet au survol par un effet au touch. H&#xE9;las tous ne sont pas aussi flexibles. Cr&#xE9;er un design dont une partie des &#xE9;l&#xE9;ments ne sont r&#xE9;v&#xE9;l&#xE9;s qu&apos;au survol de la souris peut s&apos;av&#xE9;rer compliqu&#xE9; sur mobile.</p>
<p> R&#xE9;cup&#xE9;rer les &#xE9;v&#xE8;nements au touch est une solution envisageable. Le W3C a un groupe de travail sur le projet de sp&#xE9;cifications <a href="http://www.w3.org/TR/touch-events/">touch event</a>. Dans le futur, nous serons donc capables de d&#xE9;tecter directement en JavaScript et sans librairie tierce comme <a href="http://eightmedia.github.com/hammer.js/">Hammer.js</a> ou&#xA0;<a href="http://jgestures.codeplex.com/">jGestures</a> des &#xE9;v&#xE8;nements comme <code>touchstart</code>, <code>touchmove</code> ou encore <code>touchend</code>.</p>
<p> JavaScript est une chose, mais qu&apos;en est-il du CSS ?</p>
<h4> CSS Level 4 &quot;pointer media query&quot;</h4>
<p> Le CSS Level 4 propose une nouvelle Media Query appel&#xE9;e <a href="http://dev.w3.org/csswg/mediaqueries4/#pointer">&#x201C;pointer&#x201D;</a>. Elle peut &#xEA;tre utilis&#xE9;e pour d&#xE9;tecter la pr&#xE9;sence d&apos;un dispositif de pointage comme une souris, et prend 3 valeurs possibles :</p>
<ul> <li> <code>none</code> : l&apos;appareil n&apos;a pas de dispositif de pointage</li> <li> <code>coarse</code> : l&apos;appareil a un dispositif de pointage avec une pr&#xE9;cision limit&#xE9;e (un mobile ou une tablette o&#xF9; le dispositif de pointage est un doigt)</li> <li> <code>fine</code> : l&apos;appareil dispose d&apos;un dispositif de pointage pr&#xE9;cis comme une souris, ou encore un track pad ou le stylet d&apos;une tablette graphique</li>
</ul>
<p> En utilisant cette requ&#xEA;te, on peut imaginer ce genre de code pour &#xE9;largir la taille des boutons pour des appareils &quot;touch&quot; :</p>
<pre class="code">
<code class="css">@media (pointer:coarse) { input[type=&quot;submit&quot;], a.button { min-width: 30px; min-height: 40px; background: transparent; } }</code></pre>
<p> Cette Media Query n&apos;est pour le moment support&#xE9;e nulle part et est &#xE0; l&apos;&#xE9;tat de proposition. Le potentiel n&apos;en reste pas moins tr&#xE8;s int&#xE9;ressant puisqu&apos;elle permettrait de d&#xE9;tecter des appareils supportant le touch sans devoir passer par une librairie comme <a href="http://modernizr.com/docs/#touch">Modernizr</a>.</p>
<h4> La Media Query CSS Level 4 &quot;hover&quot;</h4>
<p> Les sp&#xE9;cifications CSS Level 4 proposent &#xE9;galement une nouvelle Media Query appel&#xE9;e <a href="http://dev.w3.org/csswg/mediaqueries4/#hover">hover</a>,qui est capable de d&#xE9;tecter si le dispositif de pointage de l&apos;appareil peut supporter les effets au survol. Elle renvoie un bool&#xE9;en 1 si l&apos;appareil supporte le survol, 0 si ce n&apos;est pas le cas. Notez ici que cela n&apos;a RIEN &#xE0; voir avec la pseudo-classe <code>:hover</code>.</p>
<p> En utilisant cette syntaxe, nous pourrions par exemple am&#xE9;liorer les interfaces et ne masquer des fonctionnalit&#xE9;s que pour les appareils qui supportent le survol d&apos;&#xE9;l&#xE9;ments. Le code pourrait ressembler &#xE0; &#xE7;a :</p>
<pre class="code">
<code class="css">@media (hover) { .hovercontent { display: none; } /* cacher le contenu uniquement pour les appareils qui supporent le survol */ .hovercontent:hover { display: block; } }</code></pre>
<p> On pourrait imaginer l&apos;utiliser pour cr&#xE9;er des menus d&#xE9;roulants au survol uniquement pour les appareils le supportant, et proposer une alternative plus facilement pour les autres sans avoir besoin de d&#xE9;tection des capacit&#xE9;s de l&apos;appareil.</p>
<h4> La Media Query CSS Level 4 &quot;luminosity&quot;</h4>
<p> Les appareils mobiles sont aujourd&apos;hui &#xE9;quip&#xE9;s de d&#xE9;tecteurs leur permettant de mesurer la luminosit&#xE9; ambiante. CSS Level 4 propose une <a href="http://dev.w3.org/csswg/mediaqueries4/#luminosity">media-query &quot; luminosity</a>&quot; qui aura acc&#xE8;s aux donn&#xE9;es de ces capteurs. Voici comment la d&#xE9;crivent les sp&#xE9;cifications du W3C :</p>
<p> <q>&#xA0;La Media Query luminosit&#xE9; est utilis&#xE9;e pour r&#xE9;cup&#xE9;rer des donn&#xE9;es sur la luminosit&#xE9; ambiante dans laquelle l&apos;appareil se trouve et permet &#xE0; l&apos;auteur d&apos;ajuster le style du document en fonction. </q></p>
<p> Dans le futur nous serons donc capables de cr&#xE9;er des sites qui vont <strong>r&#xE9;agir &#xE0; la luminosit&#xE9; ambiante</strong>. Nous allons pouvoir grandement am&#xE9;liorer l&apos;exp&#xE9;rience utilisateur en leur proposant par exemple plus de contrastes dans un environnement tr&#xE8;s lumineux avec la valeur &quot;washed&quot;. La valeur &quot;dim&quot; est utilis&#xE9;e pour les environnements sombres, et la valeur &quot;normal&quot; si le niveau de luminosit&#xE9; ne requiert pas d&apos;ajustement.</p>
<p> Voici &#xE0; quoi pourrait ressembler le code :</p>
<pre class="code">
<code class="css">@media (luminosity: washed) { p { background: white; color: black; font-size: 2em; }
}</code></pre>
<p> Si vous &#xEA;tes curieux et souhaitez en savoir plus sur les nouveaut&#xE9;s CSS level 4 pas forc&#xE9;ment li&#xE9;es au responsive, vous pouvez lire l&apos;article <a href="http://coding.smashingmagazine.com/2013/01/21/sneak-peek-future-selectors-level-4/">Sneak Peek Into the Future: Selectors, Level 4</a>.</p>
<h3> Plus de capacit&#xE9; mobiles d&#xE9;tectables en utilisant les APIs et JavaScript</h3>
<p> Beaucoup d&apos;autres fonctionnalit&#xE9;s peuvent &#xEA;tre d&#xE9;tect&#xE9;es pour am&#xE9;liorer l&apos;exp&#xE9;rience utilisateur et proposer un site responsive digne de ce nom. Par exemple il serait possible d&apos;acc&#xE9;der nativement au gyroscope, &#xE0; la boussole ou &#xE0; l&apos;acc&#xE9;l&#xE9;rom&#xE8;tre pour d&#xE9;tecter l&apos;orientation de l&apos;appareil en utilisant <a href="http://www.alsacreations.com/tuto/lire/1501-api-device-orientation-motion-acceleration.html">DeviceOrientationEvent</a>. <a href="http://caniuse.com/#feat=deviceorientation">Le support de cette API</a> s&apos;am&#xE9;liore pour Android et iOS mais elle reste pour le moment &#xE0; l&apos;&#xE9;tat de brouillon. Les possibilit&#xE9;s pour les jeux HTML5 qui exploiteraient l&apos;orientation directement dans le navigateur n&apos;en restent pas moins prometteuses.</p>
<p> Une autre API qui commence &#xE0; &#xEA;tre beaucoup utilis&#xE9;e et particuli&#xE8;rement utile est la <a href="http://www.alsacreations.com/tuto/lire/926-geolocalisation-geolocation-html5.html">G&#xE9;olocalisation</a>. Cette API est d&apos;ailleurs <a href="http://caniuse.com/#search=geolocation">tr&#xE8;s bien support&#xE9;e</a>. Elle permet de positionner l&apos;utilisateur en utilisant son GPS, l&apos;adresse IP ou encore les r&#xE9;seaux Wi-Fi ou la triangulation d&apos;antennes relais. On peut imaginer utiliser la g&#xE9;olocalisation sur un site responsive pour proposer des informations contextuelles &#xE0; l&apos;utilisateur. Une grosse cha&#xEE;ne de restaurants pourrait pas exemple am&#xE9;liorer l&apos;exp&#xE9;rience en montrant &#xE0; l&apos;utilisateur g&#xE9;olocalis&#xE9; les restaurants de la cha&#xEE;ne qui se trouvent autour de lui.</p>
<p> Le W3C propose &#xE9;galement un brouillon pour <a href="http://dev.w3.org/2009/dap/vibration/">l&apos;API Vibration</a>. Le navigateur peut alors proposer des retours tactiles sous forme de vibrations &#xE0; l&apos;utilisateur. N&#xE9;anmoins on sort l&#xE0; quelque peu du domaine du responsive pour entrer un peu plus dans le domaine du jeu et de l&apos;applicatif web.</p>
<p> Une autre API qui a fait couler beaucoup d&apos;encre est&#xA0;<a href="http://www.w3.org/TR/netinfo-api/">Network Information</a>. La possibilit&#xE9; de pouvoir optimiser des images et un site en fonction de la bande passante de l&apos;utilisateur a de quoi s&#xE9;duire plus d&apos;un d&#xE9;veloppeur. Nous serions en th&#xE9;orie alors capables de proposer des images en haute r&#xE9;solution pour les appareils avec une grosse bande passante, et vice et versa. Avec l&apos;attribut <code>bandwith</code> de l&apos;API network, il serait possible d&apos;estimer la bande passante d&apos;un utilisateur en Mb/s. Le second attribut <code>metered</code> est un Boolean qui nous indique si l&apos;utilisateur a une connexion mesur&#xE9;e, comme c&apos;est le cas pour des mobicartes pr&#xE9;-pay&#xE9;es par exemple. Ces deux attributs sont accessibles en JavaScript.</p>
<p> H&#xE9;las la mesure de la connexion d&apos;un utilisateur est une chose techniquement complexe. En outre, la connexion peu changer &#xE0; tout moment. Un utilisateur passant sous un tunnel peut perdre sa connexion, et la vitesse de t&#xE9;l&#xE9;chargement va subitement chuter. Il est donc totalement hypoth&#xE9;tique d&apos;imaginer &#xE0; l&apos;heure actuelle une Media Query &quot;magique&quot; qui permettrait de mesurer la bande passante. Yoav Weiss a &#xE9;crit un excellent article sur le probl&#xE8;me qu&apos;une telle Media Query pourrait engendrer et sur la mesure de la bande passante en g&#xE9;n&#xE9;ral intitul&#xE9; <a href="http://mobile.smashingmagazine.com/2013/01/09/bandwidth-media-queries-we-dont-need-em/%22">Bandwidth Media Queries? We Don&#x2019;t Need &#x2019;Em!</a>.</p>
<p> Il existe encore beaucoup d&apos;autres APIs li&#xE9;es aux fonctionnalit&#xE9;s mobiles que je ne vais pas d&#xE9;tailler ici. Si vous souhaitez en savoir plus, <a href="https://wiki.mozilla.org/WebAPI">Mozilla a une liste tr&#xE8;s d&#xE9;taill&#xE9;e</a>. La plupart d&apos;entre elles sont loin d&apos;&#xEA;tre standardis&#xE9;es, et beaucoup sont plus orient&#xE9;es vers de l&apos;applicatif web que vers le site responsive. Il n&apos;en reste pas moins passionnant de voir &#xE0; quel point la mobilit&#xE9; va devenir complexe dans le futur et toutes les possibilit&#xE9;s qui vont s&apos;ouvrir &#xE0; nous.</p>
<h3> Repenser la fa&#xE7;on dont nous, et nos clients/utilisateurs g&#xE9;rons le contenu.</h3>
<p> Il reste encore bons nombres de d&#xE9;fis techniques &#xE0; relever pour g&#xE9;rer du contenu de mani&#xE8;re efficace sur mobile. La philosophie &quot;mobile-first&quot; commence &#xE0; faire de plus en plus d&apos;&#xE9;mules dans la communaut&#xE9; de designers et d&apos;int&#xE9;grateurs. Il serait par exemple techniquement possible d&apos;envoyer &#xE0; un mobile le minimum de HTML et donn&#xE9;es n&#xE9;cessaires, puis d&apos;utiliser du JavaScript et des chargements en AJAX pour charger plus de contenu et d&apos;images de mani&#xE8;re conditionnelle pour les navigateurs de bureau, voire les tablettes. Mais pour faire cela, il nous faut d&apos;abord <strong>repenser la mani&#xE8;re dont nous allons g&#xE9;rer notre contenu</strong>. Il nous faut &#xEA;tre capable de prioriser et hi&#xE9;rarchiser les contenus pour les g&#xE9;n&#xE9;rer de la mani&#xE8;re la plus flexible et adaptive possible. Un bon exemple ici serait la carte responsive d&#xE9;crite plus haut : nous chargeons pour le mobile une simple image, et am&#xE9;liorons progressivement l&apos;exp&#xE9;rience avec une &quot;vraie&quot; carte pour les utilisateurs de navigateur sur bureau. Plus nous allons vouloir rendre un site responsive, et plus la gestion du contenu va se complexifier.</p>
<p> Du code plus flexible peut nous aider &#xE0; formater un contenu qui s&apos;adapte. Certaines personnes ont sugg&#xE9;r&#xE9; de cr&#xE9;er des phrases responsive en morcelant les &#xE9;l&#xE9;ments de balises HTML et de classes pour pouvoir n&apos;en afficher que certaines parties en fonction de la taille de l&apos;&#xE9;cran. L&apos;id&#xE9;e est de masquer certaines parties pour les petits appareils en utilisant des Media Queries. Vous pouvez voir cette technique en action sur le blog de 37signal&apos;s <a href="http://37signals.com/svn/">Signal vs. Noise</a>&#xA0;ainsi que dans l&apos;article de Frankie Roberto intitul&#xE9; <a href="http://www.frankieroberto.com/responsive_text">Responsive Text</a>. M&#xEA;me si cette technique peut &#xEA;tre utilis&#xE9;e pour am&#xE9;liorer l&apos;affichage de petites parties du site comme un slogan dans un pied de page, il est totalement impensable de l&apos;appliquer &#xE0; grande &#xE9;chelle &#xE0; l&apos;ensemble d&apos;un site web.</p>
<p> On commence ici &#xE0; mettre le doigt sur un probl&#xE8;me qui va prendre de plus en plus d&apos;importance dans le futur : la n&#xE9;cessit&#xE9; de parser son contenu textuel de m&#xE9;tadonn&#xE9;es pour lui donner une plus grande structure s&#xE9;mantique. Rappelons-nous, le contenu de notre site ne vient plus uniquement de nos r&#xE9;dacteurs de contenus en interne. Si nous souhaitons &#xE0; terme, &#xEA;tre capable de r&#xE9;utiliser le contenu d&apos;autres site sur le notre, il va falloir pr&#xE9;parer la structure de ce contenu pour qu&apos;il soit facilement r&#xE9;utilisable. Les nouveaux &#xE9;l&#xE9;ments HTML5 comme <code>article</code>, <code>section</code> sont un bon point de d&#xE9;part pour faire gagner de la valeur s&#xE9;mantique &#xE0; nos contenus. Dans le futur, il ne faudra plus penser et structurer le contenu comme une seule entit&#xE9; (une page web) mais le penser comme l&apos;assemblage de multiples blocs r&#xE9;utilisables que l&apos;on va pouvoir afficher dans diff&#xE9;rents formats sur diff&#xE9;rents appareils.</p>
<p> Le plus grand d&#xE9;fi sera de <strong>faire en sorte que la structuration en m&#xE9;tadonn&#xE9;es soit facile d&apos;acc&#xE8;s et compr&#xE9;hensible</strong> par toutes les personnes qui font partie de la cha&#xEE;ne de cr&#xE9;ation d&apos;un site web. Nous allons devoir les &#xE9;duquer, et leur expliquer comment ces donn&#xE9;es peuvent &#xEA;tre utilis&#xE9;es pour prioriser le contenu et assembler de mani&#xE8;re pragmatique diff&#xE9;rents &#xE9;l&#xE9;ments tout en restant ind&#xE9;pendant de la plateforme utilis&#xE9;e. Le grand challenge sera de les aider &#xE0; penser en terme de blocs r&#xE9;utilisables plut&#xF4;t qu&apos;en terme de &quot;grosse zone de texte que l&apos;on peut copier/coller depuis Word vers l&apos;&#xE9;diteur WYSIWYG du CMS&quot;. Notre travail sera de les aider &#xE0; comprendre que le contenu et sa mise en forme sont deux choses s&#xE9;par&#xE9;es et ind&#xE9;pendantes, tout comme nous en tant que designers et int&#xE9;grateurs avons compris que le contenu (HTML) et sa pr&#xE9;sentation (CSS) sont plus simples &#xE0; g&#xE9;rer une fois s&#xE9;par&#xE9;s.</p>
<p> <strong>&#xC9;crire un contenu orient&#xE9; vers une seule et unique plateforme n&apos;est plus une option</strong>. Qui sait sur quels appareils votre contenu sera affich&#xE9; demain ? Dans 6 mois ? Dans un an ? Il nous faut <a href="http://mobile.smashingmagazine.com/2013/01/14/preparing-websites-for-the-unexpected/">pr&#xE9;parer ce contenu pour l&apos;inattendu</a>. Mais pour arriver &#xE0; cela, il va nous falloir &#xE9;galement cr&#xE9;er de meilleurs outils de publication. Karen McGrane a donn&#xE9; une conf&#xE9;rence intitul&#xE9;e <a href="http://karenmcgrane.com/2012/09/04/adapting-ourselves-to-adaptive-content-video-slides-and-transcript-oh-my/">Adapting Ourselves to Adaptive Content</a>. Elle y parle d&apos;exemples concrets tir&#xE9;s de l&apos;industrie de la publication. Elle d&#xE9;taille le processus pour cr&#xE9;er des contenus r&#xE9;utilisables et introduit l&apos;id&#xE9;e de COPE (<em>create once and publish everywhere</em> - en fran&#xE7;ais &quot;cr&#xE9;er une fois, publier partout&quot;). Il va nous falloir construire de meilleurs CMSs qui seront capables de g&#xE9;n&#xE9;rer les m&#xE9;tadonn&#xE9;es n&#xE9;cessaires &#xE0; cette priorisation des contenus. Nous allons &#xE9;galement devoir expliquer &#xE0; nos coll&#xE8;gues et r&#xE9;dacteurs de contenu comment ces CMSs fonctionnent et comment penser en terme de contenus r&#xE9;utilisables et non pas de pages WYSIWYG.</p>
<p> Karen McGrane &#xE9;crit :</p>
<blockquote> <p> &quot;Vous serez peut-&#xEA;tre amen&#xE9;s &#xE0; &#xE9;crire trois versions diff&#xE9;rentes de votre titre; deux versions du sommaire, et ajouter plusieurs images dans diff&#xE9;rentes tailles, diff&#xE9;rentes coupes, et vous ne serez m&#xEA;me pas la personne qui d&#xE9;cidera quelle image ou quel titre sera affich&#xE9; sur telle ou telle plateforme. Cette d&#xE9;cision sera faite par une m&#xE9;tadonn&#xE9;e. Elle sera faite par les r&#xE8;gles de l&apos;industrie [&#x2026;] <strong>les m&#xE9;tadonn&#xE9;es sont la nouvelle direction artistique</strong>.&quot;</p>
</blockquote>
<p> Masquer des contenus pour des appareils n&apos;est plus une strat&#xE9;gie de gestion de contenu p&#xE9;renne. Il nous faut des CMS qui puissent nous fournir la structure pour cr&#xE9;er du contenu r&#xE9;utilisable. Il nous faut &#xE9;galement des meilleurs workflows de publication dans ces CMSs. Les interfaces hasardeuses et complexes font peur aux utilisateurs, et la plupart des personnes qui vont g&#xE9;n&#xE9;rer les contenus ne sont pas particuli&#xE8;rement &#xE0; l&apos;aise avec des outils trop compliqu&#xE9;s. Il va nous falloir leur fournir des outils qui sont faciles d&apos;acc&#xE8;s et de compr&#xE9;hension pour les aider &#xE0; publier du contenu propre, s&#xE9;mantique et ind&#xE9;pendant de la pr&#xE9;sentation finale.</p>
<p class="center"> <img alt="Content is like water" src="http://www.alsacreations.com/xmedia/doc/full/content-is-like-water.jpg"></p>
<h3> Conclusion</h3>
<p> Cet article peut vous para&#xEE;tre long, <strong>mais il n&apos;est que le sommet de l&apos;iceberg</strong>. Aujourd&apos;hui notre profession commence &#xE0; comprendre que le responsive webdesign c&apos;est bien plus que balancer quelques Media Queries dans une feuille de style, choisir des points de rupture et doubler les dimensions des images pour ces nouveaux jouets haute r&#xE9;solution qui nous servent de mobile. Vous l&apos;avez lu, vu, le chemin est long, et nous sommes loin d&apos;&#xEA;tre arriv&#xE9;s &#xE0; destination. Il y a encore tellement de choses &#xE0; faire et de probl&#xE8;mes &#xE0; r&#xE9;soudre que la solution responsive magique et miraculeuse n&apos;existe pas encore aujourd&apos;hui.</p>
<p> Nous avons d&#xE9;couvert des solutions techniques, d&apos;autres viendront dans le futur en utilisant des nouvelles technologies pr&#xE9;sent&#xE9;es dans cet article avec l&apos;aide d&apos;organisations comme le <a href="http://www.w3.org/">W3C</a>, le&#xA0;<a href="http://www.whatwg.org/">WHATWG</a> ou encore le <a href="http://filamentgroup.com/">Filament Group</a>.</p>
<p> Mais gardons une chose importante &#xE0; l&apos;esprit : c&apos;est &#xE9;galement &#xE0; nous, designers, nous int&#xE9;grateurs, nous d&#xE9;veloppeurs d&apos;aider &#xE0; trouver de meilleures solutions. Des gens g&#xE9;niaux comme <a href="http://www.lukew.com/">Luke Wroblewski</a>,&#xA0;<a href="http://bradfrostweb.com/">Brad Frost</a>, toutes les femmes et les hommes cit&#xE9;s dans cet article et ceux que j&apos;ai oubli&#xE9; &#x153;uvrent au quotidien, testent et exp&#xE9;rimentent diff&#xE9;rentes techniques et solutions. Succ&#xE8;s ou &#xE9;checs, <strong>la chose la plus importante reste le partage</strong> ce que nous, designers, d&#xE9;veloppeurs, r&#xE9;dacteurs de contenus et membres de la communaut&#xE9; webdesign cr&#xE9;ons au quotidien pour aider &#xE0; surmonter ces d&#xE9;fis pr&#xE9;sent&#xE9;s par le concept de responsive webdesign.</p>
<p> Nous sommes tous dans le m&#xEA;me bateau, autant faire ensemble du web un endroit meilleur, non ?</p> <h3 class="ressources">Ressources</h3> </div>]]></description>
      <link>http://www.alsacreations.com/article/lire/1559-responsive-web-design-present-futur-adaptation-mobile.html</link>
      <guid>http://www.alsacreations.com/article/lire/1559-responsive-web-design-present-futur-adaptation-mobile.html</guid>
      <pubDate>Tue, 28 Jan 2014 11:01:00 +0100</pubDate>
    </item>
    <item>
      <title><![CDATA[Traduit ailleurs : Apprendre les mises en page CSS]]></title>
      <description><![CDATA[<div id="about"> <p> Ce site vise &#xE0; vous apprendre les bases de CSS utilis&#xE9;es pour structurer n&apos;importe quel site web. </p> <p> Je suppose que vous savez d&#xE9;j&#xE0; ce que sont les s&#xE9;lecteurs, les propri&#xE9;t&#xE9;s et les valeurs. Et vous connaissez probablement une ou deux choses sur les mise en page, m&#xEA;me si &#xE7;a peut vous donner envie de vous arracher les cheveux. Si vous voulez apprendre le HTML et le CSS depuis le d&#xE9;but, vous devriez allez faire un tour sur <a href="http://learn.shayhowe.com/html-css/">ce tutoriel</a>. Sinon, voyons si nous pouvons vous &#xE9;viter de vous &#xE9;nerver sur votre prochain projet. </p>
</div>]]></description>
      <link>http://fr.learnlayout.com/</link>
      <guid>http://fr.learnlayout.com/</guid>
      <pubDate>Tue, 21 Jan 2014 11:01:00 +0100</pubDate>
    </item>
    <item>
      <title><![CDATA[Traduit ailleurs : Comment fonctionnent les navigateurs]]></title>
      <description><![CDATA[<div><p>Firefox dispose de deux arbres suppl&#xFFFD;mentaires pour un calcul plus facile du style, l&apos;arbre des r&#xFFFD;gles et l&apos;arbre de contexte de style. Webkit a aussi des objets de style, mais ils ne sont pas stock&#xFFFD;s dans un arbre, comme l&apos;arbre de contexte de style, seul le n&#xFFFD;ud DOM pointe sur son style.</p><p>Les contextes de style contiennent des valeurs finales. Les valeurs sont calcul&#xFFFD;es en appliquant toutes les r&#xFFFD;gles d&apos;appariement dans le bon ordre et en effectuant les manipulations qui les transforment de valeurs logiques &#xFFFD; valeurs concr&#xFFFD;tes. Par exemple, si la valeur logique est le pourcentage par rapport &#xFFFD; l&apos;&#xFFFD;cran, il sera calcul&#xFFFD; et transform&#xFFFD; en unit&#xFFFD;s absolues. L&apos;id&#xFFFD;e derri&#xFFFD;re l&apos;arbre des r&#xFFFD;gles est tr&#xFFFD;s intelligente. Elle permet de partager ces valeurs entre les n&#xFFFD;uds pour &#xFFFD;viter de les calculer &#xFFFD; nouveau. Cela &#xFFFD;conomise aussi de l&apos;espace.</p><p>L&apos;ensemble des r&#xFFFD;gles adapt&#xFFFD;es sont stock&#xFFFD;es dans un arbre. Les n&#xFFFD;uds du bas d&apos;un chemin sont prioritaires. L&apos;arbre contient tous les chemins pour la correspondance de r&#xFFFD;gles qui ont &#xFFFD;t&#xFFFD; trouv&#xFFFD;es. Le stockage des r&#xFFFD;gles se fait paresseusement. L&apos;arbre n&apos;est pas calcul&#xFFFD; au d&#xFFFD;but de chaque n&#xFFFD;ud, mais &#xFFFD; chaque fois qu&apos;un style de n&#xFFFD;ud doit &#xFFFD;tre calcul&#xFFFD;, le chemin calcul&#xFFFD; est ajout&#xFFFD; &#xFFFD; l&apos;arbre.</p><p>L&apos;id&#xFFFD;e est de voir l&apos;arbre des chemins comme des mots dans un dictionnaire. Disons que nous avons d&#xFFFD;j&#xFFFD; calcul&#xFFFD; cet arbre r&#xFFFD;gle :</p><p>Supposons que nous devions faire correspondre des r&#xFFFD;gles pour un autre &#xFFFD;l&#xFFFD;ment dans l&apos;arborescence de contenu et que nous trouvons que les r&#xFFFD;gles appari&#xFFFD;es (dans le bon ordre) sont B - E - I. Nous avons d&#xFFFD;j&#xFFFD; ce chemin dans l&apos;arbre, car nous avons d&#xFFFD;j&#xFFFD; calcul&#xFFFD; le trajet A - B - E - I - L. Nous avons maintenant moins de travail &#xFFFD; faire.</p><p>Voyons comment cet arbre nous permet d&apos;&#xFFFD;conomiser du travail.</p><div class="BlocSection3"> <p>Les contextes de style sont divis&#xFFFD;s en structures. Ces structures contiennent des informations de style pour une certaine cat&#xFFFD;gorie comme la bordure ou la couleur. Toutes les propri&#xFFFD;t&#xFFFD;s dans une structure sont h&#xFFFD;rit&#xFFFD;es ou non h&#xFFFD;rit&#xFFFD;es. Les propri&#xFFFD;t&#xFFFD;s h&#xFFFD;rit&#xFFFD;es sont des propri&#xFFFD;t&#xFFFD;s qui ne sont pas d&#xFFFD;finies par l&apos;&#xFFFD;l&#xFFFD;ment, elles sont h&#xFFFD;rit&#xFFFD;es du parent. Les propri&#xFFFD;t&#xFFFD;s non h&#xFFFD;rit&#xFFFD;es (appel&#xFFFD;es propri&#xFFFD;t&#xFFFD;s &#xFFFD; remise &#xFFFD; z&#xFFFD;ro &#xFFFD;) utilisent des valeurs par d&#xFFFD;faut si elles ne sont pas d&#xFFFD;finies.</p> <p>L&apos;arbre nous aide en mettant en cache les structures (contenant les valeurs finales calcul&#xFFFD;es) dans l&apos;arborescence. L&apos;id&#xFFFD;e est que si le n&#xFFFD;ud du bas n&apos;a pas fourni une d&#xFFFD;finition pour une structure alors une structure mise en cache pour un n&#xFFFD;ud sup&#xFFFD;rieur peut &#xFFFD;tre utilis&#xFFFD;e.</p> </div><div class="BlocSection3"> <p>Lors du calcul du contexte de style pour un &#xFFFD;l&#xFFFD;ment donn&#xFFFD;, on calcule d&apos;abord un chemin dans l&apos;arbre des r&#xFFFD;gles ou on en utilise un existant. Nous commen&#xFFFD;ons alors par appliquer les r&#xFFFD;gles dans le chemin pour combler les structures dans notre nouveau contexte style. Nous commen&#xFFFD;ons &#xFFFD; la partie basse du chemin, celui avec la plus haute priorit&#xFFFD; (g&#xFFFD;n&#xFFFD;ralement le s&#xFFFD;lecteur le plus sp&#xFFFD;cifique) et parcourir l&apos;arborescence jusqu&apos;&#xFFFD; ce que notre structure soit pleine. S&apos;il n&apos;y a pas de sp&#xFFFD;cification pour la structure dans ce n&#xFFFD;ud r&#xFFFD;gle, alors nous pouvons grandement optimiser, on remonte l&apos;arborescence jusqu&apos;&#xFFFD; ce qu&apos;on trouve un n&#xFFFD;ud qui satisfait pleinement et nous pointons tout simplement dessus, c&apos;est la meilleure optimisation, la structure enti&#xFFFD;re est partag&#xFFFD;e. Cela permet d&apos;&#xFFFD;conomiser le calcul des valeurs finales et la m&#xFFFD;moire.</p> <p>Si nous trouvons des d&#xFFFD;finitions partielles, nous remontons l&apos;arbre jusqu&apos;&#xFFFD; ce que la structure soit compl&#xFFFD;te.</p> <p>Si nous n&apos;avons pas trouv&#xFFFD; de d&#xFFFD;finitions de notre structure, alors, dans le cas o&#xFFFD; la structure est de type &#xFFFD; h&#xFFFD;rit&#xFFFD; &#xFFFD;, nous pointons vers la structure du parent dans <b>l&apos;arborescence des contextes</b>, dans ce cas, nous avons &#xFFFD;galement r&#xFFFD;ussi &#xFFFD; partager la structure. Si c&apos;est une structure &#xFFFD; remise &#xFFFD; z&#xFFFD;ro &#xFFFD;, alors les valeurs par d&#xFFFD;faut sont utilis&#xFFFD;es.</p> <p>Si le n&#xFFFD;ud le plus sp&#xFFFD;cifique ajoute des valeurs, alors nous devons faire quelques calculs suppl&#xFFFD;mentaires pour la transformer en valeurs r&#xFFFD;elles. Ensuite nous mettons en cache le r&#xFFFD;sultat dans le n&#xFFFD;ud de l&apos;arbre de sorte qu&apos;il puisse &#xFFFD;tre utilis&#xFFFD; par des enfants.</p> <p>Dans le cas o&#xFFFD; un &#xFFFD;l&#xFFFD;ment a un fr&#xFFFD;re qui pointe vers le n&#xFFFD;ud de l&apos;arbre, alors le <b>contexte de style complet</b> peut &#xFFFD;tre partag&#xFFFD; entre eux.</p> <p>Voyons un exemple, supposons que nous ayons ce HTML :</p> <p>Et les r&#xFFFD;gles suivantes :</p> <p>Pour simplifier les choses, disons que nous devons remplir seulement deux structures, la structure couleur et la structure marge. La structure couleur contient un seul membre, la couleur. La structure marge contient les quatre c&#xFFFD;t&#xFFFD;s.</p> <p>L&apos;arbre de r&#xFFFD;gles r&#xFFFD;sultant ressemblera &#xFFFD; ceci (les n&#xFFFD;uds sont identifi&#xFFFD;s par le nom du n&#xFFFD;ud et le num&#xFFFD;ro de la r&#xFFFD;gle sur laquelle ils pointent) :</p> <figure class="TextAlign-center"><img src="http://web.developpez.com/tutoriels/web/how-browsers-work/images/15.png" alt="Figure 15 : The rule tree"><figcaption>Figure 15 : l&apos;arbre des r&#xFFFD;gles</figcaption></figure> <p>L&apos;arbre des contextes ressemblera &#xFFFD; ceci (le nom de n&#xFFFD;ud est le nom de r&#xFFFD;gle g&#xFFFD;n&#xFFFD;rale vers laquelle il pointe) :</p> <figure class="TextAlign-center"><img src="http://web.developpez.com/tutoriels/web/how-browsers-work/images/16.png" alt="Figure 16 : The context tree"><figcaption>Figure 16 : l&apos;arbre des contextes</figcaption></figure> <p>Supposons que nous analysions le code HTML et que nous arrivions &#xFFFD; la deuxi&#xFFFD;me balise <span class="codeinline">&lt;div&gt;</span>. Nous devons cr&#xFFFD;er un cadre de style pour ce n&#xFFFD;ud et remplir ses structures style.</p> <p>Nous allons faire correspondre les r&#xFFFD;gles et d&#xFFFD;couvrir que les r&#xFFFD;gles correspondantes pour le <span class="codeinline">&lt;div&gt;</span> sont 1, 2 et 6. Cela signifie qu&apos;il y a d&#xFFFD;j&#xFFFD; un chemin d&apos;acc&#xFFFD;s existant dans l&apos;arborescence que notre &#xFFFD;l&#xFFFD;ment peut utiliser, nous avons juste besoin d&apos;ajouter un autre n&#xFFFD;ud pour la r&#xFFFD;gle 6 (le n&#xFFFD;ud F dans l&apos;arbre de r&#xFFFD;gles).</p> <p>Nous allons cr&#xFFFD;er un contexte de style et le mettre dans l&apos;arbre des contextes. Le nouveau contexte de style va pointer vers le n&#xFFFD;ud F dans l&apos;arbre de r&#xFFFD;gles.</p> <p>Nous avons maintenant besoin de remplir les structures du style. Nous allons commencer par remplir la structure de marge. Puisque la r&#xFFFD;gle du n&#xFFFD;ud F ne modifie pas la structure de marge, nous pouvons remonter dans l&apos;arbre jusqu&apos;&#xFFFD; ce qu&apos;on trouve une structure en cache calcul&#xFFFD;e dans un n&#xFFFD;ud d&apos;insertion pr&#xFFFD;c&#xFFFD;dent et l&apos;utiliser. Nous allons la trouver avec le n&#xFFFD;ud B, qui est le n&#xFFFD;ud le plus &#xFFFD;lev&#xFFFD; avec les r&#xFFFD;gles de marge sp&#xFFFD;cifi&#xFFFD;es.</p> <p>Nous avons une d&#xFFFD;finition de la structure couleur, donc on ne peut pas utiliser une structure en cache. Puisque la couleur n&apos;a qu&apos;un attribut, nous n&apos;avons pas besoin d&apos;aller dans l&apos;arbre pour en remplir d&apos;autres. Nous allons calculer la valeur finale (convertir la cha&#xFFFD;ne en RVB, etc.) et mettre en cache la structure calcul&#xFFFD;e sur ce n&#xFFFD;ud.</p> <p>Le travail sur le deuxi&#xFFFD;me &#xFFFD;l&#xFFFD;ment <span class="codeinline">&lt;span&gt;</span> est encore plus facile. Nous faisons correspondre les r&#xFFFD;gles et arrivons &#xFFFD; la conclusion qu&apos;il pointe sur la r&#xFFFD;gle G, comme le <span class="codeinline">&lt;span&gt;</span> pr&#xFFFD;c&#xFFFD;dent. Puisque ce sont des fr&#xFFFD;res qui pointent vers le m&#xFFFD;me n&#xFFFD;ud, nous pouvons partager le contexte de style tout simplement en pointant dans le contexte du <span class="codeinline">&lt;span&gt;</span> pr&#xFFFD;c&#xFFFD;dent.</p> <p>Pour les structures qui contiennent des r&#xFFFD;gles qui sont h&#xFFFD;rit&#xFFFD;es du parent, la mise en cache se fait sur l&apos;arbre de contexte (la propri&#xFFFD;t&#xFFFD; de couleur est en fait h&#xFFFD;rit&#xFFFD;e, mais Firefox la traite comme &#xFFFD; remise &#xFFFD; z&#xFFFD;ro &#xFFFD; et la met en cache sur l&apos;arbre de r&#xFFFD;gles). </p> <p>Par exemple, si nous ajoutons des r&#xFFFD;gles de polices dans un paragraphe :</p> <div class="code_et_titre"><ol class="contenuCode" id="contenuCoded0e2961"><li class="LigneCode"><pre class="LignePreCode">p <code class="operator">{</code><a class="keyword2 lien_documentation_code" href="http://www.w3.org/community/webed/wiki/CSS/Properties/font-family"><span>font-family</span></a><code class="operator">:</code>Verdana;<a class="keyword2 lien_documentation_code" href="http://www.w3.org/community/webed/wiki/CSS/Properties/font"><span>font</span></a> <a class="keyword2 lien_documentation_code" href="http://www.w3.org/community/webed/wiki/CSS/Properties/size"><span>size</span></a><code class="operator">:</code><code class="digit">10px</code>;<a class="keyword2 lien_documentation_code" href="http://www.w3.org/community/webed/wiki/CSS/Properties/font-weight"><span>font-weight</span></a><code class="operator">:</code><code class="keyword3">bold</code><code class="operator">}</code> </pre></li></ol></div> <p>Alors, l&apos;&#xFFFD;l&#xFFFD;ment de paragraphe, qui est un enfant de <span class="codeinline">&lt;div&gt;</span> dans l&apos;arbre de contexte, aurait pu partager la structure de police de son parent. Cela serait le cas si aucune r&#xFFFD;gle de police n&apos;avait &#xFFFD;t&#xFFFD; sp&#xFFFD;cifi&#xFFFD;e pour le paragraphe.</p> <p>Avec Webkit, qui ne dispose pas d&apos;un arbre de r&#xFFFD;gles, les d&#xFFFD;clarations correspondantes sont travers&#xFFFD;es quatre fois. En premier, les propri&#xFFFD;t&#xFFFD;s non importantes (propri&#xFFFD;t&#xFFFD;s qui doivent &#xFFFD;tre appliqu&#xFFFD;es d&apos;abord parce que d&apos;autres d&#xFFFD;pendent d&apos;elles, comme l&apos;affichage) sont appliqu&#xFFFD;es, ensuite, les propri&#xFFFD;t&#xFFFD;s importantes, puis les propri&#xFFFD;t&#xFFFD;s normales et enfin les propri&#xFFFD;t&#xFFFD;s normales pour les r&#xFFFD;gles importantes. Cela signifie que les propri&#xFFFD;t&#xFFFD;s qui apparaissent plusieurs fois seront r&#xFFFD;solues selon l&apos;ordre de cascade correct. C&apos;est le dernier qui l&apos;emporte.</p> <p>Donc, pour r&#xFFFD;sumer, le partage des objets style (tout ou partie des structures &#xFFFD; l&apos;int&#xFFFD;rieur) r&#xFFFD;sout les probl&#xFFFD;mes <a class="lienArticle simple" href="http://www.html5rocks.com/en/tutorials/internals/howbrowserswork/#issue1">1</a> et <a class="lienArticle simple" href="http://www.html5rocks.com/en/tutorials/internals/howbrowserswork/#issue3">3</a>. L&apos;arbre de r&#xFFFD;gles Firefox contribue &#xFFFD;galement &#xFFFD; l&apos;application des propri&#xFFFD;t&#xFFFD;s dans le bon ordre.</p> </div></div>]]></description>
      <link>http://web.developpez.com/tutoriels/web/how-browsers-work/</link>
      <guid>http://web.developpez.com/tutoriels/web/how-browsers-work/</guid>
      <pubDate>Wed, 12 Jun 2013 01:06:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Traduit ailleurs : Apprendre à apprécier les parties les moins sexy de CSS]]></title>
      <description><![CDATA[<div class="eight columns centered"> <p>Le futur des CSS nous donne beaucoup d&#x2019;occasions de nous enthousiasmer : d&#x2019;un c&#xF4;t&#xE9; il y a un paquet de nouvelles m&#xE9;thodes qui vont r&#xE9;volutionner notre fa&#xE7;on de mettre en page le web, et de l&#x2019;autre il y a un ensemble d&#x2019;effets graphiques qui vont permettre d&#x2019;appliquer des filtres et <em>shaders 3Ds</em> &#xAB; &#xE0; la vol&#xE9;e &#xBB;. Tout le monde aime ce genre de nouveaut&#xE9;s : les magazines et les blogs d&#xE9;bordent d&#x2019;articles &#xE0; ce propos.</p>
<p>Mais si ces outils font figure de chiens savants des CSS, je crois cependant qu&#x2019;il est temps de s&#x2019;int&#xE9;resser aux figurants : les rouages du langage tels que les s&#xE9;lecteurs, les unit&#xE9;s et les fonctions. Je les appelle souvent &#xAB; les parties les moins sexy de CSS &#xBB;, mais c&#x2019;est toujours avec beaucoup d&#x2019;affection &#x2013; affection qu&#x2019;&#xE0; mon sens vous devriez partager.</p>
<p>Pour d&#xE9;couvrir pourquoi, faisons rapidement le tour de ces parties pas tr&#xE8;s sexy qui sont con&#xE7;ues dans des laboratoires sombres, loin de la lumi&#xE8;re et de l&#x2019;&#xE9;clat de celles que l&#x2019;on expose fi&#xE8;rement dans la vitrine. Certains composants existent depuis longtemps mais m&#xE9;ritent plus de reconnaissance, tandis que d&#x2019;autres font tout juste leur apparition dans les navigateurs. Tous r&#xE9;volutionneront nos m&#xE9;thodes de travail, m&#xEA;me si ce sera parfois bien discr&#xE8;tement et modestement.</p>
<h2 id="unit&#xE9;s-de-taille-relatives">Unit&#xE9;s de taille relatives</h2>
<p>En tant que d&#xE9;veloppeur intelligent et consciencieux, il est fort probable que vous ayez d&#xE9;j&#xE0; travaill&#xE9; avec les dimensions relatives &#x2013; unit&#xE9;s <code>em</code> ou pourcentages. Du coup, vous avez certainement d&#xE9;j&#xE0; &#xE9;t&#xE9; confront&#xE9; aux probl&#xE8;mes d&#x2019;h&#xE9;ritage qui vous ont forc&#xE9; &#xE0; sortir votre calculette.<br>De nos jours, il est relativement commun de d&#xE9;finir une taille de police de base pour le document, puis d&#x2019;utiliser des unit&#xE9;s relatives pour r&#xE9;gler la taille des polices dans le reste de la page. En CSS, cela donne quelque chose comme &#xE7;a :</p> <div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="css">html <span>{</span> <span>font-size</span><span>:</span> <span>10px</span><span>;</span> <span>}</span>
p <span>{</span> <span>font-size</span><span>:</span> <span>1.4em</span><span>;</span> <span>}</span></pre></td></tr></table></div> <p>C&#x2019;est tr&#xE8;s bien, et &#xE7;a ne pose aucun probl&#xE8;me&#x2026; jusqu&#x2019;&#xE0; ce que vous vouliez donner une taille diff&#xE9;rente &#xE0; un &#xE9;l&#xE9;ment enfant. Par exemple, dans un code tel que celui-ci :</p> <div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html">Le chat s&#x2019;est assis sur le &lt;span&gt;tapis&lt;/span&gt;.</pre></td></tr></table></div> <p>Si vous voulez que ce <code>span</code> soit d&#x2019;une taille de police plus petite, par exemple 1.2em, que devez-vous faire ? Sortir votre calculette et diviser 1,2 par 1,4 pour obtenir le r&#xE9;sultat suivant :</p> <div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="css">p span <span>{</span> <span>font-size</span><span>:</span> <span>0.85714em</span><span>;</span> <span>}</span></pre></td></tr></table></div> <p>Bien s&#xFB;r, le probl&#xE8;me ne se limite pas &#xE0; l&#x2019;utilisation des <code>em</code>.<br>Lorsque vous construisez un site fluide en utilisant des pourcentages, vous savez que le pourcentage est relatif &#xE0; son conteneur. Donc si vous souhaitez fixer la largeur d&#x2019;un &#xE9;l&#xE9;ment &#xE0; 40 % de celle de son parent (qui est de 75 %), alors la largeur de l&#x2019;&#xE9;l&#xE9;ment enfant doit &#xEA;tre r&#xE9;gl&#xE9;e &#xE0; <code>53.33333%</code>.</p>
<p>Pas top.</p>
<h2 id="longueurs-relatives-&#xE0;-la-racine">Longueurs relatives &#xE0; la racine</h2>
<p>Pour combattre ce probl&#xE8;me de dimensionnement des polices, nous avons dor&#xE9;navant acc&#xE8;s &#xE0; l&#x2019;unit&#xE9; <code>rem</code> (<em>root em</em>). Il s&#x2019;agit toujours d&#x2019;une unit&#xE9; relative, mais qui d&#xE9;pend d&#x2019;une valeur de base fixe : la taille de la police de l&#x2019;&#xE9;l&#xE9;ment racine du document (l&#x2019;&#xE9;l&#xE9;ment <code>html</code>). En supposant que la taille de la police de l&#x2019;&#xE9;l&#xE9;ment racine soit de 10px comme dans l&#x2019;exemple pr&#xE9;c&#xE9;dent, les r&#xE8;gles CSS n&#xE9;cessaires dans notre cas sont :</p> <div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="css">p <span>{</span> <span>font-size</span><span>:</span> 1.4rem<span>;</span> <span>}</span>
p span <span>{</span> <span>font-size</span><span>:</span> 1.2rem<span>;</span> <span>}</span></pre></td></tr></table></div> <p>Ces deux r&#xE8;gles sont relatives &#xE0; la taille de police de l&#x2019;&#xE9;l&#xE9;ment racine, ce qui est beaucoup plus &#xE9;l&#xE9;gant et simple &#xE0; manipuler, surtout si vous avez des valeurs de base qui sont 10px ou 12px. C&#x2019;est un peu comme si on utilisait &#xE0; nouveau les valeurs en pixels, mais de mani&#xE8;re extensible cette fois.</p>
<p>C&#x2019;est l&#x2019;une des fonctionnalit&#xE9;s CSS les mieux support&#xE9;es de toutes celles pr&#xE9;sent&#xE9;es dans cet article. Elle est impl&#xE9;ment&#xE9;e par tous les navigateurs modernes, y compris IE9, et seulement <a href="http://caniuse.com/#feat=rem">absente sur Opera Mobile</a>.</p>
<h2 id="longueurs-relatives-au-viewport">Longueurs relatives au <em>viewport</em></h2>
<p>Si vous trouvez que l&#x2019;unit&#xE9; <code>rem</code> est cool (c&#x2019;est mon cas), vous allez adorer la nouvelle panoplie d&#x2019;unit&#xE9;s de longueur destin&#xE9;es &#xE0; combattre le probl&#xE8;me des pourcentages. Elles fonctionnent de mani&#xE8;re similaire &#xE0; l&#x2019;unit&#xE9; <code>rem</code>, si ce n&#x2019;est qu&#x2019;elles sont relatives &#xE0; la taille du <em>viewport</em> de l&#x2019;appareil du navigateur <sup><a href="http://letrainde13h37.fr/25/traduction-apprendre-a-apprecier-les-parties-les-moins-sexy-de-css/#fn1" class="footnoteRef" id="fnref1">1</a></sup> plut&#xF4;t qu&#x2019;&#xE0; une taille d&#xE9;finie par l&#x2019;auteur sur la racine du document.</p>
<p>Les deux unit&#xE9;s principales sont <code>vh</code> et <code>vw</code>, qui sont relatives (respectivement) &#xE0; la hauteur et &#xE0; la largeur du <em>viewport</em>. Chacune prend comme valeur un nombre qui est &#xE9;quivalent au pourcentage de la longueur sp&#xE9;cifi&#xE9;e. Comme je me souviens de mes le&#xE7;ons d&#x2019;&#xE9;criture de sc&#xE9;nario, je vais plut&#xF4;t vous montrer un exemple :</p> <p>Dans cet exemple, la hauteur du <code>div</code> serait exactement la moiti&#xE9; de la hauteur du <em>viewport</em> ; <code>1vh</code> = 1 % de la hauteur du <em>viewport</em>, donc il est logique que <code>50vh</code> soit l&#x2019;&#xE9;quivalent de 50 % de la hauteur du <em>viewport</em>.</p>
<p>Quand la taille du <em>viewport</em> change, celle de la valeur de l&#x2019;unit&#xE9; aussi. Mais l&#x2019;avantage par rapport aux pourcentages est de ne pas avoir &#xE0; se soucier des &#xE9;l&#xE9;ments parents : un &#xE9;l&#xE9;ment avec une largeur de <code>10vw</code> sera toujours de cette largeur quelle que soit celle de son conteneur.</p>
<p>Il existe aussi une unit&#xE9; <code>vmin</code>, &#xE9;quivalent &#xE0; la valeur minimale de <code>vh</code> ou <code>vw</code>, et une unit&#xE9; correspondante <code>vmax</code> devrait &#xEA;tre ajout&#xE9;e aux sp&#xE9;cifications (ce n&#x2019;est pas encore le cas au moment o&#xF9; j&#x2019;&#xE9;cris cet article <sup><a href="http://letrainde13h37.fr/25/traduction-apprendre-a-apprecier-les-parties-les-moins-sexy-de-css/#fn2" class="footnoteRef" id="fnref2">2</a></sup>).</p>
<p>&#xC0; l&#x2019;heure actuelle, ces unit&#xE9;s sont disponibles dans IE9+, Chrome et Safari 6.</p>
<h2 id="valeurs-calcul&#xE9;es">Valeurs calcul&#xE9;es</h2>
<p>Quand vous travaillez avec des mises en pages fluides ou <em>responsive</em>, vous rencontrerez certainement un probl&#xE8;me de m&#xE9;lange d&#x2019;unit&#xE9;s &#x2013; comme une grille aux dimensions en pourcentage avec des marges fixes.<br>Par exemple :</p> <div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="css">div <span>{</span> <span>margin</span><span>:</span> <span>0</span> <span>20px</span><span>;</span> <span>width</span><span>:</span> <span>33%</span><span>;</span> <span>}</span></pre></td></tr></table></div> <p>Si votre mise en page utilise uniquement des <code>padding</code> et des <code>border</code>, vous pouvez utiliser <code>box-sizing</code> pour vous aider &#xE0; contourner ce probl&#xE8;me de m&#xE9;lange, mais &#xE7;a ne vous aidera pas avec les <code>margin</code>. Une meilleure approche, plus flexible, consiste &#xE0; utiliser la fonction de valeur <code>calc()</code>, qui vous permet de r&#xE9;aliser des op&#xE9;rations math&#xE9;matiques comportant diff&#xE9;rentes unit&#xE9;s, comme par exemple :</p> <div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="css">div <span>{</span> <span>margin</span><span>:</span> <span>0</span> <span>20px</span><span>;</span> <span>width</span><span>:</span> calc<span>(</span><span>33%</span> - <span>40px</span><span>)</span><span>;</span>
<span>}</span></pre></td></tr></table></div> <p>Vous n&#x2019;&#xEA;tes pas tenu de l&#x2019;utiliser seulement sur les largeurs ; vous pouvez l&#x2019;utiliser partout o&#xF9; des unit&#xE9;s de longueur sont permises &#x2013; et si vous souhaitez vraiment passer de l&#x2019;autre c&#xF4;t&#xE9; du miroir vous pouvez utiliser <code>calc()</code> dans <code>calc()</code>.</p>
<p>IE9+ supporte cette fonction sans pr&#xE9;fixe (!), Firefox utilise le pr&#xE9;fixe <code>-moz-</code> (a priori jusqu&#x2019;&#xE0; la version 16 ou 17), et Chrome et Safari l&#x2019;impl&#xE9;mentent avec le pr&#xE9;fixe <code>-webkit-</code>. Par contre <a href="http://caniuse.com/#feat=calc">il n&#x2019;est apparemment toujours pas disponible dans une version mobile de Webkit</a>.</p>
<h2 id="charger-un-sous-ensemble-de-caract&#xE8;res">Charger un sous-ensemble de caract&#xE8;res</h2>
<p>La r&#xE9;activit&#xE9; a toujours &#xE9;t&#xE9; un param&#xE8;tre important, mais le grand nombre de mobiles sur le march&#xE9; &#x2013; chacun apportant son lot de variabilit&#xE9; et d&#x2019;incertitudes quant aux vitesses de connexion &#x2013; accentue le trait. Une fa&#xE7;on d&#x2019;acc&#xE9;l&#xE9;rer le chargement des pages est de limiter la taille des fichiers externes, ce qui rend une nouvelle propri&#xE9;t&#xE9; de <code>@font-face</code> permettant de r&#xE9;aliser cette op&#xE9;ration particuli&#xE8;rement appr&#xE9;ciable.</p>
<p>La propri&#xE9;t&#xE9; en question est <code>unicode-range</code> qui prend comme valeur un ensemble de r&#xE9;f&#xE9;rences de caract&#xE8;res Unicode. Lors de l&#x2019;appel d&#x2019;&#xE9;l&#xE9;ments externes, seuls les caract&#xE8;res sp&#xE9;cifi&#xE9;s sont charg&#xE9;s depuis le fichier de police au lieu de l&#x2019;ensemble complet. Voici le code qui explique comment ne charger que trois caract&#xE8;res depuis le fichier foo.ttf :</p> <div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="css"><span>@font-face {</span> <span>font-family</span><span>:</span> foo<span>;</span> src<span>:</span> <span>url</span><span>(</span><span>&apos;foo.ttf&apos;</span><span>)</span><span>;</span> unicode-range<span>:</span> U<span>+</span><span>31</span>-<span>33</span><span>;</span>
<span>}</span></pre></td></tr></table></div> <p>Ceci est particuli&#xE8;rement utile si vous utilisez <a href="http://net.tutsplus.com/tutorials/html-css-techniques/quick-tip-ever-thought-about-using-font-face-for-icons/">des polices d&#x2019;ic&#xF4;nes</a> et souhaitez seulement en montrer un sous-ensemble dans une page donn&#xE9;e. Lors d&#x2019;un test que j&#x2019;ai effectu&#xE9;, l&#x2019;utilisation de <code>unicode-range</code> a permis d&#x2019;&#xE9;conomiser 0,85 seconde sur le chargement d&#x2019;un fichier de police, ce qui n&#x2019;est pas sans cons&#xE9;quences. Bien entendu, ce r&#xE9;sultat peut varier suivant le contexte.</p>
<p>Cette propri&#xE9;t&#xE9; est actuellement impl&#xE9;ment&#xE9;e dans IE9+ et les navigateurs Webkit tels que Chrome et Safari.</p>
<h2 id="nouvelles-pseudo-classes">Nouvelles pseudo-classes</h2>
<p>Les unit&#xE9;s et valeurs sont bien sympas, mais ce sont les s&#xE9;lecteurs et les pseudo-classes qui m&#x2019;enthousiasment le plus. Trouver une combinaison de s&#xE9;lecteurs astucieuse, m&#xEA;me si elle reste cach&#xE9;e en un lieu que seuls quelques intr&#xE9;pides aventuriers pourront d&#xE9;couvrir, me fait me sentir tel un artiste. <a href="http://hbr.org/2012/04/the-real-leadership-lessons-of-steve-jobs/">Comme le disait le p&#xE8;re de Steve Jobs</a> : vous devriez vous assurer que la face arri&#xE8;re de la barri&#xE8;re est aussi bien peinte que la face avant m&#xEA;me si personne ne la verra, parce que VOUS vous le saurez.</p>
<p>La premi&#xE8;re fois que j&#x2019;ai utilis&#xE9; <code>:nth-of-type()</code>, j&#x2019;ai eu une r&#xE9;v&#xE9;lation, comme si j&#x2019;avais abattu les portes de la perception. OK, j&#x2019;exag&#xE8;re un peu. Mais certaines nouvelles pseudo-classes m&#xE9;ritent qu&#x2019;on s&#x2019;extasie.</p>
<h3 id="la-pseudo-classe-de-n&#xE9;gation">La pseudo-classe de n&#xE9;gation</h3>
<p>Vous ne r&#xE9;aliserez probablement pas &#xE0; quel point la pseudo-classe <code>:not()</code> est utile jusqu&#x2019;&#xE0; ce que vous l&#x2019;utilisiez. L&#x2019;argument pass&#xE9; &#xE0; <code>:not()</code> est un s&#xE9;lecteur simple, pas une combinaison. Quand une liste d&#x2019;&#xE9;l&#xE9;ments est construite par un s&#xE9;lecteur qui inclut <code>:not()</code>, tous les &#xE9;l&#xE9;ments correspondant &#xE0; l&#x2019;argument seront exclus de cette liste. Je sais, &#xE7;a m&#x2019;a paru compliqu&#xE9; aussi, mais en fait c&#x2019;est assez simple.</p>
<p>Imaginez ceci : vous avez une liste d&#x2019;&#xE9;l&#xE9;ments et vous souhaitez appliquer une r&#xE8;gle &#xE0; tous ses &#xE9;l&#xE9;ments impairs mais jamais au dernier &#xE9;l&#xE9;ment. Pour l&#x2019;instant, vous devriez faire quelque chose comme &#xE7;a :</p> <div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="css">li <span>{</span> <span>color</span><span>:</span> <span>#00F</span><span>;</span> <span>}</span>
li<span>:nth-</span>child<span>(</span>odd<span>)</span> <span>{</span> <span>color</span><span>:</span> <span>#F00</span><span>;</span> <span>}</span>
li<span>:last-child </span><span>{</span> <span>color</span><span>:</span> <span>#00F</span><span>;</span> <span>}</span></pre></td></tr></table></div> <p>Gr&#xE2;ce &#xE0; la pseudo-classe de n&#xE9;gation, vous pouvez exclure le dernier &#xE9;l&#xE9;ment de la liste en utilisant <code>:last-child</code> comme argument, ce qui r&#xE9;duira le nombre de r&#xE8;gles n&#xE9;cessaires et simplifiera un peu l&#x2019;entretien du code :</p> <div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="css">li <span>{</span> <span>color</span><span>:</span> <span>#00F</span><span>;</span> <span>}</span>
li<span>:nth-</span>child<span>(</span>odd<span>)</span><span>:</span>not<span>(</span><span>:last-</span>child<span>)</span> <span>{</span> <span>color</span><span>:</span> <span>#F00</span><span>;</span> <span>}</span></pre></td></tr></table></div> <p>Rien de tr&#xE8;s novateur, et comme je l&#x2019;ai montr&#xE9; on peut travailler sans, mais &#xE7;a reste assez utile. J&#x2019;ai eu l&#x2019;opportunit&#xE9; d&#x2019;utiliser cette pseudo-classe dans un projet reposant sur un Webkit embarqu&#xE9;, et elle a d&#xE9;montr&#xE9; son utilit&#xE9; de mani&#xE8;re constante. C&#x2019;est honn&#xEA;tement l&#x2019;une de mes pseudo-classes favorites.</p>
<p>Tout &#xE0; fait, j&#x2019;ai des pseudo-classes favorites.</p>
<p>C&#x2019;est la fonctionnalit&#xE9; la plus largement impl&#xE9;ment&#xE9;e de cet article : elle est pr&#xE9;sente dans IE9+ et tous les navigateurs modernes, sans pr&#xE9;fixe. Et si vous &#xEA;tes familier avec jQuery, vous avez probablement l&#x2019;habitude de l&#x2019;utiliser : elle y est pr&#xE9;sente depuis la version 1.0, ainsi que la m&#xE9;thode <code>not()</code> &#xE9;quivalente.</p> <p>La pseudo-class <code>:matches()</code> accepte comme argument un s&#xE9;lecteur simple, un s&#xE9;lecteur compos&#xE9;, une liste s&#xE9;par&#xE9;e par des virgules, ou une combinaison de ces &#xE9;l&#xE9;ments.<br>Super ! Mais elle fait quoi ?</p>
<p>Elle est surtout utile pour &#xE9;liminer les redondances dans les s&#xE9;lecteurs multiples. En guise d&#x2019;exemple concret, imaginez que vous ayez des &#xE9;l&#xE9;ments p dans diff&#xE9;rents containers mais que vous souhaitiez n&#x2019;en s&#xE9;lectionner que certains ; vous &#xE9;crirez peut-&#xEA;tre une r&#xE8;gle de style ressemblant &#xE0; &#xE7;a :</p> <div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="css"><span>.home</span> header p<span>,</span>
<span>.home</span> footer p<span>,</span>
<span>.home</span> aside p <span>{</span> <span>color</span><span>:</span> <span>#F00</span><span>;</span>
<span>}</span></pre></td></tr></table></div> <p>Avec <code>:matches()</code> vous pouvez consid&#xE9;rablement raccourcir cette r&#xE8;gle en trouvant les &#xE9;l&#xE9;ments communs &#xE0; ces s&#xE9;lecteurs ; dans notre exemple tous d&#xE9;butent par <code>.home</code>et finissent par <code>p</code>, nous pouvons donc utiliser <code>:matches()</code> pour agr&#xE9;ger tous les &#xE9;l&#xE9;ments interm&#xE9;diaires. D&#xE9;routant ? Voici &#xE0; quoi cela ressemblerait :</p> <div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="css"><span>.home</span> <span>:</span>matches<span>(</span>header<span>,</span>footer<span>,</span>aside<span>)</span> p <span>{</span> <span>color</span><span>:</span> <span>#F00</span><span>;</span> <span>}</span></pre></td></tr></table></div> <p>Cette pseudo-classe fait actuellement partie de CSS4 (S&#xE9;lecteurs CSS Niveau 4, pour &#xEA;tre pr&#xE9;cis), et dans la m&#xEA;me sp&#xE9;cification il est mentionn&#xE9; que l&#x2019;on pourra utiliser la m&#xEA;me syntaxe (s&#xE9;lecteurs compos&#xE9;s s&#xE9;par&#xE9;s par des virgules) dans les futures versions de <code>:not()</code>. Passionnant !</p>
<p>Aujourd&#x2019;hui, <code>:matches()</code> est disponible dans Chrome et Safari avec le pr&#xE9;fixe <code>-webkit-</code> et dans Firefox sous son ancien nom, <code>:any()</code>, avec le pr&#xE9;fixe <code>-moz-</code>.</p>
<h2 id="aimez-vous-enfin-les-figurants">Aimez-vous enfin les figurants ?</h2>
<p>La meilleure chose &#xE0; propos de toutes les nouvelles fonctionnalit&#xE9;s de cet article, c&#x2019;est qu&#x2019;elles r&#xE8;glent des probl&#xE9;mes r&#xE9;els, depuis la simple r&#xE9;p&#xE9;tition de s&#xE9;lecteurs jusqu&#x2019;aux nouveaux d&#xE9;fis de la construction de sites <em>responsive</em> &#xE0; haute-performance. En fait, je peux tout &#xE0; fait imaginer utiliser toutes ces fonctionnalit&#xE9;s de mani&#xE8;re parfaitement r&#xE9;currente.</p>
<p>Les nouvelles fonctionnalit&#xE9;s comme les filtres sont peut-&#xEA;tre plus visibles, mais il est bien plus probable que celles pr&#xE9;sent&#xE9;es ici vous soient utiles dans tous vos projets.</p>
<p>Chacune d&#x2019;entre elles facilitera votre vie professionnelle tout en &#xE9;largissant le champs des possibles, et c&#x2019;est assez sexy finalement, non ?</p>
<h2 id="notes">Notes</h2> </div>]]></description>
      <link>http://letrainde13h37.fr/25/traduction-apprendre-a-apprecier-les-parties-les-moins-sexy-de-css/</link>
      <guid>http://letrainde13h37.fr/25/traduction-apprendre-a-apprecier-les-parties-les-moins-sexy-de-css/</guid>
      <pubDate>Sat, 25 May 2013 11:05:00 +0200</pubDate>
    </item>
    <item>
      <title><![CDATA[Traduit ailleurs : Comprendre z-index et les contextes d'empilement]]></title>
      <description><![CDATA[<div><div class="article-text language-css"> <p>Cet article est une traduction de <a href="http://philipwalton.com/articles/what-no-one-told-you-about-z-index/">What No One Told You About Z-Index</a> &#xE9;crit par <a href="http://twitter.com/philwalton">Philip Walton</a> le 22 d&#xE9;cembre 2012.</p> <h2 id="ce-que-personne-ne-vous-dit-sur-z-index">Ce que personne ne vous a dit sur z-index<a href="http://iamvdo.me/blog/comprendre-z-index-et-les-contextes-dempilement#ce-que-personne-ne-vous-dit-sur-z-index" class="self-link"></a></h2>
<p>Le probl&#xE8;me avec <code>z-index</code>, c&#x2019;est que tr&#xE8;s peu de personnes ont r&#xE9;ellement compris son fonctionnement. Ce n&#x2019;est pas tr&#xE8;s compliqu&#xE9;, mais si vous n&#x2019;avez jamais pris le temps de lire la sp&#xE9;cification, il y a certainement des aspects cruciaux qui vous ont &#xE9;chapp&#xE9;. </p>
<p>Vous ne me croyez pas? Ok, voyons si vous pouvez r&#xE9;soudre ce probl&#xE8;me? </p>
<h2 id="le-probleme">Le probl&#xE8;me<a href="http://iamvdo.me/blog/comprendre-z-index-et-les-contextes-dempilement#le-probleme" class="self-link"></a></h2>
<p>Dans le HTML suivant, vous avez trois <code>&lt;div&gt;</code>, et chaque <code>&lt;div&gt;</code> contient un seul &#xE9;l&#xE9;ment <code>&lt;span&gt;</code>. Chaque <code>&lt;span&gt;</code> a sa propre couleur d&#x2019;arri&#xE8;re-plan, respectivement rouge, vert et bleu. Chaque <code>&lt;span&gt;</code> est positionn&#xE9; de mani&#xE8;re absolue pr&#xE8;s du coin haut gauche du document, de mani&#xE8;re &#xE0; chevaucher l&#xE9;g&#xE8;rement un autre &#xE9;l&#xE9;ment <code>&lt;span&gt;</code>, ce qui permet de bien distinguer l&#x2019;empilement. Le premier <code>&lt;span&gt;</code> a une valeur de <code>z-index</code> de 1, alors que les deux autres non pas de <code>z-index</code> d&#xE9;fini. </p>
<p>Voici &#xE0; quoi ressemble le HTML et le CSS. J&#x2019;ai &#xE9;galement inclus une d&#xE9;mo du rendu (via <a href="http://codepen.io/">CodePen</a>)</p>
<pre class="language-markup"><code>&lt;div&gt; &lt;span class=&quot;red&quot;&gt;Red&lt;/span&gt;
&lt;/div&gt;
&lt;div&gt; &lt;span class=&quot;green&quot;&gt;Green&lt;/span&gt;
&lt;/div&gt;
&lt;div&gt; &lt;span class=&quot;blue&quot;&gt;Blue&lt;/span&gt;
&lt;/div&gt;
</code></pre>
<pre><code>.red, .green, .blue { position: absolute;
}
.red { background: red; z-index: 1;
}
.green { background: green;
}
.blue { background: blue;
}</code></pre>
<div class="codepen-placeholder"><p class="codepen">See the Pen <a href="http://codepen.io/philipwalton/pen/ksBaI">ksBaI</a> by philipwalton (<a href="http://codepen.io/philipwalton">@philipwalton</a>) on <a href="http://codepen.io/">CodePen</a></p></div>
<p><strong>Le challenge:</strong> essayez de faire passer le <code>&lt;span&gt;</code> rouge derri&#xE8;re les &#xE9;l&#xE9;ments bleu et vert en respectant ces r&#xE8;gles:</p>
<ul>
<li>Ne pas modifier le code HTML</li>
<li>Ne pas ajouter ni modifier la propri&#xE9;t&#xE9; <code>z-index</code>, sur aucun &#xE9;l&#xE9;ment</li>
<li>Ne pas ajouter ni modifier la propri&#xE9;t&#xE9; <code>position</code>, sur aucun &#xE9;l&#xE9;ment</li>
</ul>
<p>Pour v&#xE9;rifier que vous avez bien compris, cliquez sur &#xAB;Edit on CodePen&#xBB; et jouez un peu avec. Le r&#xE9;sultat doit &#xEA;tre identique &#xE0; l&#x2019;exemple ci-dessous:</p>
<p><em>Attention: Ne cliquez pas sur l&#x2019;onglet CSS dans l&#x2019;exemple ci-dessous au risque de d&#xE9;voiler la solution.</em></p>
<div class="codepen-placeholder"><p class="codepen">See the Pen <a href="http://codepen.io/philipwalton/pen/dfCtb">dfCtb</a> by philipwalton (<a href="http://codepen.io/philipwalton">@philipwalton</a>) on <a href="http://codepen.io/">CodePen</a></p></div>
<h2 id="la-solution">La solution<a href="http://iamvdo.me/blog/comprendre-z-index-et-les-contextes-dempilement#la-solution" class="self-link"></a></h2>
<p>La solution est d&#x2019;ajouter une valeur d&#x2019;opacit&#xE9; inf&#xE9;rieure &#xE0; 1 sur la premi&#xE8;re <code>&lt;div&gt;</code> (le parent du <code>&lt;span&gt;</code> rouge). Voici le CSS du CodePen ci-dessus: </p>
<pre><code>div:first-child{ opacity: .99;
} </code></pre>
<p>Si vous &#xEA;tes perplexe et n&#x2019;aviez jamais pens&#xE9; que l&#x2019;opacit&#xE9; avait un impact sur l&#x2019;ordre d&#x2019;empilement des &#xE9;l&#xE9;ments, bienvenue au club. J&#x2019;ai eu la m&#xEA;me r&#xE9;action quand je suis tomber pour la premi&#xE8;re fois sur ce cas.</p>
<p>Heureusement, la suite de l&#x2019;article va clarifier les choses.</p>
<h2 id="ordre-dempilement-stacking-order">Ordre d&#x2019;empilement (Stacking order)<a href="http://iamvdo.me/blog/comprendre-z-index-et-les-contextes-dempilement#ordre-dempilement-stacking-order" class="self-link"></a></h2>
<p><code>z-index</code> semble tr&#xE8;s simple: les &#xE9;l&#xE9;ments avec un <code>z-index</code> plus &#xE9;l&#xE9;v&#xE9; apparaissent devant les &#xE9;l&#xE9;ments avec un <code>z-index</code> plus faible. Et bien en fait, non. Et c&#x2019;est bien l&#xE0; le probl&#xE8;me de <code>z-index</code>. &#xC7;a parait tellement simple, que beaucoup de d&#xE9;veloppeurs ne prennent pas le temps de lire les d&#xE9;tails.</p>
<p>Chaque &#xE9;l&#xE9;ment HTML peut &#xEA;tre devant ou derri&#xE8;re un autre &#xE9;l&#xE9;ment du document. C&#x2019;est ce que l&#x2019;on appelle l&#x2019;ordre d&#x2019;empilement. Les r&#xE8;gles qui d&#xE9;finissent cet ordre sont plut&#xF4;t bien d&#xE9;finies dans la sp&#xE9;cification, mais comme je l&#x2019;ai d&#xE9;j&#xE0; mentionn&#xE9;, elles ne sont pas bien comprises par la plupart des d&#xE9;veloppeurs web.</p>
<p>Quand les propri&#xE9;t&#xE9;s <code>z-index</code> et <code>position</code> ne sont pas utilis&#xE9;es, les r&#xE8;gles sont plut&#xF4;t simples: l&#x2019;ordre d&#x2019;empilement est identique &#xE0; l&#x2019;ordre d&#x2019;apparition dans le HTML. (OK, c&#x2019;est en fait <a href="http://www.w3.org/TR/CSS2/zindex.html">un peu plus compliqu&#xE9; que cela</a>, mais tant que vous n&#x2019;utilisez pas des marges n&#xE9;gatives pour superposer des &#xE9;l&#xE9;ments en ligne, vous ne rencontrerez jamais ce genre de cas l&#xE0;)</p>
<p>Quand vous commencez &#xE0; utiliser la propri&#xE9;t&#xE9; <code>position</code>, les &#xE9;l&#xE9;ments positionn&#xE9;s (et ses enfants) sont affich&#xE9;s devant les &#xE9;l&#xE9;ments non-positionn&#xE9;s. (Un &#xE9;l&#xE9;ment est consid&#xE9;r&#xE9; &#xAB;positionn&#xE9;&#xBB; lorsque que la valeur de la propri&#xE9;t&#xE9; <code>position</code> est diff&#xE9;rente de <code>static</code>, comme par exemple <code>relative</code>, <code>absolute</code>, etc.)</p>
<p>Enfin, lorsque <code>z-index</code> est associ&#xE9;, les choses deviennent plus d&#xE9;licates. D&#x2019;abord, il est naturel de penser que les &#xE9;l&#xE9;ments avec un <code>z-index</code> plus &#xE9;lev&#xE9; apparaissent devant les &#xE9;l&#xE9;ments avec un <code>z-index</code> plus faible, et que les &#xE9;l&#xE9;ments qui ont un <code>z-index</code> sont affich&#xE9;s devant les &#xE9;l&#xE9;ments qui n&#x2019;en ont pas, mais ce n&#x2019;est pas si simple. Premi&#xE8;rement, le <code>z-index</code> ne fonctionne que sur les &#xE9;l&#xE9;ments positionn&#xE9;s. Si vous tentez d&#x2019;appliquer un <code>z-index</code> sans position d&#xE9;finie, il ne se passera rien. Deuxi&#xE8;mement, les valeurs de <code>z-index</code> peuvent cr&#xE9;er un contexte d&#x2019;empilement, et subitement les choses deviennent l&#xE9;g&#xE8;rement plus compliqu&#xE9;es.</p>
<h2 id="contextes-dempilement-stacking-contexts">Contextes d&#x2019;empilement (Stacking contexts)<a href="http://iamvdo.me/blog/comprendre-z-index-et-les-contextes-dempilement#contextes-dempilement-stacking-contexts" class="self-link"></a></h2>
<p>Un groupe d&#x2019;&#xE9;l&#xE9;ments qui ont un parent commun qui se d&#xE9;place d&#x2019;avant en arri&#xE8;re dans l&#x2019;ordre d&#x2019;empilement est ce que l&#x2019;on appelle un contexte d&#x2019;empilement. Une bonne compr&#xE9;hension des contextes d&#x2019;empilement est la cl&#xE9; pour vraiment saisir la mani&#xE8;re dont le <code>z-index</code> fonctionne.</p>
<p>Chaque contexte d&#x2019;empilement a un &#xE9;l&#xE9;ment HTML unique comme racine. Lorsque un nouveau contexte d&#x2019;empilement est cr&#xE9;&#xE9; sur un &#xE9;l&#xE9;ment, cela contraint ses enfants &#xE0; appara&#xEE;tre &#xE0; un endroit pr&#xE9;cis dans l&#x2019;ordre d&#x2019;empilement. Cela signifie qu&#x2019;un &#xE9;l&#xE9;ment au sein d&#x2019;un contexte d&#x2019;empilement, qui est le plus bas dans l&#x2019;ordre d&#x2019;empilement, ne peut pas &#xEA;tre affich&#xE9; devant un &#xE9;l&#xE9;ment qui est dans un autre contexte d&#x2019;empilement affich&#xE9; plus haut, m&#xEA;me avec un <code>z-index</code> tr&#xE8;s important.</p>
<p>De nouveaux contextes d&#x2019;empilement peuvent &#xEA;tres cr&#xE9;&#xE9;s:</p>
<ul>
<li>Lorsque un &#xE9;l&#xE9;ment est la racine du document (l&#x2019;&#xE9;l&#xE9;ment <code>&lt;html&gt;</code>)</li>
<li>Lorsque un &#xE9;l&#xE9;ment dont la valeur de la propri&#xE9;t&#xE9; <code>position</code> est diff&#xE9;rente de <code>static</code> et lorsque <code>z-index</code> est diff&#xE9;rent de <code>auto</code>.</li>
<li>Lorsque un &#xE9;l&#xE9;ment &#xE0; une opacit&#xE9; inf&#xE9;rieure &#xE0; 1</li>
</ul>
<p>La premi&#xE8;re et la seconde fa&#xE7;on de cr&#xE9;er un contexte d&#x2019;empilement sont plut&#xF4;t claires et sont g&#xE9;n&#xE9;ralement connues des d&#xE9;veloppeurs web (m&#xEA;mes s&#x2019;ils ne savent pas forc&#xE9;ment que &#xE7;a a un nom).</p>
<p>La troisi&#xE8;me fa&#xE7;on (l&#x2019;opacit&#xE9;) n&#x2019;est presque jamais &#xE9;voqu&#xE9;e hors des sp&#xE9;cifications du W3C.</p> <p><strong>Note personnelle de traduction</strong>: Il existe d&#x2019;autres r&#xE8;gles qui cr&#xE9;e un contexte d&#x2019;empilement (en CSS3):</p>
<ul>
<li>Lorsque un &#xE9;l&#xE9;ment dont la valeur de la propri&#xE9;t&#xE9; <code>transform</code> est diff&#xE9;rente de <code>none</code></li>
<li>Lorsque un &#xE9;l&#xE9;ment dont la valeur de la propri&#xE9;t&#xE9; <code>transform-style</code> vaut <code>preserve-3d</code></li>
<li>Lorsque un &#xE9;l&#xE9;ment dont la valeur de la propri&#xE9;t&#xE9; <code>filter</code> est diff&#xE9;rente de <code>none</code></li>
<li>Lorsque un &#xE9;l&#xE9;ment, enfant d&#x2019;un Flexbox, dont la valeur de la propri&#xE9;t&#xE9; <code>z-index</code> est diff&#xE9;rente de <code>auto</code> (m&#xEA;me si la valeur de la propri&#xE9;t&#xE9; <code>position</code> est <code>static</code>)</li>
<li>Lors de l&#x2019;utilisation des propri&#xE9;t&#xE9;s <code>clip-path</code>, <code>mask</code> ou <code>mask-image</code></li>
<li>et d&#x2019;autres&#x2026;</li>
</ul> <h2 id="definir-lordre-dempilement-dun-element">D&#xE9;finir l&#x2019;ordre d&#x2019;empilement d&#x2019;un &#xE9;l&#xE9;ment<a href="http://iamvdo.me/blog/comprendre-z-index-et-les-contextes-dempilement#definir-lordre-dempilement-dun-element" class="self-link"></a></h2>
<p>R&#xE9;ussir &#xE0; d&#xE9;terminer l&#x2019;ordre d&#x2019;affichage pour chaque &#xE9;l&#xE9;ment d&#x2019;une page (y compris les bordures, les arri&#xE8;re-plans, les textes, etc.) est tr&#xE8;s difficile et tr&#xE8;s loin du cadre de cet article (je vous renvoie une nouvelle fois &#xE0; <a href="http://www.w3.org/TR/CSS2/zindex.html">la sp&#xE9;cification</a>).</p>
<p>Mais dans la plupart des cas, une compr&#xE9;hension de base peut permettre de pr&#xE9;voir plus facilement le d&#xE9;veloppement CSS. Commen&#xE7;ons donc par d&#xE9;finir l&#x2019;ordre d&#x2019;affichage au sein de chaque contexte d&#x2019;empilement.</p>
<h3 id="ordre-dempilement-au-sein-du-meme-contexte-dempilement">Ordre d&#x2019;empilement au sein du m&#xEA;me contexte d&#x2019;empilement<a href="http://iamvdo.me/blog/comprendre-z-index-et-les-contextes-dempilement#ordre-dempilement-au-sein-du-meme-contexte-dempilement" class="self-link"></a></h3>
<p>Voici les r&#xE8;gles qui d&#xE9;finissent l&#x2019;ordre d&#x2019;affichage pour un contexte d&#x2019;empilement (du bas vers le haut):</p>
<ul>
<li>L&#x2019;&#xE9;l&#xE9;ment racine du contexte d&#x2019;empilement</li>
<li>Les &#xE9;l&#xE9;ments positionn&#xE9;s (et ses enfants) avec un <code>z-index</code> n&#xE9;gatif (les valeurs les plus hautes sont affich&#xE9;es devant les plus basses; les &#xE9;l&#xE9;ments avec le m&#xEA;me <code>z-index</code> sont affich&#xE9;s en suivant l&#x2019;ordre du HTML)</li>
<li>Les &#xE9;l&#xE9;ments non-positionn&#xE9;s (en suivant l&#x2019;ordre du HTML)</li>
<li>Les &#xE9;l&#xE9;ments positionn&#xE9;s (et ses enfants) avec un <code>z-index</code> dont la valeur est <code>auto</code> (en suivant l&#x2019;ordre du HTML)</li>
<li>Les &#xE9;l&#xE9;ments positionn&#xE9;s (et ses enfants) avec un <code>z-index</code> positif (les valeurs les plus hautes sont affich&#xE9;es devant les plus basses; les &#xE9;l&#xE9;ments avec le m&#xEA;me <code>z-index</code> sont affich&#xE9;s en suivant l&#x2019;ordre du HTML)</li>
</ul>
<p>Note: les &#xE9;l&#xE9;ments positionn&#xE9;s avec un <code>z-index</code> n&#xE9;gatif sont affich&#xE9;s en premier dans le contexte d&#x2019;empilement, ce qui signifie qu&#x2019;ils apparaissent derri&#xE8;re tous les autres &#xE9;l&#xE9;ments. Gr&#xE2;ce &#xE0; cela, il devient possible qu&#x2019;un &#xE9;l&#xE9;ment soit affich&#xE9; derri&#xE8;re son parent, ce qui est normalement impossible. Cela fonctionne uniquement si le parent est dans le m&#xEA;me contexte d&#x2019;empilement et si ce parent n&#x2019;est pas l&#x2019;&#xE9;l&#xE9;ment racine du contexte d&#x2019;empilement. Un tr&#xE8;s bon exemple de cette technique est <a href="http://nicolasgallagher.com/css-drop-shadows-without-images/demo/">la cr&#xE9;ation d&#x2019;ombres sans images</a> par Nicolas Gallagher.</p>
<h3 id="ordre-dempilement-global">Ordre d&#x2019;empilement global<a href="http://iamvdo.me/blog/comprendre-z-index-et-les-contextes-dempilement#ordre-dempilement-global" class="self-link"></a></h3>
<p>Avec une solide compr&#xE9;hension sur la cr&#xE9;ation de nouveaux contextes d&#x2019;empilement ainsi qu&#x2019;une ma&#xEE;trise de l&#x2019;ordre d&#x2019;empilement au sein d&#x2019;un contexte d&#x2019;empilement, il devient assez facile de d&#xE9;terminer l&#x2019;ordre d&#x2019;empilement global des &#xE9;l&#xE9;ments.</p>
<p>La cl&#xE9; de la r&#xE9;ussite est d&#x2019;&#xEA;tre capable de rep&#xE9;rer quand de nouveaux contextes d&#x2019;empilement sont cr&#xE9;&#xE9;s. Si vous appliquez un <code>z-index</code> d&#x2019;un milliard sur un &#xE9;l&#xE9;ment et que l&#x2019;ordre de cet &#xE9;l&#xE9;ment n&#x2019;est pas affect&#xE9;, v&#xE9;rifiez si l&#x2019;un de ses parents ne cr&#xE9;e pas un contexte d&#x2019;empilement. Si c&#x2019;est le cas, votre <code>z-index</code> ne vous sera pas d&#x2019;une grande aide.</p>
<h2 id="pour-conclure">Pour conclure<a href="http://iamvdo.me/blog/comprendre-z-index-et-les-contextes-dempilement#pour-conclure" class="self-link"></a></h2>
<p>Revenons au probl&#xE8;me initial, j&#x2019;ai recr&#xE9;&#xE9; la structure HTML en ajoutant des commentaires pour chaque balise qui indique son ordre d&#x2019;empilement. Cet ordre se base sur le CSS d&#x2019;origine.</p>
<pre class="language-markup"><code>&lt;div&gt;&lt;!-- 1 --&gt; &lt;span class=&quot;red&quot;&gt;&lt;!-- 6 --&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div&gt;&lt;!-- 2 --&gt; &lt;span class=&quot;green&quot;&gt;&lt;!-- 4 --&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div&gt;&lt;!-- 3 --&gt; &lt;span class=&quot;blue&quot;&gt;&lt;!-- 5 --&gt;&lt;/span&gt;
&lt;/div&gt;</code></pre>
<p>Lorsque nous appliquons la propri&#xE9;t&#xE9; opacit&#xE9; sur la premi&#xE8;re <code>&lt;div&gt;</code>, l&#x2019;ordre d&#x2019;empilement est modifi&#xE9; de cette fa&#xE7;on: </p>
<pre class="language-markup"><code>&lt;div&gt;&lt;!-- 1 --&gt; &lt;span class=&quot;red&quot;&gt;&lt;!-- 1.1 --&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div&gt;&lt;!-- 2 --&gt; &lt;span class=&quot;green&quot;&gt;&lt;!-- 4 --&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;div&gt;&lt;!-- 3 --&gt; &lt;span class=&quot;blue&quot;&gt;&lt;!-- 5 --&gt;&lt;/span&gt;
&lt;/div&gt;</code></pre>
<p>Le <code>span.red</code>, initialement en position 6, se retrouve en 1.1. J&#x2019;ai utilis&#xE9; ici la notation avec un point pour bien symboliser la cr&#xE9;ation d&#x2019;un nouveau contexte d&#x2019;empilement o&#xF9; <code>span.red</code> devient le premier &#xE9;l&#xE9;ment au sein de ce contexte.</p>
<p>C&#x2019;est donc maintenant un peu plus clair sur pourquoi l&#x2019;&#xE9;l&#xE9;ment rouge est affich&#xE9; sous les autres &#xE9;l&#xE9;ments. L&#x2019;exemple original contenait seulement deux contextes d&#x2019;empilement, le contexte racine et celui form&#xE9; par le <code>span.red</code>. Avec l&#x2019;ajout de l&#x2019;opacit&#xE9; sur le parent de <code>span.red</code>, nous avons cr&#xE9;&#xE9; un troisi&#xE8;me contexte, et donc, le <code>z-index</code> du <code>span.red</code> est uniquement actif au sein de ce nouveau contexte. Du fait que la premi&#xE8;re <code>&lt;div&gt;</code> (celle o&#xF9; l&#x2019;opacit&#xE9; est appliqu&#xE9;e) et ses &#xE9;l&#xE9;ments fr&#xE8;res ne sont ni positionn&#xE9;s ni n&#x2019;ont de <code>z-index</code>, leur ordre d&#x2019;affichage est celui du HTML, ce qui signifie que la premi&#xE8;re <code>&lt;div&gt;</code>, et tous ses enfants contenus dans le contexte d&#x2019;empilement, sont affich&#xE9;s sous la deuxi&#xE8;me et la troisi&#xE8;me <code>&lt;div&gt;</code>.</p>
<h2 id="ressources-complementaires">Ressources compl&#xE9;mentaires<a href="http://iamvdo.me/blog/comprendre-z-index-et-les-contextes-dempilement#ressources-complementaires" class="self-link"></a></h2> <p>Je me permets &#xE9;galement de vous proposer mon article complet sur les subtilit&#xE9;s de CSS:</p>
<ul>
<li><a href="http://iamvdo.me/blog/ce-que-vous-avez-toujours-voulu-savoir-sur-css">Ce que vous avez toujours voulu savoir sur CSS</a></li>
</ul> </div></div>]]></description>
      <link>http://iamvdo.me/blog/comprendre-z-index-et-les-contextes-dempilement</link>
      <guid>http://iamvdo.me/blog/comprendre-z-index-et-les-contextes-dempilement</guid>
      <pubDate>Sun, 17 Feb 2013 03:02:00 +0100</pubDate>
    </item>
    <item>
      <title><![CDATA[Traduit ailleurs : Outline none]]></title>
      <description><![CDATA[<body class="domraider"> </body>]]></description>
      <link>http://www.outlinenone.fr/</link>
      <guid>http://www.outlinenone.fr/</guid>
      <pubDate>Wed, 14 Nov 2012 11:11:00 +0100</pubDate>
    </item>
  </channel>
</rss>
