<?xml 
version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.pompage.net/spip.php?page=backend.xslt" ?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>pompage.net</title>
	<link>http://www.pompage.net/</link>
	<description>le web design puis&#233; &#224; la source</description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="http://www.pompage.net/spip.php?page=backend" rel="self" type="application/rss+xml" />

	<image>
		<title>pompage.net</title>
		<url>http://www.pompage.net/local/cache-vignettes/L144xH85/siteon0-bd12c.png?1763125863</url>
		<link>http://www.pompage.net/</link>
		<height>85</height>
		<width>144</width>
	</image>



<item xml:lang="fr">
		<title>De l'audit de contenu aux id&#233;es de design :</title>
		<link>http://www.pompage.net/traduction/de-l-audit-de-contenu-aux-idees-de-design</link>
		<guid isPermaLink="true">http://www.pompage.net/traduction/de-l-audit-de-contenu-aux-idees-de-design</guid>
		<dc:date>2015-10-21T08:40:29Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Evren Kiefer, Frank Taillandier</dc:creator>


		<dc:subject>strat&#233;gie de contenu</dc:subject>
		<dc:subject>Christopher Detzi</dc:subject>

		<description>
&lt;p&gt;Tout au long de ma carri&#232;re, j'ai g&#233;n&#233;ralement compris la valeur apport&#233;e par un audit de contenu (qu'on le fasse ou qu'on en b&#233;n&#233;ficie) dans le cadre du redesign d'un site web. Un audit de contenu est une &#233;valuation du contenu d'un site, &#224; la fois, d'un point de vue quantitatif (par exemple &#8220;Combien de contenu est pr&#233;sent ?&#8221;) et qualitatif (par exemple &#8220;Est-ce qu'il est bon ?&#8221;). Par contre, ce qui n'est souvent pas bien discut&#233; ou compris &#224; propos des audits de contenu ce sont les b&#233;n&#233;fices (&#8230;)&lt;/p&gt;


-
&lt;a href="http://www.pompage.net/traduction/" rel="directory"&gt;Traduction&lt;/a&gt;

/ 
&lt;a href="http://www.pompage.net/tag/strategie-de-contenu" rel="tag"&gt;strat&#233;gie de contenu&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/tag/christopher-detzi" rel="tag"&gt;Christopher Detzi&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Tout au long de ma carri&#232;re, j'ai g&#233;n&#233;ralement compris la valeur apport&#233;e par un audit de contenu (qu'on le fasse ou qu'on en b&#233;n&#233;ficie) dans le cadre du redesign d'un site web. Un audit de contenu est une &#233;valuation du contenu d'un site, &#224; la fois, d'un point de vue quantitatif (par exemple &#8220;Combien de contenu est pr&#233;sent ?&#8221;) et qualitatif (par exemple &#8220;Est-ce qu'il est bon ?&#8221;). Par contre, ce qui n'est souvent pas bien discut&#233; ou compris &#224; propos des audits de contenu ce sont les b&#233;n&#233;fices significatifs qu'ils procurent au del&#224; de la simple &#233;valuation de quantit&#233; et de qualit&#233;.&lt;/p&gt;
&lt;p&gt;Dans un projet r&#233;cent sur lequel j'ai travaill&#233;, l'audit de contenu a &#233;t&#233; crucial pour faciliter les discussions strat&#233;giques sur la direction du design. Ces conversations auraient &#233;t&#233; beaucoup plus difficiles sans avoir l'audit de contenu complet. Nous avons utiliser l'audit de plusieurs fa&#231;ons, chacune tr&#232;s importante pour guider nos efforts :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; R&#233;v&#233;ler la vraie ampleur du contenu du site (il y en avait moins que nous le pensions)&lt;/li&gt;&lt;li&gt; Clarifier et affiner la port&#233;e du projet (le point cl&#233; a &#233;t&#233; diff&#233;rent de celui auquel nous nous attendions)&lt;/li&gt;&lt;li&gt; Faciliter les discussions strat&#233;giques sur les objectifs de design et la direction (qui &#233;taient diff&#233;rents de ceux que les parties prenantes avaient imagin&#233;es)&lt;/li&gt;&lt;li&gt; &#201;tablir un langage commun &#224; toute l'&#233;quipe pour la dur&#233;e du projet (cela s'est r&#233;v&#233;l&#233; plus compliqu&#233; que nous l'avions anticip&#233;)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Je vais utiliser ce projet comme mod&#232;le pour mettre en &#233;vidence comment mener et utiliser les audits de contenu dans le contexte d'un projet de redesign de site web.&lt;/p&gt;
&lt;h2&gt;Le Projet&lt;/h2&gt;
&lt;p&gt;La t&#226;che &#233;tait immense : revigorer et rendre pertinent un intranet poussi&#233;reux pour les employ&#233;s qui avait &#233;t&#233; une d&#233;charge &#224; contenus sans r&#233;glementation pendant dix ans. La n&#233;gligence de longue date avait fait des ravages et les utilisateurs du site avaient tout simplement arr&#234;t&#233; de l'utiliser. Les probl&#232;mes &#233;taient &#233;vidents :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Les employ&#233;s ne pouvaient pas trouver les informations dont ils avaient besoin,&lt;/li&gt;&lt;li&gt; Les informations qu'ils trouvaient n'&#233;taient pas &#224; jour ou pas pertinentes,&lt;/li&gt;&lt;li&gt; Le contenu &#233;tait cat&#233;goris&#233;, structur&#233; et affich&#233; de fa&#231;on incoh&#233;rente,&lt;/li&gt;&lt;li&gt; Les employ&#233;s allaient ailleurs pour trouver ce dont ils avaient besoin.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Le processus&lt;/h2&gt;
&lt;p&gt;Un audit de contenu commence avec un catalogue (ou un inventaire) du contenu du site. Cela peut &#234;tre un processus laborieux et chronophage suivant le volume de contenu qui se trouve sur la site. Beaucoup de designers avec lesquels j'ai travaill&#233; admettent &#224; contrec&#339;ur la valeur de cette activit&#233; mais elle se retrouve mise de c&#244;t&#233; parce qu'elle est per&#231;ue comme un investissement en temps trop important par rapport &#224; sa valeur. D'une mani&#232;re ou d'une autre, cette perception est exacte. Un inventaire du contenu du site sur un tableur n'est qu'un amas de donn&#233;es brutes. Il n'indique pas grand chose sur le contenu au del&#224; de ce qui s'y trouve. Le travail difficile et, finalement, le b&#233;n&#233;fice d&#233;pendent de la d&#233;couverte de p&#233;pites de sagesse qui se trouvent dans les donn&#233;es brutes.&lt;/p&gt;
&lt;p&gt;Nous pouvons faire cela en utilisant l'audit de contenu comme plate-forme pour faciliter des conversations souvent difficiles avec les parties prenantes sur la mission du site, les priorit&#233;s des utilisateurs et les contraintes et opportunit&#233;s op&#233;rationnelles.&lt;/p&gt;
&lt;p&gt;Il existe de nombreuses fa&#231;ons de d&#233;couper et analyser le contenu d'un site web pour faciliter ces discussions et &#233;clairer les d&#233;cisions de design. Voici les domaines que je consid&#232;re &#234;tre les plus efficaces dans le contexte d'un redesign de site web :&lt;/p&gt;
&lt;h4&gt;Identifier et documenter le volume et le type des contenus&lt;/h4&gt;
&lt;p&gt;Au d&#233;but de tout redesign, il y a souvent de grandes exag&#233;rations par rapport au volume de contenu dont il faudra s'occuper. Ces opinions ont tendance &#224; provoquer de l'anxi&#233;t&#233;, &#224; accabler les membres de l'&#233;quipe et elles sont souvent la raison pour laquelle la perspective de finir des audits de contenu est tr&#232;s rapidement &#233;cart&#233;e. Avoir des donn&#233;es sur le volume r&#233;el de contenu donne un nombre r&#233;el que tous les membres de l'&#233;quipe peuvent consid&#233;rer objectivement et utiliser pour la planification.&lt;/p&gt;
&lt;div class='spip_document_470 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH381/volume_602_fr-ac6a5.png?1763243337' width='500' height='381' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Sur ce projet d'intranet, nous avons imm&#233;diatement r&#233;alis&#233; que les chiffres avaient &#233;t&#233; grandement surestim&#233;s. Le site &#233;tait gros mais pas aussi gros que tout le monde le pensait. Plus de 60% des &#8220;pages&#8221; &#233;taient, en fait, des fichiers PDF ou Microsoft Office, dont une grande partie &#233;taient des duplicatas de pages HTML existantes. Cette d&#233;couverte a aid&#233; &#224; clarifier l'ampleur de notre t&#226;che.&lt;/p&gt;
&lt;p&gt;Une fois que nous avons tri&#233; et r&#233;colt&#233; le contenu du site, l'&#233;tape suivante &#233;tait de l'utiliser pour faciliter les discussions sur les plans futurs pour le contenu :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Tout ce contenu est-il encore pertinent ? Quels besoins d'affaire, de client ou d'employ&#233; aide-t-il &#224; r&#233;soudre ?&lt;/li&gt;&lt;li&gt; Quels nouveaux contenus devront &#234;tre cr&#233;&#233;s dans les prochains mois ? D'o&#249; viennent ces besoins ?&lt;/li&gt;&lt;li&gt; Qu'est-ce qui motive les d&#233;cisions sur les types de fichiers et/ou les variations existantes de format ? Est-ce que ces d&#233;cisions sont encore d'actualit&#233; ?&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Identifier et documenter la structure actuelle du contenu&lt;/h4&gt;
&lt;p&gt;Il y a toujours un semblant de structure, m&#234;me sur les sites mal con&#231;us. Cr&#233;er des repr&#233;sentations visuelles de ces structures et de leurs principes d'organisation r&#233;v&#232;le souvent des probl&#232;mes ou des bizarreries qui pourront aider &#224; orienter vers la solution de conception.&lt;/p&gt;
&lt;div class='spip_document_471 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH354/structure_602_fr-70d7c.png?1763243337' width='500' height='354' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Sur le projet d'intranet, nous avons d&#233;couverts que l'organisation du contenu avait &#233;t&#233; mal con&#231;ue et n'&#233;tait pas adapt&#233;e aux r&#233;alit&#233;s op&#233;rationnelles. Par exemple, il y avait neuf aires de contenu, par ailleurs, plus de 50% du contenu &#233;tait dans une seule de ces aires. Cette distribution d&#233;s&#233;quilibr&#233;e cr&#233;ait trop de couches de navigation et contribuait &#224; une mauvaise exp&#233;rience de d&#233;couverte et de retour vers les contenus.&lt;/p&gt;
&lt;p&gt;Une fois que vous avez une repr&#233;sentation visuelle de la fa&#231;on dont le contenu est structur&#233; et organis&#233;, vous pouvez l'utiliser pour faciliter les discussions suivantes :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Pourquoi le contenu a-t-il &#233;t&#233; organis&#233; de cette fa&#231;on ? Qu'est-ce qui a initialement conduit &#224; prendre ces d&#233;cisions ?&lt;/li&gt;&lt;li&gt; Quelles informations ont &#233;t&#233; difficiles &#224; classer et &#224; organiser dans ce syst&#232;me ?&lt;/li&gt;&lt;li&gt; Quels sont les types de contenu les plus importants par rapport aux objectifs commerciaux ?&lt;/li&gt;&lt;li&gt; Qu'est-ce que les gens vous ont dit &#224; propos de l'organisation actuelle du contenu ?&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;D&#233;terminer si le contenu est utilis&#233;&lt;/h4&gt;
&lt;p&gt;Avoir l'inventaire de contenu (URLs de production incluses) donnent une carte et un point de r&#233;f&#233;rence pour les statistiques du site. M&#234;me si ces rapports peuvent parfois &#234;tre mal interpr&#233;t&#233;s, ils donnent une id&#233;e g&#233;n&#233;rale de l'utilisation ou de la non-utilisation actuelle du site et indique les contenus les plus souvent utilis&#233;s.&lt;/p&gt;
&lt;div class='spip_document_472 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH414/traffic_602_fr-1cdf8.png?1763243337' width='500' height='414' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Dans le projet d'intranet, nous avons utilis&#233; ces rapports pour am&#233;liorer les r&#233;sultats de nos entretiens avec les utilisateurs. Par exemple. les utilisateurs n'ont pas exprim&#233;s le d&#233;sir de comprendre l'organisation hi&#233;rarchique ou la structure de pr&#233;sentation des r&#233;sultats, pourtant, les vues et les t&#233;l&#233;chargements d'organigrammes &#233;taient &#233;lev&#233;es. Ce sont des donn&#233;es importantes &#224; prendre en compte pour le design.&lt;/p&gt;
&lt;p&gt;Ces donn&#233;es peuvent &#234;tre utilis&#233;es pour avoir des discussions franches &#224; propos de ce qui est utile et de ce qui ne l'est pas sur le site.&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Quels contenus sont rarement utilis&#233;s ? Peut-on en tirer des conclusions d&#233;finitives ?&lt;/li&gt;&lt;li&gt; Que nous apprend la popularit&#233; de certains contenus sur les personnes qui utilisent le site ? Peut-on &#233;tendre et am&#233;liorer ces contenus pour leur en donner encore plus ?&lt;/li&gt;&lt;li&gt; Comment peut-on structurer le design pour faciliter l'acc&#232;s aux informations que l'on sait importantes ?&lt;/li&gt;&lt;li&gt; Y-a-t-il des mani&#232;res de r&#233;v&#233;ler la pertinence du contenu qui n'est pas utilis&#233; pour le moment ?&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Documenter la pr&#233;sentation incoh&#233;rente du contenu&lt;/h4&gt;
&lt;p&gt;Un probl&#232;me commun avec les sites n&#233;glig&#233;s ou mal g&#233;r&#233;s est le niveau d'incoh&#233;rence dans le design et la pr&#233;sentation du contenu. Faire des copies d'&#233;cran d'une large palette de pages et de types de pr&#233;sentation pendant votre audit est une tr&#232;s bonne mani&#232;re de rendre compte des incoh&#233;rences et d'identifier des opportunit&#233;s de consolidation.&lt;/p&gt;
&lt;p&gt;Dans le projet d'intranet, nous avons montr&#233; une large s&#233;lection de captures d'&#233;cran et ensuite montr&#233; comment la structure de contenu pouvait &#234;tre normalis&#233;e au niveau de la pr&#233;sentation, &#233;liminant les incoh&#233;rences et les variations inutiles. Nous avons fait cela en identifiant les attributs communs des contenus, m&#234;me si leur pr&#233;sentation variait grandement.&lt;/p&gt;
&lt;p&gt;Passer du temps &#224; capturer et annoter les captures d'&#233;cran t&#244;t dans le projet est essentiel pour des discussions productives &#224; propos des r&#233;alit&#233;s op&#233;rationnelles et la future direction de design. Utiliser ces outils pour r&#233;pondre aux questions suivantes :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Y-a-t-il une raison pour que des contenus similaires soient pr&#233;sent&#233;s diff&#233;remment ? Parfois, il existe des raisons commerciales l&#233;gitimes, telles que s'aligner sur du mat&#233;riel de communication hors ligne.&lt;/li&gt;&lt;li&gt; O&#249; les efforts de consolidations ont-ils mal tourn&#233; ? Qu'est-ce qui cause ces incoh&#233;rences en dehors du manque de sensibilisation ?&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Les r&#233;sultats&lt;/h2&gt;
&lt;p&gt;Dans le projet d'intranet, ce processus a permis de nombreuses r&#233;alisations qui ont men&#233; directement &#224; des d&#233;cisions de design, parmi les plus notables :&lt;/p&gt;
&lt;h4&gt;Une conscience aigu&#235; des priorit&#233;s&lt;/h4&gt;
&lt;p&gt;Savoir quels sont les contenus qui sont sur le site, pourquoi, et lesquels sont vraiment utilis&#233;s est essentiel pour comprendre les priorit&#233;s. L'audit a facilit&#233; les conversations et donner forme aux questions &#224; propos de l'utilit&#233; et l'utilisation du contenu qui n'auraient pas &#233;t&#233; aussi fructueuses ou r&#233;v&#233;latrices.&lt;/p&gt;
&lt;h4&gt;Contraintes op&#233;rationnelles et commerciales&lt;/h4&gt;
&lt;p&gt;Les contraintes op&#233;rationnelles et d'affaires sont souvent r&#233;v&#233;l&#233;es au travers du processus d'audit. Dans ce projet, il y avait clairement des contraintes op&#233;rationnelles qui limitaient les solutions de design que nous pouvions proposer. Par exemple, alors que les parties prenantes appr&#233;ciaient le concept d'une page d'accueil orient&#233;e sur les nouvelles fra&#238;ches, ils n'avaient pas les capacit&#233;s de faire des mises &#224; jour r&#233;guli&#232;res. Les &#233;valuations et discussions de suivi ont r&#233;v&#233;l&#233; ces contraintes plus clairement que si nous n'avions pas entrepris l'audit. Et ces discussions ont form&#233; notre approche du design, nous assurant ainsi que nos recommandations n'entraient pas en conflit avec les r&#233;alit&#233;s op&#233;rationnelles.&lt;/p&gt;
&lt;h4&gt;Un langage commun&lt;/h4&gt;
&lt;p&gt;Les audits peuvent r&#233;v&#233;ler un langage et une terminologie sp&#233;cifiques &#224; l'organisation qui seront peu familiers pour les personnes de l'ext&#233;rieur. Dans ce projet, le contenu &#233;tait herm&#233;tique pour de multiples raisons et l'audit nous a aid&#233; &#224; d&#233;coder le contenu et &#224; &#233;tablir une compr&#233;hension commune des concepts. Ainsi, les revues de design &#233;taient moins abstraites et s'alignaient plus pr&#233;cis&#233;ment avec la mani&#232;re dont les &#233;quipes internes pensaient et parlaient du contenu. De plus, nous avons &#233;t&#233; en mesure de r&#233;utiliser du contenu existant dans nos prototypes pour r&#233;v&#233;ler des d&#233;cisions structurelles et, o&#249; cela s'est av&#233;r&#233; n&#233;cessaire, &#233;crire de la copie repr&#233;sentative destin&#233;e &#224; servir de guide dans les futurs d&#233;veloppement de contenu.&lt;/p&gt;
&lt;h4&gt;Un &lt;i&gt;vrai&lt;/i&gt; sens de l'&#233;chelle&lt;/h4&gt;
&lt;p&gt;Le site &#233;tait certainement gros, mais pas de la fa&#231;on dont tout le monde ou nous le pensions. Nous avons acquis une perspective nuanc&#233;e du contenu, comprenant que nous ne parlions pas d'un site de 10 000 pages. Cela a chang&#233; la mani&#232;re dont nous avons pens&#233; 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&#233; une saine dose d'objectivit&#233; aux conversations et calm&#233; un grand nombre d'anxi&#233;t&#233;s caus&#233;es (en grande partie) par nos incertitudes.&lt;/p&gt;
&lt;hr/&gt;
&lt;p&gt;Si on les aborde correctement, les audits de contenu sont des outils d'une puissance exceptionnelle. Au del&#224; de l'&#233;valuation de la quantit&#233; et de la qualit&#233; du contenu, ils aident les concepteurs &#224; comprendre l'environnement informationnel, facilitent les discussions strat&#233;giques et permettent la d&#233;couverte d'informations qui ont directement influenc&#233;s la direction du design et la strat&#233;gie. En r&#233;sum&#233;, nous avons augment&#233; les chances de succ&#232;s de notre redesign en approchant les audits en gardant ces buts &#224; l'esprit.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Concevoir un design sans la couleur</title>
		<link>http://www.pompage.net/traduction/concevoir-un-design-sans-la-couleur</link>
		<guid isPermaLink="true">http://www.pompage.net/traduction/concevoir-un-design-sans-la-couleur</guid>
		<dc:date>2014-09-09T10:30:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Fr&#233;d&#233;ric Chotard, Nicolas Contant</dc:creator>


		<dc:subject>Mark Boulton</dc:subject>
		<dc:subject>Design</dc:subject>
		<dc:subject>Web design</dc:subject>

		<description>&lt;p&gt;Cet article est le premier d'une s&#233;rie publi&#233;e sur le blog du designer Mark Boulton. Mark propose ici de d&#233;marrer un design sans aucune couleur.&lt;/p&gt;

-
&lt;a href="http://www.pompage.net/traduction/" rel="directory"&gt;Traduction&lt;/a&gt;

/ 
&lt;a href="http://www.pompage.net/tag/mark-boulton" rel="tag"&gt;Mark Boulton&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/Design" rel="tag"&gt;Design&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/Web-design" rel="tag"&gt;Web design&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;La conception d'un design efficace est une affaire d&#233;licate, et souvent rendue plus difficile encore par les choix de couleurs. Pourquoi ne pas imaginer un mode initial de conception qui s'affranchisse totalement de la couleur au profit d'un travail sur les tons ?&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Faire un design en travaillant sur la couleur, c'est peut-&#234;tre l'une des choses les plus difficiles &#224; faire dans le domaine du design graphique. Pourquoi ? Parce qu'il n'y a rien de plus subjectif. Certains trouveront g&#233;nial de choisir une palette de gris sombre avec quelques touches de rose vif, tandis que d'autres trouveront &#231;a tr&#232;s laid. On voit trop souvent des designers prendre des d&#233;cisions arbitraires sur cette question, qu'ils soient ou non form&#233;s &#224; la th&#233;orie chromatique, et c'est au moment o&#249; ils tentent de justifier ces choix aupr&#232;s de leurs clients que tout se complique. Dans ce premier article, je vais m'int&#233;resser aux tons et &#224; l'avantage qu'on trouvera &#224; limiter l'&#233;tendue de sa palette.&lt;/p&gt;
&lt;h2&gt;On baisse d'un ton&lt;/h2&gt;
&lt;p&gt;Il y a quelques ann&#233;es (houl&#224;, &#231;a fait m&#234;me une bonne quinzaine d'ann&#233;es&#8230;) j'&#233;tais en premi&#232;re ann&#233;e aux Beaux-Arts, ici &#224; Stockport au Royaume-Uni. Je voulais devenir peintre, ou plus exactement illustrateur. D&#232;s la premi&#232;re semaine, on nous a demand&#233; de nous d&#233;barrasser de tous les beaux pinceaux qu'on venait de s'acheter pour les cours. Nous avons donc d&#251; laisser notre mat&#233;riel tout neuf &#224; la maison, puis aller dehors r&#233;colter des brindilles et d&#233;nicher de l'encre noire. Je n'&#233;tais vraiment pas enthousiaste. Comment imaginer qu'un artiste puisse cr&#233;er &#224; l'aide d'outils aussi primitifs ?&lt;br class='autobr' /&gt;
Nos professeurs nous ont donc fait peindre avec des brindilles, puis avec nos pieds, puis les yeux band&#233;s : bref, la totale. &#192; l'&#233;poque j'ai trouv&#233; &#231;a nul, et je ne comprenais pas o&#249; ils voulaient en venir. Maintenant que j'ai pris du recul, je per&#231;ois bien l'int&#233;r&#234;t de cet horrible d&#233;marrage. Ils nous apprenaient &#224; observer et &#224; produire des &#339;uvres qui n'&#233;taient pas dict&#233;es par nos outils. En d'autres termes, si nous avions dispos&#233; de couleurs vari&#233;es et de beaux pinceaux, la tentation de les exploiter aurait &#233;t&#233; trop grande. Faute de pinceaux et de couleurs, nous avons &#233;t&#233; contraints de communiquer la notion de couleur uniquement avec des effets de ton.&lt;br class='autobr' /&gt;
C'est par cela que je voudrais commencer.&lt;/p&gt;
&lt;h2&gt;Faisons sans la couleur&lt;/h2&gt;
&lt;p&gt;L'une des choses que j'appr&#233;cie dans le design &#233;ditorial, et en particulier dans le design typographique, c'est l'importance du noir et blanc. Bien s&#251;r, la couleur constitue une &#233;tape tr&#232;s importante de tout travail typographique, mais je m'int&#233;resse avant tout au ton et &#224; la forme. Je crois qu'il y a tout &#224; gagner &#224; retirer compl&#232;tement la couleur de l'&#233;quation afin de focaliser sur les questions de tonalit&#233; d'un design, avant d'y appliquer des couleurs.&lt;br class='autobr' /&gt;
Quelques exemples notables suffiront &#224; montrer qu'un design bas&#233; seulement sur du noir peut &#234;tre original et attirant.&lt;br class='autobr' /&gt;
On ne saurait parler du design web en noir et blanc sans &#233;voquer le site de Khoi Vinh, &lt;a href=&#034;http://www.subtraction.com&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Subtraction.com&lt;/a&gt;. Khoi travaille avec du noir et de l'orange pour correspondre au style suisse du design (ou style typographique international, &lt;i&gt;&lt;abbr title=&#034;Note du traducteur&#034;&gt;NdT&lt;/abbr&gt;&lt;/i&gt;).&lt;/p&gt;
&lt;div class='spip_document_464 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH244/fss_colour_01-f1c41.jpg?1763401054' width='500' height='244' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;Le site Substraction.com par Khoi Vinh&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#034;http://www.form.de/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Form&lt;/a&gt;, un magazine de design allemand, utilise une typographie en noir et blanc (bas&#233;e sur une grille rigoureuse) pour transmettre son concept de marque aux utilisateurs du site. On voit l'effet qui est atteint avec ce noir et blanc : l'ouvrage qui est mis en lumi&#232;re, avec sa couleur vive, se d&#233;tache tr&#232;s nettement du cadre noir et blanc.&lt;/p&gt;
&lt;div class='spip_document_465 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH244/fss_colour_02-74554.jpg?1763401054' width='500' height='244' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;Le magazine allemand de design Form&lt;/i&gt;&lt;/p&gt;
&lt;h2&gt;D'abord du gris&lt;/h2&gt;
&lt;p&gt;Faites donc le test pour votre prochain design. Comme indiqu&#233; dans le titre, contentez-vous de le d&#233;marrer avec du gris en diff&#233;rentes nuances. N'ajoutez aucune couleur tant que vous n'&#234;tes pas satisfait du design en noir et blanc. Il y a de grandes chances que les d&#233;cisions de palette et de couleurs que vous prendrez seront ensuite beaucoup plus simples, parce que le design ne d&#233;pendra plus de la couleur pour fonctionner. C'est particuli&#232;rement pertinent si on cherche &#224; cr&#233;er un design avec une bonne accessibilit&#233;. Ce n'est pas le sujet de cet article, puisque je me concentre ici sur le design graphique, mais l'accessibilit&#233; reste n&#233;anmoins une question qui ne doit pas &#234;tre n&#233;glig&#233;e. En basant votre design sur le noir et blanc, vous vous assurez que la solution retenue ne d&#233;pendra jamais de la couleur.&lt;br class='autobr' /&gt;
J'utilise souvent la couleur pour mettre des &#233;l&#233;ments du design en avant, mais en g&#233;n&#233;ral ils ont d&#233;j&#224; un r&#244;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 &#233;l&#233;ments d'une barre de navigation. La couleur sert alors &#224; faire ressortir des &#233;l&#233;ments fonctionnels cruciaux de l'interface.&lt;/p&gt;
&lt;div class='spip_document_466 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH191/fss_colour_03-74c00.jpg?1763401054' width='500' height='191' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;On r&#233;sout d'abord les questions de tons avant d'appliquer de la couleur&lt;/i&gt;&lt;/p&gt;
&lt;h2&gt;Vers des palettes mono- et duo-tonales&lt;/h2&gt;
&lt;p&gt;Dans mon prochain billet, je vais aller un peu plus loin avec mes gris.&lt;br class='autobr' /&gt;
On a quand m&#234;me de la chance, nous les designers du web. On peut employer pratiquement n'importe quelle couleur. Les designers papier, eux, sont confront&#233;s &#224; des limites sur l'usage des couleurs depuis l'origine de l'imprimerie. Du coup, cela les a rendus tr&#232;s attentifs &#224; ces questions du design en couleur. Je trouve qu'il n'y a rien de plus formateur que de cr&#233;er des projets &#224; une ou deux couleurs, mais appliqu&#233;es &#224; un grand nombre de situations, afin de mieux r&#233;fl&#233;chir &#224; la fa&#231;on dont la couleur est employ&#233;e. Je vais essayer d'&#233;voquer cet axe de r&#233;flexion (et cette contrainte) dans mon prochain billet.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;p&gt;Cet article fait partie de l'ouvrage &#171; &lt;span lang=&#034;en&#034;&gt;Five Simple Steps : Designing for the Web&lt;/span&gt; &#187; &#233;crit par Mark Boulton en 2006. La suite de l'article est disponible en anglais sur son site : &lt;a href=&#034;http://www.markboulton.co.uk/journal/five-simple-steps-to-designing-with-colour-part-2-a-few-basics&#034; hreflang=&#034;en&#034;&gt;deuxi&#232;me&lt;/a&gt; et &lt;a href=&#034;http://www.markboulton.co.uk/journal/five-simple-steps-to-designing-with-colour-part-3-colour-combinations&#034; hreflang=&#034;en&#034;&gt;troisi&#232;me&lt;/a&gt; partie.&lt;/p&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>&#201;crire du JavaScript v&#233;loce et &#224; faible empreinte m&#233;moire</title>
		<link>http://www.pompage.net/traduction/javascript-rapide-et-efficace</link>
		<guid isPermaLink="true">http://www.pompage.net/traduction/javascript-rapide-et-efficace</guid>
		<dc:date>2014-08-26T10:30:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Frank Taillandier, Fr&#233;d&#233;ric Chotard, Goulven Champenois, Nicolas Froidure, V&#233;ronique Bouvier</dc:creator>


		<dc:subject>JavaScript</dc:subject>
		<dc:subject>Confirm&#233;</dc:subject>
		<dc:subject>Addy Osmani</dc:subject>

		<description>&lt;p&gt;Les moteurs JavaScript tels que V8 (Chrome, NodeJs) sont sp&#233;cifiquement con&#231;us pour une &lt;a href=&#034;http://www.html5rocks.com/en/tutorials/speed/v8/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;ex&#233;cution rapide&lt;/a&gt; des applications JavaScript les plus complexes. En tant que d&#233;veloppeur, si vous &#234;tes soucieux de la consommation de m&#233;moire et des performances, il est important que vous connaissiez les m&#233;canismes mis en &#339;uvre dans les moteurs JavaScript des navigateurs de vos utilisateurs.&lt;/p&gt;

-
&lt;a href="http://www.pompage.net/traduction/" rel="directory"&gt;Traduction&lt;/a&gt;

/ 
&lt;a href="http://www.pompage.net/JavaScript" rel="tag"&gt;JavaScript&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/Confirme" rel="tag"&gt;Confirm&#233;&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/tag/addy-osmani" rel="tag"&gt;Addy Osmani&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Qu'il s'agisse de V8, de &lt;a href=&#034;https://developer.mozilla.org/en-US/docs/SpiderMonkey&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span lang=&#034;en&#034;&gt;Spider Monkey&lt;/span&gt;&lt;/a&gt; (Firefox), de &lt;a href=&#034;http://my.opera.com/ODIN/blog/carakan-faq&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Caracan&lt;/a&gt; (Op&#233;ra) ou de &lt;a href=&#034;http://en.wikipedia.org/wiki/Chakra_(JScript_engine)&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Chakra&lt;/a&gt; (&lt;abbr&gt;IE&lt;/abbr&gt;), conna&#238;tre le fonctionnement interne du moteur JavaScript vous permettra de mieux optimiser vos applications. Cela ne veut pas dire qu'il faut que vous optimisiez votre code pour un seul moteur ou navigateur : ne faites jamais cela !&lt;/p&gt;
&lt;p&gt;Vous devriez plut&#244;t vous poser ce type de questions :&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Que puis-je faire pour rendre mon code plus efficient ?&lt;/li&gt;&lt;li&gt; Quelles optimisations communes sont faites par les moteurs JavaScript ?&lt;/li&gt;&lt;li&gt; Quelles sont les limites de l'optimisation de ces moteurs ? Le ramasse-miette est-il bien capable de lib&#233;rer la m&#233;moire comme je m'y attend ?&lt;/li&gt;&lt;/ol&gt;&lt;div class='spip_document_401 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH330/ueM0mcKufwF0HEYK-529ea3c6-55774.jpg?1763273155' width='500' height='330' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;Les sites v&#233;loces, comme les voitures de course, n&#233;cessitent des outils sp&#233;cialis&#233;s. Cr&#233;dti de l'image : &lt;a href=&#034;http://dhybridcars.com/toyota-hybrid/2013-scion-fr-s-sexy-sport-car/media/2013-scion-fr-s-speed-gauge-img-8/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;dHybridcars&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Nombreux sont les pi&#232;ges quand on souhaite produire du code rapide et &#233;conome en m&#233;moire. Cet article propose donc d'explorer plusieurs techniques test&#233;es et approuv&#233;es pour &#233;crire du code qui s'ex&#233;cute efficacement.&lt;/p&gt;
&lt;h2&gt;Comment fonctionne JavaScript au sein de V8 ?&lt;/h2&gt;
&lt;p&gt;Bien qu'il soit possible d'&#233;crire des applications volumineuses sans comprendre le fonctionnement des moteurs JavaScript, n'importe quel conducteur vous dira qu'il a d&#233;j&#224; jet&#233; un &#339;il sous le capot au moins une fois. &#201;tant donn&#233; que Chrome est mon navigateur pr&#233;f&#233;r&#233;, je vais vous parler quelque peu de son moteur Javascript. Le c&#339;ur de V8 est compos&#233; de diff&#233;rentes pi&#232;ces :&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Un compilateur de base qui parcourt votre JavaScript et g&#233;n&#232;re du code machine avant qu'il soit ex&#233;cut&#233;, plut&#244;t que d'ex&#233;cuter du &lt;code&gt;bytecode&lt;/code&gt; ou simplement de l'interpr&#233;ter. Ce code natif n'est pour le moment pas tr&#232;s optimis&#233;.&lt;/li&gt;&lt;li&gt; V8 repr&#233;sente vos objets dans un mod&#232;le objet. Les objets sont repr&#233;sent&#233;s au sein de tableaux associatifs en JavaScript, mais dans V8, ils sont repr&#233;sent&#233;s avec les classes cach&#233;es (&lt;a href=&#034;https://developers.google.com/v8/design&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span lang=&#034;en&#034;&gt;hidden classes&lt;/span&gt;&lt;/a&gt;) qui sont un syst&#232;me de typage interne pour optimiser la recherche de r&#233;f&#233;rences.&lt;/li&gt;&lt;li&gt; Le profileur &#224; l'ex&#233;cution surveille le syst&#232;me en fonctionnement et identifie les fonctions &#171; chaudes &#187; (le code qui est fr&#233;quemment ex&#233;cut&#233;[a]).&lt;/li&gt;&lt;li&gt; Un compilateur optimis&#233; recompile et optimise les fonctions chaudes identifi&#233;es par le profileur &#224; l'ex&#233;cution et proc&#232;de &#224; des optimisations comme l'&lt;span lang=&#034;en&#034;&gt;inlining&lt;/span&gt; (le remplacement des appels de fonction par le corps de la fonction appel&#233;e).&lt;/li&gt;&lt;li&gt; V8 supporte le retour sur optimisation[b] ce qui signifie que le compilateur peut r&#233;voquer le code optimis&#233; s'il d&#233;couvre que les optimisations s'av&#232;rent contre-productives.&lt;/li&gt;&lt;li&gt; V8 a &#233;galement un ramasse-miette. Comprendre son fonctionnement peut &#234;tre tout aussi important qu'optimiser son JavaScript.&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Le ramasse-miette&lt;/h2&gt;
&lt;p&gt;Le ramasse-miette est un syst&#232;me de gestion de la m&#233;moire. Il introduit la notion de collecteur qui tente de lib&#233;rer la m&#233;moire occup&#233;e par des objets qui ne sont plus utilis&#233;s. Dans un langage &#224; ramasse-miette tel que JavaScript les objets qui sont toujours r&#233;f&#233;renc&#233;s par votre application ne sont pas effac&#233;s.&lt;/p&gt;
&lt;p&gt;D&#233;r&#233;f&#233;rencer manuellement les objets s'av&#232;re inutile la plupart du temps. En d&#233;clarant simplement les variables &#224; l'endroit o&#249; elles sont n&#233;cessaires (id&#233;alement le plus localement possible ; &#224; l'int&#233;rieur de la fonction o&#249; elles sont utilis&#233;es plut&#244;t que dans un contexte parent), cela devrait fonctionner tout seul.&lt;/p&gt;
&lt;div class='spip_document_403 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH456/_M6Bmqzz2I2BiLo5-2405f84b-cec42.jpg?1763273155' width='500' height='456' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Le ramasse-miette en train de lib&#233;rer de la m&#233;moire. Cr&#233;dits de l'image : &lt;a href=&#034;http://www.flickr.com/photos/26817893@N05/2864644153/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Valtteri M&#228;ki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il est impossible de forcer l'intervention du ramasse-miette en Javascript. Ne pensez pas que c'est dommage, car le processus de lib&#233;ration de la m&#233;moire est contr&#244;l&#233; par l'environnement d'ex&#233;cution et il sait g&#233;n&#233;ralement mieux que vous quand un nettoyage s'impose.&lt;/p&gt;
&lt;h2&gt;Les mythes du d&#233;r&#233;f&#233;rencement&lt;/h2&gt;
&lt;p&gt;Dans un bon nombre de discussions en ligne &#224; propos de la lib&#233;ration de m&#233;moire en JavaScript, le mot-cl&#233; &lt;code&gt;delete&lt;/code&gt; a amen&#233; certains d&#233;veloppeurs &#224; penser qu'ils pouvaient forcer le d&#233;r&#233;f&#233;rencement en l'utilisant, alors qu'il est seulement suppos&#233; retirer une cl&#233; d'un tableau de hachage. &#201;vitez d'utiliser &lt;code&gt;delete&lt;/code&gt; si vous le pouvez. Dans l'exemple ci-dessous, &lt;code&gt;delete o.x&lt;/code&gt; fait plus de mal que de bien contrairement aux apparences. Il change la classe cach&#233;e de l'objet &lt;code&gt;o&lt;/code&gt; et le transforme en objet g&#233;n&#233;rique plus lent.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var o = { x: 1 };
delete o.x; // true
o.x; // undefined&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cela dit, vous pouvez &#234;tre certains de trouver &lt;code&gt;delete&lt;/code&gt; dans la plupart des biblioth&#232;ques JavaScript populaires. Il a une utilit&#233; au sein du langage. Ce qu'il faut retenir, c'est qu'il modifie la structure des objets &#171; chauds &#187; &#224; l'ex&#233;cution. Les moteurs JavaScript rep&#232;rent ces objets chauds et tentent de les optimiser. C'est plus facile si la structure de ces objets &#233;volue peu au cours de leur utilisation, or &lt;code&gt;delete&lt;/code&gt; impose des changements.&lt;/p&gt;
&lt;p&gt;Il y a &#233;galement des erreurs d'interpr&#233;tation sur le fonctionnement de &lt;code&gt;null&lt;/code&gt;. Attribuer &#224; la r&#233;f&#233;rence d'un objet la valeur &lt;code&gt;null&lt;/code&gt; ne d&#233;truit pas l'objet associ&#233;. Cela d&#233;truit en r&#233;alit&#233; la r&#233;f&#233;rence &#224; cet objet. Il vaut mieux utiliser &lt;code&gt;o.x=null&lt;/code&gt; plut&#244;t que le mot-cl&#233; &lt;code&gt;delete&lt;/code&gt;, mais c'est rarement utile.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var o = { x: 1 };
o = null;
o; // null
o.x; // TypeError&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si cette r&#233;f&#233;rence est la derni&#232;re pointant sur cet objet, alors il devient &#233;ligible pour &#234;tre lib&#233;r&#233; de la m&#233;moire. Mais si ce n'&#233;tait pas la derni&#232;re r&#233;f&#233;rence &#224; ce dernier, cet objet reste atteignable et ne sera donc pas d&#233;truit.&lt;/p&gt;
&lt;p&gt;Une autre chose importante est que les variables globales ne sont pas d&#233;truites par le ramasse-miette durant toute la dur&#233;e de vie de votre page. Que celles-ci soient affich&#233;es une fraction de seconde ou plusieurs heures, les variables affect&#233;es au contexte global d'ex&#233;cution du JavaScript resteront en m&#233;moire.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;var monEspaceDeNomGlobal = {};&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Les variables globales ne sont d&#233;truites que lorsque vous rafra&#238;chissez la page, naviguez vers une autre page, fermez l'onglet ou votre navigateur. Les variables rattach&#233;es au contexte d'une fonction sont d&#233;truites quand elles tombent en dehors du contexte courant. Cela signifie qu'elles sont d&#233;truites quand les fonctions sont retir&#233;es de la pile d'ex&#233;cution et qu'il n'y a plus de r&#233;f&#233;rences pointant vers elles.&lt;/p&gt;
&lt;h2&gt;Quelques r&#232;gles g&#233;n&#233;rales&lt;/h2&gt;
&lt;p&gt;Pour donner l'opportunit&#233; au ramasse-miette de lib&#233;rer la m&#233;moire occup&#233;e par vos variables le plus t&#244;t possible, ne gardez pas de r&#233;f&#233;rence &#224; vos objets plus longtemps que n&#233;cessaire. La plupart du temps, cela se fait automatiquement. Mais voici quelques r&#232;gles &#224; garder en t&#234;te :&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Comme dit plus haut, d&#233;clarez vos variables dans un contexte appropri&#233; plut&#244;t que de les d&#233;r&#233;f&#233;rencer manuellement. En d'autres termes, au lieu de cr&#233;er une r&#233;f&#233;rence globale que vous devrez d&#233;r&#233;f&#233;rencer plus tard, optez pour une variable locale qui sera d&#233;truite lorsque son contexte sera sorti de la pile. Vous aurez alors un code plus propre, et moins de choses &#224; g&#233;rer.&lt;/li&gt;&lt;li&gt; Assurez-vous de bien supprimer vos &#233;couteurs d'&#233;v&#233;nements des n&#339;uds &lt;abbr&gt;DOM&lt;/abbr&gt; d&#232;s lors qu'ils deviennent inutiles, en particulier juste avant de retirer les n&#339;uds du document.&lt;/li&gt;&lt;li&gt; Si vous cachez localement certaines donn&#233;es, assurez-vous de les nettoyer quand elles ne sont plus utiles ou de programmer leur suppression pour &#233;viter que de trop grands volumes de donn&#233;es ne soient stock&#233;es en m&#233;moire.&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Les fonctions&lt;/h2&gt;
&lt;p&gt;Maintenant, int&#233;ressons-nous aux fonctions. Comme dit pr&#233;c&#233;demment, le ramasse-miette fonctionne par r&#233;cup&#233;ration de pages m&#233;moires qui ne sont plus r&#233;f&#233;renc&#233;es par l'application. Pour mieux illustrer notre propos, voyons quelques exemples.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function foo() { var bar = new GrosObjet(); bar.appelQuelconque();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quand le fil d'ex&#233;cution sort de la fonction &lt;code&gt;foo&lt;/code&gt;, l'objet vers lequel pointe &lt;code&gt;bar&lt;/code&gt; est automatiquement &#233;ligible pour &#234;tre lib&#233;r&#233; de la m&#233;moire car il n'existe plus aucune r&#233;f&#233;rence &#224; cet objet.&lt;/p&gt;
&lt;p&gt;Comparons cet exemple au code suivant :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function foo() { var bar = new GrosObjet(); bar.appelQuelconque(); return bar;
} //somewhere else
var b = foo();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous avons maintenant une r&#233;f&#233;rence &#224; l'objet qui survit &#224; l'appel de la fonction &lt;code&gt;foo&lt;/code&gt; et qui persistera tant qu'aucun autre objet ne sera assign&#233; &#224; la variable &lt;code&gt;b&lt;/code&gt; (ou tant que &lt;code&gt;b&lt;/code&gt; sera dans le contexte d'ex&#233;cution courant).&lt;/p&gt;
&lt;h2&gt;Les &lt;span lang=&#034;en&#034;&gt;closures&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Quand vous trouvez une fonction qui contient la d&#233;claration d'une autre fonction et retourne une r&#233;f&#233;rence vers cette fonction, cette derni&#232;re aura acc&#232;s au contexte de sa fonction parente m&#234;me si sa fonction parente est retir&#233;e de la pile d'ex&#233;cution. C'est ce qu'on appelle une &lt;a href=&#034;http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span lang=&#034;en&#034;&gt;closure&lt;/span&gt;&lt;/a&gt; ; c'est une expression qui a acc&#232;s aux variables situ&#233;es dans un contexte particulier. Par exemple :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;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&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;L'objet de type &lt;code&gt;function&lt;/code&gt; cr&#233;&#233; lors de l'appel &#224; &lt;code&gt;somme()&lt;/code&gt; ne peut &#234;tre d&#233;truit puisqu'il est toujours r&#233;f&#233;renc&#233; au sein du contexte global. Il est donc toujours r&#233;f&#233;renc&#233; et reste tout ce qu'il y a de plus accessible via &lt;code&gt;sommeA(n)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Int&#233;ressons-nous &#224; un autre exemple. Pouvons-nous acc&#233;der &#224; &lt;code&gt;longueChaine&lt;/code&gt; ?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var a = function () { var longueChaine = new Array(1000000).join('x'); return function () { return longueChaine; };
}();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Oui, bien s&#251;r, via &lt;code&gt;a()&lt;/code&gt;, donc elle n'a pas &#233;t&#233; d&#233;truite. Et dans l'exemple suivant ?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var a = function () { var petiteChaine = 'x'; var longueChaine = new Array(1000000).join('x'); return function (n) { return petiteChaine; };
}();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On ne peut plus y acc&#233;der et elle est &#233;ligible pour &#234;tre d&#233;truite par le ramasse-miette.&lt;/p&gt;
&lt;h2&gt;Les &lt;span lang=&#034;en&#034;&gt;timers&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;On trouve beaucoup de fuites de m&#233;moires dans les boucles, mais &lt;code&gt;setTimeout()&lt;/code&gt;/&lt;code&gt;setInterval()&lt;/code&gt; ne sont pas mal non plus pour &#231;a.&lt;/p&gt;
&lt;p&gt;Consid&#233;rons l'exemple suivant :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var monObjet = { callMeMaybe: function () { var maReference = this; var val = setTimeout(function () { console.log('Tu perds ton temps!'); maReference.callMeMaybe(); }, 1000); }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Si nous appelons &lt;code&gt;monObjet.callMeMaybe();&lt;/code&gt; pour mettre en route le &lt;span lang=&#034;en&#034;&gt;timer&lt;/span&gt;, nous pourrons voir toutes les secondes dans la console le message suivant : &#171; Tu perds ton temps ! &#187; Si nous tentons :&lt;/p&gt;
&lt;p&gt;&lt;code&gt;monObjet = null;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Le &lt;span lang=&#034;en&#034;&gt;timer&lt;/span&gt; sera toujours actif. monObjet ne sera pas d&#233;truit puisque la &lt;span lang=&#034;en&#034;&gt;closure&lt;/span&gt; transmise &#224; &lt;code&gt;setTimeout&lt;/code&gt; doit &#234;tre conserv&#233;e pour rester accessible. Par effet d'entra&#238;nement, monObjet est conserv&#233; puisqu'il encapsule &lt;code&gt;maReference&lt;/code&gt;. Il en irait de m&#234;me si nous avions pass&#233; cette &lt;span lang=&#034;en&#034;&gt;closure&lt;/span&gt; &#224; n'importe quelle autre fonction conservant une r&#233;f&#233;rence &#224; cet objet.&lt;/p&gt;
&lt;p&gt;C'est &#233;galement important de garder &#224; l'esprit que les r&#233;f&#233;rences &#224; l'int&#233;rieur des appels &#224; &lt;code&gt;setTimeout&lt;/code&gt;/&lt;code&gt;setInterval&lt;/code&gt;, comme pour les fonctions, ne pourront &#234;tre d&#233;truites qu'apr&#232;s la compl&#232;te ex&#233;cution de ces derni&#232;res.&lt;/p&gt;
&lt;h2&gt;Soyez &#224; l'&#233;coute des probl&#232;mes de performance&lt;/h2&gt;
&lt;p&gt;On ne le r&#233;p&#233;tera jamais assez : n'optimisez votre code que lorsque vous constatez des probl&#232;mes de performance. On trouve des tas de micro-benchmarks d&#233;montrant que &#171; N &#187; est plus rapide que &#171; M &#187; dans V8, mais confront&#233; &#224; la r&#233;alit&#233; d'un vrai module de code ou d'une application concr&#232;te, l'impact de ces optimisations pourrait &#234;tre bien moins important que ce que vous pensiez obtenir.&lt;/p&gt;
&lt;div class='spip_document_404 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH350/LHIP7xx4hrh8IRBW-76ff5424-4b276.jpg?1763273155' width='500' height='350' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;En faire trop peut &#234;tre aussi probl&#233;matique que de ne rien faire du tout. Cr&#233;dits image : &lt;a href=&#034;https://www.flickr.com/photos/tim_uk/7717078488/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Tim Sheerman-Chase&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Imaginons que nous voulions cr&#233;er un module qui :&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; utilise une source de donn&#233;e locale contenant des &#233;l&#233;ments avec un identifiant num&#233;rique,&lt;/li&gt;&lt;li&gt; affiche un tableau contenant ces donn&#233;es,&lt;/li&gt;&lt;li&gt; assigne des gestionnaires d'&#233;v&#233;nements qui commutent une classe quand un utilisateur clique sur une cellule.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Il y a plusieurs chose &#224; prendre en compte dans ce probl&#232;me, bien qu'il soit tr&#232;s simple &#224; r&#233;soudre. Comment stockerons-nous les donn&#233;es ? Comment g&#233;n&#233;rer[e] le tableau de mani&#232;re efficiente et l'ins&#233;rer dans le &lt;abbr&gt;DOM&lt;/abbr&gt; ? Comment pouvons-nous capturer les &#233;v&#233;nements &#233;mis par le tableau de mani&#232;re optimale ?&lt;/p&gt;
&lt;p&gt;Une premi&#232;re m&#233;thode (na&#239;ve) serait de stocker chaque silo de donn&#233;es disponible dans des objets que nous regrouperions dans un tableau associatif. On pourrait utiliser jQuery pour parcourir ce tableau de donn&#233;es, g&#233;n&#233;rer le tableau et ensuite, l'ins&#233;rer dans le &lt;abbr&gt;DOM&lt;/abbr&gt;. Enfin, on pourrait utiliser les &#233;couteurs d'&#233;v&#233;nements pour programmer le comportement d&#233;sir&#233; au clic sur une cellule.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ne faites SURTOUT PAS comme &#231;a !&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var moduleA = function () { return { data: dataArrayObject, init: function () { this.addTable(); this.addEvents(); }, addTable: function () { for (var i = 0; i &lt; rows; i++) { $tr = $('&lt;tr&gt;&lt;/tr&gt;'); for (var j = 0; j &lt; this.data.length; j++) { $tr.append('&lt;td&gt;' + this.data[j]['id'] + '&lt;/td&gt;'); } $tr.appendTo($tbody); } }, addEvents: function () { $('table td').on('click', function () { $(this).toggleClass('active'); }); } };
}();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;C'est basique, mais &#231;a fait ce qui a &#233;t&#233; demand&#233;.&lt;/p&gt;
&lt;p&gt;Dans ce cas, cependant, nous ne faisons qu'utiliser la propri&#233;t&#233; ID de type num&#233;rique qui aurait &#233;t&#233; plus avantageusement stock&#233;e dans un simple tableau. Point int&#233;ressant, utiliser &lt;code&gt;documentFragment&lt;/code&gt; et les m&#233;thodes natives du &lt;abbr&gt;DOM&lt;/abbr&gt; est plus optimal que d'utiliser jQuery de cette mani&#232;re pour g&#233;n&#233;rer notre tableau. Enfin, bien s&#251;r, &#233;couter les &#233;v&#233;nements au niveau du tableau aurait &#233;t&#233; plus performant que d'&#233;couter les clics sur chaque cellule.&lt;/p&gt;
&lt;p&gt;Notez que jQuery fait appel &#224; &lt;code&gt;DocumentFragment&lt;/code&gt; en interne, mais dans notre exemple le code appelle la fonction &lt;code&gt;append()&lt;/code&gt; &#224; chaque it&#233;ration de la boucle, cloisonnement qui emp&#234;che une bonne optimisation. Cela ne devrait pas &#234;tre si catastrophique mais n'oubliez pas de passer votre code au banc d'essai pour vous en assurer.&lt;/p&gt;
&lt;p&gt;Dans notre cas, proc&#233;der &#224; ces am&#233;liorations engendrera de bons gains en performance comme nous pouvons nous y attendre. &#201;couter les &#233;v&#233;nements au niveau du tableau[g] apporte une am&#233;lioration int&#233;ressante, quant &#224; l'&lt;a href=&#034;http://jsperf.com/first-pass&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;utilisation de &lt;code&gt;DocumentFragment&lt;/code&gt;&lt;/a&gt;, elle dope v&#233;ritablement les performances.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;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('tr'); for (var j = 0; j &lt; this.data.length; j++) { td = document.createElement('td'); td.appendChild(document.createTextNode(this.data[j])); frag2.appendChild(td); } tr.appendChild(frag2); frag.appendChild(tr); } tbody.appendChild(frag); }, addEvents: function () { $('table').on('click', 'td', function () { $(this).toggleClass('active'); }); } };
}();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nous pourrions &#233;galement tenter d'autres approches pour am&#233;liorer les performances. Vous avez probablement lu quelque part qu'utiliser le prototypage est plus optimal que de cr&#233;er un module (et nous l'avons confirm&#233; au d&#233;but de cet article), ou entendu que les moteurs de gabarits (&lt;span lang=&#034;en&#034;&gt;templates&lt;/span&gt;) JavaScript sont tr&#232;s performants. Ils le sont parfois, mais utilisez-les pour clarifier votre code et pr&#233;compilez vos gabarits. Testons et voyons si ces pratiques sont aussi int&#233;ressantes que &#231;a.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var moduleG = function () {}; moduleG.prototype.data = dataArray;
moduleG.prototype.init = function () { this.addTable(); this.addEvents();
};
moduleG.prototype.addTable = function () { var template = _.template($('#template').text()); var html = template({'data' : this.data}); $tbody.append(html);
};
moduleG.prototype.addEvents = function () { $('table').on('click', 'td', function () { $(this).toggleClass('active'); });
}; var modG = new moduleG();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Comme on pouvait s'y attendre, les b&#233;n&#233;fices en terme de performance sont n&#233;gligeables ici. Les &lt;a href=&#034;http://jsperf.com/second-pass&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;moteurs de &lt;span lang=&#034;en&#034;&gt;template&lt;/span&gt; et le prototypage&lt;/a&gt; ne nous apportent rien de plus que ce que nous avions auparavant. Cela dit, ce n'est pas vraiment pour les performances que les d&#233;veloppeurs modernes utilisent ces outils. C'est plut&#244;t la clart&#233;, le mod&#232;le d'h&#233;ritage et la maintenabilit&#233; du code qui les motive.&lt;/p&gt;
&lt;p&gt;Certains probl&#232;mes plus complexes concernent &lt;a href=&#034;http://jsperf.com/canvas-drawimage-vs-webgl-drawarrays/6&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;l'efficience du dessin avec canvas&lt;/a&gt; et &lt;a href=&#034;http://jsperf.com/canvas-pixel-manipulation/30&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;la manipulation de pixels&lt;/a&gt; avec ou sans &lt;a href=&#034;http://jsperf.com/typed-arrays-for-pixel-manipulation&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;tableaux typ&#233;s&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Jetez toujours un &#339;il critique aux micro-benchmarks avant d'appliquer leurs conclusions &#224; vos applications. Certains d'entre vous pourraient se souvenir de l'article &lt;a href=&#034;http://jsperf.com/dom-vs-innerhtml-based-templating/473&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span lang=&#034;en&#034;&gt;Javascript templating shoot-off&lt;/span&gt;&lt;/a&gt; et &lt;a href=&#034;http://jsperf.com/javascript-templating-shootoff-extended/26&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;la pol&#233;mique qui s'en est suivie&lt;/a&gt;. Vous devez vous assurer que les r&#233;sultats de vos tests ne sont pas influenc&#233;s par des contraintes inexistantes dans une application concr&#232;te. Testez &#233;galement ces optimisations dans leur contexte final.&lt;/p&gt;
&lt;h2&gt;Quelques astuces d'optimisation pour V8&lt;/h2&gt;
&lt;p&gt;Lister toutes les optimisations r&#233;alisables pour V8 s'&#233;loignerait du sujet de cet article, mais voici cependant quelques astuces qui m&#233;ritent d'&#234;tre cit&#233;es. En les gardant &#224; l'esprit vous serez en mesure de limiter l'&#233;criture de code non-performant.&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Certaines pratiques telles que l'utilisation de &lt;code&gt;try...catch&lt;/code&gt; emp&#234;chent V8 de se lancer dans la moindre optimisation. Pour plus d'information sur les fonctions qui peuvent &#234;tre optimis&#233;es et celles qui ne le peuvent pas, utilisez d8, un petit utilitaire en ligne de commande fourni avec V8, et l'option &lt;code&gt;--trace-opt file.js&lt;/code&gt;.&lt;/li&gt;&lt;li&gt; Si la vitesse d'ex&#233;cution vous importe, essayez de garder vos fonctions monomorphes ; assurez-vous que les variables (tableaux, objets, param&#232;tres de fonction) ne contiennent que des &#233;l&#233;ments du m&#234;me type. Par exemple, &#233;vitez ce genre de code (NdT : en clair, faites comme si JavaScript &#233;tait un langage typ&#233;) :&lt;/li&gt;&lt;/ol&gt;&lt;pre&gt;&lt;code&gt;function ajoute(x, y) { return x+y;
} ajoute(1, 2); ajoute('a','b'); ajoute(mon_objet, undefined);&lt;/code&gt;&lt;/pre&gt;&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Ne r&#233;utilisez pas des &#233;l&#233;ments d&#233;sinitialis&#233;s ou supprim&#233;s. Le r&#233;sultat sera identique, mais votre code sera bien plus lent.&lt;/li&gt;&lt;li&gt; N'&#233;crivez pas de fonctions gigantesques car elles sont plus difficiles &#224; optimiser.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Pour plus de trucs et astuces, je vous recommande de visualiser la vid&#233;o &lt;a href=&#034;http://www.youtube.com/watch?v=UJPdhx5zTaw&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span lang=&#034;en&#034;&gt;Breaking the Javascript speed limit with V8&lt;/span&gt;&lt;/a&gt; de &lt;span lang=&#034;en&#034;&gt;Daniel Clifford&lt;/span&gt; au Google &lt;abbr&gt;IO&lt;/abbr&gt;. Je vous recommande &#233;galement &lt;a href=&#034;http://floitsch.blogspot.co.uk/2012/03/optimizing-for-v8-introduction.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span lang=&#034;en&#034;&gt;Optimizing For V8 - A Series&lt;/span&gt;&lt;/a&gt; dans la foul&#233;e.&lt;/p&gt;
&lt;h2&gt;Objets vs Tableaux : que dois-je utiliser ?&lt;/h2&gt;&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Si vous souhaitez stocker un paquet de nombres ou une liste d'objets de m&#234;me nature, utilisez les tableaux.&lt;/li&gt;&lt;li&gt; Si ce dont vous avez besoin s&#233;mantiquement est un objet avec un lot de propri&#233;t&#233;s (de types diff&#233;rents), utilisez un objet avec des propri&#233;t&#233;s. C'est tr&#232;s efficient en terme de m&#233;moire et assez rapide d'acc&#232;s.&lt;/li&gt;&lt;li&gt; Qu'elles soient stock&#233;es dans des objets ou des tableaux, les cl&#233;s num&#233;riques sont plus rapides d'acc&#232;s lors de vos it&#233;rations que les propri&#233;t&#233;s des objets.&lt;/li&gt;&lt;li&gt; Les propri&#233;t&#233;s des objets sont tr&#232;s complexes : elle peuvent &#234;tre cr&#233;es avec des accesseurs (getters/setters) et utiliser diff&#233;rents type d'&#233;num&#233;rabilit&#233; et d'acc&#232;s en &#233;criture. Les &#233;l&#233;ments d'un tableau sont au contraire peu personnalisables ; ils existent ou pas, point final. Au niveau du moteur JavaScript, cela permet plus d'optimisations en terme d'organisation de la m&#233;moire pour repr&#233;senter sa structure. C'est d'autant plus b&#233;n&#233;fique quand ces tableaux contiennent des nombres. Par exemple, si vous avez besoin de stocker des vecteurs, ne d&#233;finissez pas une classe avec des propri&#233;t&#233;s &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;y&lt;/code&gt; et &lt;code&gt;z&lt;/code&gt; ; utilisez plut&#244;t un tableau.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Il existe une diff&#233;rence majeure entre les objets et les tableaux en JavaScript, c'est la propri&#233;t&#233; magique &lt;code&gt;length&lt;/code&gt;. Si vous g&#233;rez cette propri&#233;t&#233; vous-m&#234;me, vos objets seront tout aussi rapides que des tableaux dans V8.&lt;/p&gt;
&lt;h2&gt;Quelques astuces pour l'utilisation des objets&lt;/h2&gt;&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Cr&#233;ez vos objets via leur fonction constructeur. Cela permet d'assigner &#224; chaque objet la m&#234;me classe cach&#233;e et &#233;vite de changer cette derni&#232;re par la suite. Un autre point qui plaide pour cela est que c'est l&#233;g&#232;rement plus rapide que son homologue &lt;code&gt;Object.create()&lt;/code&gt;.&lt;/li&gt;&lt;li&gt; Il n'y a aucune restriction sur le nombre de types d'objets diff&#233;rents au sein d'une application ou sur leur complexit&#233; (tout en restant raisonnable : les longues cha&#238;nes de prototype tendent &#224; ralentir l'application, et les objets avec un nombre limit&#233; de propri&#233;t&#233; b&#233;n&#233;ficient d'une repr&#233;sentation sp&#233;ciale leur conf&#233;rant une rapidit&#233; accrue). Pour les objets &#171; chauds &#187;, essayez de garder une cha&#238;ne de prototypes courte et peu de propri&#233;t&#233;s.&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Clonage d'objets&lt;/h2&gt;
&lt;p&gt;Le clonage d'objets est un probl&#232;me que rencontrent tous les d&#233;veloppeurs d'applications. Bien qu'il soit possible de tester ses diff&#233;rentes impl&#233;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&#233;es est g&#233;n&#233;ralement lent, ne le faites pas. Les boucles &lt;code&gt;for...in&lt;/code&gt; sont particuli&#232;rement inadapt&#233;es pour cela car elles ont une sp&#233;cification d&#233;moniaque et ne seront jamais rapides pour des objets arbitraires, quel que soit le moteur JavaScript.&lt;/p&gt;
&lt;p&gt;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&#232;me), utilisez un tableau ou un &#8220;constructeur de copie&#8221; personnalis&#233; qui copie chaque propri&#233;t&#233; individuellement. C'est probablement la mani&#232;re la plus rapide de le faire.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function clone(original) { this.foo = original.foo; this.bar = original.bar;
}
var copie = new clone(original);&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Les fonctions en cache gr&#226;ce aux modules&lt;/h2&gt;
&lt;p&gt;Mettre vos fonctions en cache gr&#226;ce au patron de conception &#171; module &#187; peut am&#233;liorer les performances. Regardez l'exemple ci-dessous, vous constaterez que l'une ou l'autre m&#233;thodes que vous avez l'habitude de voir est plus lente car elle oblige &#224; copier les fonctions membres sans arr&#234;t.&lt;/p&gt;
&lt;p&gt;Vous noterez &#233;galement que cette approche peut se r&#233;v&#233;ler significativement meilleure que de s'appuyer sur la technique du prototype (et &lt;a href=&#034;http://jsperf.com/prototypal-performance/12&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;un test jsPerf le confirme&lt;/a&gt;).&lt;/p&gt;
&lt;div class='spip_document_406 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;a href=&#034;https://lh3.googleusercontent.com/7CLlAgAFc-agiZoak-1a3vE50u8Cf2r2eIXPiSJoWORMTcvabAo7mcyoAVRk9TwcQDnr3x7ggPSMI2UMFVHaCCQJm2O5opwq63vmAWHTH_kxM0iJmGMF&#034; class=&#034;spip_doc_lien mediabox&#034; type=&#034;image/png&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH364/7CLlAgAFc-agiZoa-8952bdc1-7628c.png?1763273155' width='500' height='364' alt='' /&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;Mesure des gains de performance des techniques modules et prototypes.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Voici un test comparatif entre les patrons de conception module et prototype.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; // Technique &#034;Prototype&#034; Klass1 = function () {} Klass1.prototype.foo = function () { log('foo'); } Klass1.prototype.bar = function () { log('bar'); } // Technique &#034;Module&#034; Klass2 = function () { var foo = function () { log('foo'); }, bar = function () { log('bar'); }; return { foo: foo, bar: bar } } // Technique &#034;Module avec fonctions mises en cache&#034; var FooFunction = function () { log('foo'); }; var BarFunction = function () { log('bar'); }; 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&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Quelques astuces pour l'utilisation des tableaux&lt;/h2&gt;
&lt;p&gt;Maintenant, jetons un &#339;il aux tableaux. En r&#232;gle g&#233;n&#233;rale, ne supprimez pas d'&#233;l&#233;ments dans les tableaux. Cela oblige le moteur &#224; basculer vers une repr&#233;sentation interne plus lente. Quand les cl&#233;s d'un tableau deviennent &#233;parpill&#233;es, le moteur est susceptible de le transformer en tableau associatif, qui est encore plus lent.&lt;/p&gt;
&lt;h2&gt;Repr&#233;sentation litt&#233;rale des tableaux&lt;/h2&gt;
&lt;p&gt;L'initialisation litt&#233;rale d'un tableau est pr&#233;f&#233;rable puisque cela donne un aper&#231;u &#224; la machine virtuelle de ce que vous souhaitez y stocker (taille, type de valeurs). Ils sont typiquement souhaitables pour des tableaux de taille petite &#224; moyenne.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Ici, le moteur JS voit que vous souhaitez un tableau contenant 4 nombres
var a = [1, 2, 3, 4]; // Ne faites pas &#231;a :
a = []; // Ici, le moteur n'a aucune id&#233;e de ce qui ira dans le tableau
for(var i = 1; i &lt;= 4; i++) { a.push(i);
}&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Stocker un seul type de donn&#233;es versus donn&#233;es mixtes&lt;/h2&gt;
&lt;p&gt;Il n'est jamais bon de m&#233;langer diff&#233;rents types de valeurs dans un m&#234;me tableau (des nombres, cha&#238;nes, objets, bool&#233;ens ou undefined, comme par exemple : &lt;code&gt;var arr = [1, &#8220;1&#8221;, undefined, true, &#8220;true&#8221;]&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;a href=&#034;http://jsperf.com/type-inference-performance/2&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Test de performance de l'inf&#233;rence de type&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Comme vous pouvez le constater, le meilleur r&#233;sultat est obtenu par le tableau d'entiers.&lt;/p&gt;
&lt;h2&gt;Tableaux &#224; cl&#233;s cons&#233;cutives ou non&lt;/h2&gt;
&lt;p&gt;Quand vous utilisez des tableaux aux cl&#233;s non cons&#233;cutives, soyez bien conscients qu'acc&#233;der &#224; leurs &#233;l&#233;ments est bien plus lent que si les cl&#233;s se suivaient dans leur ordre naturel. La raison est que s'il manque trop d'&#233;l&#233;ments le moteur V8 choisira de ne pas leur allouer d'espace m&#233;moire. &#192; la place, il pr&#233;f&#233;rera les g&#233;rer au sein d'un tableau associatif, ce qui est bien plus lent en terme de temps d'acc&#232;s.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#034;http://jsperf.com/sparse-arrays-vs-full-arrays&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Test comparatifs entre tableaux &#224; cl&#233;s &#233;parses et cl&#233; cons&#233;cutives&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ce test montre que la somme des &#233;l&#233;ments d'un tableau aux cl&#233;s cons&#233;cutives est plus rapide. Le fait qu'il contienne ou non des z&#233;ros ne fait aucune diff&#233;rence.&lt;/p&gt;
&lt;h2&gt;Tableaux &#171; trou&#233;s &#187; contre tableaux &#171; pleins &#187;&lt;/h2&gt;
&lt;p&gt;&#201;vitez de trouer vos tableaux (en supprimant des &#233;l&#233;ments ou en faisant &lt;code&gt;a[x] = foo&lt;/code&gt; (dans le cas o&#249; &lt;code&gt;x &gt; a.length&lt;/code&gt;). Il suffit qu'un seul &#233;l&#233;ment manque dans un tableau pour ralentir le code.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#034;http://jsperf.com/packed-vs-holey-arrays&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Test entre tableaux &#171; trou&#233;s &#187; et tableaux &#171; pleins &#187;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Allouer l'espace du tableau &#224; l'initialisation ou &#224; la vol&#233;e&lt;/h2&gt;
&lt;p&gt;Ne pr&#233;-allouez pas les tableaux dont la taille exc&#233;derait 64 000 &#233;l&#233;ments. Faites-les plut&#244;t grossir &#224; la vol&#233;e. Avant d'interpr&#233;ter les tests sur ce point, rappelez-vous bien que leurs r&#233;sultats sont fortement d&#233;pendants du moteur JavaScript test&#233;.&lt;/p&gt;
&lt;div class='spip_document_407 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH323/2C8fjpV7SYj_EBBT-0a9ebee5-2a8e1.jpg?1763273155' width='500' height='323' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;Test des tableaux initialement vides par rapport aux tableaux pr&#233;-allou&#233;s.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Nitro (Safari) traite les tableaux pr&#233;-allou&#233;s plus favorablement. Cependant, c'est le contraire pour les autres moteurs (V8 et &lt;span lang=&#034;en&#034;&gt;Spider Monkey&lt;/span&gt;) pour lesquels allouer l'espace &#224; la vol&#233;e est plus efficace.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#034;http://jsperf.com/pre-allocated-arrays&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Tester les tableaux pr&#233;-allou&#233;s&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Tableau vide
var arr = [];
for (var i = 0; i &lt; 1000000; i++) { arr[i] = i;
} // Tableau pr&#233;-dimensionn&#233;
var arr = new Array(1000000);
for (var i = 0; i &lt; 1000000; i++) { arr[i] = i;
}&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Optimiser vos applications&lt;/h2&gt;
&lt;p&gt;Dans le monde des applications Web, la performance est primordiale. Aucun utilisateur ne souhaite qu'un tableur prenne plusieurs secondes pour faire la somme des cellules d'une colonne, ou attendre plusieurs minutes que s'affiche le r&#233;sum&#233; de leurs messages. C'est pourquoi rendre votre code aussi v&#233;loce que possible est parfois critique.&lt;/p&gt;
&lt;div class='spip_document_408 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH375/_O7Nq1qZ17dAYP5o-3b427de8-0a073.jpg?1763273155' width='500' height='375' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;Cr&#233;dits de l'image : &lt;a href=&#034;http://www.flickr.com/photos/perolofforsberg/6691744587/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Per Olof Forsberg&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Bien qu'il soit utile de comprendre et d'am&#233;liorer les performances de vos applications, cela peut &#234;tre difficile. Nous recommandons la d&#233;marche suivante pour venir &#224; bout des points qui vous ralentissent :&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Mesurer : rep&#233;rer les points les plus lents de votre application ( 45%)&lt;/li&gt;&lt;li&gt; Comprendre : trouver ce qui provoque cette lenteur ( 45%)&lt;/li&gt;&lt;li&gt; Corriger ! ( 10%)&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Quelques-uns des outils suivants peuvent vous aider dans cette t&#226;che.&lt;/p&gt;
&lt;h2&gt;Mesurer la performance&lt;/h2&gt;
&lt;p&gt;Il existe de nombreuses fa&#231;ons de tester les performances de vos bouts de code en JavaScript mais en r&#232;gle g&#233;n&#233;rale on effectue une comparaison entre deux chronom&#233;trages. L'&#233;quipe de &lt;a href=&#034;http://jsperf.com&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;jsPerf&lt;/a&gt; a propos&#233; un mod&#232;le qui a &#233;t&#233; ensuite repris par les suites de tests que sont &lt;a href=&#034;http://www.webkit.org/perf/sunspider/sunspider.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;SunSpider&lt;/a&gt; et &lt;a href=&#034;http://krakenbenchmark.mozilla.org/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Kraken&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var tempsTotal, depart = new Date, iterations = 1000;
while (iterations--) { // Placer ici le code a tester
}
// tempsTotal &#8594; Nombre de millisecondes necessaires // pour executer les instructions 1000 fois
tempsTotal = new Date - depart;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dans cet exemple le code &#224; tester est plac&#233; dans une boucle et ex&#233;cut&#233; un nombre d&#233;termin&#233; de fois. Une fois termin&#233;, la date de d&#233;but d'ex&#233;cution est soustraite &#224; la date de fin d&#233;terminant le temps &#233;coul&#233; durant le test.&lt;/p&gt;
&lt;p&gt;N&#233;anmoins cette fa&#231;on de faire des tests est tr&#232;s r&#233;ductrice, surtout si vous voulez mesurer dans diff&#233;rents navigateurs et environnements. Le ramasse-miette lui-m&#234;me peut avoir des effets sur vos r&#233;sultats. M&#234;me en affinant la mesure en utilisant &lt;code&gt;window.performance&lt;/code&gt;, vous pouvez &#234;tre s&#251;rs que des impond&#233;rables viendront fausser les mesures.&lt;/p&gt;
&lt;p&gt;Que vous &#233;criviez simplement des tests sur des parties de votre code, des suites de tests ou une librairie compl&#232;te, il y a bien plus de facteurs &#224; prendre en compte que vous ne pouvez l'imaginer. Pour un guide plus complet sur les tests de performance, je vous recommande fortement de lire &lt;a href=&#034;http://mathiasbynens.be/notes/javascript-benchmarking&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span lang=&#034;en&#034;&gt;Javascript Benchmarking&lt;/span&gt;&lt;/a&gt; de Mathias Bynens et John-David Dalton.&lt;/p&gt;
&lt;h2&gt;Le profilage&lt;/h2&gt;
&lt;p&gt;Les outils pour d&#233;veloppeur de Chrome permettent de &lt;a href=&#034;https://developers.google.com/chrome-developer-tools/docs/profiles&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;profiler ais&#233;ment vos applications&lt;/a&gt;. Vous pouvez utiliser cette fonctionnalit&#233; pour identifier les fonctions les plus chronophages pour les optimiser en priorit&#233;. Cette d&#233;marche est importante car la moindre petite modification de votre code peut avoir des cons&#233;quences importantes en termes de performance.&lt;/p&gt;
&lt;div class='spip_document_409 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH315/VV_Q0smFYBKpTq3l-8fc87d8b-8647b.jpg?1763273155' width='500' height='315' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;L'onglet &#8220;profilage&#8221; des outils pour d&#233;veloppeur de Chrome.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Pour commencer le profilage, il faut obtenir une mesure de base des performances actuelles de votre application. Cette derni&#232;re peut &#234;tre obtenue gr&#226;ce &#224; l'onglet &#8220;&lt;span lang=&#034;en&#034;&gt;timeline&lt;/span&gt;&#8221; (frise chronologique). Cela nous permettra de mesurer le temps effectif d'ex&#233;cution de notre application.&lt;/p&gt;
&lt;p&gt;L'onglet &#8220;&lt;span lang=&#034;en&#034;&gt;profiles&lt;/span&gt;&#8221; nous donnera lui une vue plus d&#233;taill&#233;e de ce qui se passe vraiment dans notre application. Le profilage processeur (&lt;span lang=&#034;en&#034;&gt;JavaScript &lt;abbr&gt;CPU&lt;/abbr&gt; profile&lt;/span&gt;) nous permet de savoir combien de temps processeur est utilis&#233; par notre application, le profilage des s&#233;lecteurs &lt;abbr&gt;CSS&lt;/abbr&gt; (&lt;span lang=&#034;en&#034;&gt;&lt;abbr&gt;CSS&lt;/abbr&gt; selector profile&lt;/span&gt;) nous renseigne sur le temps n&#233;cessaire pour calculer les s&#233;lecteurs &lt;abbr&gt;CSS&lt;/abbr&gt;, et les captures de pile de m&#233;moire &lt;span lang=&#034;en&#034;&gt;Heap&lt;/span&gt; (&lt;span lang=&#034;en&#034;&gt;Heap snapshots&lt;/span&gt;) nous permet de savoir combien nos objets consomment de m&#233;moire.&lt;/p&gt;
&lt;p&gt;L'utilisation de ces outils nous permet d'ajuster et de profiler &#224; nouveaux notre code afin de v&#233;rifier si les changements r&#233;alis&#233;s ont bien un impact positif sur les performances.&lt;/p&gt;
&lt;div class='spip_document_411 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH293/7hD4UAk_zr2Vcu91-a8a1f541-b9b31.jpg?1763273155' width='500' height='293' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Pour une bonne introduction au profilage dans Chrome, lisez &lt;a href=&#034;http://coding.smashingmagazine.com/2012/06/12/javascript-profiling-chrome-developer-tools/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span lang=&#034;en&#034;&gt;Javascript Profiling With The Chrome Developper Tools&lt;/span&gt;&lt;/a&gt; par Zack Grossbart.&lt;/p&gt;
&lt;p&gt;Petit truc : dans l'id&#233;al, il vaut mieux &#233;viter que les extensions et applications install&#233;es dans Chrome n'influent sur vos r&#233;sultats. Pour cela, ex&#233;cutez Chrome avec l'option &lt;code&gt;--user-data-dir &lt;un_r&#233;pertoire_vide&gt;&lt;/code&gt;. Cela suffit la plupart du temps, mais si vous avez besoin d'aller plus loin les options de V8 vous seront d'une grande aide.&lt;/p&gt;
&lt;h2&gt;Eviter les fuites m&#233;moire : trois techniques pour les d&#233;celer&lt;/h2&gt;
&lt;p&gt;Les &#233;quipes internes de Google, celle de Gmail par exemple, utilisent &#233;norm&#233;ment les outils pour d&#233;veloppeurs de Chrome pour traquer et &#233;liminer les fuites m&#233;moires.&lt;/p&gt;
&lt;div class='spip_document_412 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH283/KLG0BbASOYyCW-TQ-8c48c8f7-4bfbf.jpg?1763273155' width='500' height='283' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;Statistiques d'utilisation m&#233;moire dans les outils pour d&#233;veloppeurs.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Les statistiques utilis&#233;es par nos &#233;quipes sont par exemple : l'utilisation m&#233;moire priv&#233;e, la taille de la pile &lt;span lang=&#034;en&#034;&gt;Heap&lt;/span&gt; de JavaScript, le nombre de n&#339;uds &lt;abbr&gt;DOM&lt;/abbr&gt;, l'effacement des donn&#233;es, le nombre de gestionnaires d'&#233;v&#232;nements et le comportement du ramasse-miette. Les habitu&#233;s des architectures dirig&#233;es par les &#233;v&#233;nements seront peut-&#234;tre contents d'apprendre que la plupart de nos probl&#232;mes venaient de l'utilisation de &lt;code&gt;listen()&lt;/code&gt; non suivi d'&lt;code&gt;unlisten()&lt;/code&gt; (&lt;span lang=&#034;en&#034;&gt;Closure&lt;/span&gt;) et par l'absence de &lt;code&gt;dispose()&lt;/code&gt; pour les objets cr&#233;ant des gestionnaires d'&#233;v&#232;nements.&lt;/p&gt;
&lt;p&gt;Par chance, les outils pour d&#233;veloppeurs peuvent nous aider &#224; localiser ces probl&#232;mes et Loreena Lee a cr&#233;&#233; une pr&#233;sentation fantastique, qui d&#233;taille la &lt;a href=&#034;https://docs.google.com/presentation/d/1wUVmf78gG-ra5aOxvTfYdiLkdGaR9OhXRnOlIcEmu2s/pub?start=false&amp;loop=false&amp;delayms=3000#slide=id.g1d65bdf6_0_0&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;technique des trois captures&lt;/a&gt; pour d&#233;tecter les fuites m&#233;moires, que je ne vous recommenderai jamais assez de lire.&lt;/p&gt;
&lt;p&gt;La base de la technique est d'enregistrer un certain nombre d'action utilisateur dans votre application, forcer l'&#233;xecution du ramasse-miette, v&#233;rifier si le nombre de noeuds &lt;abbr&gt;DOM&lt;/abbr&gt; reste sup&#233;rieur &#224; la normale puis comparer trois captures successives de la pile &lt;span lang=&#034;en&#034;&gt;Heap&lt;/span&gt; pour d&#233;tecter s'il y a une fuite de m&#233;moire.&lt;/p&gt;
&lt;h2&gt;Gestion de la m&#233;moire dans les applications sans rechargement de page&lt;/h2&gt;
&lt;p&gt;La gestion de la m&#233;moire est tr&#232;s importante au sein des applications qui ne sont jamais recharg&#233;es (avec AngularJS, Backbone, Ember..). En effet, une fuite de m&#233;moire devient rapidement handicapantes. C'est un &#233;norme pi&#232;ge au sein des applications pour appareils mobiles (qui sont limit&#233;s en m&#233;moire) comme les clients mails ou les applications de r&#233;seaux sociaux qui ont une dur&#233;e d'utilisation tr&#232;s importante. Comme on dit : &lt;strong&gt;de grands pouvoirs impliquent de grandes responsabilit&#233;s&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Il y a plusieurs fa&#231;on de se pr&#233;munir de cela. Dans &lt;span lang=&#034;en&#034;&gt;Backbone&lt;/span&gt;, assurez-vous de toujours d&#233;r&#233;f&#233;rencer vos vues et r&#233;f&#233;rences en utilisant &lt;code&gt;dispose()&lt;/code&gt; (actuellement disponible dans &lt;a href=&#034;https://github.com/documentcloud/backbone/blob/master/backbone.js#L1234&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Backbone (edge)&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Cette fonction, ajout&#233;e tout r&#233;cemment, supprime tout gestionnaire associ&#233; aux &#233;v&#232;nements de la vue ainsi qu'&#224; toute collection ou &#233;couteur de mod&#232;le pour lesquels la vue a &#233;t&#233; pass&#233;e en troisi&#232;me argument (en tant que contexte de &lt;code&gt;callback&lt;/code&gt;). &lt;code&gt;dispose()&lt;/code&gt; est &#233;galement appel&#233; par la m&#233;thode &lt;code&gt;remove()&lt;/code&gt; de la vue, et s'occupe de nettoyer la majorit&#233; de l'utilisation m&#233;moire lorsque &lt;a href=&#034;https://github.com/documentcloud/backbone/blob/master/backbone.js#L1235&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;la vue est supprim&#233;e de l'&#233;cran&lt;/a&gt;. D'autres librairies, comme Ember, &lt;a href=&#034;https://github.com/emberjs/ember.js/blob/d8f76a7fdde741ae3d1e07b12df9cb6718170e48/packages/ember-handlebars/lib/helpers/binding.js#L296&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;suppriment les observateurs&lt;/a&gt; quand ils d&#233;tectent que les &#233;l&#233;ments ont &#233;t&#233;s supprim&#233;s de la vue pour &#233;viter les fuites m&#233;moires.&lt;/p&gt;
&lt;p&gt;Voici les conseils avis&#233;s de Derick Bailey :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;Plut&#244;t que d'essayer de comprendre comment fonctionnent les &#233;v&#232;nements en terme de r&#233;f&#233;rences, suivez simplement les r&#232;gles standard de gestion de la m&#233;moire en JavaScript et vous serez tranquilles. Si vous chargez des donn&#233;es dans une collection &lt;span lang=&#034;en&#034;&gt;Backbone&lt;/span&gt; pleine d'objets Utilisateurs et voulez que cette collection soit nettoy&#233;e par la suite afin de ne plus utiliser de m&#233;moire, vous devez supprimer toute r&#233;f&#233;rence &#224; cette collection et aux objets qu'elle contient. Une fois toutes les r&#233;f&#233;rences supprim&#233;es, la m&#233;moire sera lib&#233;r&#233;e. Ce n'est rien d'autre que le comportement standard du ramasse-miette de JavaScript.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dans son article, Derick couvre la plupart des &lt;a href=&#034;http://lostechies.com/derickbailey/2012/03/19/backbone-js-and-javascript-garbage-collection/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;erreurs communes de gestion de m&#233;moire&lt;/a&gt; li&#233;es &#224; l'utilisation de &lt;span lang=&#034;en&#034;&gt;Backbone&lt;/span&gt; et comment les corriger.&lt;/p&gt;
&lt;p&gt;Il y a &#233;galement un &lt;a href=&#034;https://github.com/felixge/node-memory-leak-tutorial&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;bon tutoriel disponible pour d&#233;boguer les fuites m&#233;moires&lt;/a&gt; dans Node &#233;crit par Felix Geisend&#246;rfer. Particuli&#232;rement int&#233;ressant si votre application Node est utilis&#233;e dans le contexte d'un application sans rechargement de page.&lt;/p&gt;
&lt;h2&gt;Eviter les r&#233;agencements&lt;/h2&gt;
&lt;p&gt;Quand un navigateur doit recalculer la position et la forme des &#233;l&#233;ments d'un document afin de les redessiner, il effectue ce qu'on appelle un &lt;span lang=&#034;en&#034;&gt;reflow&lt;/span&gt; (r&#233;agencement). C'est une op&#233;ration qui bloque l'interface utilisateur, il est donc important de savoir comment limiter le temps qu'elle dure.&lt;/p&gt;
&lt;div class='spip_document_413 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH310/wJllbq8Yl2jsKuxr-f73a08a2-5c1ab.jpg?1763273155' width='500' height='310' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;Graphique montrant une succession de r&#233;agencements&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Il vaut mieux regrouper les m&#233;thodes qui &lt;a href=&#034;http://stackoverflow.com/questions/510213/when-does-reflow-happen-in-a-dom-environment&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;provoquent des r&#233;agencements&lt;/a&gt; ou un &lt;span lang=&#034;en&#034;&gt;repaint&lt;/span&gt; (changement d'apparence d'un ou plusieurs &#233;l&#233;ments, sans changements de dimensions) et les &#233;viter autant que possible. Si c'est n&#233;cessaire, effectuez de pr&#233;f&#233;rence vos modification en-dehors du &lt;abbr&gt;DOM&lt;/abbr&gt;. Utilisez pour cela un &lt;a href=&#034;http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-B63ED1A3&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;code&gt;DocumentFragment&lt;/code&gt;&lt;/a&gt; qui fonctionne &#224; l'identique mais est bien plus l&#233;ger. Voyez-le comme une fa&#231;on d'extraire une portion de l'arbre du document ou de cr&#233;er un nouveau &#171; fragment &#187; de document. Plut&#244;t que de constamment ajouter des n&#339;uds au document principal via le &lt;abbr&gt;DOM&lt;/abbr&gt;, nous pouvons construire un fragment de document avec ce dont nous avons besoin et l'ins&#233;rer en une seule fois dans le &lt;abbr&gt;DOM&lt;/abbr&gt;, ce qui &#233;vite des reflows successifs et inutiles.&lt;/p&gt;
&lt;p&gt;Par exemple, &#233;crivons une fonction qui ajoute 20 &#233;l&#233;ments &lt;code&gt;div&lt;/code&gt; &#224; un autre. Le faire en ajoutant le nouveau &lt;code&gt;div&lt;/code&gt; aussit&#244;t qu'il est cr&#233;&#233; risque de d&#233;clencher 20 r&#233;agencements.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function ajouteDivs(element) { var div; for (var i = 0; i &lt; 20; i ++) { div = document.createElement('div'); div.innerHTML = 'Coucou!'; element.appendChild(div); }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour contourner ce probl&#232;me, nous pouvons utiliser un &lt;code&gt;DocumentFragment&lt;/code&gt; auquel nous ajouterons chaque &lt;code&gt;div&lt;/code&gt;. Quand nous int&#232;grerons ce fragment au document principal, tous ses n&#339;uds enfants seront ajout&#233;s en une fois, ce qui ne provoque qu'un seul recalcul.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function ajouteDivs(element) { var div; // Cr&#233;e un fragment de document vide var fragment = document.createDocumentFragment(); for (var i = 0; i &lt; 20; i ++) { div = document.createElement('a'); div.innerHTML = 'Coucou!'; fragment.appendChild(div); } element.appendChild(fragment);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vous pouvez en savoir plus sur ce th&#232;me avec les articles &lt;a href=&#034;https://developers.google.com/speed/articles/javascript-dom&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span lang=&#034;en&#034;&gt;Make the Web Faster&lt;/span&gt;&lt;/a&gt;, &lt;a href=&#034;http://blog.tojicode.com/2012/03/javascript-memory-optimization-and.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span lang=&#034;en&#034;&gt;JavaScript Memory Optimization&lt;/span&gt;&lt;/a&gt; et &lt;a href=&#034;http://gent.ilcore.com/2011/08/finding-memory-leaks.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span lang=&#034;en&#034;&gt;Finding Memory Leaks&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;D&#233;tecter les fuites de m&#233;moires dans JavaScript&lt;/h2&gt;
&lt;p&gt;Afin d'aider &#224; la d&#233;tection des fuites m&#233;moires, deux de mes coll&#232;gues Googlers (Marja H&#246;ltt&#228; et Jochen Eisinger) ont d&#233;velopp&#233; un outil qui fonctionne avec les outils pour d&#233;veloppeurs de Google Chrome (avec le protocole d'inspection &#224; distance pour &#234;tre pr&#233;cis). L'outil r&#233;cup&#232;re plusieurs captures de la pile &lt;span lang=&#034;en&#034;&gt;heap&lt;/span&gt; pour d&#233;tecter les objets provoquant des fuites m&#233;moire.&lt;/p&gt;
&lt;div class='spip_document_414 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH271/s_4W5xFT7d7BnC6x-d9be17e9-80b7c.jpg?1763273155' width='500' height='271' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;Un outil d&#233;tectant les fuites m&#233;moire dans Javascript&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Il existe un billet complet sur la &lt;a href=&#034;http://google-opensource.blogspot.de/2012/08/leak-finder-new-tool-for-javascript.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;fa&#231;on d'utiliser l'outil&lt;/a&gt; et je vous encourage &#224; le lire ou &#224; jeter un &#339;il sur la &lt;a href=&#034;https://code.google.com/p/leak-finder-for-javascript/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;page du projet &lt;span lang=&#034;en&#034;&gt;Leak Finder&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Si vous vous demandez pourquoi un tel outil n'est pas directement int&#233;gr&#233; aux outils pour d&#233;veloppeurs, sachez qu'il y a deux raisons. La premi&#232;re, c'est qu'&#224; l'origine l'outil a &#233;t&#233; d&#233;velopp&#233; pour nous aider &#224; capturer des sc&#233;narios sp&#233;cifiques dans la &lt;span lang=&#034;en&#034;&gt;Closure Library&lt;/span&gt;, et la deuxi&#232;me c'est qu'il correspond plus &#224; un outil externe (ou peut-&#234;tre un jour en tant qu'extension, si nous mettons en place une &lt;abbr&gt;API&lt;/abbr&gt; de profilage de la pile &lt;span lang=&#034;en&#034;&gt;Heap&lt;/span&gt;).&lt;/p&gt;
&lt;h2&gt;Les options de V8 pour d&#233;boguer les optimisations et le ramasse-miette&lt;/h2&gt;
&lt;p&gt;Chrome supporte le passage d'options directement &#224; V8 via l'option &lt;code&gt;js-flags&lt;/code&gt; pour obtenir plus d'informations sur les optimisations effectu&#233;es par le moteur. Par exemple, cette commande trace les optimisations de V8 :&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/Applications/Google Chrome/Google Chrome&#034; --js-flags=&#034;--trace-opt --trace-deopt&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Si vous &#234;tes sur Windows, ex&#233;cutez :&lt;/p&gt;
&lt;p&gt;&lt;code&gt;chrome.exe --js-flags=&#034;--trace-opt --trace-deopt&#034;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Voici les options de d&#233;bogage disponibles pour d&#233;velopper avec Chrome :&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code&gt;trace-opt&lt;/code&gt; : enregistre dans un fichier le nom des fonctions optimis&#233;es et montre &#224; quels endroits V8 ne peut optimiser le code faute de pouvoir le cerner correctement.&lt;/li&gt;&lt;li&gt; &lt;code&gt;trace-deopt&lt;/code&gt; : enregistre dans un fichier les portions de code qui ont &#233;t&#233; d&#233;optimis&#233;es pendant l'ex&#233;cution.&lt;/li&gt;&lt;li&gt; &lt;code&gt;trace-gc&lt;/code&gt; : enregistre dans un fichier chaque appel au ramasse-miette.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Dans ces fichiers, V8 indique les fonctions optimis&#233;es avec une ast&#233;risque (&lt;code&gt;*&lt;/code&gt;) et celles qui ne le sont pas avec un tilde (&lt;code&gt;~&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Si vous souhaitez en apprendre plus au sujet des options de V8 et de la fa&#231;on dont il fonctionne je vous recommande fortement de jeter un &#339;il &#224; &lt;a href=&#034;http://mrale.ph/blog/2011/12/18/v8-optimization-checklist.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;l'excellent billet&lt;/a&gt; de Vyacheslav Egorov qui r&#233;sume les meilleurs ressources disponibles actuellement sur le sujet.&lt;/p&gt;
&lt;h2&gt;Mesures temporelles pr&#233;cises : &lt;abbr&gt;HRT&lt;/abbr&gt; et &lt;span lang=&#034;en&#034;&gt;Navigation Time &lt;abbr&gt;API&lt;/abbr&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#034;http://www.w3.org/TR/hr-time/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span lang=&#034;en&#034;&gt;High Resolution Time&lt;/span&gt; (&lt;abbr&gt;HRT&lt;/abbr&gt;)&lt;/a&gt; est une interface JavaScript d&#233;livrant une mesure du temps avec une pr&#233;cision de l'ordre du millioni&#232;me de microseconde, non sujette aux variations de l'horloge syst&#232;me et aux ajustements de cette derni&#232;re par l'utilisateur. Voyez cela comme une fa&#231;on plus pr&#233;cise de faire des tests de performance que la m&#233;thode vue pr&#233;c&#233;demment avec &lt;code&gt;new Date()&lt;/code&gt; et &lt;code&gt;Date.now()&lt;/code&gt;. C'est tr&#232;s pratique quand vous &#233;crivez des tests de performance.&lt;/p&gt;
&lt;div class='spip_document_416 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH143/9qxlMZ8PU-PIkekz-e3d4a87a-739ca.jpg?1763273155' width='500' height='143' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;&lt;span lang=&#034;en&#034;&gt;High Resolution Time&lt;/span&gt; (&lt;abbr&gt;HRT&lt;/abbr&gt;) indique le temps avec une pr&#233;cision au millioni&#232;me de milliseconde pr&#232;s.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;abbr&gt;HRT&lt;/abbr&gt; est disponible dans Chrome (version stable) via &lt;code&gt;window.performance.webkitNow()&lt;/code&gt;, mais la version canary de Chrome propose d&#233;j&#224; une version non-pr&#233;fix&#233;e (&lt;code&gt;window.performance.now()&lt;/code&gt;) Paul Irish a r&#233;dig&#233; une &lt;a href=&#034;http://updates.html5rocks.com/2012/08/When-milliseconds-are-not-enough-performance-now&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;pr&#233;sentation plus compl&#232;te de &lt;code&gt;window.performance&lt;/code&gt;&lt;/a&gt; sur HTML5Rocks.&lt;/p&gt;
&lt;p&gt;Nous avons une mesure temporelle pr&#233;cise, mais &lt;i&gt;quid&lt;/i&gt; de la mesure pr&#233;cise de performance sur le web ?&lt;/p&gt;
&lt;p&gt;Eh bien, nous avons maintenant &#224; notre disposition la &lt;a href=&#034;https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/Overview.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span lang=&#034;en&#034;&gt;Navigation Timing &lt;abbr&gt;API&lt;/abbr&gt;&lt;/span&gt;&lt;/a&gt;. Cette &lt;abbr&gt;API&lt;/abbr&gt; propose une fa&#231;on simple d'obtenir des mesures pr&#233;cises et d&#233;taill&#233;es, r&#233;cup&#233;r&#233;es durant le chargement de la page et sa pr&#233;sentation aux utilisateurs. Les mesures sont expos&#233;es via l'objet &lt;code&gt;window.performance.timing&lt;/code&gt; que vous pouvez simplement obtenir par le biais de la console Javascript.&lt;/p&gt;
&lt;div class='spip_document_417 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH292/MZXBB_oDX3yHC19b-e818cc7b-e5fb6.jpg?1763273155' width='500' height='292' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;Mesure de performances affich&#233;es dans la console JavaScript.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;On peut ais&#233;ment extraire diverses informations tr&#232;s pratiques des donn&#233;es ci-dessus. Par exemple, la latence du r&#233;seau via &lt;code&gt;responseEnd - fetchStart&lt;/code&gt;, le temps n&#233;cessaire au chargement de la page &#224; partir de sa r&#233;ception via &lt;code&gt;loadEventEnd - responseEnd&lt;/code&gt; et le temps n&#233;cessaire pour passer du clic &#224; l'affichage de la nouvelle page via &lt;code&gt;loadEventEnd - navigationStart&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Comme vous pouvez le voir ci-dessus, une propri&#233;t&#233; &lt;code&gt;performance.memory&lt;/code&gt; est disponible. Elle donne des informations sur l'usage de la m&#233;moire par JavaScript comme par exemple la taille de la pile &lt;span lang=&#034;en&#034;&gt;Heap&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Pour plus d'informations sur la &lt;span lang=&#034;en&#034;&gt;Navigation Timing &lt;abbr&gt;API&lt;/abbr&gt;&lt;/span&gt;, lisez le super billet de Sam Dutton : &lt;a href=&#034;http://www.html5rocks.com/en/tutorials/webperformance/basics/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span lang=&#034;en&#034;&gt;Measuring Page Load Speed With Navigation Timing&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;About:memory&lt;/code&gt; et &lt;code&gt;about:tracing&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;about:tracing&lt;/code&gt; dans Google Chrome affiche les performances du navigateur lui-m&#234;me, et enregistre l'activit&#233; de chaque &lt;span lang=&#034;en&#034;&gt;thread&lt;/span&gt;, de chaque onglet et de chaque processus.&lt;/p&gt;
&lt;div class='spip_document_418 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH275/r8N-F6YK0GdUTJtJ-8f87047b-3b7d0.jpg?1763273155' width='500' height='275' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;&lt;code&gt;about:tracing&lt;/code&gt; montre les performances du navigateur.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Ce qui est tr&#232;s pratique c'est que cet outile permet de capturer et profiler les m&#233;canismes internes de Chrome de mani&#232;re &#224; pouvoir ajuster et optimiser votre JavaScript de mani&#232;re appropri&#233;e.&lt;/p&gt;
&lt;p&gt;Lili Thompson a &#233;crit un excellent article destin&#233; aux d&#233;veloppeurs de jeux vid&#233;os HTML5 sur la fa&#231;on d'&lt;a href=&#034;http://www.html5rocks.com/en/tutorials/games/abouttracing/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;utiliser &lt;code&gt;about:tracing&lt;/code&gt; pour le profilage de WebGL&lt;/a&gt;. Les autres d&#233;veloppeurs y trouveront aussi des informations utiles.&lt;/p&gt;
&lt;p&gt;Naviguer &#224; l'int&#233;rieur de la page &lt;code&gt;about:memory&lt;/code&gt; de Chrome est &#233;galement d'une grande aide. Il montre l'utilisation exacte de chaque onglet ce qui peut aider &#224; d&#233;tecter facilement les applications causant des fuites de m&#233;moire.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Comme nous l'avons vu, &lt;strong&gt;il y a nombre de subtilit&#233;s &#224; conna&#238;tre dans le monde de la performance des moteurs JavaScript&lt;/strong&gt;, et pas de solution miracle. Ce n'est qu'en confrontant vos optimisations &#224; des tests grandeur nature que vous pourrez estimer les gains en performance les plus importants. De plus, savoir comment les moteurs JavaScript interpr&#232;tent et optimisent votre code peut vous fournir des pistes pour le d&#233;veloppement de vos applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mesurez, comprenez, corrigez !&lt;/strong&gt; ...et recommencez.&lt;/p&gt;
&lt;div class='spip_document_419 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L496xH500/FaISwq_SHQqFahSf-49ad7e8f-40266.jpg?1763273155' width='496' height='500' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Cr&#233;dits image : &lt;a href=&#034;http://www.flickr.com/photos/38891164@N02/4266609887/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Sally Hunter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Soyez conscients de l'importance de la performance, mais sans aller jusqu'aux micros optimisations qui pourraient nuire &#224; la simplicit&#233; de votre code. Par exemple, certains d&#233;veloppeurs pr&#233;f&#232;rent utiliser &lt;code&gt;.forEach&lt;/code&gt; et &lt;code&gt;Object.keys&lt;/code&gt; plut&#244;t que les boucles &lt;code&gt;for&lt;/code&gt; et &lt;code&gt;for...in&lt;/code&gt;, malgr&#233; leur lenteur, pour pouvoir garder la main sur le contexte. Sachez distinguer les optimisations qui sont absolument indispensables &#224; votre application de celles dont elle peut se passer.&lt;/p&gt;
&lt;p&gt;Aussi, soyez bien conscient que bien que les moteurs Javascript continuent &#224; am&#233;liorer leurs performances, la vraie bataille pour les performances se situe au niveau du &lt;abbr&gt;DOM&lt;/abbr&gt;. Les r&#233;agencements et les recalculs graphiques (&lt;span lang=&#034;en&#034;&gt;reflows&lt;/span&gt; et &lt;span lang=&#034;en&#034;&gt;repaints&lt;/span&gt;) doivent &#234;tre &#233;vit&#233;s &#224; tout prix, souvenez-vous donc de ne toucher au &lt;abbr&gt;DOM&lt;/abbr&gt; que quand c'est absolument n&#233;cessaire. Et allez-y mollo sur le r&#233;seau : les requ&#234;tes &lt;abbr&gt;HTTP&lt;/abbr&gt; sont pr&#233;cieuses, surtout dans un contexte de mobilit&#233;, vous devriez exploiter le maximum du potentiel du cache &lt;abbr&gt;HTTP&lt;/abbr&gt; pour r&#233;duire le poids de vos ressources.&lt;/p&gt;
&lt;p&gt;Garder tout cela &#224; l'esprit vous assure de tirer le meilleur parti des informations contenues dans ce billet. J'esp&#232;re que vous l'avez trouv&#233; utile !&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_ps'&gt;&lt;p&gt;L'article original a &#233;t&#233; relu par Jakob Kummerow, Michael Starzinger ; Sindre Sorhus, Mathias Bynens, John-David Dalton et Paul Irish.&lt;/p&gt;&lt;/div&gt;
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Inline-block est-il un substitut aux floats ?</title>
		<link>http://www.pompage.net/traduction/inline-block-vs-float</link>
		<guid isPermaLink="true">http://www.pompage.net/traduction/inline-block-vs-float</guid>
		<dc:date>2014-08-05T10:30:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Augustin Chassine, Didier De Vos, Fabien Basmaison, Goulven Champenois</dc:creator>


		<dc:subject>Steven Bradley</dc:subject>
		<dc:subject>D&#233;butant</dc:subject>
		<dc:subject>CSS</dc:subject>
		<dc:subject>Technique</dc:subject>
		<dc:subject>Int&#233;gration</dc:subject>

		<description>&lt;p&gt;Les dispositions d'&#233;l&#233;ments avec les CSS sont souvent d&#233;licates ; cet article permet de faire le point sur les meilleurs choix &#224; effectuer entre les &#233;l&#233;ments flottants (floats) et les blocs en ligne (inline-blocks).&lt;/p&gt;

-
&lt;a href="http://www.pompage.net/traduction/" rel="directory"&gt;Traduction&lt;/a&gt;

/ 
&lt;a href="http://www.pompage.net/tag/steven-bradley" rel="tag"&gt;Steven Bradley&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/tag/debutant" rel="tag"&gt;D&#233;butant&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/CSS" rel="tag"&gt;CSS&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/Technique" rel="tag"&gt;Technique&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/tag/integration" rel="tag"&gt;Int&#233;gration&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Quand vient le moment de d&#233;velopper la mise en page avec CSS, &lt;code&gt;float&lt;/code&gt; fait le plus gros du travail. Nous utilisons les &#233;l&#233;ments flottants pour les blocs importants comme une zone de contenu principale ou une colonne lat&#233;rale ; nous y avons aussi recours pour les blocs de moindre taille &#224; l'int&#233;rieur de ces blocs principaux. Mais les floats sont-ils toujours le meilleur choix ?&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Si les floats fonctionnent g&#233;n&#233;ralement sans probl&#232;me, il peut parfois &#234;tre d&#233;licat de les manipuler. C'est tout particuli&#232;rement compliqu&#233; quand il s'agit de blocs imbriqu&#233;s, comme par exemple lorsqu'on veut organiser une grille d'images, mais qu'elles refusent de bien s'aligner. Une alternative existe : les blocs en lignes. Ils b&#233;n&#233;ficient de &lt;a href=&#034;http://www.vanseodesign.com/css/understanding-css-floats/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;certains avantages des floats&lt;/a&gt; sans en pr&#233;senter les inconv&#233;nients.&lt;/p&gt;
&lt;p&gt;Les inline-block n'ont rien d'une nouveaut&#233; et il est possible que vous les utilisiez d&#233;j&#224;. Ce n'&#233;tait pas mon cas jusqu'&#224; r&#233;cemment. Il se trouve que les derniers sites que j'ai r&#233;alis&#233;s &#233;taient destin&#233;s &#224; des photographes. Naturellement, ce genre de site pr&#233;sente des grilles d'image. Pour les mettre en forme, j'ai privil&#233;gi&#233; inline-block &#224; float.&lt;/p&gt;
&lt;div class='spip_document_462 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH350/css-box-model_fr-2a310.png?1763164452' width='500' height='350' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;&lt;h2&gt;Qu'est ce qu'un inline-block ?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#034;http://www.w3.org/TR/CSS21/visuren.html#display-prop&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Inline-block&lt;/a&gt; est l'une des valeurs possibles pouvant &#234;tre assign&#233;es &#224; &lt;a href=&#034;http://www.vanseodesign.com/css/display-property/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;la propri&#233;t&#233; &lt;code&gt;display &lt;/code&gt;d'un &#233;l&#233;ment&lt;/a&gt;. Cette valeur tient son nom du fait qu'elle regroupe certaines caract&#233;ristiques des &#233;l&#233;ments de type bloc et en ligne.&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Les &#233;l&#233;ments de type bloc g&#233;n&#232;rent des bo&#238;tes selon &lt;a href=&#034;http://www.w3.org/TR/css3-box/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;le mod&#232;le de bo&#238;tes &lt;abbr title=&#034;Cascading Style Sheets&#034;&gt;CSS&lt;/abbr&gt;&lt;/a&gt;. Ils peuvent avoir une largeur (&lt;code&gt;width&lt;/code&gt;), une hauteur (&lt;code&gt;height&lt;/code&gt;), des bordures et des marges int&#233;rieures et ext&#233;rieures (&lt;code&gt;padding &lt;/code&gt;et &lt;code&gt;margin&lt;/code&gt;). Ils s'organisent verticalement les uns au-dessus des autres.&lt;/li&gt;&lt;li&gt; Les &#233;l&#233;ments en-ligne ne forment pas de bo&#238;tes. Ils se suivent horizontalement. (&lt;abbr title=&#034;Note du Traducteur&#034;&gt;NdT&lt;/abbr&gt; : Ils g&#233;n&#232;rent en fait des bo&#238;tes de ligne : voir &lt;a href=&#034;http://www.w3.org/TR/css3-box/#block-level0&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;indications du W3C&lt;/a&gt;.)&lt;/li&gt;&lt;li&gt; Les &#233;l&#233;ments de type blocs-en-ligne, de l'int&#233;rieur, se comportent comme des &lt;a href=&#034;http://quirksmode.org/css/css2/display.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&#233;l&#233;ments de type bloc&lt;/a&gt; : ils forment des bo&#238;tes. Vus de l'ext&#233;rieur, ils se comportent tels des &#233;l&#233;ments en-ligne, se suivent horizontalement au lieu de &lt;a href=&#034;http://www.vanseodesign.com/css/css-stack-z-index/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;s'empiler&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Lorsqu'on y pense, ce comportement n'est pas si &#233;loign&#233; de celui des &#233;l&#233;ments flottants. Les flottants forment des bo&#238;tes et se tiennent eux aussi c&#244;te &#224; c&#244;te au lieu de s'organiser verticalement. L'un et l'autre ne sont bien s&#251;r pas identiques, mais leur positionnement en ligne &#224; l'ext&#233;rieur et leur comportement en bloc &#224; l'int&#233;rieur sont parfois les seules caract&#233;ristiques recherch&#233;es. Dans ce cas, un float ou un &lt;a href=&#034;http://www.impressivewebs.com/inline-block/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;inline-block&lt;/a&gt; pourra &#234;tre utilis&#233; indiff&#233;remment.&lt;/p&gt;
&lt;div class='spip_document_463 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH160/floats-inline-blocks_fr-cd6b0.png?1763164452' width='500' height='160' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;&lt;h2&gt;La diff&#233;rence entre float et inline-block&lt;/h2&gt;
&lt;p&gt;M&#234;me si float et inline-block partagent quelques similitudes, il existe &lt;a href=&#034;http://www.onderhond.com/blog/inline-block-vs-float&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;des diff&#233;rences bien pr&#233;cises&lt;/a&gt; entre les deux.&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Flux du document &#8211; Les flottants sont retir&#233;s du flux normal, permettant ainsi aux &#233;l&#233;ments qui les suivent de &lt;a href=&#034;http://www.ternstyle.us/blog/float-vs-inline-block&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;flotter autour d'eux&lt;/a&gt; ; les blocs en ligne restent dans le flux du document. Ainsi, il n'est pas n&#233;cessaire d'avoir recours &#224; des techniques telles que &lt;code&gt;clearfix &lt;/code&gt;ou &lt;code&gt;overflow:hidden&lt;/code&gt;. Ainsi, les &#233;l&#233;ments suivant un &#171; inline-block &#187; ne peuvent pas habiller ce dernier, et on ne peut pas forcer un &#233;l&#233;ment &#224; passer sous un &#171; inline-block &#187; avec la propri&#233;t&#233; &lt;code&gt;clear&lt;/code&gt;.&lt;/li&gt;&lt;li&gt; Positionnement horizontal &#8211; Un exemple concret serait des floats qui ne peuvent &#234;tre centr&#233;s avec un &lt;code&gt;text-align: center&lt;/code&gt; plac&#233; sur leur parent. De plus, aucun style de positionnement appliqu&#233; au parent d'un flottant n'aura d'influence sur ce dernier. &#192; l'inverse, le parent d'un inline-block peut &lt;a href=&#034;http://joshnh.com/2012/02/07/why-you-should-use-inline-block-when-positioning-elements/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;affecter sa position&lt;/a&gt;.&lt;/li&gt;&lt;li&gt; Alignement vertical &#8211; Les inline-blocks s'alignent par d&#233;faut sur la ligne de base du texte. Les floats s'alignent en haut de leur parent. Il est possible de changer ce comportement par d&#233;faut pour les inline-blocks et ainsi &lt;a href=&#034;http://designshack.net/articles/css/whats-the-deal-with-display-inline-block/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;contr&#244;ler o&#249; ils seront align&#233;s verticalement&lt;/a&gt;, ce qui n'est pas le cas pour les floats. C'est principalement pour cette raison que&#8239;j'ai eu davantage recours aux inline-blocks.&lt;/li&gt;&lt;li&gt; Espaces blancs &#8211; Les inline-blocks ob&#233;issent aux espaces pr&#233;sents dans le &lt;abbr title=&#034;HyperText Markup Language&#034;&gt;HTML&lt;/abbr&gt; (&lt;abbr&gt;NdT&lt;/abbr&gt; : que ce soit une espace simple, une tabulation ou un retour chariot). Si plusieurs &#233;l&#233;ments inline-block sont chacun d&#233;clar&#233;s sur une nouvelle ligne dans le code &lt;abbr&gt;HTML&lt;/abbr&gt;, ils s'afficheront de chaque c&#244;t&#233; d'un espace horizontal. Les &#233;l&#233;ments flottants se tiendront eux les uns &#224; c&#244;t&#233; des autres ind&#233;pendamment des espaces pr&#233;sents dans le balisage.&lt;/li&gt;&lt;li&gt; &lt;abbr title=&#034;Internet Explorer&#034;&gt;IE&lt;/abbr&gt;6 et &lt;abbr&gt;IE&lt;/abbr&gt;7 &#8211; Les blocs en ligne ne sont pas support&#233;s ou n'ont qu'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'une alternative.&lt;/li&gt;&lt;/ul&gt;&lt;div class='spip_document_461 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH90/whitespace-3d999.png?1763164452' width='500' height='90' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;Tous les blocs ci-dessus ont une d&#233;claration &lt;code&gt;display: inline-block&lt;/code&gt;. &#192; gauche, une espace est pr&#233;sente entre eux dans le code. &#192; droite, l'espace a &#233;t&#233; retir&#233;e du &lt;abbr&gt;HTML&lt;/abbr&gt;. Aucune autre diff&#233;rence.&lt;/i&gt;&lt;/p&gt;
&lt;h2&gt;R&#233;gler le probl&#232;me de l'espace blanc&lt;/h2&gt;
&lt;p&gt;Cela est possible. Il est probable que vous voudrez utiliser plusieurs inline-block sans pour autant souhaiter l'espace entre eux. Il existe &lt;a href=&#034;http://css-tricks.com/fighting-the-space-between-inline-block-elements/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;quelques m&#233;thodes&lt;/a&gt; pour le supprimer.&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Supprimez tout espace dans le balisage (&lt;abbr&gt;NDT&lt;/abbr&gt; : tabulations et retours &#224; la ligne compris) &#8211; Affranchissez-vous des retours chariot entre les &#233;l&#233;ments de type inline-block. Il ne s'agit pas de la solution la plus &#233;l&#233;gante, mais elle est efficace, surtout si vous n'avez que quelques &#233;l&#233;ments.&lt;/li&gt;&lt;li&gt; Utilisez des marges n&#233;gatives &#8211; Il vous faudra prendre en compte la taille de la fonte car les espaces sont calcul&#233;es en fonction de cette valeur. J'aime &#224; penser qu'il s'agit de 0,25em, mais n'&#233;tant pas s&#251;r, laissez un commentaire si vous en savez plus sur le sujet.&lt;/li&gt;&lt;li&gt; Appliquer une taille de police de 0 au parent &#8211; Qu'importe la taille de l'espace, une taille de texte nulle implique que l'espace sera lui aussi nul. Il sera alors &#233;videmment n&#233;cessaire d'attribuer une nouvelle taille pour tous les enfants qui en auraient besoin.&lt;/li&gt;&lt;/ul&gt;&lt;div class='spip_document_457 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH287/floating-blocks-39621.jpg?1763164452' width='500' height='287' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;&lt;h2&gt;Quand utiliser les inline-blocks et quand utiliser les floats ?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#034;http://css-tricks.com/forums/topic/inline-block-vs-float/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Quand utiliser l'un ou l'autre&lt;/a&gt; d&#233;pend des sp&#233;cificit&#233;s de votre design, et de ce que vous tentez de r&#233;aliser. Si vous voulez que le texte s'&#233;coule autour d'un &#233;l&#233;ment, alors float est la r&#233;ponse la plus &#233;vidente. Si vous voulez centrer un &#233;l&#233;ment, inline-block est la meilleure option.&lt;br class='autobr' /&gt;
En d&#233;finitive, votre choix d&#233;coulera des diff&#233;rences entre inline-block et float, et des particularit&#233;s de chacun qui vous sont n&#233;cessaires.&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Utilisez inline-block&#8230; lorsque vous avez besoin d'un plus grand contr&#244;le sur l'alignement vertical et le &lt;a href=&#034;http://www.vanseodesign.com/css/css-positioning/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;positionnement horizontal des &#233;l&#233;ments&lt;/a&gt;.&lt;/li&gt;&lt;li&gt; Utilisez float&#8230; lorsque vous attendez des autres &#233;l&#233;ments qu'ils s'agencent autour d'un &#233;l&#233;ment sp&#233;cifique, lorsque vous d&#233;sirez un support pour les versions plus anciennes d'Internet Explorer ou souhaitez &#233;viter la probl&#233;matique de l'espace entre &#233;l&#233;ments.&lt;/li&gt;&lt;/ul&gt;&lt;div class='spip_document_458 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH208/floats-95662.png?1763164452' width='500' height='208' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;Les blocs ci-dessus flottent &#224; gauche pour composer une grille. Le cinqui&#232;me bloc [five] se retrouve coinc&#233; par le second [two] car ce dernier est le plus haut de sa rang&#233;e. C'est un probl&#232;me r&#233;current lors de la cr&#233;ation de grilles d'images.&lt;/i&gt;&lt;/p&gt;
&lt;h2&gt;Les floats, les inline-blocks et les grilles d'images&lt;/h2&gt;
&lt;p&gt;Dans mon cas, l'utilisation des inline-blocks m'est utile face au souci de l'alignement vertical. Je crois que cela doit &#234;tre la m&#234;me chose pour beaucoup de personnes qui commencent &#224; les utiliser. J'ai derni&#232;rement construit plusieurs sites pour des photographes et, bien entendu, ces sites sont in&#233;vitablement charg&#233;s de &lt;a href=&#034;http://blog.teamtreehouse.com/using-inline-block-to-display-a-product-grid-view&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;grilles d'images&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Les flottants sont plus efficaces si les images de la grille ont toutes la m&#234;me hauteur. D&#232;s que ce n'est plus le cas, c'est-&#224;-dire la plupart du temps, les floats se retrouvent comme suspendus &#224; c&#244;t&#233; de l'image la plus haute de la rang&#233;e sup&#233;rieure. Ceci est d&#251; au fait que les floats sont exclus du flux normal du document.&lt;/p&gt;
&lt;p&gt;Les blocs en ligne n'ont pas ce probl&#232;me puisqu'ils restent dans le flux. Quand une nouvelle rang&#233;e d'images doit &#234;tre cr&#233;&#233;e, la nouvelle rang&#233;e se positionne naturellement sous la pr&#233;c&#233;dente, de mani&#232;re rectiligne. Pour avoir ce m&#234;me comportement avec des &#233;l&#233;ments flottants, nous aurions besoin de savoir pr&#233;cis&#233;ment sur quel flottant positionner la propri&#233;t&#233; &lt;code&gt;clear &lt;/code&gt;(&lt;abbr&gt;NDT&lt;/abbr&gt; : pour forcer un vrai retour &#224; la ligne). Ceci peut poser probl&#232;me dans le cas o&#249; les &#233;l&#233;ments sont g&#233;n&#233;r&#233;s dynamiquement. Dans ce cas pr&#233;cis, utiliser des blocs en ligne est bien plus naturel. &lt;br class='autobr' /&gt;
&lt;a href=&#034;http://www.vanseodesign.com/blog/demo/inline-block/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Voici une d&#233;monstration&lt;/a&gt; qui illustre le probl&#232;me abord&#233; plus haut et les diff&#233;rents r&#233;sultats obtenus suivant la technique utilis&#233;e.&lt;/p&gt;
&lt;div class='spip_document_460 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH153/inline-blocks-ecdee.png?1763164452' width='500' height='153' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;&lt;i&gt;&lt;code&gt;display: inline-block&lt;/code&gt; est appliqu&#233; aux blocs du dessus. &#201;tant donn&#233; qu'ils ne sont pas exclus du flux du document, aucun des blocs ne se retrouve prisonnier des blocs de la ligne sup&#233;rieure.&lt;/i&gt;&lt;/p&gt;
&lt;h2&gt;Les inline-blocks pour la navigation&lt;/h2&gt;
&lt;p&gt;Une autre application possible pour inline-block se trouve dans &lt;a href=&#034;http://www.vanseodesign.com/css/simple-navigation-bar-with-css-and-xhtml/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;les barres horizontales de navigation&lt;/a&gt;. On y fait g&#233;n&#233;ralement flotter les liens pour ensuite les d&#233;clarer comme des &#233;l&#233;ments de type bloc. Je me vois &#233;galement d&#233;clarer des items de liste comme inline. S'il vous faut jongler avec des valeurs inline et block pour utiliser float, inline-block repr&#233;sente alors peut&#8209;&#234;tre une meilleure solution.&lt;/p&gt;
&lt;p&gt;Partout o&#249; vous avez besoin de ranger vos &#233;l&#233;ments en une ou plusieurs lignes, vous devriez songer &#224; utiliser inline-block plut&#244;t que float. &#201;videmment, des tableaux feraient eux aussi l'affaire dans ces circonstances. Apr&#232;s tout, ils sont faits pour aligner du contenu en lignes et colonnes.&lt;/p&gt;
&lt;p&gt;Si vous construisez quelque chose de plus complexe n&#233;cessitant lignes et colonnes, alors &lt;a href=&#034;http://www.vanseodesign.com/css/tables/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;un tableau HTML ou CSS&lt;/a&gt; peut &#234;tre votre meilleure option, m&#234;me si les inline-blocks restent &#224; privil&#233;gier pour les constructions plus simples.&lt;/p&gt;
&lt;div class='spip_document_456 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH341/block-58cd7.jpg?1763164452' width='500' height='341' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Les inline-blocks puisent parmi les caract&#233;ristiques des &#233;l&#233;ments en ligne vus de l'ext&#233;rieur ; et des &#233;l&#233;ments de type block vus de l'int&#233;rieur. Cela les rend tr&#232;s similaires aux flottants &#224; quelques diff&#233;rences pr&#232;s.&lt;/p&gt;
&lt;p&gt;Ces diff&#233;rences vous aideront &#224; choisir l'utilisation la mieux adapt&#233;e. Si vous rencontrez des probl&#232;mes avec &lt;a href=&#034;http://www.vanseodesign.com/css/dynamic-vertical-centering/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;l'alignement vertical&lt;/a&gt; ou le positionnement horizontal, vous serez plus enclin &#224; utiliser un inline-block. Si vous avez besoin de plus de contr&#244;le sur un seul &#233;l&#233;ment et son interaction avec le contenu qui l'entoure, vous serez plus enclin &#224; utiliser un float.&lt;br class='autobr' /&gt;
Bien entendu, un tableau peut s'av&#233;rer comme &#233;tant la meilleure option en fonction de ce que vous tentez d'accomplir.&lt;/p&gt;
&lt;p&gt;Tout ceci n'est rien de nouveau, mais j'ai pens&#233; qu'un article et &lt;a href=&#034;http://www.vanseodesign.com/blog/demo/inline-block/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;une d&#233;monstration&lt;/a&gt; seraient utiles &#224; quiconque n'aurait pas utilis&#233; les blocs en ligne l&#224; o&#249; il aurait d&#251;.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Introduction &#224; l'accessibilit&#233; de JavaScript</title>
		<link>http://www.pompage.net/traduction/introduction-a-l-accessibilite-de-javascript</link>
		<guid isPermaLink="true">http://www.pompage.net/traduction/introduction-a-l-accessibilite-de-javascript</guid>
		<dc:date>2014-08-04T08:00:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Bertrand Keller, Frank Taillandier, Fr&#233;d&#233;ric Chotard</dc:creator>


		<dc:subject>Accessibilit&#233;</dc:subject>
		<dc:subject>JavaScript</dc:subject>
		<dc:subject>James Edwards</dc:subject>

		<description>&lt;p&gt;Il fut un temps o&#249; l'accessibilit&#233; de JavaScript signifiait simplement assurer une d&#233;gradation &#233;l&#233;gante lorsque JavaScript n'&#233;tait pas disponible. Mais, avec la perc&#233;e d'Ajax et des Applications Internet Riches (RIA), JavaScript n'est plus seulement utilis&#233; pour am&#233;liorer l'utilisabilit&#233; &#224; la marge, il constitue d&#233;sormais la base des applications web. De nos jours, parler de l'accessibilit&#233; de JavaScript c'est s'assurer que le code JavaScript est accessible en lui-m&#234;me.&lt;/p&gt;

-
&lt;a href="http://www.pompage.net/traduction/" rel="directory"&gt;Traduction&lt;/a&gt;

/ 
&lt;a href="http://www.pompage.net/Accessibilite" rel="tag"&gt;Accessibilit&#233;&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/JavaScript" rel="tag"&gt;JavaScript&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/tag/james-edwards" rel="tag"&gt;James Edwards&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Il fut un temps o&#249; l'accessibilit&#233; de JavaScript signifiait simplement assurer une d&#233;gradation &#233;l&#233;gante lorsque JavaScript n'&#233;tait pas disponible. Mais, avec la perc&#233;e d'Ajax et des Applications Internet Riches (&lt;abbr&gt;RIA&lt;/abbr&gt;), JavaScript n'est plus seulement utilis&#233; pour am&#233;liorer l'utilisabilit&#233; &#224; la marge, il constitue d&#233;sormais la base des applications web. De nos jours, parler de l'accessibilit&#233; de JavaScript c'est s'assurer que le code JavaScript est accessible en lui-m&#234;me.&lt;/p&gt;
&lt;h2&gt;Ce que nous r&#233;serve l'avenir&lt;/h2&gt;
&lt;p&gt;Le protocole d'accessibilit&#233; des applications Internet riches (NdT : &lt;abbr&gt;ARIA&lt;/abbr&gt; en anglais, pour &lt;span lang=&#034;en&#034;&gt;Accessible Rich Internet Applications&lt;/span&gt;) est une des &#233;volutions les plus importantes de ces derni&#232;res ann&#233;es dans l'accessibilit&#233; web. Il a &#233;t&#233; con&#231;u par le groupe Initiative pour l'Accessibilit&#233; du Web (&lt;abbr&gt;WAI&lt;/abbr&gt;) et d&#233;finit une s&#233;mantique permettant de rendre le contenu interactif accessible aux technologies d'assistance telles que les lecteurs d'&#233;cran. &lt;abbr&gt;WAI-ARIA&lt;/abbr&gt; est apparu par n&#233;cessit&#233;, l'explosion du Web 2.0 s'&#233;tant faite presque sans aucune consid&#233;ration d'accessibilit&#233;. JavaScript est d&#233;sormais utilis&#233; dans le code d'applications web critiques et les technologies d'assistance doivent donc imp&#233;rativement pouvoir interpr&#233;ter le contenu dynamique.&lt;/p&gt;
&lt;h2&gt;Aujourd'hui&lt;/h2&gt;
&lt;p&gt;Malheureusement, &lt;abbr&gt;ARIA&lt;/abbr&gt; n'est pas encore tr&#232;s bien pris en charge. Seules les derni&#232;res versions des (tr&#232;s co&#251;teux) lecteurs d'&#233;cran offrent un d&#233;but de prise en charge, et aucun d'entre eux ne l'offre int&#233;gralement. De plus, ce qui est support&#233; n'est pas forc&#233;ment bien impl&#233;ment&#233;. Et m&#234;me quand &lt;abbr&gt;ARIA&lt;/abbr&gt; sera largement pris en charge, ce ne sera pas pour autant la r&#233;ponse &#224; tout car l'accessibilit&#233; de JavaScript ne se r&#233;sume pas &#224; ce qui est d&#233;fini par &lt;abbr&gt;ARIA&lt;/abbr&gt;. Pour que les fondations de ce protocole soient solides, elles doivent associer une v&#233;ritable compr&#233;hension du besoin utilisateur et des d&#233;veloppements bas&#233;s sur les standards.&lt;/p&gt;
&lt;p&gt;Sitepoint va consacrer &lt;a href=&#034;http://www.sitepoint.com/category/javascript/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;plusieurs articles &#224; l'accessibilit&#233; de JavaScript&lt;/a&gt;. Nous commen&#231;ons par un aper&#231;u des choses simples que vous pouvez faire d&#232;s &#224; pr&#233;sent pour rendre votre JavaScript plus accessible. Plus tard, nous entrerons plus en d&#233;tails dans le monde d'&lt;abbr&gt;ARIA&lt;/abbr&gt;. Mais avant toute chose, nous devons revoir quelques concepts th&#233;oriques&lt;/p&gt;
&lt;h2&gt;Le c&#339;ur de l'accessibilit&#233;&lt;/h2&gt;
&lt;p&gt;L'accessibilit&#233; de JavaScript peut &#234;tre divis&#233;e en trois grands groupes de besoins utilisateurs. Ce chapitre d&#233;crit ces groupes de mani&#232;re d&#233;taill&#233;e.&lt;/p&gt;
&lt;h2&gt;Les utilisateurs de technologies d'assistance&lt;/h2&gt;
&lt;p&gt;Le premier groupe comprend les personnes qui utilisent des lecteurs d'&#233;cran, plages Braille ou d'autres aides techniques de ce genre. Les aveugles sont majoritaires dans ce groupe, mais il inclut &#233;galement les personnes souffrant de handicaps visuels ou cognitifs, pour qui les lecteurs d'&#233;cran facilitent la lecture et la compr&#233;hension.&lt;/p&gt;
&lt;p&gt;Les technologies d'assistance pr&#233;sentent toutes les informations sous forme de texte structur&#233;. Par cons&#233;quent, toutes les fonctionnalit&#233;s JavaScript doivent adopter une forme qui puisse &#234;tre pr&#233;sent&#233;e textuellement. Une barre de progression script&#233;e telle qu'illustr&#233;e ci-dessous fournit des informations visuelles, elle devrait donc &#234;tre compl&#233;t&#233;e par un texte fournissant les m&#234;mes informations.&lt;/p&gt;
&lt;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=&#034;228&#034; data-legende-lenx=&#034;xxx&#034;
&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L226xH51/javascript-a4a48-7a145.png?1763401054' width='226' height='51' alt='' /&gt;
&lt;figcaption class='spip_doc_legende'&gt; &lt;div class='spip_doc_descriptif crayon document-descriptif-454 '&gt;Une barre de progressions dont la position, 76%, est indiqu&#233;e visuellement et &#224; l'aide d'un nombre en pourcentage.
&lt;/div&gt; &lt;div class='spip_doc_credits crayon document-credits-454 '&gt;Sitepoint, &lt;a href=&#034;http://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2012/11/javascript-accessibility-progress.png&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;http://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2012/11/javascript-accessibility-progress.png&lt;/a&gt;
&lt;/div&gt;
&lt;/figcaption&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Le texte en lui-m&#234;me ne suffit pas, s'il ne poss&#232;de pas de structure ou de liaisons interpr&#233;tables par les technologies d'assistance. Un texte est souvent structur&#233; de fa&#231;on tr&#232;s simple, sous forme de listes et de tableaux. Les technologies d'assistance comprennent ais&#233;ment ce type de structure, il ne nous reste donc qu'&#224; les utiliser correctement.&lt;/p&gt;
&lt;p&gt;En utilisant par exemple des listes non ordonn&#233;es et des libell&#233;s de structure comme base d'un menu d&#233;roulant, les technologies d'assistance peuvent interpr&#233;ter le sens &#224; partir de la s&#233;mantique et de la hi&#233;rarchie de ces &#233;l&#233;ments. Nous pouvons &#233;galement construire des widgets de calendrier o&#249; chaque mois est repr&#233;sent&#233; par un tableau &lt;abbr&gt;HTML&lt;/abbr&gt;. Il suffit alors de d&#233;clencher son affichage par un bouton et de le d&#233;crire &#224; l'aide d'une l&#233;gende. Une s&#233;mantique solide des &#233;l&#233;ments doit constituer la base de tout contenu interactif.&lt;/p&gt;
&lt;h2&gt;Les utilisateurs qui naviguent au clavier&lt;/h2&gt;
&lt;p&gt;Le deuxi&#232;me groupe est form&#233; par les personnes qui utilisent uniquement le clavier. Ce groupe comprend les non-voyants utilisant un lecteur d'&#233;cran, mais &#233;galement les personnes voyantes qui ne peuvent pas utiliser la souris en raison d'un handicap moteur, ainsi que les personnes ayant une d&#233;ficience cognitive et pour suivre les &#233;l&#233;ments qui poss&#232;dent le focus aide &#224; se concentrer. Pour s'adapter aux besoins de ce groupe, toutes les fonctionnalit&#233;s JavaScript doit &#234;tre accessibles au clavier. Les interactions par exemple doivent &#234;tre limit&#233;es aux touches les plus intuitives : tabulation, les fl&#232;ches, la touche Entr&#233;e et la touche d'&#233;chappement.&lt;/p&gt;
&lt;p&gt;La prise en charge du clavier se fait souvent &#224; moindre co&#251;t, pour peu que vous partiez du principe que le meilleur &#233;v&#233;nement est toujours celui qui est le plus ind&#233;pendant du p&#233;riph&#233;rique. Ainsi, la validation du formulaire doit &#234;tre li&#233;e &#224; l'&#233;v&#233;nement &lt;code&gt;submit&lt;/code&gt; du formulaire, tandis que les &#233;v&#233;nements d'activation primaires devraient &#234;tre li&#233;s &#224; l'&#233;v&#233;nement clic universel, plut&#244;t que des &#233;v&#233;nements sp&#233;cifiques comme &lt;code&gt;mousedown&lt;/code&gt;, &lt;code&gt;touchstart&lt;/code&gt; ou &lt;code&gt;KeyDown&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour les interactions plus complexes, il est souvent n&#233;cessaire de combiner les &#233;v&#233;nements. Les R&#232;gles d'Accessibilit&#233; pour les Contenus Web (&lt;abbr&gt;NdT&lt;/abbr&gt; : &lt;span lang=&#034;en&#034;&gt;Web Content Accessibility Guidelines&lt;/span&gt;, ou &lt;abbr&gt;WCAG&lt;/abbr&gt; en anglais) parlent d'association d'&#233;v&#233;nements : il s'agit de coupler les &#233;v&#233;nements souris avec leur &#233;quivalent clavier le plus similaire. Un exemple est le couplage des &#233;v&#233;nements &lt;code&gt;mousedown&lt;/code&gt; et &lt;code&gt;keydown&lt;/code&gt;. Ce n'est toutefois pas la bonne fa&#231;on de voir les choses car on se concentre ici sur la technique plut&#244;t que sur la finalit&#233; d'une action. Tant que l'objectif est atteint, peu importe que les modalit&#233;s au clavier soient totalement diff&#233;rentes de l'action &#224; la souris.&lt;/p&gt;
&lt;p&gt;Pour le glisser-d&#233;poser par exemple, il n'y a pas d'&#233;quivalent &#224; l'&#233;v&#233;nement &lt;code&gt;mousemove&lt;/code&gt;, mais nous pouvons quand m&#234;me rendre cette fonctionnalit&#233; accessible au clavier. Il s'agit en fait de deux interactions distinctes. La premi&#232;re permet de d&#233;placer des &#233;l&#233;ments vers le haut ou le bas pour les r&#233;organiser, ce qui peut tout simplement se faire gr&#226;ce aux fl&#232;ches haut et bas. La seconde interaction concerne l'action d'attraper et de d&#233;placer, pour d&#233;placer des fichiers d'un dossier &#224; un autre par exemple. Cela peut se faire par exemple avec la touche Espace pour s&#233;lectionner l'&#233;l&#233;ment, la touche Tabulation pour s&#233;lectionner la destination, et la touche Entr&#233;e pour d&#233;poser.&lt;/p&gt;
&lt;p&gt;Lorsque des touches non-standard sont utilis&#233;es, un texte d'accompagnement devrait figurer pour l'expliquer. Dans les faits, certaines interactions seront immanquablement plus compliqu&#233;es que leur &#233;quivalent &#224; la souris. Mais ce n'est pas bien grave, du moment que le r&#233;sultat est atteignable. L'accessibilit&#233; c'est l'&#233;quivalence, pas l'&#233;galit&#233;.&lt;/p&gt;
&lt;p&gt;Une autre consid&#233;ration importante concernant l'accessibilit&#233; au clavier est de garder un ordre logique du contenu. Des bulles d'aide enrichies, par exemple, doivent &#234;tre ins&#233;r&#233;es imm&#233;diatement apr&#232;s l'&#233;l&#233;ment qu'elles concernent pour qu'on y acc&#232;de directement en tabulant une seule fois, et afin que les lecteurs d'&#233;cran puissent les lire dans la foul&#233;e.&lt;/p&gt;
&lt;h2&gt;Les utilisateurs sensibles au clignotement ou aux limites de temps&lt;/h2&gt;
&lt;p&gt;Le dernier groupe comprend les personnes sensibles aux clignotements ou aux brusques changements de luminosit&#233;, ou qui ne peuvent pas r&#233;agir aux &#233;v&#233;nements en temps r&#233;el comme les autres. Le contenu clignotant affecte les personnes souffrant d'une &#233;pilepsie photosensible, chez qui cela peut provoquer une crise, ainsi que les personnes souffrant de d&#233;ficience cognitive, qui ont du mal &#224; se concentrer lorsque les choses bougent dans leur vision p&#233;riph&#233;rique. Les limitations sur les contenus qui clignotent sont assez bien formul&#233;es par les r&#232;gles d'accessibilit&#233; pour les contenus web et synth&#233;tis&#233;es par le seuil de trois clignotements maximum.&lt;/p&gt;
&lt;p&gt;Les limites temporelles peuvent &#233;galement s'av&#233;rer probl&#233;matiques car &#233;couter un contenu vocalis&#233; prend plus de temps que de le lire. Naviguer au clavier prend &#233;galement plus de temps qu'&#224; la souris. De ce fait, les actions JavaScript bas&#233;es sur le temps doivent &#234;tre contr&#244;lables par l'utilisateur. Les limites sur des activit&#233;s temporelles ne sont pas trop sp&#233;cifiques, car il y a diff&#233;rents cas de figure &#224; prendre en consid&#233;ration.&lt;/p&gt;
&lt;p&gt;Le grand principe pour les limites temporelles est que si une activit&#233; doit &#234;tre effectu&#233;e dans un certain laps de temps, l'utilisateur est pr&#233;venu quand la limite est sur le point d'expirer et se voit proposer une fa&#231;on de la rallonger. Par exemple, un site de banque en ligne peut avoir des limites de temps strictes sur l'inactivit&#233; de session, mais l'utilisateur doit pouvoir l'allonger &#224; 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).&lt;/p&gt;
&lt;p&gt;Lorsque du contenu est anim&#233;, l'animation ne devrait pas durer plus de cinq secondes, &#224; moins que l'utilisateur ait un moyen de la contr&#244;ler. Une animation peut &#234;tre purement d&#233;corative, la limite de temps est donc utile pour les personnes qui souffrent de d&#233;ficience cognitive et pour qui une animation continue en p&#233;riph&#233;rie rend plus difficile le fait de se concentrer sur le contenu principal.&lt;/p&gt;
&lt;p&gt;Pour une animation telle que le d&#233;filement ou le d&#233;placement d'un contenu, la restriction impose de permettre aux utilisateurs de terminer leur t&#226;che sans changements de contexte inattendus. Un lecteur d'actualit&#233;s qui d&#233;file automatiquement par exemple devrait avoir un bouton pause, pour laisser l'utilisateur lire chaque actualit&#233; &#224; son propre rythme et en &#233;tant assur&#233; que les choses ne bougeront pas pendant qu'il la lira ! Cela est &#233;galement valable lorsque de grands blocs de contenus ou des pages enti&#232;res sont automatiquement recharg&#233;s. C'est tr&#232;s courant sur les sites de bourse en ligne ou de r&#233;sultats sportifs. Vous ne devriez jamais faire cela, &#224; moins de fournir des contr&#244;les sp&#233;cifiques &#224; l'utilisateur sur la fr&#233;quence de rafra&#238;chissement (qui devrait &#234;tre &#224; &lt;code&gt;never&lt;/code&gt; (jamais) par d&#233;faut).&lt;/p&gt;
&lt;p&gt;Mais les limites temporelles font souvent partie int&#233;grante des activit&#233;s pour lesquelles elles sont utilis&#233;es. Beaucoup de jeux comportent intrins&#232;quement des limites de temps et les supprimer nuirait au principe m&#234;me du jeu. Dans de tels cas, on peut dire que le contenu ne peut &#234;tre rendu accessible sans changer sa signification. Les r&#232;gles d'accessibilit&#233; autorisent cette possibilit&#233;, du moment que le contenu est clairement d&#233;crit comme tel.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Nous venons de voir que l'accessibilit&#233; de JavaScript peut se r&#233;sumer &#224; trois principes fondamentaux.&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Toute fonctionnalit&#233; JavaScript doit prendre une forme qui peut &#234;tre interpr&#233;t&#233;e comme du texte.&lt;/li&gt;&lt;li&gt; Toute fonctionnalit&#233; JavaScript doit &#234;tre accessible au clavier.&lt;/li&gt;&lt;li&gt; Les activit&#233;s temporelles en JavaScript doivent pouvoir &#234;tre contr&#244;l&#233;es par l'utilisateur, &#224; moins que cela ne change leur sens.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;La prochaine fois, nous nous &#233;loignerons de la th&#233;orie, pour voir quelques petites choses simples mais pratiques que vous pouvez mettre en &#339;uvre d&#232;s &#224; pr&#233;sent pour rendre une fonctionnalit&#233; JavaScript plus accessible. Et nous ne parlons pas de techniques &#224; peine prises en charge, non test&#233;es ou avant-gardistes mais bien de ce que nous faisons d&#233;j&#224; depuis des ann&#233;es.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Votre application me fait grossir</title>
		<link>http://www.pompage.net/traduction/votre-application-me-fait-grossir</link>
		<guid isPermaLink="true">http://www.pompage.net/traduction/votre-application-me-fait-grossir</guid>
		<dc:date>2014-07-24T10:30:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Blandine Proust, Fr&#233;d&#233;ric Chotard</dc:creator>


		<dc:subject>Ergonomie</dc:subject>
		<dc:subject>Kathy Sierra</dc:subject>

		<description>&lt;p&gt;Un regard sur la psychologie de l'utilisateur face &#224; des interfaces mal con&#231;ues.&lt;/p&gt;

-
&lt;a href="http://www.pompage.net/traduction/" rel="directory"&gt;Traduction&lt;/a&gt;

/ 
&lt;a href="http://www.pompage.net/tag/ergonomie" rel="tag"&gt;Ergonomie&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/tag/kathy-sierra" rel="tag"&gt;Kathy Sierra&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;L'exp&#233;rience utilisateur vue &#224; travers le prisme de la psychologie comportementale... attention &#224; ne pas &#233;puiser les ressources cognitives de vos visiteurs !&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;En 1999, le professeur Baba Shiv (qui enseigne aujourd'hui &#224; Stanford) et son co-auteur Alex Fedorikhin ont men&#233; une exp&#233;rience simple sur 165 &#233;tudiants. Ils ont demand&#233; &#224; la moiti&#233; d'entre eux de m&#233;moriser un nombre de sept chiffres, et &#224; l'autre moiti&#233; de m&#233;moriser un nombre de deux chiffres. Apr&#232;s cette t&#226;che de m&#233;morisation, on a dit aux participants que la t&#226;che &#233;tait termin&#233;e, et qu'ils pouvaient prendre un en-cas : au choix, du g&#226;teau au chocolat ou de la salade de fruits.&lt;/p&gt;
&lt;div class='spip_document_469 spip_document spip_documents spip_document_image spip_documents_left spip_document_left'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L461xH636/fr_fixedmemorization.jpg-format=500w-64bb6.jpg?1763193641' width='461' height='636' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;R&#233;sultat ? &lt;strong&gt;Les participants qui devaient m&#233;moriser le nombre de sept chiffres &#233;taient 50 % plus attir&#233;s par le g&#226;teau au chocolat que ne l'&#233;taient les membres de l'autre groupe.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Les chercheurs, sid&#233;r&#233;s par les r&#233;sultats convergents d'un grand nombre d'exp&#233;riences, sont parvenus &#224; cette &#233;trange conclusion : &lt;strong&gt;le contr&#244;le de soi et les processus cognitifs sont aliment&#233;s par la m&#234;me r&#233;serve de ressources.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Vous passez des heures au boulot concentr&#233; sur un probl&#232;me de design ? 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 &lt;i&gt;vraiment&lt;/i&gt; pendant une r&#233;union p&#233;nible et interminable ? Vous aurez plus de mal &#224; coder plus tard dans la journ&#233;e.&lt;/p&gt;
&lt;p&gt;Car la volont&#233;, le contr&#244;le de soi et les t&#226;ches cognitives puisent dans les m&#234;mes r&#233;serves. Si vous &#233;puisez ces r&#233;serves &#224; un moment donn&#233;, vous en paierez forc&#233;ment le prix un peu plus tard. Il n'y a qu'une seule r&#233;serve. Une r&#233;serve de ressources rares, pr&#233;cieuses et &lt;i&gt;tr&#232;s volatiles&lt;/i&gt;. Si vous passez votre journ&#233;e &#224; vous contr&#244;ler (face &#224; des clients m&#233;contents ou &#224; des coll&#232;gues incapables), vous rentrez chez vous le soir avec la jauge &#224; z&#233;ro.&lt;/p&gt;
&lt;p&gt;Le r&#233;servoir est vide. Et m&#234;me si vous adorez vous frotter &#224; des probl&#232;mes compliqu&#233;s quand vous &#234;tes au travail, cela n'emp&#234;che pas du tout que vos ressources soient diminu&#233;es. Il n'y a qu'une seule r&#233;serve. Qu'elle soit consomm&#233;e par des activit&#233;s que vous aimez ou que vous d&#233;testez n'y change rien. Le r&#233;servoir de ressources cognitives s'en fiche. Du coup, la moindre petite chose vous fait r&#226;ler contre vos enfants ou votre chien. Ou bien c'est le chien qui vous grogne dessus.&lt;/p&gt;
&lt;div class='spip_document_468 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L466xH685/fr_dogexperimentwebversion.jpg-format=500w-6876f.jpg?1763193641' width='466' height='685' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Au cours d'une exp&#233;rience, un premier groupe de chiens devait rester assis pendant quelques minutes sans rien faire, avant d'&#234;tre autoris&#233;s &#224; jouer avec leur jouet &#224; croquettes &#171; intelligent &#187; (le genre de jouet o&#249; le chien doit fournir des efforts pour en extraire des croquettes). Les chiens de l'autre groupe restaient tranquilles dans leurs cages avant de recevoir leur jouet.&lt;/p&gt;
&lt;p&gt;Vous imaginez peut-&#234;tre d&#233;j&#224; la suite : les chiens qu'on avait oblig&#233;s &#224; rester assis (et donc &#224; &#234;tre dans le contr&#244;le de soi) ont abandonn&#233; beaucoup plus t&#244;t leur jouet que ceux qui &#233;taient rest&#233;s tranquilles dans leurs cages. Les chiens qui n'avaient PAS d&#233;pens&#233; de ressources cognitives en s'effor&#231;ant d'ob&#233;ir montraient davantage de d&#233;termination et d'&#233;nergie mentale et &#233;motionnelle pour r&#233;soudre le probl&#232;me. Pensez-y la prochaine fois que vous demanderez &#224; Youki de patienter un peu. Car ses ressources cognitives &#224; lui s'&#233;puisent tout aussi vite.&lt;/p&gt;
&lt;p&gt;R&#233;fl&#233;chissons maintenant &#224; ce que nous faisons subir &#224; nos utilisateurs. Si l'exp&#233;rience utilisateur les oblige &#224; faire des choix, et m&#234;me si ces choix sont &#224; la fois clairs et utiles, cet acte de d&#233;cision diminue leurs ressources cognitives. Et pas uniquement au moment du choix&#8230; m&#234;me apr&#232;s ce moment, ils continuent &#224; consommer inconsciemment leurs ressources : &#171; Ai-je fait le bon choix ? &#187;&lt;/p&gt;
&lt;p&gt;Si votre application est compliqu&#233;e et si votre &lt;abbr title=&#034;Foire Aux Questions&#034;&gt;FAQ&lt;/abbr&gt; ou votre aide en ligne ne r&#233;pond pas &#224; mes besoins, vous faites baisser mon maigre niveau de ressources cognitives. Si votre application se comporte de fa&#231;on contre-intuitive (m&#234;me si &#231;a n'arrive qu'une seule fois), je perdrai une partie de mes ressources &#224; chaque nouvelle utilisation, parce que je me demanderai toujours : &#171; Attends, est-ce que &#231;a fait bien ce que je pensais ? &#187;&lt;/p&gt;
&lt;p&gt;Ou bien, imaginons que votre application soit vraiment hyper-facile &#224; utiliser mais que dans son design et dans son fonctionnement elle soit remplie d'&#233;l&#233;ments motivateurs (des &#171; clins d'&#339;il &#187;, des aspects ludiques, des astuces de fonctionnement, etc.) qui ont &#233;t&#233; pens&#233;s pour me garder &#171; accroch&#233; &#187; dans votre int&#233;r&#234;t, pas dans le mien (oui Zynga, c'est &#224; toi que je pense)... Eh bien, l&#224; aussi vous &#233;puisez mes ressources cognitives. Et que se passe-t-il quand je l&#226;che l'&#233;cran pour aller dans la cuisine ?...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Votre application me fait grossir.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si notre travail fait perdre &#224; l'utilisateur ses ressources cognitives, qu'est-ce qu'il perd ? Qu'est-ce qu'il aurait pu faire d'autre avec ces ressources si rares, si pr&#233;cieuses, si vite disparues ? Peut-&#234;tre qu'il avait dans l'id&#233;e de suivre bien sagement son r&#233;gime. Ou de faire de la guitare. Ou de jouer avec ses enfants.&lt;/p&gt;
&lt;p&gt;Dites-moi, ce nouvel &#233;l&#233;ment que vous venez d'ajouter&#8230; Cet &#233;l&#233;ment bling-bling, super-techno, ultra-cool&#8230; est-ce qu'il ne risque pas de co&#251;ter tr&#232;s cher &#224; votre utilisateur ? Car si le r&#233;sultat de votre travail appauvrit ses ressources cognitives, on ne peut plus employer ces ressources &#224; d'autres usages beaucoup plus importants. Le probl&#232;me ne r&#233;side pas dans le fait que vous accaparez le temps et l'attention de vos utilisateurs pendant qu'ils utilisent votre application. Il r&#233;side dans l'&#233;puisement de leurs capacit&#233;s de pens&#233;e logique, de r&#233;solution de probl&#232;me et de ma&#238;trise de soi apr&#232;s avoir cliqu&#233;, balay&#233; ou touch&#233; un &#233;cran.&lt;/p&gt;
&lt;p&gt;Bien entendu, ce n'est pas un mal en soi si votre travail &#233;puise le r&#233;servoir de ressources d'un utilisateur. C'est peut-&#234;tre justement dans votre application que votre utilisateur veut d&#233;penser ces ressources. Mais d&#232;s lors que vous savez ce que co&#251;te une interaction avec votre produit, vous allez peut-&#234;tre faire des choix diff&#233;rents.&lt;/p&gt;
&lt;p&gt;Vous allez peut-&#234;tre r&#233;fl&#233;chir davantage &#224; ce qui motive vraiment vos utilisateurs. Vous allez peut-&#234;tre vous demander, &#224; chaque r&#233;union de design : &#171; est-ce que cet &#233;l&#233;ment nous pousse &#224; choisir les fruits ou bien le g&#226;teau ? &#187; afin de limiter les &#233;l&#233;ments qui m&#232;nent au g&#226;teau &#8212; ceux qui co&#251;tent le plus &#8212; &#224; ce pour quoi vos utilisateurs sont venus : utiliser votre application.&lt;/p&gt;
&lt;p&gt;(Il est vrai que vous pouvez recharger vos ressources cognitives pendant la journ&#233;e en fournissant des glucides &#224; votre cerveau, mais allez-y doucement. Il vaut mieux prendre un en-cas prot&#233;in&#233; avec de temps en temps quelques petites gorg&#233;es de boisson &#233;nergisante).&lt;/p&gt;
&lt;p&gt;Mais quand bien m&#234;me vous parvenez &#224; justifier l'&#233;puisement des ressources cognitives de vos utilisateurs &lt;i&gt;pendant&lt;/i&gt; qu'ils utilisent votre produit, que dire alors de votre politique de &lt;span lang=&#034;en&#034;&gt;marketing&lt;/span&gt; ? Croyez-vous sinc&#232;rement que votre &#171; &lt;span lang=&#034;en&#034;&gt;marketing&lt;/span&gt; de contenu &#187; constitue un bon usage de leurs ressources ? &#171; Oui, parce qu'on obtient de la valeur ajout&#233;e &#187;, direz-vous. Mais qu'est-ce que &#231;a veut vraiment dire ? Pouvez-vous honn&#234;tement affirmer que &#171; l'engagement envers une marque &#187; constitue un usage sain et &#233;thique de leurs maigres et pr&#233;cieuses ressources cognitives ? &#171; Oui, &lt;i&gt;parce que notre contenu est utile&lt;/i&gt; &#187;.&lt;/p&gt;
&lt;p&gt;Tout &#231;a est bien beau, tr&#232;s &#171; r&#233;seaux sociaux &#187;, tr&#232;s &#171; 3.0 &#187;, tout &#231;a, mais il y a quand m&#234;me un petit probl&#232;me : on est dans un jeu &#224; somme nulle. Ce que je consommerai au point A, je ne l'aurai plus au point B. Et je n'aurai pas juste perdu de l'attention ou du temps, mais une capacit&#233; &#224; &#234;tre au meilleur de moi-m&#234;me. C'est-&#224;-dire lorsque je dispose de g&#233;n&#233;reuses ressources cognitives. Lorsque je peux penser, r&#233;soudre des probl&#232;mes, et maintenir un bon contr&#244;le de moi-m&#234;me. Lorsque je sais cr&#233;er, &#233;tablir des liens et rester concentr&#233;.&lt;/p&gt;
&lt;p&gt;Ce &#171; contenu &#187; en vaut-il la peine ? C'est possible. Mais au lieu de nous demander &#171; est-ce que c'est vraiment utile ? &#187;, nous devrions sans doute aller plus loin et nous demander &#171; est-ce qu'ils vont vraiment l'utiliser ? &#187; (au fait, en &#233;crivant ceci je suis bien conscient que je suis en train de puiser dans vos ressources cognitives. Mais apr&#232;s tout, je ne me suis pas lanc&#233; dans &lt;a href=&#034;http://seriouspony.com/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;span lang=&#034;en&#034;&gt;Serious Pony&lt;/span&gt;&lt;/a&gt; pour pr&#233;server vos ressources cognitives : je voudrais plut&#244;t contribuer &#224; &#233;pargner celles de &lt;i&gt;vos utilisateurs&lt;/i&gt;).&lt;/p&gt;
&lt;p&gt;Je n'ai rien contre le &#171; &lt;span lang=&#034;en&#034;&gt;marketing&lt;/span&gt; de contenu &#187;. Bien au contraire, c'est pratiquement la seule forme de &lt;span lang=&#034;en&#034;&gt;marketing&lt;/span&gt;-&#233;puiseur-de-ressources qui puisse valoir le d&#233;tour. C'est typiquement le genre de marketing qui peut pousser les gens &#224; devenir plus comp&#233;tents dans un domaine qui les int&#233;resse. C'est le genre de &lt;span lang=&#034;en&#034;&gt;marketing&lt;/span&gt; qui a la capacit&#233; de fournir aux utilisateurs un apprentissage &#8212; ce que la plupart des entreprises ignorent royalement. Le &lt;span lang=&#034;en&#034;&gt;marketing&lt;/span&gt; de contenu peut (et doit) &#234;tre &#171; le guide qui vous manquait &#187;. Il peut (et doit) repr&#233;senter une source d'inspiration qui pousse nos utilisateurs &#224; apprendre, &#224; progresser (dans ce qui les int&#233;resse) et &#224; se connecter &#224; d'autres utilisateurs.&lt;/p&gt;
&lt;p&gt;Mais si on parle de &#171; contenu &#187; qui vise uniquement &#224; attirer les passants (&#171; D&#233;couvrez les 7 voies du succ&#232;s ! &#187;) en esp&#233;rant les &#171; convertir &#187;, on leur fait du mal. Si l'alibi pour leur balancer du &#171; contenu &#187;, c'est la courbe de fr&#233;quence des visites, on leur fait du mal. L&#224;, en ce moment, je vous fais du mal. Mea culpa. C'est pour &#231;a que j'essaie d'utiliser des images pour souligner l'essentiel, pour vous &#233;viter d'avoir &#224; lire l'article (et aussi parce que j'ai un c&#244;t&#233; verbeux, oui je sais, j'y travaille&#8230;).&lt;/p&gt;
&lt;p&gt;J'ai perdu mon p&#232;re brutalement la semaine derni&#232;re ; et comme c'est souvent le cas quand un proche vient de mourir, je me suis dit : &#171; Quand on est sur sur son lit de mort, on relativise beaucoup de choses. &#187; Dans mon travail de ces 20 derni&#232;res ann&#233;es, j'ai cr&#233;&#233; des jeux de marketing interactif, des sites gamifi&#233;s (= con&#231;us selon une approche plus ludique, &lt;abbr title=&#034;Note du Traducteur&#034;&gt;&lt;i&gt;NdT&lt;/i&gt;&lt;/abbr&gt;) et des dizaines d'autres projets qui &#233;taient soigneusement, finement et scientifiquement con&#231;us pour aspirer goul&#251;ment des ressources cognitives, mais&#8230; pour pas grand-chose d'important en fin de compte. Est-ce que mes visiteurs s'y laissaient attirer de fa&#231;on volontaire ? Bien s&#251;r que oui. Sauf que quand j'&#233;cris &#171; bien s&#251;r &#187;, je me dis : &#171; pas si s&#251;r... &#187; Car c'est ce que nous apprend la recherche en psychologie, en neurosciences ou en &#233;conomie comportementale de ces 50 derni&#232;res ann&#233;es. Mes visiteurs se faisaient aguicher, s&#233;duire, et finalement prendre au pi&#232;ge. Et j'&#233;tais tr&#232;s fort &#224; ce petit jeu-l&#224;. Je suis vraiment, vraiment sinc&#232;rement d&#233;sol&#233;.&lt;/p&gt;
&lt;p&gt;Avec &lt;span lang=&#034;en&#034;&gt;Serious Pony&lt;/span&gt;, mon objectif est de donner &#224; tous des pistes pour prendre mieux soin des utilisateurs. Pas seulement pendant qu'ils utilisent nos applications, nos sites ou nos produits, mais aussi apr&#232;s. Et pas seulement parce que ce sont nos utilisateurs, mais parce que ce sont d'abord des personnes.&lt;/p&gt;
&lt;p&gt;Parce que quand ils seront sur leur lit de mort, nos utilisateurs ne vont certainement pas se dire : &#171; Ah, si seulement j'avais consacr&#233; plus de temps &#224; leurs marques !... &#187;&lt;/p&gt;
&lt;p&gt;Aidez-les &#224; &#233;conomiser et &#224; bien g&#233;rer leurs ressources cognitives si maigres, si pr&#233;cieuses et si volatiles, pour qu'elles soient consacr&#233;es &#224; ce qui est vraiment important. Important pour eux. Et puis, pensez &#224; vos propres ressources. Pensez aux enfants. Pensez &#224; Youki.&lt;/p&gt;
&lt;div class='spip_document_467 spip_document spip_documents spip_document_image spip_documents_center spip_document_center'&gt;
&lt;figure class=&#034;spip_doc_inner&#034;&gt; &lt;img src='http://www.pompage.net/local/cache-vignettes/L500xH333/boinocrate.jpg-format=750w-4126c.jpg?1763193641' width='500' height='333' alt='' /&gt;
&lt;/figure&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>D'abord la structure. Le contenu suivra.</title>
		<link>http://www.pompage.net/traduction/structure-d-abord-le-contenu-suivra</link>
		<guid isPermaLink="true">http://www.pompage.net/traduction/structure-d-abord-le-contenu-suivra</guid>
		<dc:date>2014-07-08T10:30:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Bertrand Keller, Fr&#233;d&#233;ric Chotard, Goulven Champenois, V&#233;ronique Bouvier</dc:creator>


		<dc:subject>Mark Boulton</dc:subject>

		<description>&lt;p&gt;On parle souvent de conception &#171; donnant la priorit&#233; au contenu &#187; mais que recouvre cette expression, au juste ? Faut-il r&#233;diger tous les textes du site avant de commencer le design ? Non, bien s&#251;r. Mark Boulton pr&#233;sente son cheminement et sa m&#233;thode pour concevoir des sites o&#249; le contenu soit &#224; sa juste place.&lt;/p&gt;

-
&lt;a href="http://www.pompage.net/traduction/" rel="directory"&gt;Traduction&lt;/a&gt;

/ 
&lt;a href="http://www.pompage.net/tag/mark-boulton" rel="tag"&gt;Mark Boulton&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Il faut bien commencer quelque part. On ne peut pas partir de rien.&lt;/p&gt;
&lt;p&gt;En 2001, j'ai commenc&#233; &#224; travailler pour la &lt;a href=&#034;http://www.bbc.co.uk/wales&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;BBC&lt;/a&gt; &#224; Cardiff. Quatre ann&#233;es durant j'ai travaill&#233; aux c&#244;t&#233;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'&#224; la refonte de la page d'accueil. Tout ces projets furent abord&#233;s selon l'approche &#034;Contenu en premier&#034; (mais pas tel que &lt;a href=&#034;http://adactio.com/journal/4523/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;d&#233;fini par Jeremy Keith&lt;/a&gt;), mais nous n'avons jamais eu le contenu en premier.&lt;/p&gt;
&lt;p&gt;J'ai travaill&#233; avec de nombreux m&#233;dias ces dix derni&#232;res ann&#233;es. J'ai beaucoup appris sur de nombreux processus &#233;ditoriaux &#224; travers trois m&#233;dias : la t&#233;l&#233;vision, les journaux, et le web (et m&#234;me un petit peu de radio). Je me r&#233;jouis des points communs entre eux et me tords de douleur en constatant les diff&#233;rentes mani&#232;res de faire pour chacun d'eux, tant dans les organisations elles-m&#234;mes que dans ce qu'elles produisent. Certaines choses ont &#233;t&#233; directement transpos&#233;es sur le web avec succ&#232;s ; d'autres ont &#233;t&#233; des &#233;checs. Comme de fabriquer des sites web en singeant les CD-Roms, par exemple. Vous vous souvenez de cette &#233;poque ?&lt;/p&gt;
&lt;p&gt;Le mod&#232;le que nous avons emprunt&#233; &#224; l'impression papier pour l'appliquer aux premiers temps du Web &#8212; le mod&#232;le de page et le syst&#232;me de publication &#8212; est maintenant en danger. Il est menac&#233; par le postulat qu'il faudrait avoir connaissance du contenu avant de lancer la conception. Quiconque a d&#233;j&#224; travaill&#233; dans l'&#233;dition, cr&#233;&#233; un concept de marque &#224; grande &#233;chelle ou un syst&#232;me d'orientation sait parfaitement que c'est un non-sens. Nous n'avons pas besoin de donner la priorit&#233; au contenu, mais &#224; la structure. Le contenu quand &#224; lui est toujours essentiel.&lt;/p&gt;
&lt;p&gt;Soyons clair &#224; ce propos. Il est illusoire de vouloir &#233;crire votre contenu &#8212; ou de demander &#224; votre client de l'&#233;crire &#8212; avant de concevoir la structure. Du moins en g&#233;n&#233;ral. Le contenu a besoin d'&#234;tre structur&#233; et la structure modifie votre contenu, tout comme concevoir modifie le contenu. Ce n'est donc pas &#171; contenu &lt;i&gt;puis&lt;/i&gt; conception &#187;, ou &#171; contenu &lt;i&gt;ou&lt;/i&gt; conception &#187; ; c'est &#171; contenu &lt;i&gt;et&lt;/i&gt; conception &#187;.&lt;/p&gt;
&lt;p&gt;Concevoir la maquette d'un magazine ou d'un journal papier n&#233;cessite d'imposer des contraintes rigoureuses aux multiples types de contenu. Vous devez d&#233;finir, en &#233;troite collaboration avec l'&#233;quipe &#233;ditoriale, les cat&#233;gories de contenu que vous devrez accommoder. Le gabarit d'un article d'information, d'un &#233;ditorial ou d'un dossier n&#233;cessite un traitement visuel diff&#233;rent pour indiquer aux lecteurs que le contenu n'est pas de m&#234;me type. Les variations de mise en forme doivent &#234;tre assez limit&#233;es, d'ailleurs. Pourquoi ? Eh bien, surtout &#224; cause du facteur temps. Journaux et magazines subissent d'&#233;normes contraintes de temps, et le contenu est litt&#233;ralement d&#233;vers&#233; dans un moule pr&#233;fabriqu&#233; &#8212; on peut retoucher ou ajuster &#224; la marge, mais les maquettes et gabarits ne laissent pratiquement aucune libert&#233;. Et ce n'est pas une mauvaise pratique, c'est ainsi que les contenus vivent et respirent dans un environnement &#224; forte cadence &#233;ditoriale. La fluidit&#233; est privil&#233;gi&#233;e. Tout cela ne peut pas &#234;tre fig&#233; en amont. La priorit&#233; au contenu ne marcherait pas dans ce cas pr&#233;cis.&lt;/p&gt;
&lt;h2&gt;Le contenu comme structure&lt;/h2&gt;
&lt;p&gt;Nous avons vu r&#233;cemment l'&#233;mergence d'un raisonnement fallacieux dans notre domaine. L'id&#233;e qu'il n'est pas possible de cr&#233;er une conception convenable sans avoir connaissance du contenu. &lt;a href=&#034;http://www.markboulton.co.uk/journal/comments/a-richer-canvas&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Je l'ai dit moi-m&#234;me&lt;/a&gt; il y a quelque temps. Mais ce n'est qu'&#224; moiti&#233; vrai. Les journaux, les magazines et de nombreux autres p&#233;riodiques et publications issus de diff&#233;rents m&#233;dias d&#233;montrent quotidiennement que cette th&#233;orie ne tient pas.&lt;/p&gt;
&lt;p&gt;Vous pouvez mettre en place une bonne exp&#233;rience utilisateur sans avoir connaissance du contenu. Ce que vous ne pouvez pas faire, c'est mettre en place une bonne exp&#233;rience utilisateur sans conna&#238;tre la &lt;i&gt;structure&lt;/i&gt; de votre contenu. La question n'est pas de savoir ce qu'est ce contenu, mais de comment il est constitu&#233;. Et c'est une diff&#233;rence de taille.&lt;/p&gt;
&lt;p&gt;Il faut donc commencer par la structure, pas par les mots. Qu'est-ce qu'un &#171; article d'opinion &#187; ? Quels sont les variables &#224; prendre en compte ? Peut-on m&#234;me les d&#233;finir ? Y aura-t-il des images ? Combien ? (La r&#233;ponse est toujours la m&#234;me : &#171; Je ne sais pas, &#231;a d&#233;pend ! &#187;). Nous pouvons concevoir en privil&#233;giant la fluidit&#233;, mais cela signifie une perte de contr&#244;le. Encore. Comment faire, alors ? Comment concevoir en privil&#233;giant la fluidit&#233; ? Eh bien, nous d&#233;finissons la structure de notre contenu et les gabarits qu'il occupera. Nous d&#233;finissons les r&#232;gles du syst&#232;me pour qu'il affiche le contenu de diff&#233;rentes mani&#232;res (si possible) pour aider le lecteur &#224; mieux comprendre le contenu.&lt;/p&gt;
&lt;p&gt;Comme le dit &lt;a href=&#034;http://spiekermann.com/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Erik Spiekermann&lt;/a&gt; : &#171; on donne de la forme au contenu &#187;.&lt;/p&gt;
&lt;h2&gt;Les concepteurs en tant que directeurs de contenu&lt;/h2&gt;
&lt;p&gt;Les designers ont toujours &#233;t&#233; impliqu&#233;s par le contenu. Nous ne nous arr&#234;tons pas &#224; &lt;a href=&#034;http://www.markboulton.co.uk/journal/comments/visual-design-is-not-a-thing&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;l'aspect visuel&lt;/a&gt;. Mais comment le faire comprendre &#224; nos clients &#224; comprendre lorsque nous disons :&lt;/p&gt;
&lt;blockquote&gt;&#171; Le contenu d'abord ! &#187;&lt;/blockquote&gt;
&lt;p&gt;Ce n'est pas pour dire :&lt;/p&gt;
&lt;blockquote&gt;&#171; Je vais rester assis ici sans bouger jusqu'&#224; ce que vous me donniez le contenu. Je dis bien le contenu finalis&#233;, valid&#233;, paraph&#233;, sign&#233;. Merci, j'attends &#187;&lt;/blockquote&gt;
&lt;p&gt;Non, bien s&#251;r. Il faut plut&#244;t comprendre :&lt;/p&gt;
&lt;blockquote&gt;&#171; Nous aimerions bien comprendre le type et la structure des contenus pour ce projet. Ne vous inqui&#233;tez pas, vous n'&#234;tes pas oblig&#233; de commencer &#224; l'&#233;crire, aidez-nous seulement &#224; comprendre. &#187;&lt;/blockquote&gt;
&lt;p&gt;Nous pouvons faire cela de nombreuses mani&#232;res mais r&#233;cemment, j'ai remarqu&#233; que ces grands principes fonctionnaient bien pour moi :&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;Parler.&lt;/strong&gt; Et utiliser des Post-It. Installez-vous dans une pi&#232;ce (ferm&#233;e &#224; clef de pr&#233;f&#233;rence) et discutez du site web ou de l'application. Pas du contenu pour le moment. Pendant que vous &#234;tes en train de parler, &#233;crivez les mots qui r&#233;sonnent &#224; votre oreille. Apr&#232;s avoir discut&#233;, accrochez ces mots sur un mur et commencez &#224; les connecter entre eux. Nos confr&#232;res de l'exp&#233;rience utilisateur ont s&#251;rement un nom qui claque pour qualifier cet exercice, mais je ne le connais pas.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Accepter le d&#233;sordre.&lt;/strong&gt; Vous devriez vous retrouver avec tout un tas de mots vaguement reli&#233;s entre eux (ce n'est toujours pas du contenu) &#224; propos de diff&#233;rents sujets. Ces sujets sont l'ADN de votre site. L'attitude, le ton, la marque, le message, ainsi que les points de d&#233;tail tels que les diff&#233;rents types de contenu, taxonomies, mots-cl&#233;s et autres aspects techniques. Maintenant, il faut ordonner tout cela.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;It&#233;rer.&lt;/strong&gt; &#192; un moment pendant le tri, vous aurez besoin de commencer &#224; d&#233;gager la structure. L&#224; aussi, j'ai constat&#233; qu'effectuer cette &#233;tape de mani&#232;re it&#233;rative et &#224; plusieurs est plus fructueux.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Structurer.&lt;/strong&gt; Vous devriez maintenant avoir un d&#233;but de structure. &#192; l'&#233;tape 3, il y a s&#251;rement un moment o&#249; votre client (ou vous-m&#234;me) dira en d&#233;signant un terme not&#233; sur un Post-it : &#171; Oui, mais qu'est-ce que c'est que &lt;i&gt;&#231;a&lt;/i&gt; ? &#187; Dessinez la structure sur un papier et qualifiez-la par un mot. C'est l&#224; que vous allez entrer dans le d&#233;tail et t&#226;cher de donner du corps &#224; cette id&#233;e. C'est ce qui d&#233;finit la structure de votre contenu. Et ce n'est pas termin&#233;.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Pr&#233;voir.&lt;/strong&gt; Utilisez un tableau de contenu. En gros, c'est comme un tableur pour vos contenus. Remplissez-le, je vous conseille &lt;a href=&#034;http://24ways.org/2011/extracting-the-content&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;celui&lt;/a&gt; de &lt;a href=&#034;http://supernicestudio.com/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Relly&lt;/a&gt;, il est excellent. Cet outil peut vraiment aider vos clients plus tard quand arrive l'&#233;tape &#171; Oh mon dieu, j'ai tellement de contenu &#224; &#233;crire et je ne sais pas par o&#249; commencer &#187;. Cela permet de se concentrer sur ce qui compte.&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;D'abord la structure. Le contenu suivra.&lt;/h2&gt;
&lt;p&gt;Arr&#234;tons de cloisonner le contenu. Nous avons d&#233;j&#224; fait cette erreur &#224; l'&#233;poque o&#249; le web imitait les brochures imprim&#233;es ; l'approche &#171; Contenu en premier &#187; ne fait que d&#233;placer le probl&#232;me &#224; l'autre bout du processus. Concentrons-nous donc sur la structure pour commencer, mais en gardant le contenu &#224; l'esprit tout du long. La relation contenu-mise en forme est quasi symbiotique : ni l'un ni l'autre ne peut exister isol&#233;ment.&lt;/p&gt;
&lt;p&gt;Commen&#231;ons par la structure. Et d&#233;couvrons de quoi le contenu est fait, plut&#244;t que de nous inqui&#233;ter de ce qu'il est.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Principes &#224; conna&#238;tre pour am&#233;liorer vos feuilles de styles</title>
		<link>http://www.pompage.net/traduction/ameliorer-vos-feuilles-de-styles</link>
		<guid isPermaLink="true">http://www.pompage.net/traduction/ameliorer-vos-feuilles-de-styles</guid>
		<dc:date>2014-06-19T15:37:51Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Augustin Chassine, Bertrand Keller, Frank Taillandier, Fr&#233;d&#233;ric Chotard, V&#233;ronique Bouvier</dc:creator>


		<dc:subject>CSS</dc:subject>
		<dc:subject>Int&#233;gration</dc:subject>
		<dc:subject>Hugo Giraudel</dc:subject>
		<dc:subject>Tous niveaux</dc:subject>

		<description>&lt;p&gt;Hugo Giraudel propose de faire le point en 10 &#233;tapes sur les bonnes pratiques pour am&#233;liorer sa connaissance et son usage des CSS.&lt;/p&gt;

-
&lt;a href="http://www.pompage.net/traduction/" rel="directory"&gt;Traduction&lt;/a&gt;

/ 
&lt;a href="http://www.pompage.net/CSS" rel="tag"&gt;CSS&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/tag/integration" rel="tag"&gt;Int&#233;gration&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/tag/hugo-giraudel" rel="tag"&gt;Hugo Giraudel&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/Tous-niveaux" rel="tag"&gt;Tous niveaux&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Cet article passe en revue quelques principes de base et astuces tir&#233;s de mon exp&#233;rience personnelle pour apprendre &#224; devenir meilleur en &lt;abbr title&#034;Cascading Style Sheets&#034;&gt;CSS&lt;/abbr&gt;. Dans cet article, je vais parler avant tout de ma propre exp&#233;rience et de ce que j'ai appris sur &lt;abbr&gt;CSS&lt;/abbr&gt; pendant pr&#232;s d'un an et demi de pratique intensive.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Tout d'abord, laissez-moi vous rappeler que &lt;abbr&gt;CSS&lt;/abbr&gt; est un langage extr&#234;mement simple. Il peut se r&#233;sumer en 3 mots : s&#233;lecteur, propri&#233;t&#233;, valeur. Et c'est &#224; peu pr&#232;s tout. C'est pourquoi certaines personnes n'aiment pas du tout &lt;abbr&gt;CSS&lt;/abbr&gt; car elles ont l'impression d'&#234;tre comme des enfants qui jouent aux Legos.&lt;/p&gt;
&lt;p&gt;En effet, il suffit d'expliquer les bases de &lt;abbr&gt;CSS&lt;/abbr&gt; &#224; un enfant de 9 ans pour qu'il ou elle soit en mesure de cr&#233;er un site web. Pas un site compliqu&#233; bien entendu, mais peut-&#234;tre quelques pages avec des titres, des liens, du contenu, des images, quelque chose dans ce go&#251;t-l&#224;.&lt;/p&gt;
&lt;p&gt;Toutefois, le fait que &lt;abbr&gt;CSS&lt;/abbr&gt; soit un langage simple ne veut pas dire que tout le monde soit au m&#234;me niveau. Certaines personnes utilisent &lt;abbr&gt;CSS&lt;/abbr&gt; comme un chimpanz&#233; se sert d'une fourchette, certaines personnes se d&#233;brouillent pas mal avec et d'autres peuvent faire des choses formidables.&lt;/p&gt;
&lt;p&gt;De ce que je peux en dire, je m'amuse avec &lt;abbr&gt;CSS&lt;/abbr&gt; depuis pr&#232;s de deux ans maintenant et je pratique &#224; un niveau disons &#171; intensif &#187; depuis pr&#232;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.&lt;/p&gt;
&lt;p&gt;Quoi qu'il en soit, voici quelques trucs que j'ai compris au cours des mois &#233;coul&#233;s et que j'aimerais partager avec vous. Encore une fois ce ne sont pas des bouts de code ou des astuces utiles, ce sont plut&#244;t des principes g&#233;n&#233;raux et des bonnes pratiques. Voici ce que je vais aborder :&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Ne pas se ruer sur le code et faire simple&lt;/li&gt;&lt;li&gt; Apprendre les bases et quelques astuces&lt;/li&gt;&lt;li&gt; Ne pas se r&#233;p&#233;ter&lt;/li&gt;&lt;li&gt; &lt;abbr&gt;CSS&lt;/abbr&gt; orient&#233; objet&lt;/li&gt;&lt;li&gt; &lt;abbr&gt;CSS&lt;/abbr&gt;3 : apprendre ce que l'on peut faire et ce que l'on peut utiliser&lt;/li&gt;&lt;li&gt; Am&#233;lioration progressive et d&#233;gradation &#233;l&#233;gante&lt;/li&gt;&lt;li&gt; Les pr&#233;processeurs &lt;abbr&gt;CSS&lt;/abbr&gt;&lt;/li&gt;&lt;li&gt; Garder un &#339;il sur l'avenir&lt;/li&gt;&lt;li&gt; Lire le code des autres&lt;/li&gt;&lt;li&gt; Pratiquer sans rel&#226;che&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Qu'en dites-vous ? Vous &#234;tes pr&#234;ts ? Allez, c'est parti.&lt;/p&gt;
&lt;h2&gt;1. Ne vous ruez pas sur le code et faites au plus simple&lt;/h2&gt;&lt;h3&gt;Ne vous ruez pas sur le code&lt;/h3&gt;
&lt;p&gt;C'est plut&#244;t un conseil g&#233;n&#233;ral, qui n'est pas sp&#233;cifique &#224; &lt;abbr&gt;CSS&lt;/abbr&gt;. Quand vous &#234;tes sur le point de commencer &#224; d&#233;velopper,&lt;strong&gt; r&#233;fl&#233;chissez d'abord &#224; ce que vous allez faire&lt;/strong&gt;. Posez-vous quelques questions :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Comment vais-je faire &#231;a ?&lt;/li&gt;&lt;li&gt; Y a-t-il une autre mani&#232;re de faire ?&lt;/li&gt;&lt;li&gt; Comment puis-je l'optimiser (pour que ce soit maintenable, propre, cool, etc.) ?&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Commencer &#224; coder sans r&#233;fl&#233;chir peut vous faire perdre du temps. Imaginez-vous passer une heure &#224; cr&#233;er quelque chose pour vous apercevoir que c'est sans issue et que vous devez tout recommencer depuis le d&#233;but ? C'est hors de question.&lt;/p&gt;
&lt;p&gt;Passer des heures sur un diaporama en &lt;abbr&gt;CSS&lt;/abbr&gt; pour finir avec SlidesJS ou Adaptor, c'est vraiment nul. Non pas parce que vous avez &#233;chou&#233;, mais parce que c'&#233;tait une perte de temps. Vous pourriez le payer tr&#232;s cher, le jour o&#249; vous serez soumis &#224; des d&#233;lais tr&#232;s serr&#233;s.&lt;/p&gt;
&lt;h3&gt;Faites simple&lt;/h3&gt;
&lt;p&gt;&lt;abbr&gt;CSS&lt;/abbr&gt; est un langage simple mais les choses peuvent facilement devenir complexes. Surtout si vous voulez qu'elles le deviennent. &lt;strong&gt;Dans la plupart des cas, l'id&#233;e la plus simple est souvent la meilleure&lt;/strong&gt;. Quand vous devez r&#233;aliser quelque chose, demandez-vous toujours s'il n'y a pas un moyen plus simple de le faire. Vous seriez surpris du nombre de fois o&#249; la r&#233;ponse est &#171; oui &#187;.&lt;/p&gt;
&lt;p&gt;Par exemple, si vous voulez coder une barre de navigation horizontale vraiment simple qui ne comporte que des liens, vous avez plusieurs fa&#231;ons de faire :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Faire flotter les &#233;l&#233;ments de la liste&lt;/li&gt;&lt;li&gt; Passer les &#233;l&#233;ments de la liste en ligne&lt;/li&gt;&lt;li&gt; Passer les &#233;l&#233;ments de la liste en blocs en ligne (&lt;code&gt;inline-block&lt;/code&gt;)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Choisissez le plus simple et transformez les &#233;l&#233;ments de liste en &#233;l&#233;ments en ligne. Pas besoin de &lt;i&gt;hack&lt;/i&gt; pour nettoyer les flottants. Pas besoin de corriger l'espacement des &#233;l&#233;ments en ligne. Il y a juste besoin d'un espacement interne classique, rien de plus. Fin de chantier.&lt;/p&gt;
&lt;h2&gt;2. Conna&#238;tre les bases et apprendre les astuces&lt;/h2&gt;
&lt;p&gt;Pour devenir bon en &lt;abbr&gt;CSS&lt;/abbr&gt; ou quoi que ce soit d'autre dans la vie, vous devez conna&#238;tre les bases. Vous ne deviendrez jamais un expert si vous n'&#234;tes pas &#224; l'aise avec les bases de la discipline.&lt;/p&gt;
&lt;h3&gt;Les bases de &lt;abbr&gt;CSS&lt;/abbr&gt;&lt;/h3&gt;
&lt;p&gt;Quelles sont les bases de &lt;abbr&gt;CSS&lt;/abbr&gt; ? Selon les personnes, vous aurez droit &#224; diff&#233;rentes versions, c'est plus de l'ordre du ressenti, mais si vous voulez mon avis, il y a deux choses &#224; comprendre avant tout pour vraiment se familiariser avec &lt;abbr&gt;CSS&lt;/abbr&gt; :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;Le mod&#232;le de bo&#238;te&lt;/strong&gt;. Chaque &#233;l&#233;ment en &lt;abbr&gt;CSS&lt;/abbr&gt; est une bo&#238;te (de type bloc ou en ligne) avec une largeur, une hauteur, et &#233;ventuellement des espacements, des marges et des bordures. C'est la chose la plus importante &#224; savoir. Vous en saurez davantage &lt;a href=&#034;http://www.w3.org/TR/CSS2/box.html&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;ici&lt;/a&gt;.&lt;/li&gt;&lt;li&gt; &lt;strong&gt;La sp&#233;cificit&#233;&lt;/strong&gt;. Pour pouvoir corriger vos &lt;abbr&gt;CSS&lt;/abbr&gt;, il est essentiel de savoir quelle r&#232;gle est plus forte que quelle autre. Pour plus d'informations sur le sujet, lisez les sp&#233;cifications : &lt;a href=&#034;http://www.w3.org/TR/CSS2/cascade.html&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;L'assignation des valeurs des propri&#233;t&#233;s, la cascade et l'h&#233;ritage&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Les astuces&lt;/h3&gt;
&lt;p&gt;Une fois que vous avez compris &#231;a, vous &#234;tes sur la bonne voie. &#192; partir de l&#224;, vous n'aurez qu'&#224; apprendre quelques astuces pour vous d&#233;brouiller avec les cas sp&#233;cifiques. Et vous n'avez pas fini d'en croiser. Laissez-moi vous en montrer quelques-unes.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Le coup du &#171; j'ai oubli&#233; de positionner l'&#233;l&#233;ment parent &#187;&lt;/i&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.enfant { position: absolute; top: 0; left: 0;
} /* Ceci a &#233;t&#233; oubli&#233; */
/*
.parent { position: relative; // Ou n'importe quelle autre valeur que static.
}
*/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et c'est l&#224; que vous vous dites : &#171; Hein ?! Mais pourquoi est-ce que mon &#233;l&#233;ment est en haut &#224; gauche de la page ? &#187; Eh oui : vous avez oubli&#233; de d&#233;finir la position de l'&#233;l&#233;ment parent (&lt;code&gt;relative&lt;/code&gt;, &lt;code&gt;absolute&lt;/code&gt;, tout ce que vous voulez sauf &lt;code&gt;static&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Le coup du &#171; contexte d'imbrication &#187;&lt;/i&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.parent { z-index: 1; opacity: 0.5; transform: rotate(5deg);
} .enfant { z-index: -1;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tous les d&#233;veloppeurs au monde ont bataill&#233; au moins une fois sur le sujet de l'imbrication de bo&#238;tes. En r&#233;sum&#233;, il est tout simplement impossible d'appliquer un &lt;code&gt;z-index&lt;/code&gt; &#224; un enfant d'un &#233;l&#233;ment (ou d'un pseudo-&#233;l&#233;ment) qui poss&#232;de d&#233;j&#224; un contexte d'imbrication (d&#233;clench&#233; soit par &lt;code&gt;z-index&lt;/code&gt;, opacity ou transform) ; il n'y a pas d'autres possibilit&#233;s. Une fois que vous ma&#238;trisez &#231;a, impossible de l'oublier, promis.&lt;/p&gt;
&lt;p&gt;&lt;abbr title=&#034;Nota Bene&#034;&gt;NB&lt;/abbr&gt; : pour plus d'information &#224; propos de &lt;code&gt;z-index&lt;/code&gt; et de l'imbrication &lt;abbr&gt;CSS&lt;/abbr&gt;, je vous recommande&lt;a href=&#034;http://www.vanseodesign.com/css/css-stack-z-index/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;ce superbe billet&lt;/a&gt; de Steven Bradley.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Le coup du &#171; J'ai oubli&#233; d'effacer le flottant &#187;&lt;/i&gt;&lt;br class='autobr' /&gt;
Votre mise en page devient folle. Les blocs se baladent n'importe o&#249;. Vous pleurez sans comprendre les raisons de cet affichage &#233;trange. Alors v&#233;rifiez vos flottants ! Dans la plupart des cas, c'est que vous avez oubli&#233; de les r&#233;initialiser.&lt;/p&gt;
&lt;p&gt;Note : dans le cas o&#249; un parent contient uniquement des &#233;l&#233;ments flottants, il va se r&#233;duire &#224; moins que vous n'annulez les flottants, ou alors que vous d&#233;finissiez une hauteur ou un &lt;code&gt;overflow&lt;/code&gt; (&lt;abbr title=&#034;Note du traducteur&#034;&gt;NdT&lt;/abbr&gt; : propri&#233;t&#233; d&#233;finissant les d&#233;passements de blocs ou comment le contenu est rogn&#233; : si le contenu d&#233;passe les dimensions d'un bloc, &lt;code&gt;overflow&lt;/code&gt; permet de cacher le contenu, d'afficher une barre de d&#233;filement ou pas).&lt;/p&gt;
&lt;p&gt;Je pourrais continuer pendant des heures sur ces sujets, mais ce n'est pas le but de cet article. Je dirais que &lt;strong&gt;&lt;abbr&gt;CSS&lt;/abbr&gt; pr&#233;sente un grand nombre de cas particuliers&lt;/strong&gt; et on en d&#233;couvre encore chaque jour. Tant que vous ne vous serez pas cass&#233; les dents dessus, vous ne saurez pas qu'ils existent ; mais ensuite, vous saurez comment les traiter.&lt;/p&gt;
&lt;h2&gt;3. DRY&lt;/h2&gt;
&lt;p&gt;DRY est l'acronyme de Don't Repeat Yourself (&lt;i&gt;Ne pas se r&#233;p&#233;ter&lt;/i&gt;, &lt;abbr&gt;NdT&lt;/abbr&gt;), et encore une fois ce n'est pas sp&#233;cifique &#224; &lt;abbr&gt;CSS&lt;/abbr&gt;. Il s'agit plut&#244;t d'une pratique r&#233;pandue lorsque vous codez, quel que soit le langage avec lequel vous avez &#224; composer.&lt;/p&gt;
&lt;p&gt;Ainsi, l'id&#233;e principale est d'&#233;viter de r&#233;p&#233;ter les m&#234;mes bouts de code X fois alors qu'une seule fois pourrait suffire. Dans certains langages, cela peut &#233;voquer l'utilisation d'une fonction, mais en &lt;abbr&gt;CSS&lt;/abbr&gt;, cela signifie utiliser une classe plut&#244;t que cibler un &#233;l&#233;ment sp&#233;cifique (voir plus loin la section concernant OOCSS). Pourtant, parfois il existe une chose vraiment simple comme la mutualisation de son code (&lt;i&gt;refactoring&lt;/i&gt;). Laissez-moi vous expliquer.&lt;/p&gt;
&lt;p&gt;Si vous &#234;tes en pr&#233;sence d'un bout de code qui est pr&#233;sent plusieurs fois dans votre feuille de style, il pourrait &#234;tre int&#233;ressant de le mutualiser (refactoriser) afin de n'avoir plus qu'une seule occurrence. Lisez ce qui suit :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.navigation li { color: #333;
} .navigation li a { color: #333;
} /* Mutualis&#233; */ .navigation li,
.navigation li a { color: #333;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vous voyez ? Vous vous demandez peut-&#234;tre quel est l'int&#233;r&#234;t, puisque le r&#233;sultat est le m&#234;me. Il y a deux choses &#224; prendre en compte : &lt;strong&gt;la performance et la facilit&#233; de maintenance&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&#192; propos de la performance : moins de lignes de code signifie un parcours plus rapide de la &lt;abbr&gt;CSS&lt;/abbr&gt; par le navigateur. Pour faire simple, le navigateur va appliquer la couleur aux deux r&#232;gles &#224; la fois au lieu de le faire deux fois.&lt;/p&gt;
&lt;p&gt;&#192; propos de la maintenance, je pense que cela parle de soi-m&#234;me. En proc&#233;dant de la sorte, vous avez seulement une ligne &#224; changer alors qu'avant vous deviez en changer deux pour modifier la couleur. Qu'en est-il quand vous avez 50 fois ou 300 fois le m&#234;me code ?&lt;/p&gt;
&lt;h4&gt;Plus d'informations sur DRY CSS&lt;/h4&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;http://www.vanseodesign.com/css/dry-principles/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;DRY CSS, don't repeat your CSS&lt;/a&gt; par Steven Bradley&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://fr.slideshare.net/jeremyclarke/dry-css-a-dontrepeatyourself-methodology-for-creating-efficient-unified-and-scalable-stylesheets&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;DRY CSS: a don't-repeat-yourself methodology for creating efficient, unified and scalable style sheets&lt;/a&gt; par Jeremy Clarke&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;4. OOCSS&lt;/h2&gt;&lt;h3&gt;C'est quoi ce truc ?&lt;/h3&gt;
&lt;p&gt;OOCSS est l'acronyme d'Object-Oriented CSS (&lt;abbr&gt;CSS&lt;/abbr&gt; Orient&#233; Objet, &lt;abbr&gt;NdT&lt;/abbr&gt;) . Vous avez probablement entendu parler de la programmation orient&#233;e objet. Il s'agit tout bonnement d'utiliser des &#171; objets &#187;, g&#233;n&#233;ralement des instances de classes (qui se composent d'attributs et de m&#233;thodes). J'imagine que vous vous demandez quel peut &#234;tre le rapport avec &lt;abbr&gt;CSS&lt;/abbr&gt; ?&lt;/p&gt;
&lt;p&gt;Premi&#232;rement, disons que c'est plus un concept ou une bonne pratique qu'un vrai principe. &lt;abbr&gt;CSS&lt;/abbr&gt; ne peut pas vraiment &#234;tre orient&#233; objet sachant que ce n'est pas un langage de programmation : pas d'espace de nommage, pas de fonctions, pas de m&#233;thodes, pas de classes de programmation, aucune des instructions conditionnelles, etc. C'est pourquoi certaines personnes ricaneront quand vous parlerez d'OOCSS.&lt;/p&gt;
&lt;p&gt;M&#234;me si je suis d'accord avec cela, malgr&#233; tout nous pouvons encore optimiser notre fa&#231;on de coder les &lt;abbr&gt;CSS&lt;/abbr&gt; pour faciliter le processus, rendre les sites Web plus rapides et am&#233;liorer la maintenabilit&#233;.&lt;/p&gt;
&lt;h3&gt;Comment faire ?&lt;/h3&gt;
&lt;p&gt;Pour le dire simplement, cela signifie utiliser des classes. Un grand nombre de classes. Pensez &#224; votre site comme s'il poss&#233;dait des &#171; modules &#187; ou des &#171; composants &#187;, si vous voulez. Essayez de rep&#233;rer les mod&#232;les qui se r&#233;p&#232;tent pour en faire des &#171; objets &#187; (classes) afin de les r&#233;utiliser.&lt;/p&gt;
&lt;p&gt;Pour &#234;tre un peu plus pr&#233;cis, cela signifie essentiellement deux choses :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; S&#233;parer structure et apparence&lt;/li&gt;&lt;li&gt; S&#233;parer conteneurs et contenu&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;S&#233;parer structure et apparence&lt;/h4&gt;
&lt;p&gt;S&#233;parer la structure et l'apparence peut se r&#233;v&#233;ler important : vous savez que des &#233;l&#233;ments graphiques peuvent &#234;tre utilis&#233;s &#224; plusieurs endroits sur un site web et sur plusieurs types d'&#233;l&#233;ments&#173;&#173;&#173;&#173;, n'est-ce pas ? Prenez le bout de code suivant, cela peut convenir &#224; un bouton, &#224; une image, ce que vous voulez :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#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);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Maintenant, au lieu de ce qui pr&#233;c&#232;de, nous pourrions cr&#233;er une classe qu'on appellerait &#171; habillage &#187; (&lt;i&gt;skin&lt;/i&gt;) ou quelque chose comme &#231;a, et l'appliquer aux &#233;l&#233;ments qui en ont besoin. Le r&#233;sultat est beaucoup plus compr&#233;hensible, la feuille de style plus maintenable et une interpr&#233;tation de classes plus rapide.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.habillage { border: 1px solid #444; border-radius: 5px; box-shadow: 0 0 5px rgba(0,0,0,0.1);
}&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;S&#233;parer conteneurs et contenu&lt;/h4&gt;
&lt;p&gt;Je pense que c'est l'une des r&#232;gles les plus importantes de OOCSS : coder des composants ind&#233;pendants, pas des bouts de code pour un &#233;l&#233;ment sp&#233;cifique de votre mod&#232;le. Les choses devraient &#234;tre r&#233;utilisables, quelle que soit leur place sur votre site Internet, sans les coder &#224; nouveau. Prenons l'exemple suivant :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#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);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;D'accord. Maintenant, si je veux exactement le m&#234;me style sur un titre de niveau 2 plac&#233; dans le pied de page ? Ou bien mettre en forme un titre de niveau 3 plac&#233; exactement de la m&#234;me mani&#232;re (quelle qu'en soit la raison) ? La meilleure fa&#231;on de faire consisterait &#224; cr&#233;er une classe et &#224; donner ces styles &#224; cette classe, pas aux &#233;l&#233;ments eux-m&#234;mes.&lt;/p&gt;
&lt;h3&gt;Qu'en est-il du &#171; ne jamais utiliser d'ID &#187; ?&lt;/h3&gt;
&lt;p&gt;Quand Nicole Sullivan a d&#233;couvert le concept de &lt;abbr&gt;CSS&lt;/abbr&gt; orient&#233;-objet, ce fut un sujet chaud. En effet &lt;a href=&#034;http://csslint.net/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;CSSLint&lt;/a&gt;, un outil de qualit&#233; du code &lt;abbr&gt;CSS&lt;/abbr&gt; cr&#233;&#233; par Nicholas C. Zakas et Nicole Sullivan, d&#233;conseille l'utilisation des s&#233;lecteurs d'ID.&lt;/p&gt;
&lt;p&gt;Pour comprendre le point de vue de Nicole, il est important de comprendre que les ID peuvent poser certains probl&#232;mes de priorit&#233;, car ils ont le score le plus &#233;lev&#233; dans ce domaine. Prenez le code suivant &#224; titre d'exemple (&#224; voir sur &lt;a href=&#034;http://csswizardry.com/2011/09/when-using-ids-can-be-a-pain-in-the-class/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;CSSWizardry&lt;/a&gt; - &lt;a href=&#034;http://jsfiddle.net/csswizardry/gTZGq/1/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;source ici&lt;/a&gt;) :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;!-- HTML --&gt;
&lt;div id=&#034;en-tete&#034;&gt; &lt;p&gt; &lt;a href=&#034;#&#034;&gt;Foo&lt;/a&gt; &lt;a href=&#034;#&#034;&gt;Bar&lt;/a&gt; &lt;/p&gt; &lt;div class=&#034;tweet&#034;&gt; &lt;a href=&#034;#&#034;&gt;Suivez-moi sur twitter&lt;/a&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;div class=&#034;tweet&#034;&gt; &lt;a href=&#034;#&#034;&gt;Suivez-moi sur twitter&lt;/a&gt;
&lt;/div&gt; /* CSS */
#en-tete a { color: #f90; }
.tweet a { color: #000; }&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour mettre le premier lien Twitter en noir, vous avez deux options : soit lui donner une ID, soit utiliser le lourdaud &lt;code&gt;&lt;important!&gt;&lt;/code&gt;. Si &lt;code&gt;#en-tete&lt;/code&gt; &#233;tait une classe au lieu d'une ID, le probl&#232;me n'aurait pas exist&#233;.&lt;/p&gt;
&lt;p&gt;C'est en partie la raison pour laquelle Nicole Sullivan a dit &#171; pas d'ID &#187;.&lt;/p&gt;
&lt;p&gt;Je finirai cette partie par la citation de &lt;a href=&#034;http://csswizardry.com/2011/09/when-using-ids-can-be-a-pain-in-the-class/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Harry Roberts&lt;/a&gt; sur le sujet : &#171; [...] J'ai d&#233;cid&#233; qu'une interdiction g&#233;n&#233;rale &#233;tait l'option la plus logique. &#201;pargnez-vous beaucoup de soucis : n'utilisez jamais d'ID dans vos fichiers &lt;abbr&gt;CSS&lt;/abbr&gt; &#187;.&lt;/p&gt;
&lt;p&gt;Bien s&#251;r, il est tout &#224; fait possible d'utiliser des IDs qui restent parfaitement valides.&lt;/p&gt;
&lt;h3&gt;Quel est mon sentiment sur OOCSS ?&lt;/h3&gt;
&lt;p&gt;En ce qui me concerne, je ne suis pas vraiment un expert sur le sujet. D'abord parce que je n'ai jamais travaill&#233; sur un site &#233;norme impliquant de nombreux d&#233;veloppeurs front-end. Ne nous leurrons pas, c'est sans doute tr&#232;s utile pour les sites de grande importance, mais pas forc&#233;ment pour le petit site que vous faites pour votre boulanger.&lt;br class='autobr' /&gt;
Cependant, m&#234;me si je n'utilise pas OOCSS dans mes projets, j'essaie de me concentrer sur les choses importantes comme la r&#233;utilisation des composants, la maintenabilit&#233; de la feuille de style, la performance et autres. Ce sont les choses sur lesquelles OOCSS se concentre, donc d'une certaine fa&#231;on, je ne suis pas si loin de la logique.&lt;/p&gt;
&lt;h4&gt;Autres ressources sur OOCSS et les IDs&lt;/h4&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;http://coding.smashingmagazine.com/2011/12/12/an-introduction-to-object-oriented-css-oocss/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;An introduction to OOCSS&lt;/a&gt; par Louis Lazaris&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://github.com/stubbornella/oocss/wiki&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Object Oriented CSS&lt;/a&gt; par Nicole Sullivan&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://oocss.org/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;OOCSS.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://oli.jp/2011/ids/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Don't use IDs in CSS selectors?&lt;/a&gt; par Oli Studholme&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;5. &lt;abbr&gt;CSS&lt;/abbr&gt;3 : d&#233;couvrez ce que vous pouvez faire et ce que vous pouvez utiliser&lt;/h2&gt;
&lt;p&gt;Bon, assez de concepts. Parlons de choses s&#233;rieuses. Parlons un peu de &lt;abbr&gt;CSS&lt;/abbr&gt;3. Bien qu'en r&#233;alit&#233; &lt;abbr&gt;CSS&lt;/abbr&gt;3 n'existe pas en tant que tel :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;Contrairement &#224; &lt;abbr&gt;CSS&lt;/abbr&gt;2, qui est une importante sp&#233;cification d&#233;finissant diverses caract&#233;ristiques, &lt;abbr&gt;CSS&lt;/abbr&gt;3 est divis&#233; en plusieurs documents s&#233;par&#233;s appel&#233;s &#171; modules &#187;. Chaque module ajoute de nouvelles fonctionnalit&#233;s ou &#233;tend les fonctions d&#233;finies dans &lt;abbr&gt;CSS&lt;/abbr&gt;2, sur la pr&#233;servation de la r&#233;tro-compatibilit&#233;. [...] En raison de la modularisation, les diff&#233;rents modules sont plus ou moins stables et aboutis.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;i&gt;(Traduction de &lt;a href=&#034;http://en.wikipedia.org/wiki/Cascading_Style_Sheets&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Cascading Style Sheets&lt;/a&gt; sur Wikipedia EN)&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Mais entendons-nous sur le fait que nous parlons des nouvelles fonctionnalit&#233;s que comprennent les navigateurs modernes.&lt;/p&gt;
&lt;p&gt;De nos jours, &lt;abbr&gt;CSS&lt;/abbr&gt;3 est partout : des bords arrondis aux d&#233;grad&#233;s, de la transparence aux ombres et pseudo-&#233;l&#233;ments.&lt;/p&gt;
&lt;h3&gt;Que peut-on faire ?&lt;/h3&gt;
&lt;p&gt;&#192; mon avis, vous pouvez vous servir de &lt;abbr&gt;CSS&lt;/abbr&gt;3 pour r&#233;duire le nombre de requ&#234;tes &lt;abbr title=&#034;HyperText Transfer Protocol&#034;&gt;HTTP&lt;/abbr&gt; (images), le nombre de balises et la taille des fichiers JavaScript. Voyons cela de plus pr&#232;s :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Coin arrondi (&lt;code&gt;border-radius&lt;/code&gt;) : 1 ligne de &lt;abbr&gt;CSS&lt;/abbr&gt; au lieu de 4 conteneurs + 4 images&lt;/li&gt;&lt;li&gt; Opacit&#233; (&lt;code&gt;opacity&lt;/code&gt;) et canal alpha de couleur : 1 ligne de &lt;abbr&gt;CSS&lt;/abbr&gt; au lieu d'un &lt;abbr title=&#034;Portable Network Graphics&#034;&gt;PNG&lt;/abbr&gt; semi-transparent&lt;/li&gt;&lt;li&gt; S&#233;lecteurs avanc&#233;s : pas besoin de JavaScript&lt;/li&gt;&lt;li&gt; Bo&#238;te flexible (&lt;code&gt;flexbox&lt;/code&gt;) : quelques lignes de &lt;abbr&gt;CSS&lt;/abbr&gt; au lieu de toute une biblioth&#232;que JavaScript&lt;/li&gt;&lt;li&gt; D&#233;grad&#233;s (&lt;code&gt;gradient&lt;/code&gt;) : quelques lignes de &lt;abbr&gt;CSS&lt;/abbr&gt; au lieu d'une image d'arri&#232;re-plan r&#233;p&#233;t&#233;e&lt;/li&gt;&lt;li&gt; Arri&#232;res-plans multiples (&lt;code&gt;background&lt;/code&gt;) : pas besoin de plusieurs conteneurs&lt;/li&gt;&lt;li&gt; Pseudo-&#233;l&#233;ments (&lt;code&gt;pseudo-element&lt;/code&gt;) : pas de balises suppl&#233;mentaires pour les &#233;l&#233;ments d&#233;coratifs&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Et je pourrais continuer longtemps mais je pense que vous avez compris. Ce que je veux faire passer comme message, c'est ceci : lancez-vous, et d&#233;couvrez tout ce que vous pouvez faire avec &lt;abbr&gt;CSS&lt;/abbr&gt;3. Vous devez cr&#233;er une table des mati&#232;res ? Sachez que vous pouvez le faire uniquement avec &lt;abbr&gt;CSS&lt;/abbr&gt; gr&#226;ce &#224; &lt;a href=&#034;http://dev.opera.com/articles/view/automatic-numbering-with-css-counters/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;CSS counters&lt;/a&gt;. Vous devez d&#233;finir une bordure originale personnalis&#233;e pour un site ? Sachez qu'il existe une propri&#233;t&#233; &lt;a href=&#034;http://css-tricks.com/understanding-border-image/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;code&gt;border-image&lt;/code&gt;&lt;/a&gt; pour l'int&#233;grer.&lt;/p&gt;
&lt;p&gt;Vous pouvez faire un million de choses avec &lt;abbr&gt;CSS&lt;/abbr&gt;, et c'est encore plus vrai quand il s'agit de &lt;abbr&gt;CSS&lt;/abbr&gt;3. Il est important de savoir ce que vous pouvez faire ou pas. Malheureusement, il n'existe pas de potion magique pour cela, vous devez lire la documentation et faire des exp&#233;riences. &#192; partir de l&#224;, vous apprendrez que vous pouvez faire des calculs avec la propri&#233;t&#233; &lt;code&gt;calc ()&lt;/code&gt;, mais vous ne pourrez pas obtenir 6 colonnes d'&#233;gale hauteur sans avoir &#224; vous battre comme un beau diable.&lt;/p&gt;
&lt;h3&gt;Apprendre ce que vous pouvez utiliser&lt;/h3&gt;
&lt;p&gt;Le plus gros probl&#232;me avec &lt;abbr&gt;CSS&lt;/abbr&gt;, c'est que tous les navigateurs ne prennent pas en charge les m&#234;mes propri&#233;t&#233;s. Pire, certaines propri&#233;t&#233;s sont g&#233;r&#233;es de plusieurs mani&#232;res diff&#233;rentes quand il s'agit de &lt;abbr&gt;CSS&lt;/abbr&gt;3. Ce sera votre plus grande mal&#233;diction lors de l'exp&#233;rimentation avec &lt;abbr&gt;CSS&lt;/abbr&gt;3.&lt;/p&gt;
&lt;p&gt;&#192; titre d'exemple, prenez la propri&#233;t&#233; &lt;abbr&gt;CSS&lt;/abbr&gt;3 la plus simple : &lt;i&gt;border-radius&lt;/i&gt; (coin arrondi). Eh bien, il y a des navigateurs qui ne comprennent pas les coins arrondis (&lt;abbr title=&#034;Internet Explorer&#034;&gt;IE&lt;/abbr&gt;8 + version ant&#233;rieure et Opera Mini). En fait, m&#234;me Firefox et Chrome n'interpr&#232;tent pas &lt;code&gt;border-radius&lt;/code&gt; de la m&#234;me fa&#231;on (ou ne l'ont pas toujours fait de la m&#234;me fa&#231;on).&lt;/p&gt;
&lt;p&gt;Qu'est-ce que cela signifie pour vous en tant que d&#233;veloppeur front-end ? Cela veut dire que si vous devez afficher des coins arrondis dans tous les navigateurs, vous pouvez le faire &#224; l'ancienne. Arri&#232;re-plans multiples + images multiples, ou alors adopter les deux solutions et servir l'une ou l'autre en fonction du navigateur.&lt;/p&gt;
&lt;p&gt;Quand je dois faire quelque chose en &lt;abbr&gt;CSS&lt;/abbr&gt;, voici le processus que je suis :&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Comment vais-je faire cela ?&lt;/li&gt;&lt;li&gt; D'accord, je comprends. Fait-il partie de la sp&#233;cification &lt;abbr&gt;CSS&lt;/abbr&gt;2.1 ?
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Oui : fastoche, fin de l'histoire.&lt;/li&gt;&lt;li&gt; Non, passez &#224; l'&#233;tape 3.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://caniuse.com/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Quelle est la qualit&#233; du rendu par les navigateurs ?&lt;/a&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Bonne : fastoche, fin de l'histoire.&lt;/li&gt;&lt;li&gt; Mauvaise, passez &#224; l'&#233;tape 4.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt; Est-ce une am&#233;lioration ou une fonction vitale ?
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; C'est juste une am&#233;lioration. Je ne fais rien pour les navigateurs non pris en charge ou &#224; la limite j'ajoute une solution de repli (fallback).&lt;/li&gt;&lt;li&gt; Il s'agit d'une caract&#233;ristique essentielle : passez &#224; l'&#233;tape 5.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt; Comment vais-je le faire fonctionner dans les navigateurs non pris en charge ?&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Prenons un exemple r&#233;el, d'accord ? Avec quelque chose de simple, comme un d&#233;grad&#233;. Allons-y.&lt;/p&gt;
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Comment vais-je faire cela ?&lt;/li&gt;&lt;li&gt; D'accord, je comprends. Fait-il partie de la sp&#233;cification &lt;abbr&gt;CSS&lt;/abbr&gt;2.1 ?
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Non, les d&#233;grad&#233;s appartiennent &#224; &lt;abbr&gt;CSS&lt;/abbr&gt;3.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://caniuse.com/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Quelle est la qualit&#233; du rendu par les navigateurs ?&lt;/a&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Pas mal, mais pas parfait. &lt;abbr&gt;IE&lt;/abbr&gt;8 + versions ant&#233;rieures ainsi qu'Opera Mini ne prennent pas en charge les d&#233;grad&#233;s &lt;abbr&gt;CSS&lt;/abbr&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; Est-ce une am&#233;lioration ou une fonctionnalit&#233; vitale ?
&lt;ol class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Il s'agit plut&#244;t d'une am&#233;lioration graphique, rien de fondamental. Je vais ajouter une couleur unie comme solution de repli.&lt;/li&gt;&lt;li&gt; C'est un &#233;l&#233;ment graphique indispensable : je dois le faire fonctionner pour les navigateurs non support&#233;s.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt; Comment vais-je faire pour les anciens navigateurs ?
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Je vais devoir recourir &#224; une image d'arri&#232;re-plan.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Gr&#226;ce &#224; ce processus pas &#224; pas, vous savez comment faire quelque chose avec &lt;abbr&gt;CSS&lt;/abbr&gt; (si c'est faisable), si vous pouvez l'utiliser en tenant compte du support des navigateurs et comment cr&#233;er des solutions de repli.&lt;/p&gt;
&lt;p&gt;&lt;abbr&gt;NB&lt;/abbr&gt; : souvenez-vous toujours de l'audience cible de votre site web ou de votre application. Si vous cr&#233;ez du contenu web pour une application iPad, vous pourrez utiliser de nombreuses propri&#233;t&#233;s &lt;abbr&gt;CSS&lt;/abbr&gt;3 sans vous soucier des solutions de repli. Toutefois si vous cr&#233;ez un site pour une banque, rappelez-vous que beaucoup de gens utilisent encore IE8 ou des versions plus anciennes encore.&lt;/p&gt;
&lt;h3&gt;Fournir des solutions de repli&lt;/h3&gt;
&lt;p&gt;Selon la situation, fournir une solution de repli pour les navigateurs non pris en charge peut &#234;tre soit ridiculement simple soit extr&#234;mement p&#233;nible. En effet, il y a des cas diff&#233;rents. Regardons cela de plus pr&#232;s.&lt;/p&gt;
&lt;h4&gt;Pas de solution de repli ou une solution de repli simple&lt;/h4&gt;
&lt;p&gt;Quand il y a une am&#233;lioration de l'exp&#233;rience utilisateur dont l'absence de prise en charge est sans cons&#233;quences, vous n'&#234;tes m&#234;me pas oblig&#233;s de fournir une solution de repli. C'est appr&#233;ciable.&lt;/p&gt;
&lt;p&gt;Il y a aussi quelques propri&#233;t&#233;s qui sont faciles &#224; traiter quand il s'agit de solution de repli. En g&#233;n&#233;ral, vous devez seulement &#233;crire deux versions de cette propri&#233;t&#233; : d'abord la solution de repli, puis la version correcte pour les navigateurs qui le supportent.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.mon-element { border: 1px solid #666; border: 1px solid rgba(0,0,0,0.3); background: #708090; background: hsl(210, 13%, 50%);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dans ce cas, les navigateurs ne supportant pas &lt;code&gt;rgba&lt;/code&gt; et &lt;code&gt;hsl&lt;/code&gt; ne liront pas les lignes 3 et 5 ; de ce fait vous fournissez des versions alternatives aux lignes 2 et 4. Pour les navigateurs pris en charge, ils vont d'abord appliquer la version alternative, puis la remplacer par la version correcte.&lt;/p&gt;
&lt;h4&gt;Modernizr&lt;/h4&gt;
&lt;p&gt;De nos jours, on ne peut gu&#232;re parler de &lt;abbr&gt;CSS&lt;/abbr&gt;3 sans mentionner &lt;a href=&#034;http://modernizr.com/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Modernizr&lt;/a&gt;. Il s'agit d'une biblioth&#232;que JavaScript qui teste la prise en charge des fonctionnalit&#233;s HTML5 et &lt;abbr&gt;CSS&lt;/abbr&gt;3 au chargement de la page. Cela peut sembler lourd, mais il est bien optimis&#233; et assez rapide.&lt;/p&gt;
&lt;p&gt;Quoi qu'il en soit, parfois, il faut savoir pr&#233;cis&#233;ment si le navigateur prend en charge une fonctionnalit&#233; particuli&#232;re. Notamment pour fournir une version alternative n&#233;cessitant d'autres propri&#233;t&#233;s &lt;abbr&gt;CSS&lt;/abbr&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* 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;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pour fournir une solution de repli de ce type, les classes ajout&#233;es par la biblioth&#232;que Javascript Modernizr vous seront d'un grand secours (&lt;code&gt;.no-opacity&lt;/code&gt; [sans-opacite] et &lt;code&gt;.no-pointerevents&lt;/code&gt; [sans-evenementpointeur]). Vous ne pouvez pas avoir les deux versions simultan&#233;ment.&lt;/p&gt;
&lt;p&gt;Quoi qu'il en soit, n'oubliez jamais de d&#233;finir une solution de repli, c'est vraiment important. Les fonctionnalit&#233;s majeures doivent &#234;tre prises en charge par tous les navigateurs, tant les anciens que les nouveaux, et si ce n'est pas le cas partout, vous devez avertir l'utilisateur.&lt;/p&gt;
&lt;p&gt;Donc, soit vous commencez avec une base simple et l'am&#233;liorez pour les navigateurs r&#233;cents, soit vous commencez avec une base moderne et vous composez pour les navigateurs plus anciens. Voir la section suivante pour plus d'informations.&lt;/p&gt;
&lt;h4&gt;Autres ressources sur &lt;abbr&gt;CSS&lt;/abbr&gt;3 :&lt;/h4&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;http://www.w3.org/Style/CSS/current-work.en.html&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Les sp&#233;cifications actuelles des CSS&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://www.webplatform.org/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;WebPlatform.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://modernizr.com/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Modernizr pour la d&#233;tection des fonctionnalit&#233;s&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://caniuse.com/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;CanIUse pour la prise en charge par les diff&#233;rents navigateurs&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;6. Am&#233;lioration progressive et d&#233;gradation &#233;l&#233;gante&lt;/h2&gt;
&lt;p&gt;Ce sont deux termes dont vous avez probablement d&#233;j&#224; entendu parler, en particulier la d&#233;gradation &#233;l&#233;gante, mais il y a une diff&#233;rence subtile entre les deux.&lt;/p&gt;
&lt;h3&gt;Am&#233;lioration progressive&lt;/h3&gt;
&lt;p&gt;Le principe de l'am&#233;lioration progressive est d'&#233;tablir une base commune de fonctionnalit&#233;s et de fonctions disponibles, et ensuite, d'am&#233;liorer l'exp&#233;rience utilisateur en fonction de ce que le navigateur prend en charge.&lt;/p&gt;
&lt;p&gt;Utiliser l'attribut &lt;abbr title=&#034;HyperText Markup Language&#034;&gt;HTML&lt;/abbr&gt;5 &lt;code&gt;required&lt;/code&gt; pour avertir l'utilisateur qu'un champ est manquant dans un formulaire avant de le soumettre peut &#234;tre consid&#233;r&#233; comme une am&#233;lioration progressive. Il s'agit d'une am&#233;lioration de l'exp&#233;rience utilisateur rendue possible gr&#226;ce au moteur natif du navigateur.&lt;/p&gt;
&lt;h3&gt;D&#233;gradation &#233;l&#233;gante&lt;/h3&gt;
&lt;p&gt;Vous utilisez la d&#233;gradation &#233;l&#233;gante lorsque vous d&#233;clinez une version alternative ou inf&#233;rieure de vos fonctionnalit&#233;s au cas o&#249; elles ne sont pas prises en charge. Fondamentalement, on part du plus haut pour aller vers le plus bas.&lt;/p&gt;
&lt;p&gt;Un exemple tr&#232;s simple serait l'avertissement que vous mettez entre les balises &lt;code&gt;&lt;canvas&gt;&lt;/code&gt; pour informer les utilisateurs de navigateurs qui ne les prennent pas en charge qu'il y a quelque chose qu'ils ne peuvent pas voir.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;canvas&gt;
Cette page utilise HTML5 Canvas. Veuillez utiliser un navigateur r&#233;cent pour voir ce contenu. Pour obtenir un autre navigateur, allez &#224; &lt;a href=&#034;http://browsehappy.com/&#034;&gt;BrowseHappy&lt;/a&gt;
&lt;/canvas&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Quelle est la diff&#233;rence ?&lt;/h3&gt;
&lt;p&gt;En fin de compte, il n'y en a pas. Vous avez des fonctionnalit&#233;s pour les navigateurs r&#233;cents et des fonctionnalit&#233;s ou des solutions de repli pour les plus anciens. C'est plut&#244;t une question de proc&#233;dure : soit vous codez pour les navigateurs modernes tout en proposant une solution de repli pour les anciens, soit vous le faites dans l'autre sens. C'est un choix.&lt;/p&gt;
&lt;p&gt;En tout cas, je veux redire ici que l'exp&#233;rience utilisateur n'est pas n&#233;cessairement la m&#234;me dans tous les navigateurs. En fait, ce n'est m&#234;me pas possible, puisque les moteurs des navigateurs sont diff&#233;rents. Quoi qu'il en soit, vous devez fournir des fonctionnalit&#233;s de base pour tout le monde, mais faites-moi plaisir : am&#233;liorez votre site web ou votre application pour les navigateurs modernes. Ils sont bien con&#231;us, ils fournissent des fonctionnalit&#233;s &#224; l'&#233;tat natif : utilisez-les.&lt;/p&gt;
&lt;h4&gt;Lectures compl&#233;mentaires sur l'am&#233;lioration progressive et la d&#233;gradation &#233;l&#233;gante&lt;/h4&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;http://dev.opera.com/articles/view/graceful-degradation-progressive-enhancement/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Progressive enhancement and graceful degradation&lt;/a&gt; sur DevOpera&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://www.alistapart.com/articles/understandingprogressiveenhancement/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Understanding progressive enhancement&lt;/a&gt; par Aaron Gustafson&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;7. Les pr&#233;processeurs &lt;abbr&gt;CSS&lt;/abbr&gt; &lt;/h2&gt;
&lt;p&gt;Aaaah, les pr&#233;processeurs&#8230; Le sujet chaud du moment. Sont-ils utiles ? Pour quoi faire ? Devrais-je en employer un ? Lequel ? Je pense que c'est l'un des sujets les plus d&#233;battus sur &lt;abbr&gt;CSS&lt;/abbr&gt; en ce moment.&lt;/p&gt;
&lt;p&gt;Je vais essayer d'&#234;tre aussi objectif que possible dans cette partie. Permettez-moi de commencer par ceci : si vous ne voulez pas utiliser un pr&#233;processeur, alors ne le faites pas. Ce ne sera jamais un probl&#232;me. Vous ne serez pas un mauvais d&#233;veloppeur front-end pour autant. Cela ne vous rendra pas incapable de faire certaines choses. Mais vous devriez, n&#233;anmoins, essayer de vous faire votre propre opinion &#224; ce sujet.&lt;/p&gt;
&lt;p&gt;Ok, j'en ai fini avec les pr&#233;cautions. Qu'est-ce qu'un pr&#233;processeur, de mani&#232;re g&#233;n&#233;rale ? Un pr&#233;processeur est une sorte d'outil qui compile une syntaxe donn&#233;e dans une langue utilis&#233;e par un autre programme (dans le cas pr&#233;sent : le navigateur). Il y a des pr&#233;processeurs pour de nombreux languages : il y a Markdown ou Jade pour le &lt;abbr&gt;HTML&lt;/abbr&gt;. Il y a LESS, Sass et Stylus pour &lt;abbr&gt;CSS&lt;/abbr&gt;. Il existe CoffeeScript pour JavaScript. Il y a CakePHP pour &lt;abbr title=&#034;HyperText Preprocessor&#034;&gt;PHP&lt;/abbr&gt; et ainsi de suite.&lt;/p&gt;
&lt;h3&gt;De quoi parle-t-on ?&lt;/h3&gt;
&lt;p&gt;Un pr&#233;processeur &lt;abbr&gt;CSS&lt;/abbr&gt; fournit aux &lt;abbr&gt;CSS&lt;/abbr&gt; certaines particularit&#233;s &#224; partir de langages orient&#233;s objet. Des choses comme :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; les variables&lt;/li&gt;&lt;li&gt; les fonctions (avec des param&#232;tres)&lt;/li&gt;&lt;li&gt; les espaces de nommages&lt;/li&gt;&lt;li&gt; l'imbrication&lt;/li&gt;&lt;li&gt; les instructions conditionnelles&lt;/li&gt;&lt;li&gt; les op&#233;rations&lt;/li&gt;&lt;li&gt; etc.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&#199;a a l'air attrayant, non ? Peut-&#234;tre que vous voulez un exemple pour comprendre la mani&#232;re dont cela fonctionne. Prenons le &lt;abbr&gt;CSS&lt;/abbr&gt; suivant pour une barre de navigation.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.navigation { width: 800px; width: calc(100%-150px);
}
.navigation li { color: #444;
}
.navigation li a { text-decoration: none;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et voici maintenant la version compil&#233;e (SCSS) :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$couleur-principale: #444; .navigation { width: (100%-150px); li { color: $couleur-principale; a { text-decoration: none; } }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En gros, un pr&#233;processeur va interpr&#233;ter ceci dans une version &lt;abbr&gt;CSS&lt;/abbr&gt; standard. Ce sera exactement la m&#234;me chose, sauf pour le calcul. Il lancera l'op&#233;ration elle-m&#234;me et affichera le r&#233;sultat correspondant sans qu'il soit n&#233;cessaire d'utiliser une fonction comme &lt;code&gt;calc()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Donc, vous vous retrouvez avec une feuille de style plus compr&#233;hensible (variables et imbrications) et plus facile &#224; maintenir (variables et fonctions). C'&#233;tait un exemple tr&#232;s th&#233;orique, mais dans un projet r&#233;el, vous sentirez la diff&#233;rence.&lt;/p&gt;
&lt;h3&gt;Comment le choisir ?&lt;/h3&gt;
&lt;p&gt;Il existe beaucoup de pr&#233;processeurs &lt;abbr&gt;CSS&lt;/abbr&gt;, chacun avec ses avantages et ses particularit&#233;s. Quoi qu'il en soit, chacun d'entre eux fait plus ou moins la m&#234;me chose, donc le choix vous appartient. Voici les principales options quand il s'agit de pr&#233;processeurs &lt;abbr&gt;CSS&lt;/abbr&gt; :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;http://sass-lang.com/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Sass&lt;/a&gt; (&#233;crit en Ruby)&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://lesscss.org/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;LESS&lt;/a&gt; (&#233;crit en JavaScript)&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://learnboost.github.com/stylus/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Stylus&lt;/a&gt; (&#233;crit en JavaScript)&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://the-echoplex.net/csscrush/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Crush&lt;/a&gt; (&#233;crit en &lt;abbr&gt;PHP&lt;/abbr&gt;)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;L'id&#233;al, c'est d'apprendre &#224; les conna&#238;tre, de les tester et de voir ce qui r&#233;pond le mieux &#224; vos besoins et &#224; votre projet. Il y a plusieurs facteurs qui entrent en jeu ; les &#233;num&#233;rer tous serait hors de la port&#233;e de cet article, mais vous pouvez trouver quelques ressources pertinentes ci-dessous.&lt;/p&gt;
&lt;h3&gt;Mon sentiment sur les pr&#233;processeurs &lt;abbr&gt;CSS&lt;/abbr&gt; ?&lt;/h3&gt;
&lt;p&gt;Je ne suis pas un expert quand il s'agit de pr&#233;processeurs &lt;abbr&gt;CSS&lt;/abbr&gt;, mais j'en suis un partisan. Ils fournissent des fonctionnalit&#233;s tr&#232;s utiles mais qu'on ne trouve pas dans les &lt;abbr&gt;CSS&lt;/abbr&gt; comme les variables, les d&#233;clarations, l'imbrication et les conditions.&lt;/p&gt;
&lt;p&gt;J'ai bricol&#233; un peu avec LESS, et il m'a fait &#224; peu pr&#232;s ce que je voulais. Ou du moins, jusqu'&#224; ce que je commence &#224; me lancer dans des choses un peu plus compliqu&#233;es que vous avez pu lire dans mon dernier article sur &lt;a href=&#034;http://tympanus.net/codrops/2012/11/14/creative-css-loading-animations/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;CSS Loading Animations&lt;/a&gt; (pour les boucles + pr&#233;fixes vendeurs + &lt;i&gt;keyframes&lt;/i&gt;).&lt;/p&gt;
&lt;p&gt;J'ai aussi jet&#233; un coup d'&#339;il rapide &#224; Sass et Compass. &#192; ma grande surprise, c'&#233;tait incroyablement facile &#224; installer et &#224; lancer gr&#226;ce &#224; Ruby. J'avais peur, mais c'est tr&#232;s tr&#232;s intuitif, croyez-moi. En fin de compte, je suis vraiment impressionn&#233; par l'association Sass + Compass. Vous pouvez &#233;galement en savoir plus sur les raisons pour lesquelles je suis pass&#233; de LESS &#224; Sass dans &lt;a href=&#034;http://hugogiraudel.com/blog/less-to-sass.html&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;cet article&lt;/a&gt; sur mon blog.&lt;/p&gt;
&lt;p&gt;Quoi qu'il en soit, je suis encore tout &#224; fait capable d'&#233;crire des &lt;abbr&gt;CSS&lt;/abbr&gt; classiques sans pr&#233;processeur, et la plupart du temps c'est ce que je fais. Mais au final, je pense que nous allons tous en utiliser un, quel qu'il soit. Il nous manque vraiment certains &#233;l&#233;ments tr&#232;s utiles avec les &lt;abbr&gt;CSS&lt;/abbr&gt;, et les pr&#233;processeurs &lt;abbr&gt;CSS&lt;/abbr&gt; sont l&#224; pour y rem&#233;dier.&lt;/p&gt;
&lt;h4&gt;Lectures compl&#233;mentaires sur les pr&#233;processeurs &lt;abbr&gt;CSS&lt;/abbr&gt;&lt;/h4&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;http://net.tutsplus.com/tutorials/html-css-techniques/sass-vs-less-vs-stylus-a-preprocessor-shootout/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Sass vs. LESS vs. Stylus&lt;/a&gt; par Johnathan Croom&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://css-tricks.com/musings-on-preprocessing/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Musing on preprocessing&lt;/a&gt; par Chris Coyier&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://fr.slideshare.net/verekia/deep-dive-into-css-preprocessors&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Deep Dive Into CSS Preprocessors&lt;/a&gt; par Jonathan Verrecchia&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://blog.mediumequalsmessage.com/guidelines-using-oocss-and-css-preprocessors&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Guidelines using OOCSS and CSS preprocessors&lt;/a&gt; par Chris Webb&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;8. Garder un &#339;il sur l'avenir&lt;/h2&gt;
&lt;p&gt;Les langages sont en constante &#233;volution. C'est particuli&#232;rement vrai pour les &lt;abbr&gt;CSS&lt;/abbr&gt;. Les sp&#233;cifications &lt;abbr&gt;CSS&lt;/abbr&gt; bougent sans cesse, et les navigateurs ajoutent sans cesse de nouvelles fonctionnalit&#233;s &#224; leurs moteurs.&lt;/p&gt;
&lt;p&gt;&#192; ce propos, mon premier conseil serait de rester &#224; l'&#233;coute de ce qui se pr&#233;pare. Je sais que vous ne pouvez pas &#234;tre en mesure de tout utiliser d&#232;s son lancement, mais savoir quelle fonctionnalit&#233; est maintenant prise en charge par Canary Chrome, bient&#244;t par Chrome version stable et Safari, puis par Opera, Firefox et ainsi de suite, c'est important afin de prendre du recul sur les probl&#232;mes &lt;abbr&gt;CSS&lt;/abbr&gt; et les solutions possibles.&lt;/p&gt;
&lt;h4&gt;Ressources pour garder un &#339;il sur l'avenir :&lt;/h4&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;http://www.w3.org/Style/CSS/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Page d'accueil du W3C pour les CSS&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://caniuse.com/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;CanIUse.com pour la compatibilit&#233; navigateur&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://developer.mozilla.org/fr/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Mozilla Developer Network pour la documentation&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://www.html5rocks.com/en/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;HTML5 Rocks&lt;/a&gt; pour les les tutoriels et les articles les plus r&#233;cents et les plus pointus&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;9. Lire le code des autres&lt;/h2&gt;
&lt;p&gt;Une des meilleures fa&#231;ons d'apprendre &#224; coder est de lire du code.&lt;/p&gt;
&lt;p&gt;Heureusement, le &lt;abbr&gt;CSS&lt;/abbr&gt; est visible c&#244;t&#233; client, ce qui vous permet de le lire sur n'importe quel site avec un inspecteur web comme WebKit inspector, Dragonfly, Firebug, etc. De plus, l'industrie du web est tr&#232;s orient&#233;e vers l'open-source, ce qui signifie que les gens sont heureux de partager leurs sources avec vous.&lt;/p&gt;
&lt;p&gt;Une autre excellente fa&#231;on d'apprendre est de suivre des tutoriels. Prenez un tutoriel simple, et suivez-le &#233;tape par &#233;tape. Ensuite, essayez de le refaire &#224; partir de z&#233;ro. S'il vous arrive d'&#234;tre bloqu&#233;, jetez un coup d'&#339;il &#224; la solution, puis continuez par vous-m&#234;me.&lt;/p&gt;
&lt;p&gt;Lorsque vous serez &#224; l'aise avec &lt;abbr&gt;CSS&lt;/abbr&gt; et que vous voudrez entrer finement dans les d&#233;tails, vous voudrez peut-&#234;tre jeter un &#339;il &#224; des d&#233;monstrations et des exp&#233;riences qui ne sont pas comment&#233;es ni expliqu&#233;es. Les gens cr&#233;ent des choses tous les jours, et vous tomberez sans arr&#234;t sur des choses que vous ne connaissiez pas encore.&lt;/p&gt;
&lt;p&gt;&#192; ce sujet, il y a quelques mois Chris Coyier, Tim Sabat et Alex Vazquez ont lanc&#233; &lt;a href=&#034;http://codepen.io/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;CodePen&lt;/a&gt;, une sorte de plate-forme pour cr&#233;er, partager et explorer du code (&lt;abbr&gt;HTML&lt;/abbr&gt;, &lt;abbr&gt;CSS&lt;/abbr&gt;, JavaScript). CodePen comprend &#233;galement un tas d'outils comme les biblioth&#232;ques (jQuery, jQuery UI, MooTools, YUI, Prototype, Zepto, Dojo, Ext JS, PrefixFree, etc) et les pr&#233;processeurs (&lt;abbr title=&#034;XHTML Abstraction Markup Language&#034;&gt;HAML&lt;/abbr&gt;, Markdown, Slim, LESS, SCSS, Sass, CoffeeScript) si vous en avez besoin.&lt;/p&gt;
&lt;h4&gt;D'autres ressources pour trouver des exemples de code cr&#233;&#233; par d'autres personnes :&lt;/h4&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;http://codepen.io/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;CodePen&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://cssdeck.com/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;CSS Deck&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://dabblet.com/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Dabblet&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://thecodeplayer.com/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;TheCodePlayer&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;10. Pratiquez sans rel&#226;che&lt;/h2&gt;
&lt;p&gt;Vous savez ce qu'on dit &#224; propos de l'apprentissage : &lt;strong&gt;on apprend en faisant&lt;/strong&gt;. Donc, mon meilleur conseil est de continuer &#224; pratiquer comme pour toute autre chose. Plus vous pratiquez, meilleur vous serez. La pratique ne signifie pas n&#233;cessairement faire un site web &#224; partir de z&#233;ro. Il suffit de choisir une capture simple sur Dribbble et d'essayer de la refaire en &lt;abbr&gt;CSS&lt;/abbr&gt;. Le r&#233;sultat ne sera peut-&#234;tre pas utile imm&#233;diatement, mais ce que vous avez appris vous sera utile un jour.&lt;/p&gt;
&lt;p&gt;Et comme je l'ai dit dans la partie &#171; Apprendre les bases et quelques astuces &#187; de cet article, &lt;abbr&gt;CSS&lt;/abbr&gt; est plein de cas particuliers. Vous devrez apprendre &#224; les g&#233;rer si vous voulez &#233;crire des &lt;abbr&gt;CSS&lt;/abbr&gt;. Et la seule fa&#231;on de conna&#238;tre ces cas particuliers consiste &#224; pratiquer, d&#233;couvrir de nouveaux cas, jeter un &#339;il &#224; la solution, et continuer.&lt;/p&gt;
&lt;p&gt;Je vous recommande aussi de partager votre code. Il est toujours utile d'obtenir un retour constructif, alors assurez-vous de demander aux gens de v&#233;rifier votre code une fois qu'il est presque fini. Il suffit de les d&#233;poser dans un &lt;a href=&#034;http://jsfiddle.net/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;JSFiddle&lt;/a&gt;, de partager et de demander des commentaires.&lt;/p&gt;
&lt;h2&gt;Sommaire et cr&#233;dits&lt;/h2&gt;
&lt;p&gt;Comme cet article mentionne un tas de liens et de ressources diverses, autant les rassembler tous au m&#234;me endroit :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;a href=&#034;http://www.w3.org/Style/CSS/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Page d'accueil du W3C pour les CSS&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://www.w3.org/Style/CSS/current-work.en.html&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Les sp&#233;cifications actuelles des CSS&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://www.w3.org/TR/CSS2/cascade.html&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Comment assigner des valeurs aux propri&#233;t&#233;s ; la cascade ; l'h&#233;ritage (W3C)&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Les CSS &lt;a href=&#034;http://en.wikipedia.org/wiki/Cascading_Style_Sheets&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;sur Wikipedia EN&lt;/a&gt; et &lt;a href=&#034;https://fr.wikipedia.org/wiki/Feuilles_de_style_en_cascade&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;sur Wikip&#233;dia FR&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://www.w3.org/TR/CSS2/box.html&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;CSS 2.1: le mod&#232;le de bo&#238;te&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://www.webplatform.org/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;WebPlatform.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://modernizr.com/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Modernizr&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://caniuse.com/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;CanIUse&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://www.vanseodesign.com/css/css-stack-z-index/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;z-index And The CSS Stack: Which Element Displays First?&lt;/a&gt; par Steven Bradley&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://www.vanseodesign.com/css/dry-principles/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;DRY CSS, don't repeat your CSS&lt;/a&gt; par Steven Bradley&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://fr.slideshare.net/jeremyclarke/dry-css-a-dontrepeatyourself-methodology-for-creating-efficient-unified-and-scalable-stylesheets&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;DRY CSS: a don't-repeat-yourself methodology for creating efficient, unified and scalable style sheets&lt;/a&gt; par Jeremy Clarke&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://dev.opera.com/articles/view/graceful-degradation-progressive-enhancement/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Progressive enhancement and graceful degradation&lt;/a&gt; sur DevOpera&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://www.alistapart.com/articles/understandingprogressiveenhancement/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Understanding progressive enhancement&lt;/a&gt; par Aaron Gustafson&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://sass-lang.com/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Sass&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://lesscss.org/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;LESS&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://learnboost.github.com/stylus/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Stylus&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://the-echoplex.net/csscrush/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Crush&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://net.tutsplus.com/tutorials/html-css-techniques/sass-vs-less-vs-stylus-a-preprocessor-shootout/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Sass vs. LESS vs. Stylus&lt;/a&gt; par Johnathan Croom&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://css-tricks.com/musings-on-preprocessing/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Musing on preprocessing&lt;/a&gt; par Chris Coyier&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://fr.slideshare.net/verekia/deep-dive-into-css-preprocessors&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Deep Dive Into CSS Preprocessors&lt;/a&gt; par Jonathan Verrecchia&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://blog.mediumequalsmessage.com/guidelines-using-oocss-and-css-preprocessors&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Guidelines using OOCSS and CSS preprocessors&lt;/a&gt; par Chris Webb&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;https://developer.mozilla.org/fr/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Mozilla Developer Network&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://www.html5rocks.com/en/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;HTML5 Rocks&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://codepen.io/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;CodePen&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://cssdeck.com/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;CSS Deck&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://dabblet.com/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;Dabblet&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href=&#034;http://thecodeplayer.com/&#034; class=&#034;spip_out&#034; hreflang=&#034;en&#034; rel=&#034;external&#034;&gt;TheCodePlayer&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Merci beaucoup d'avoir lu cet article. J'esp&#232;re qu'il vous aidera d'une mani&#232;re ou d'une autre &#224; am&#233;liorer la fa&#231;on dont vous apprenez et utilisez les &lt;abbr&gt;CSS&lt;/abbr&gt;.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Quelles mesures CSS, pour quel usage ?</title>
		<link>http://www.pompage.net/traduction/css-unites-et-usages</link>
		<guid isPermaLink="true">http://www.pompage.net/traduction/css-unites-et-usages</guid>
		<dc:date>2014-04-09T10:00:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Fr&#233;d&#233;ric Chotard, Goulven Champenois</dc:creator>


		<dc:subject>CSS</dc:subject>
		<dc:subject>Dudley Storey</dc:subject>
		<dc:subject>D&#233;butant</dc:subject>

		<description>&lt;p&gt;Confront&#233;s au foisonnement des syst&#232;mes de mesure CSS, les d&#233;veloppeurs web peuvent avoir du mal &#224; comprendre quelle unit&#233; utiliser &#224; quel moment. Voici une liste de recommandations pour mieux s'y retrouver.&lt;/p&gt;

-
&lt;a href="http://www.pompage.net/traduction/" rel="directory"&gt;Traduction&lt;/a&gt;

/ 
&lt;a href="http://www.pompage.net/CSS" rel="tag"&gt;CSS&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/tag/dudley-storey" rel="tag"&gt;Dudley Storey&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/tag/debutant" rel="tag"&gt;D&#233;butant&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Confront&#233;s au foisonnement des syst&#232;mes de mesure CSS, les d&#233;veloppeurs web peuvent avoir du mal &#224; comprendre quelles unit&#233;s il faut utiliser dans leurs pages, et &#224; quel moment. On peut &#234;tre tent&#233; de toujours utiliser les m&#234;mes mesures, mais ce choix risque de limiter s&#233;rieusement l'aboutissement de vos designs. Je propose ci-dessous une liste de suggestions, mais non pas de r&#232;gles absolues : libre &#224; vous de vous en &#233;carter si vous le jugez pr&#233;f&#233;rable.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2&gt;Les pixels (&lt;code&gt;px&lt;/code&gt;)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&#192; choisir pour&lt;/strong&gt; : les traits de bordure et les &#233;l&#233;ments g&#233;n&#233;raux, lorsqu'il s'agit de designs &#224; largeur fixe ; &#233;galement pour les valeurs des d&#233;calages des &lt;a href=&#034;http://demosthenes.info/blog/css/shadows&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;ombres port&#233;es en &lt;abbr title=&#034;Cascading Style Sheets&#034;&gt;CSS&lt;/abbr&gt;&lt;/a&gt;. &#192; &#233;viter pour les points d'arr&#234;t dans &lt;a href=&#034;http://demosthenes.info/blog/154/CSS-media-queries&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;code&gt;@media&lt;/code&gt;&lt;/a&gt; car cela &lt;a href=&#034;http://blog.cloudfour.com/the-ems-have-it-proportional-media-queries-ftw/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;casse la mise en page en cas de zoom&lt;/a&gt; : mieux vaut employer &lt;code&gt;rem&lt;/code&gt; ou &lt;code&gt;em&lt;/code&gt;.&lt;br class='autobr' /&gt;
&lt;strong&gt;&#192; &#233;viter pour&lt;/strong&gt; : la typographie, sauf s'il s'agit d'&#233;tablir une taille de police de base dans un &#171; &lt;a href=&#034;http://demosthenes.info/blog/210/CSS-Resets&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;reset &lt;abbr&gt;CSS&lt;/abbr&gt;&lt;/a&gt; &#187; (remise &#224; z&#233;ro des styles, &lt;i&gt;&lt;abbr title=&#034;Note du Traducteur&#034;&gt;NdT&lt;/abbr&gt;&lt;/i&gt;).&lt;/p&gt;
&lt;h2&gt;Les pourcentages (&lt;code&gt;%&lt;/code&gt;)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&#192; choisir pour&lt;/strong&gt; : int&#233;grer des &lt;a href=&#034;http://demosthenes.info/blog/586/CSS-Fluid-Image-Techniques-for-Responsive-Site-Design&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;images&lt;/a&gt; et des &lt;a href=&#034;http://demosthenes.info/blog/627/Make-A-Responsive-CSS3-Image-Slider&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;conteneurs&lt;/a&gt; &#224; taille variable ; et pour d&#233;finir la hauteur de la balise &lt;code&gt;body&lt;/code&gt; dans certains cas.&lt;br class='autobr' /&gt;
&lt;strong&gt;&#192; &#233;viter pour&lt;/strong&gt; : la typographie. (Exception : &lt;a href=&#034;http://demosthenes.info/blog/300/CSS3-and-HTML5-Stylesheet-Reset&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;la taille de police pour un reset &lt;abbr&gt;CSS&lt;/abbr&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;em&lt;/code&gt; et &lt;code&gt;ex&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&#192; choisir pour&lt;/strong&gt; : la typographie, et les &#233;l&#233;ments qui y sont li&#233;s (les marges, par exemple), mais sans perdre de vue que &lt;code&gt;em&lt;/code&gt; et &lt;code&gt;ex&lt;/code&gt; peuvent &#234;tre tr&#232;s d&#233;licats &#224; employer dans des mises en page complexes. L'unit&#233; alternative &lt;a href=&#034;http://demosthenes.info/blog/673/REM-Not-the-Band&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;code&gt;rem&lt;/code&gt;&lt;/a&gt; est plus appropri&#233;e dans ces cas-l&#224;.&lt;/p&gt;
&lt;h2&gt;Les points et les picas&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&#192; choisir pour&lt;/strong&gt; : &lt;a href=&#034;http://demosthenes.info/blog/css/print&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;les feuilles de style d'impression&lt;/a&gt;.&lt;br class='autobr' /&gt;
&lt;strong&gt;&#192; &#233;viter pour&lt;/strong&gt; : tout le reste.&lt;/p&gt;
&lt;h2&gt;rem&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&#192; choisir si&lt;/strong&gt; : vous voulez une alternative plus solide et fiable aux solutions avec &lt;code&gt;em&lt;/code&gt; ou &lt;code&gt;ex&lt;/code&gt;, et pour les m&#234;mes usages, y compris les points d'arr&#234;t dans les requ&#234;tes de m&#233;dias.&lt;br class='autobr' /&gt;
&lt;strong&gt;&#192; &#233;viter si&lt;/strong&gt; : vous devez prendre en charge &lt;abbr title=&#034;Internet Explorer&#034;&gt;IE&lt;/abbr&gt;8 et les versions ant&#233;rieures. Sinon, utilisez cette unit&#233; mais pr&#233;voyez une solution de repli (en fournissant une alternative dans une unit&#233; plus courante avant la valeur en &lt;code&gt;rem&lt;/code&gt;) ou encore un &#171; polyfill &#187; (c'est-&#224;-dire un script effectuant le calcul dans les navigateurs ne comprenant pas cette unit&#233;, &lt;i&gt;&lt;abbr&gt;NdT&lt;/abbr&gt;&lt;/i&gt;).&lt;/p&gt;
&lt;h2&gt;Unit&#233;s relatives &#224; la surface d'affichage (&lt;code&gt;vh&lt;/code&gt; et &lt;code&gt;vw&lt;/code&gt;)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&#192; choisir pour&lt;/strong&gt; : &lt;a href=&#034;http://demosthenes.info/blog/739/Creating-Responsive-Hero-Text-With-vw-Units&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;la typographie r&#233;active&lt;/a&gt; ; et pour des &lt;a href=&#034;http://demosthenes.info/blog/738/Create-Perfect-Responsive-Shapes-With-CSS-vw-Units&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;conteneurs r&#233;actifs &#171; parfaits &#187;&lt;/a&gt;.&lt;br class='autobr' /&gt;
Difficile de savoir pour quel usage il faudrait &lt;strong&gt;&#233;viter&lt;/strong&gt; ces unit&#233;s, car &lt;code&gt;vh&lt;/code&gt; et &lt;code&gt;vw&lt;/code&gt; sont tr&#232;s r&#233;cents et encore loin d'avoir &#233;t&#233; totalement exploit&#233;s en design web. Attention toutefois &#224; l'absence de prise en charge sous &lt;abbr&gt;IE&lt;/abbr&gt;8 : pr&#233;voyez donc des solutions de repli.&lt;/p&gt;
&lt;h2&gt;Les pouces (&lt;code&gt;in&lt;/code&gt;) et les centim&#232;tres (&lt;code&gt;cm&lt;/code&gt;)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&#192; choisir dans&lt;/strong&gt; : les feuilles de style d'impression, et en particulier pour les marges des pages.&lt;br class='autobr' /&gt;
&lt;strong&gt;&#192; &#233;viter pour&lt;/strong&gt; : tout le reste.&lt;/p&gt;
&lt;h2&gt;Les caract&#232;res (&lt;code&gt;ch&lt;/code&gt;)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&#192; choisir pour&lt;/strong&gt; : dimensionner et positionner les polices &#224; espacement constant. Attention, le support navigateur est incomplet.&lt;/p&gt;
&lt;h2&gt;Grille de texte (&lt;code&gt;gd&lt;/code&gt;)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;De pr&#233;f&#233;rence pour&lt;/strong&gt; : des mises en page exp&#233;rimentales, car c'est une unit&#233; qui n'est prise en charge que par &lt;abbr&gt;IE&lt;/abbr&gt;10+ au moment o&#249; j'&#233;cris ces lignes. Des substituts de type &#171; &lt;a href=&#034;https://github.com/codler/Grid-Layout-Polyfill&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;polyfill&lt;/a&gt; &#187; commencent n&#233;anmoins &#224; appara&#238;tre.&lt;/p&gt;
&lt;h2&gt;Nombres bruts&lt;/h2&gt;
&lt;p&gt;Bien que presque toutes les propri&#233;t&#233;s &lt;abbr&gt;CSS&lt;/abbr&gt; exigent que l'unit&#233; de mesure soit indiqu&#233;e dans la d&#233;claration, pour quelques-unes d'entre elles il est pr&#233;f&#233;rable de n'employer que des valeurs d'entiers ou &#224; virgule flottante. En particulier, les propri&#233;t&#233;s &lt;a href=&#034;http://demosthenes.info/blog/606/Molten-Leading-Exploring-The-CSS-Relationship-Between-Font-Size-Line-Height-and-Margin&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;code&gt;line-height&lt;/code&gt;&lt;/a&gt; (hauteur de ligne) et &lt;a href=&#034;http://demosthenes.info/blog/438/CSS3-Border-Image-Explained&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&lt;code&gt;border-image&lt;/code&gt;&lt;/a&gt; (image de bordure) sont plut&#244;t &#224; sp&#233;cifier &#224; l'aide de nombres bruts.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Tests de contenu</title>
		<link>http://www.pompage.net/traduction/tests-de-contenu</link>
		<guid isPermaLink="true">http://www.pompage.net/traduction/tests-de-contenu</guid>
		<dc:date>2014-03-26T11:00:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Bertrand Keller, Evren Kiefer, Frank Taillandier, Fr&#233;d&#233;ric Chotard, Goulven Champenois</dc:creator>


		<dc:subject>Angela Colter</dc:subject>
		<dc:subject>Gestion de projet</dc:subject>
		<dc:subject>Workflow</dc:subject>
		<dc:subject>Interm&#233;diaire</dc:subject>

		<description>&lt;p&gt;Angela Colter montre comment int&#233;grer une &#233;valuation du contenu aux processus de tests d'exp&#233;rience utilisateur.&lt;/p&gt;

-
&lt;a href="http://www.pompage.net/traduction/" rel="directory"&gt;Traduction&lt;/a&gt;

/ 
&lt;a href="http://www.pompage.net/tag/angela-colter" rel="tag"&gt;Angela Colter&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/tag/gestion-de-projet" rel="tag"&gt;Gestion de projet&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/tag/workflow" rel="tag"&gt;Workflow&lt;/a&gt;, 
&lt;a href="http://www.pompage.net/Intermediaire" rel="tag"&gt;Interm&#233;diaire&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Personne n'a besoin de vous convaincre qu'il est important de tester le design et les interactions entre votre site et les personnes qui auront &#224; l'utiliser, pas vrai ? Mais si vous vous limitez &#224; cela, vous passez &#224; c&#244;t&#233; de retours sur la partie la plus importante de votre site : le contenu.&lt;br class='autobr' /&gt;
Que le but de votre site soit de convaincre les gens d'adopter un nouveau comportement, d'acheter quelque chose ou simplement de les informer, si vous vous contentez de v&#233;rifier qu'ils parviennent &#224; trouver l'information ou bien &#224; r&#233;aliser une transaction, alors vous manquez l'essentiel : le contenu est-il appropri&#233; au public ? Sont-ils capables de lire et de comprendre ce que vous avez &#233;crit ?&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h2&gt;Le conte de deux publics&lt;/h2&gt;
&lt;p&gt;Prenez un site d'information m&#233;dicale avec deux ensembles de fiches techniques : une version simplifi&#233;e pour le public de base et une version plus technique pour les m&#233;decins. Pendant les tests, un m&#233;decin participant qui lisait la version technique s'est arr&#234;t&#233; pour nous dire : &#171; &#201;coutez. J'ai cinq minutes entre deux patients pour comprendre l'essentiel de ces informations. Je ne fais pas de recherche sur le sujet, je veux juste en savoir suffisamment pour pouvoir en parler &#224; mes patients. Si je n'arrive pas &#224; comprendre rapidement, je ne peux pas l'utiliser &#187;. Nous avions fait des suppositions incorrectes &#224; propos des besoins de chaque segment du public. Nous serions pass&#233; &#224; c&#244;t&#233; de cette r&#233;v&#233;lation importante si nous n'avions pas test&#233; le contenu.&lt;/p&gt;
&lt;h2&gt;Vous vous y prenez mal&lt;/h2&gt;
&lt;p&gt;Avez-vous d&#233;j&#224; pos&#233; ces questions &#224; vos utilisateurs &#224; propos de votre contenu ?&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;Ces informations vous ont-elles plu ?&lt;br class='autobr' /&gt;
Avez-vous compris ce que vous avez lu ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il est tentant de poser ces questions mais elles ne vous aideront pas &#224; d&#233;couvrir si votre contenu est adapt&#233; &#224; votre public. La question de savoir si le contenu pla&#238;t est tr&#232;s appr&#233;ci&#233;e &#8212; surtout dans les &#233;tudes de march&#233; &#8212; mais elle n'est pas pertinente dans l'&#233;valuation de la conception car le fait que quelque chose plaise a tr&#232;s peu de rapport avec le fait de le comprendre et de l'utiliser. Dan Formosa donne des explications tr&#232;s int&#233;ressantes qui expliquent pourquoi vous devriez &lt;a href=&#034;http://interactions.acm.org/content/?p=1328&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&#233;viter de demander aux gens ce qu'ils appr&#233;cient&lt;/a&gt; pendant des recherches utilisateurs. Pour ce qui est de la question de la compr&#233;hension, il est utile d'en savoir un minimum sur la fa&#231;on dont les gens lisent.&lt;/p&gt;
&lt;h2&gt;Le processus de lecture&lt;/h2&gt;
&lt;p&gt;La lecture est le fruit de deux processus cognitifs simultan&#233;s : le d&#233;codage et la compr&#233;hension.&lt;/p&gt;
&lt;p&gt;Quand nous commen&#231;ons &#224; lire, nous apprenons que certains symboles repr&#233;sentent des concepts. Nous commen&#231;ons par reconna&#238;tre des lettres et par associer les formes aux sons qu'elles repr&#233;sentent. Ensuite, nous passons &#224; l'&#233;tape de la reconnaissance de mots entiers et de leur sens. Une fois que nous avons dig&#233;r&#233; ces mots de mani&#232;re individuelle, nous pouvons passer &#224; la compr&#233;hension : trouver ce que l'auteur a voulu dire en attachant ces mots les uns aux autres. C'est un travail difficile, en particulier si vous apprenez &#224; lire ou si vous faites partie des pr&#232;s de &lt;a href=&#034;http://www.nationmaster.com/graph/edu_lit_adu_at_low_lit_lev-education-literacy-adults-low-level&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;50% de la population&lt;/a&gt; qui ont de faibles capacit&#233;s de lecture.&lt;/p&gt;
&lt;p&gt;M&#234;me s'il est tentant de faire lire le texte &#224; quelqu'un et de lui demander s'il l'a compris, vous ne devriez pas vous appuyer sur un simple &#171; oui &#187;. Il est possible de reconna&#238;tre tous les mots (d&#233;coder), et avoir pourtant mal appr&#233;hend&#233; le sens (comprendre). Vous en avez probablement fait l'exp&#233;rience vous-m&#234;me : avez-vous d&#233;j&#224; lu quelque chose jusqu'au bout pour vous apercevoir que vous n'aviez pas compris ? Vous reconnaissez chaque mot, mais parce que le texte n'est pas clair ou parce que vous &#234;tres fatigu&#233;s, le sens du passage vous &#233;chappe.&lt;/p&gt;
&lt;p&gt;Alors comment d&#233;terminer si votre contenu est adapt&#233; &#224; pour vos utilisateurs ? Voyons comment le pr&#233;dire (sans utilisateur) et comment le tester (avec des utilisateurs).&lt;/p&gt;
&lt;h2&gt;Estimons-le&lt;/h2&gt;
&lt;p&gt;Les formules de lisibilit&#233; mesurent les &#233;l&#233;ments quantifiables de l'&#233;crit, tels que la longueur des mots et des phrases, pour pr&#233;dire le niveau de comp&#233;tence n&#233;cessaire pour les comprendre. Ils peuvent constituer une fa&#231;on rapide, facile, et bon march&#233; de d&#233;terminer si un texte sera trop difficile &#224; comprendre pour un public particulier. Les r&#233;sultats sont faciles &#224; comprendre : beaucoup donnent le niveau scolaire &#233;tats-uniens du texte.&lt;/p&gt;
&lt;p&gt;Vous pouvez acheter des logiciels de lisibilit&#233;. Il existe &#233;galement des outils gratuits en ligne propos&#233;s par &lt;a href=&#034;http://www.addedbytes.com/blog/code/readability-score/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Added Bytes&lt;/a&gt;, &lt;a href=&#034;http://juicystudio.com/services/readability.php&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Juicy Studio&lt;/a&gt;, et &lt;a href=&#034;http://www.editcentral.com/gwt1/EditCentral.html#style_diction&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Edit Central&lt;/a&gt;. Enfin, vous pouvez toujours vous rabattre sur la formule de gradation Flesch-Kincaid de Microsoft Word.&lt;/p&gt;
&lt;p&gt;Cependant, il y a un gros probl&#232;me avec les formules de lisibilit&#233; : la plupart des propri&#233;t&#233;s qui rendent un texte facile &#224; comprendre comme le contenu, l'organisation, ou la mise en page ne peuvent pas se mesurer de fa&#231;on math&#233;matique. Utiliser des mots courts et des phrases simples ne garantit en rien que le texte sera lisible. Les formules de lisibilit&#233; ne prennent pas en compte le sens. En aucun cas. Par exemple, prenons la phrase suivante de la page &#171; A propos &#187; de &lt;i&gt;A List Apart&lt;/i&gt;. L'&lt;a href=&#034;http://www.harrymclaughlin.com/SMOG.htm&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;index SMOG&lt;/a&gt; estime qu'il faut un niveau de troisi&#232;me pour la comprendre :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;Nous recevons plus de courrier en une journ&#233;e que nous pourrions en lire en une semaine.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Maintenant, r&#233;arrangeons les mots de fa&#231;on &#224; obscurcir le sens. Le r&#233;sultat : toujours compr&#233;hensible pour un &#233;l&#232;ve de troisi&#232;me.&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;En une journ&#233;e nous courrier plus qu'en une semaine recevons plus que nous pourrions en lire.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Les formules de lisibilit&#233; peuvent aider &#224; pr&#233;dire le niveau de difficult&#233; du texte et vous aider &#224; argumenter pour pouvoir le tester avec des utilisateurs. Mais ne les utilisez pas comme votre seule m&#233;thode d'&#233;valuation, et ne r&#233;&#233;crivez pas vos textes juste pour satisfaire une formule. Rappelez-vous, les formules de lisibilit&#233; estiment le niveau de difficult&#233; d'un texte. Elles ne peuvent pas vous enseigner comment r&#233;diger des textes compr&#233;hensibles.&lt;/p&gt;
&lt;h2&gt;Faire un test d'utilisabilit&#233; mod&#233;r&#233;&lt;/h2&gt;
&lt;p&gt;Pour d&#233;terminer si les gens comprennent votre contenu, faites-leur lire et appliquer de nouvelles connaissances. En d'autres termes, faites un test d'utilisabilit&#233; ! Voici comment cr&#233;er des sc&#233;narios de t&#226;ches dans lesquels les participants interpr&#232;tent et utilisent ce qu'ils ont lu :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Identifiez les probl&#232;mes cruciaux pour vos utilisateurs et vos affaires.&lt;/li&gt;&lt;li&gt; Cr&#233;ez des t&#226;ches qui testent les connaissances des utilisateurs sur ces probl&#232;mes.&lt;/li&gt;&lt;li&gt; Dites bien aux participants que ce ne sont pas eux qui sont test&#233;s mais bien le contenu.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Disons que vous testez &lt;a href=&#034;http://septa.org/fares/pass/index.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;SEPTA&lt;/a&gt;, un site de transport en commun. Il offre plusieurs types d'abonnement mensuels qui varient selon le moyen de transport utilis&#233; et la distance parcourue : par exemple, le TransPass permet de prendre le m&#233;tro, le bus ou le trolley. Un TrailPass vous permet aussi de prendre le train, etc. Si vous vouliez uniquement tester l'interface, vous articuleriez la t&#226;che de la fa&#231;on suivante :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;Achetez un TrailPass mensuel.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mais vous souhaitez tester avec quelle facilit&#233; le contenu explique la diff&#233;rence entre les abonnements pour que les gens puissent choisir celui qui leur convient le mieux. Ainsi, articulez la t&#226;che de cette fa&#231;on :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;Achetez l'abonnement le meilleur march&#233; qui r&#233;pond &#224; vos besoins.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Vous voyez la diff&#233;rence ? La premi&#232;re version ne requiert pas des participants qu'ils prennent en compte le contenu du tout. Elle leur dit simplement quelle version choisir. La deuxi&#232;me version leur demande d'utiliser le contenu pour d&#233;terminer quelle option est la meilleure pour eux. Soyez s&#251;r d'obtenir des participants qu'ils articulent explicitement leurs besoins pour que vous puissiez juger s'ils ont choisi la meilleure option.&lt;/p&gt;
&lt;p&gt;Demandez aux participants de penser &#224; haute voix pendant qu'ils lisent le contenu. Vous obtiendrez de pr&#233;cieux indices sur ce qui leur para&#238;t confus et pourquoi. Id&#233;alement, vous souhaitez que vos utilisateurs comprennent le texte d&#232;s leur premi&#232;re lecture. S'ils ont besoin de relire quoi que ce soit, vous devez clarifier le texte. Demandez aussi &#224; vos participants de paraphraser certaines portions ; s'ils ne comprennent pas l'id&#233;e g&#233;n&#233;rale, vous feriez mieux de recommencer.&lt;/p&gt;
&lt;p&gt;Pour d&#233;terminer quand les sc&#233;narii et les explications de texte sont corrects, vous devez savoir &#224; quoi ressemblent les bonnes r&#233;ponses. S'il le faut, travaillez avec un expert sur le sujet pour cr&#233;er une feuille de r&#233;ponses avant de diriger les s&#233;ances. Vous pouvez organiser des s&#233;ances de test utilisateur mod&#233;r&#233;es en temps r&#233;el soit en personne soit &#224; distance. Mais vous pouvez &#233;galement utiliser des m&#233;thodes asynchrones.&lt;/p&gt;
&lt;h2&gt;Faites un test d'utilisabilit&#233; non mod&#233;r&#233;&lt;/h2&gt;
&lt;p&gt;Si vous avez besoin d'un panel plus cons&#233;quent, que vous avez un budget serr&#233; ou que le temps presse, essayez une &#233;tude &#224; distance sans mod&#233;rateur. Envoyez aux participants l'un des outils de test utilisateur de votre choix comme &lt;a href=&#034;http://www.loop11.com/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Loop11&lt;/a&gt; ou &lt;a href=&#034;http://www.openhallway.com/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;OpenHallway&lt;/a&gt;, donnez-leur des t&#226;ches &#224; r&#233;aliser et enregistrez leurs r&#233;ponses. Vous pouvez m&#234;me utiliser quelque chose comme &lt;a href=&#034;https://surveymonkey.com/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;SurveyMonkey&lt;/a&gt; et formater votre &#233;tude comme un test &#224; choix multiple : cela vous prendra plus de temps au d&#233;but que des questions ouvertes car vous devez d&#233;finir les r&#233;ponses possibles &#224; l'avance mais ainsi l'&#233;valuation quantitative sera plus rapide.&lt;/p&gt;
&lt;p&gt;La cl&#233; du succ&#232;s d'un test &#224; choix multiple r&#233;ussi est de cr&#233;er des questions sans &#233;quivoque.&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Formulez votre question dans une forme affirmative et pas n&#233;gative.&lt;/li&gt;&lt;li&gt; Incluez seulement une seule r&#233;ponse correcte ou clairement meilleure.&lt;/li&gt;&lt;li&gt; Inventez entre deux et quatre r&#233;ponses incorrectes (des distracteurs) qui pourraient &#234;tre plausibles si vous ne compreniez pas le texte.&lt;/li&gt;&lt;li&gt; Assurez-vous que les alternatives s'excluent mutuellement.&lt;/li&gt;&lt;li&gt; &#201;vitez de donner des indices dans les r&#233;ponses.&lt;/li&gt;&lt;li&gt; &#201;vitez d'utiliser &#171; Toutes les options ci-dessus &#187; ou &#171; Aucune option ci-dessus &#187; en tant que choix.&lt;/li&gt;&lt;li&gt; &#201;vitez d'utiliser &#171; jamais &#187;, &#171; toujours &#187;, et &#171; seulement &#187;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Pensez aussi &#224; ajouter la possibilit&#233; de r&#233;pondre &#171; Je ne sais pas &#187; pour &#233;viter que les participants ne cochent une r&#233;ponse au hasard juste pour passer la question. Il ne s'agit pas du bac. Une r&#233;ponse choisie par d&#233;faut ne vous aidera pas &#224; analyser votre contenu.&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;&lt;strong&gt;Sc&#233;nario de t&#226;ches :&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Vous souhaitez acheter des ch&#232;ques voyage avec votre carte de cr&#233;dit. Quel pourcentage s'applique &#224; votre achat ?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;R&#233;ponses possibles :&lt;/strong&gt;&lt;br class='autobr' /&gt;
Le taux annuel standard de 10.99%&lt;br class='autobr' /&gt;
Le taux annuel pour avance de liquide de 24.24%*&lt;br class='autobr' /&gt;
Le taux de p&#233;nalit&#233; de 29.99%&lt;br class='autobr' /&gt;
Je ne sais pas.&lt;br class='autobr' /&gt;
(* Cette r&#233;ponse est la r&#233;ponse correcte &#224; en croire le contrat de mon propre organisme de cr&#233;dit)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Tout comme dans les tests mod&#233;r&#233;s, faites comprendre aux utilisateurs que le test concerne le contenu et non leurs capacit&#233;s.&lt;/p&gt;
&lt;h2&gt;Utilisez un test de Cloze&lt;/h2&gt;
&lt;p&gt;Un test de Cloze enl&#232;ve certains mots d'une partie de votre texte et demande &#224; vos utilisateurs de remplir les mots manquants. Les participants au test doivent se r&#233;f&#233;rer au contexte ainsi qu'&#224; leurs connaissances ant&#233;rieures du sujet pour identifier les mots effac&#233;s. C'est bas&#233; sur la th&#233;orie de Gestalt de compl&#233;tude &#8211; dans laquelle le cerveau essaie de remplir les pi&#232;ces manquantes &#8211; et l'applique &#224; l'&#233;crit.&lt;/p&gt;
&lt;p&gt;Cela ressemble &#224; ceci :&lt;/p&gt;
&lt;blockquote class=&#034;spip&#034;&gt;
&lt;p&gt;Si vous voulez _____ si les ______________ de votre site comprennent votre contenu, alors vous _____ le tester avec eux.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cela ressemble &#224; un exercice de remplissage, n'est-ce pas ? Mais au lieu d'essayer d'inventer la phrase la plus amusante, la plus &#233;trange ou la plus int&#233;ressante, comme dans le jeu am&#233;ricain Mad Libs, les participants doivent deviner le mot exact que l'auteur a utilis&#233;. M&#234;me si les tests Cloze sont rares dans le champ de l'exp&#233;rience utilisateur, les &#233;ducateurs les utilisent depuis des d&#233;cennies pour s'assurer qu'un texte est adapt&#233; &#224; leurs &#233;tudiants surtout dans les cours d'anglais deuxi&#232;me langue.&lt;/p&gt;
&lt;p&gt;Voil&#224; comment faire :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Prenez un extrait de texte de 125 &#224; 250 mots &#224; peu pr&#232;s.&lt;/li&gt;&lt;li&gt; Enlevez un mot sur cinq en le rempla&#231;ant par un espace blanc.&lt;/li&gt;&lt;li&gt; Demandez aux participants de remplir les espaces avec le mot qui, selon eux, a &#233;t&#233; enlev&#233;.&lt;/li&gt;&lt;li&gt; &#201;tablissez un score en comptant le nombre total de bonnes r&#233;ponses et en le divisant par le nombre total d'espaces blancs.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Un score de 60% ou mieux indique que le texte est appropri&#233; &#224; votre public. Les participants ayant obtenu entre 40 et 60% auront quelques difficult&#233;s &#224; comprendre le texte original. Ce n'est pas r&#233;dhibitoire, mais cela veut dire que le public aura besoin d'aide suppl&#233;mentaire pour comprendre votre contenu.&lt;br class='autobr' /&gt;
Un score de moins de 40% veut dire que les lecteurs seront frustr&#233;s par le texte et qu'il devrait &#234;tre r&#233;&#233;crit.&lt;/p&gt;
&lt;p&gt;Cela peut sembler farfelu, mais essayez cette m&#233;thode avant de l'&#233;carter. Dans une &#233;tude gouvernementale sur la lisibilit&#233; d'information li&#233;es aux services de sant&#233;, un panel d'expert a cat&#233;goris&#233; des articles de sant&#233; comme &#233;tant faciles ou difficiles. Nous avons ensuite fait passer des tests Cloze en utilisant ces articles &#224; des participants dont le niveau d'alphab&#233;tisation allait de bas &#224; moyen. Nous avons d&#233;couvert que les r&#233;sultats refl&#233;taient ceux du panel d'expert. Le score moyen des articles dits &#171; faciles &#187; &#233;tait de 60, indiquant qu'ils avaient &#233;t&#233; &#233;crits de mani&#232;re appropri&#233;e pour ce public. Le score moyen des articles dits &#171; difficiles &#187; &#233;tait de 39 : trop difficile pour ce public.&lt;/p&gt;
&lt;p&gt;Les tests Cloze sont facile &#224; cr&#233;er, administrer et &#233;valuer. Ils donnent une bonne id&#233;e de l'ad&#233;quation entre le contenu et le public vis&#233;. Si vous utilisez des tests Cloze seuls ou en combinaison avec d'autres tests utilisateurs, sachez que remplir ces blancs demande beaucoup d'efforts cognitifs. Pr&#233;voyez 25 blancs minimum pour avoir une &#233;tude de qualit&#233;, mais sachez qu'au-del&#224; de 50 le test devient vite fatiguant.&lt;/p&gt;
&lt;h2&gt;Quand tester&lt;/h2&gt;
&lt;p&gt;Testez votre contenu &#224; n'importe quel moment dans le processus de d&#233;veloppement du site. D&#232;s que vous avez du contenu, vous pouvez le tester. Vous avez besoin de convaincre votre patron de budg&#233;ter les tests de contenu ? Passez votre contenu dans une formule de lisibilit&#233;. Vous avez du contenu mais pas de wireframes ou de design visuel ? Faites un test Cloze pour &#233;valuer le contenu. Est-ce que la compr&#233;hension contenu est cruciale pour terminer une t&#226;che ou un ensemble de t&#226;ches ? Affichez le contenu lors de tests d'ergonomie.&lt;/p&gt;
&lt;h2&gt;Que tester&lt;/h2&gt;
&lt;p&gt;Vous ne pouvez pas tester chaque phrase de votre site et vous n'en avez pas besoin. Concentrez-vous sur les t&#226;ches importantes pour vos utilisateurs et votre produit. Par exemple, est-ce que votre centre de support re&#231;oit des appels concernant des informations qui devraient se trouver sur le site ? Testez le contenu pour trouver si votre site laisse &#224; d&#233;sirer et &#224; quel endroit.&lt;/p&gt;
&lt;h2&gt;N'attendez plus : allez-y !&lt;/h2&gt;
&lt;p&gt;Tout comme les tests d'ergonomie se concentrent sur ce que les utilisateurs font et non pas ce qu'ils disent faire, les tests de contenu d&#233;terminent ce que les utilisateurs comprennent et non pas ce qu'ils disent comprendre.&lt;/p&gt;
&lt;p&gt;Quel que soit votre budget, votre calendrier et votre acc&#232;s aux utilisateurs, il existe une m&#233;thode pour tester si votre contenu est appropri&#233; pour les personnes qui le lise. Donc, testez ! Si votre contenu fonctionne, vous serez vraiment fix&#233;, sinon il ne vous restera plus qu'&#224; le r&#233;&#233;crire.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
