<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://openweb.eu.org/dtd/docbkx42/docbookx.dtd">
<article role="article" xml:lang="fr" lang="fr" id="compatibilite_taille_polices">
  <articleinfo>
  	<title>Compatibilité multi-navigateurs des polices de caractères</title>
    <author>
      <firstname>Aurélien</firstname>
      <surname>Levy</surname>
    </author>
    <pubdate>2008-03-09</pubdate>
    <date>2008-03-09</date>
    <subjectset>
      <subject role="profil">
        <subjectterm>expert</subjectterm>
        <subjectterm>debutant</subjectterm>
      </subject>
      <subject role="technologie">
        <subjectterm>css</subjectterm>
      </subject>
    </subjectset>
		<abstract>
    <para>Quelles sont les unités et les valeurs à utiliser pour dimensionner la taille des caractères de façon homogène sur le plus grand nombre possible de navigateurs Web? Aurélien Levy a mené une campagne de tests pour donner une réponse à ce problème récurrent pour les développeurs de sites web.</para>
		</abstract>
  </articleinfo>
  <section>
    <section>
  		<title>Quelles unités ?</title>
      <para>Les tailles de polices peuvent être exprimées à l'aide d'unités relatives ou absolues. Sont disponibles, entre autres, pour les unités relatives :</para>
			<itemizedlist>
        <listitem>
          <para>les mots clefs ;</para>
        </listitem>
        <listitem>
          <para>les em ;</para>
        </listitem>
        <listitem>
          <para>les % ;</para>
        </listitem>
        <listitem>
          <para>les px (pixels) ;</para>
        </listitem>
      </itemizedlist>
      <para>Et pour les unités absolues :</para>
			<itemizedlist>
        <listitem>
          <para>le pt (point) ;</para>
        </listitem>
        <listitem>
          <para>le pc (pica) ;</para>
        </listitem>
        <listitem>
          <para>le cm (centimètre) ;</para>
        </listitem>
        <listitem>
          <para>le mm (millimètre) ;</para>
        </listitem>
        <listitem>
          <para>le in (inche) ;</para>
        </listitem>
      </itemizedlist>
      <para>Dans un premier temps, faisons le tri sur les unités à utiliser. Le dimensionnement des polices de caractères en pixels garantit un affichage homogène de la taille des caractères quel que soit le navigateur. Malheureusement cela empêche aussi les utilisateurs d'Internet Explorer pour Windows de changer la taille d'affichage des caractères par le biais de leur navigateur, sauf s'ils ont coché <emphasis role="strong">Ignorer les tailles de polices spécifiées sur les pages Web</emphasis> dans les options d'accessibilité, les obligeant à utiliser un logiciel de zoom d'écran. Depuis Internet Explorer 7, l'utilisateur a bien à sa disposition une fonction de zoom, mais l'effet produit et les besoins entrainant son utilisation ne sont pas forcément les mêmes.</para>
			<para>D'autre part, les unités absolues sont déconseillées pour des raisons liées à l'accessibilité des contenus Web. Ainsi, le <ulink url="http://www.synergies-publiques.fr/rubrique.php?id_rubrique=202">Référentiel général d'Accessibilité des Administrations</ulink> (RGAA) nous dit notamment que :</para>
			<blockquote>
				<para> L'utilisation d'unités relatives pour les tailles de caractères permet aux utilisateurs d'adapter l'affichage de la page selon leur besoin. De même, l'utilisation d'unités relatives pour le dimensionnement des blocs facilite leur adaptation aux contraintes de largeur de la fenêtre d'affichage. Les utilisateurs ayant besoin d'agrandir ou de réduire les textes, ou ceux ayant des écrans de petites dimensions, ne seront ainsi pas pénalisés.</para>
			</blockquote>
      <para>Pour toutes toutes ces raisons, nous abandonnerons donc les unités absolues au profit des unités relatives. Ainsi les mots clefs, les ems ou les % permettent de respecter les standards d'accessibilité, ainsi que le redimensionnement dans le navigateur qui reste encore aujourd'hui le plus utilisé sur le marché à savoir Internet Explorer.</para>
      <para>Nous allons donc devoir choisir parmi les unités relatives celle à utiliser. Étudions un peu plus précisément les avantages et les inconvénients de chacune avant de faire des choix définitifs.</para>
      <section>
    		<title>Les mots clefs (xx-small, x-small, small, medium, large, x-large, xx-large)</title>
				<para>Bien qu'étant relatifs à la taille des caractères configurée par l'utilisateur dans son navigateur, les mots clefs sont considérés dans les spécifications du W3C comme des valeurs absolues. Ils ne sont en effet pas sensible à l'héritage. En fait, les mots clefs se réfèrent à une entrée de la table des tailles de police, celle-ci étant issue de l'agent utilisateur (navigateur graphique ou texte, entre autres).</para>
				<para>Les valeurs possibles sont  : xx-small, x-small, small ,medium, large, x-large et xx-large.</para>
        <para>Le W3C conseille, dans le cas d'un moniteur, que le facteur d'échelle entre chaque mot clef varie entre 1,2 et 1,5 en fonction du mot clef utilisé afin d'éviter d'avoir un texte trop petit. Si la valeur 'medium' correspond à 16px, la valeur 'large' sera comprise entre 19.2px et 24px.</para>
        <para>Les facteurs d'échelle peuvent être différents selon les médias utilisés. Un texte en medium sur un PDA n'aura pas forcément la même taille que sur un écran d'ordinateur classique. Par ailleurs, le navigateur devrait prendre en compte la qualité et la disponibilité des polices au moment du calcul de cette table. Celle-ci peut aussi différer d'une famille de polices à une autre.</para>
				<table>
          <title>Tableau comparatif des valeurs avec des réglages standards</title>
          <tgroup cols="">
            <thead>
              <row>
                <entry>Taille HTML </entry>
                <entry>Mot clef</entry>
              </row>
            </thead>
            <tbody>
              <row>
                <entry>non applicable</entry>
                <entry><token>xx-small</token></entry>
              </row>
              <row>
                <entry><token>size=1</token>, <token>size=-2</token></entry>
                <entry><token>x-small</token></entry>
              </row>
              <row>
                <entry><token>size=2</token>, <token>size=-1</token>, <token>small</token></entry>
                <entry><token>small</token></entry>
              </row>
              <row>
                <entry><token>size=3</token></entry>
                <entry><token>medium</token></entry>
              </row>
              <row>
                <entry><token>size=4</token>, <token>size=+1</token>, <token>big</token></entry>
                <entry><token>large</token></entry>
              </row>
              <row>
                <entry><token>size=5</token>, <token>size=+2</token></entry>
                <entry><token>x-large</token></entry>
              </row>
              <row>
                <entry><token>size=6</token>, <token>size=+3</token></entry>
                <entry><token>xx-large</token></entry>
              </row>
              <row>
                <entry><token>size=7</token>, <token>size=+4</token></entry>
                <entry>non applicable</entry>
              </row>
            </tbody>
          </tgroup>
        </table>
        <para>Les avantages :</para>
				<itemizedlist>
        	<listitem>
          	<para>Permet à l'utilisateur de modifier l'affichage de la taille des caractères quelque soit sa plate-forme ;</para>
        	</listitem>
        	<listitem>
          	<para>Sept tailles possibles qui répondent en théorie à bon nombre de situations.</para>
        	</listitem>
      </itemizedlist>
        <para>Les inconvénients :</para>
				<itemizedlist>
        	<listitem>
          	<para>xx-small s'avère peu utilisable ;</para>
        	</listitem>
        	<listitem>
          	<para>Limite les possibilités de dimensionnement (sept possibilités seulement) ;</para>
        	</listitem>
        	<listitem>
          	<para>Taille affichée par un même mot clef variable en fonction du navigateur.</para>
        	</listitem>
      	</itemizedlist>
    	</section>
  	</section>		
    <section>
    	<title>Les ems ou les %</title>
			<para>Les ems et les % sont les valeurs relatives par excellence. L'utilisation des ces valeurs sur la propriété font-size implique que tous les calculs de taille se font par rapport à un élément défini précédemment, l'élément de base commun étant la taille définie par l'utilisateur dans la configuration de son navigateur. La valeur affichée est égale au produit de la valeur de pourcentage par la valeur initiale de cette propriété. Voici par exemple une page avec le code HTML suivant :</para>
<programlisting>&lt;body&gt;
   &lt;div&gt;ici du texte
      &lt;p&gt; ici du texte &lt;/p&gt;
   &lt;/div&gt;
&lt;/body&gt;</programlisting>
<para>Et le code css suivant :</para>
<programlisting>body {
font-size:100%;
}
div, p {
font-size:75%;
}</programlisting>
			<para>Dans le cas d'une configuration standard (16px par défaut) le texte dans la div fera 75% de 100%, donc 75% de 16px, donc 12px. Le texte dans le paragraphe fera quant à lui 75% de 75% de 100%, donc 75% de 12px (ou 56,25% des 16px de départ) donc 9px. (Pour plus d'info, voir <ulink url="http://blog-and-blues.org/weblog/2004/05/24/214-font-size-em">Comment définir la taille du texte en em</ulink>).</para>
       <para>Les avantages :</para>
			<itemizedlist>
        <listitem>
          <para>Permet à l'utilisateur de modifier l'affichage de la taille des caractères quelle que soit sa plate-forme ;</para>
        </listitem>
        <listitem>
          <para>Ils sont déterminés par rapport à la taille par défaut configurée dans le navigateur (16px étant la valeur défaut). Ainsi, un texte de 1em ou 100% est égale à une fois la valeur configurée ;</para>
        </listitem>
        <listitem>
          <para>Liberté totale dans le dimensionnement.</para>
        </listitem>
      </itemizedlist>
        <para>Les inconvénients :</para>
				<itemizedlist>
        	<listitem>
          	<para>Certaines valeurs de % ou de em ont un affichage différent entre les différents navigateurs ;</para>
        	</listitem>
        	<listitem>
          	<para>L'héritage des tailles de polices est un outil puissant mais son maniement n'est pas simple</para>
        	</listitem>
      </itemizedlist>
    	</section>
  	</section>
    <section>
    	<title>À l'heure du choix</title>
       <para>Nous retenons l'utilisation des % au vu de leur plus grande souplesse d'utilisation. Le problème reste de trouver les bonnes valeurs à utiliser, en utilisant pour cela un protocole de test nous permettant de comparer le rendu de la taille des caractères dans différents navigateurs.</para>
    </section>
    <section>
      <title>Quelles valeurs ?</title>
      <section>
        <title>Le protocole de test</title>
        <para>Ce protocole de test à été <ulink url="http://www.thenoodleincident.com/tutorials/typography/incremental_differences.html">mis au point par Owen Briggs</ulink>. Il s'agit simplement d'une série de page HTML composée d'un P avec un font-size fixé à 1.0em et d'un BODY avec un font-size en %, avec pour chaque page une valeur de pourcentage différente allant de 50% à 99%, et enfin d'une image de fond graduée. Ces pages sont ensuite placées dans un frameset permettant de les montrer toutes en même temps. Pour finir, il ne reste plus qu'à regarder ce frameset sous les différents navigateurs. Le résultat est  <ulink url="http://www.thenoodleincident.com/tutorials/typography/frame50-99.html">visible ici</ulink>.</para>
        <para>Malheureusement ces tests se limitent à une seule famille de police à savoir : verdana, arial, helvetica, sans-serif. Ils se limitent également à une taille maximum de 99%. L'auteur en conclut qu'il n'y a que 6 valeurs fiables, ce qui ne nous apporte aucun bénéfice par rapport à l'utilisation des mots clefs qui en comptent 7.</para>
        <para>Nous allons chercher à obtenir 11 valeurs et à élargir la gamme de familles de polices utilisées. De cette manière, nous obtiendrons dans le cas d'une configuration classique (texte réglé à 16px dans le navigateur) des tailles dont l'équivalent en px serait entre 9px et 19px qui s'afficheront de manière identique quelque soit le navigateur et la famille de police.</para>
        <para>Pour faciliter d'éventuels tests ultérieurs sur l'héritage, nous avons fait varier la valeur de font-size sur le P en % et laissé fixe la valeur du BODY à 100%, et non l'inverse comme le faisait Owen Briggs. Nous avons augmenté l'échelle de test en allant jusqu'à 129% et testé plusieurs familles de polices pour voir si les valeurs trouvées étaient les mêmes quelle que soit la famille de police. Les tests ont été effectués sur les navigateurs et plateformes suivantes :</para>
				<table>
          <title>navigateurs et plateformes testées</title>
          <tgroup cols="">
            <thead>
              <row>
                <entry>Navigateurs</entry>
                <entry>Windows</entry>
                <entry>OS X</entry>
                <entry>Linux</entry>
              </row>
            </thead>
            <tbody>
              <row>
                <entry>Konqueror 3.5</entry>
                <entry></entry>
                <entry></entry>
                <entry>oui</entry>
              </row>
              <row>
                <entry>Opera 8.5</entry>
                <entry>oui</entry>
                <entry>oui</entry>
                <entry></entry>
              </row>
              <row>
                <entry>Opera 9.2</entry>
                <entry>oui</entry>
                <entry>oui</entry>
                <entry>oui</entry>
              </row>
              <row>
                <entry>Camino 1.5</entry>
                <entry></entry>
                <entry>oui</entry>
                <entry></entry>
              </row>
              <row>
                <entry>Safari 1.2</entry>
                <entry></entry>
                <entry>oui</entry>
                <entry></entry>
              </row>
              <row>
                <entry>Safari 2</entry>
                <entry></entry>
                <entry>oui</entry>
                <entry></entry>
              </row>
              <row>
                <entry>Safari 3</entry>
                <entry></entry>
                <entry>oui</entry>
                <entry></entry>
              </row>
              <row>
                <entry>Internet Explorer 5</entry>
                <entry>oui</entry>
                <entry></entry>
                <entry></entry>
              </row>
              <row>
                <entry>Internet Explorer 5.2</entry>
                <entry></entry>
                <entry>oui</entry>
                <entry></entry>
              </row>
              <row>
                <entry>Internet Explorer 5.5</entry>
                <entry>oui</entry>
                <entry></entry>
                <entry></entry>
              </row>
              <row>
                <entry>Internet Explorer 6</entry>
                <entry>oui</entry>
                <entry></entry>
                <entry></entry>
              </row>
              <row>
                <entry>Internet Explorer 7</entry>
                <entry>oui</entry>
                <entry></entry>
                <entry></entry>
              </row>
              <row>
                <entry>Internet Explorer 8 beta 1</entry>
                <entry>oui</entry>
                <entry></entry>
                <entry></entry>
              </row>
              <row>
                <entry>Firefox 1.5</entry>
                <entry>oui</entry>
                <entry>oui</entry>
                <entry>oui</entry>
              </row>
              <row>
                <entry>Firefox 2</entry>
                <entry>oui</entry>
                <entry>oui</entry>
                <entry>oui</entry>
              </row>
              <row>
                <entry>Firefox 3 beta 4</entry>
                <entry>oui</entry>
                <entry>oui</entry>
                <entry>oui</entry>
              </row>
            </tbody>
          </tgroup>
        </table>
      </section>	
      <section>
        <title>Résultats</title>
        <para>Les résultats de ces tests sont donc visibles sous forme d'image par famille de police (images JPG):</para>
				<itemizedlist>
        	<listitem>
          	<para><ulink url="http://www.fairytells.net/typography/verdana.zip">Verdana (ZIP 3,8 Mo)</ulink></para>
        	</listitem>
        	<listitem>
          	<para><ulink url="http://www.fairytells.net/typography/arial.zip">Arial (ZIP 3,5 Mo)</ulink></para>
        	</listitem>
        	<listitem>
          	<para><ulink url="http://www.fairytells.net/typography/times.zip">Times (ZIP 3,4 Mo)</ulink></para>
        	</listitem>
        	<listitem>
          	<para><ulink url="http://www.fairytells.net/typography/geneva.zip">Geneva (ZIP, 3,7 Mo)</ulink></para>
        	</listitem>
        	<listitem>
          	<para><ulink url="http://www.fairytells.net/typography/georgia.zip">Georgia (ZIP 3,5 Mo)</ulink></para>
        	</listitem>
      </itemizedlist>
      </section>
    </section>
		<section>
      <title>La réponse à vos soucis</title>
      <para>Pour vous faciliter la tâche et ne pas jouer à cache cache avec les bonnes valeurs, voici le récapitulatif des valeurs que nous avons trouvées, comme étant les plus stable, en étudiant et comparant les images. Ceci se révèle être valable pour l'ensemble des 5 polices utilisées :</para>
				<table>
          <title>Tableau récapitulatif des résultats en base BODY à 100% (16px)</title>
          <tgroup cols="">
            <thead>
              <row>
                <entry>Valeurs en %</entry>
                <entry>Valeurs en pixels approximative</entry>
              </row>
            </thead>
            <tbody>
              <row>
                <entry>57</entry>
                <entry>9</entry>
              </row>
              <row>
                <entry>65</entry>
                <entry>10</entry>
              </row>
              <row>
                <entry>71</entry>
                <entry>11</entry>
              </row>
              <row>
                <entry>77</entry>
                <entry>12</entry>
              </row>
              <row>
                <entry>82</entry>
                <entry>13</entry>
              </row>
              <row>
                <entry>88</entry>
                <entry>14</entry>
              </row>
              <row>
                <entry>96</entry>
                <entry>15</entry>
              </row>
              <row>
                <entry>103</entry>
                <entry>16</entry>
              </row>
              <row>
                <entry>109</entry>
                <entry>17</entry>
              </row>
              <row>
                <entry>115</entry>
                <entry>18</entry>
              </row>
              <row>
                <entry>121</entry>
                <entry>19</entry>
              </row>
            </tbody>
          </tgroup>
        </table>
      <para>Il est à noter que certains frameworks CSS vous propose également des feuilles de styles toutes faites ayant la même optique. C'est notamment le cas de <ulink url="http://developer.yahoo.com/yui/fonts/">YUI Font</ulink> qui remet le texte par défaut à un équivalent 13px et vous propose les bonnes valeurs à utiliser pour avoir des textes plus petits ou plus grand.</para>
      <para>Reste cependant le problème de l'héritage inhérent à l'utilisation des % ou des em qui pourra faire l'objet d'un autre article...</para>
     </section>
</article>