<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" "http://openweb.eu.org/dtd/docbkx42/docbookx.dtd">
<article role="article" id="accessibilite_images">
  <articleinfo>
    <title>Des images accessibles</title>
    <pubdate>2003-04-28</pubdate>
    <date>2003-04-28</date>
    <author>
      <firstname>Laurent</firstname>
      <surname>Denis</surname>
      <email>laurent.denis@openweb.eu.org</email>
    </author>
    <legalnotice>
      <para>Cet article est sous licence <ulink url="http://creativecommons.org/licenses/by-sa/1.0/legalcode">Creative Commons Attribution-ShareAlike</ulink>.</para>
    </legalnotice>
    <abstract>
      <para>Les images constituent le premier obstacle majeur à l'accessibilité des pages Web. Voici quand et comment en donner un équivalent sous forme de texte.</para>
    </abstract>
    <subjectset>
      <subject role="profil">
        <subjectterm>debutant</subjectterm>
        <subjectterm>expert</subjectterm>
      </subject>
      <subject role="theme">
        <subjectterm>accessibilite</subjectterm>
      </subject>
    </subjectset>
  </articleinfo>
  <para>Une image n'est parfaitement visible&#8230; qu'à une personne ne souffrant pas de déficiences visuelles. Ce truisme mérite d'être rappelé, tant on l'oublie souvent en matière d'images Web. Toute information contenue dans une image est en effet perdue ou à tout le moins difficile à percevoir pour ceux qui souffrent d'un handicap visuel.</para>
  <para>Dès lors, des mécanismes de substitution doivent être prévus, afin qu'une information alternative remplace l'image, sous forme de texte. Celui-ci sera en effet parfaitement restitué par les navigateurs non graphiques (navigateurs textes, lecteurs d'écrans&#8230;) et sera plus aisément manipulé dans les navigateurs graphiques en fonction des paramètres de l'utilisateur (agrandissement, contraste accru&#8230;).</para>
  <section>
    <title>Le texte alternatif</title>
    <section>
      <title>L'attribut alt</title>
      <para>L'attribut <token>alt</token> est le principal vecteur des textes alternatifs pour&#160;:</para>
      <itemizedlist>
        <listitem><para>les images <token>img</token>&#160;;</para></listitem>
        <listitem><para>les zones réactives des images cliquables <token>area</token>&#160;;</para></listitem>
        <listitem><para>les boutons de formulaire <token>input type="image"</token>.</para></listitem>
      </itemizedlist>
      <para>Ces descriptions doivent être concises et complètes. Les termes les plus importants doivent être placés au début du texte.</para>
    </section>
    <section>
      <title>L'attribut <token>longdesc</token> et le <emphasis>lien D</emphasis></title>
      <para>Si la description excède approximativement 10 mots, il faut en effet envisager le recours à l'attribut <token>longdesc</token> des éléments <token>img</token>, qui crée un lien vers cette description détaillée placée dans un document annexe. Cependant, le support de cet attribut est encore très partiel. On lui substitue donc fréquemment un <emphasis>lien «&#160;D&#160;»</emphasis>(pour <emphasis>Description</emphasis>)&#160;: placé après la balise image, ce lien, avec la lettre «&#160;D&#160;» en guise de texte, mène à la page de description de l'image. Ceci s'avère particulièrement utile dans le cas des images contenant des informations complexes, telles les graphiques.</para>
    </section>
  </section>
  <section>
    <title>Toutes les images sont-elles concernées&#160;?</title>
    <para>On peut distinguer en fait deux grands types d'images selon l'information qu'elles véhiculent (nous mettons à part les images cliquables qui seront traitées par ailleurs)&#160;: des images significatives et des images non significatives.</para>
    <section>
      <title>Les images significatives</title>
      <para>Il s'agit&#160;:</para>
      <itemizedlist>
        <listitem>
          <para>des images porteuses de sens&#160;: il s'agit de toute image apportant une information pertinente pour la compréhension de la page, cette information n'étant présentée par ailleurs&#160;;</para>
        </listitem>
        <listitem>
          <para>des images-liens&#160;: elles sont essentielles à la navigation, et doivent donc impérativement être dotées d'un attribut <token>alt</token> indiquant précisément et brièvement la cible du lien. Par exemple, la traditionnelle icône représentant une silhouette de maison et suggérant un lien vers votre page d'accueil aura comme attribut <token>alt="Accueil"</token>&#160;;</para>
        </listitem>
        <listitem>
          <para>du texte en image&#160;: combien de titres de sites par exemple sont-ils transformés en graphismes <acronym>GIF</acronym> ou <acronym>JPEG</acronym>&#160;? Quand ce n'est pas un paragraphe entier de texte. Le texte en image est probablement l'un des pires obstacles à l'accessibilité, à moins que la totalité du texte de l'image ne soit reproduit dans un attribut <token>alt</token> ou dans un lien «&#160;D&#160;» si ce texte est trop long.</para>
          <para>Les animations <acronym>GIF</acronym> imposent une contrainte supplémentaire&#160;: le texte réparti fréquemment sur plusieurs images doit être reproduit <emphasis role="strong">intégralement</emphasis> dans la description, sans se limiter au texte de la première image.</para>
        </listitem>
      </itemizedlist>
    </section>
    <section>
      <title>Les images non significatives</title>
      <para>Il s'agit :</para>
        <itemizedlist>
          <listitem>
            <para>des images transparentes&#160;: elles sont utilisées dans les mises en pages <emphasis>à l'ancienne</emphasis> pour «&#160;caler&#160;» la mise en page (le recours à cette technique laborieuse est inutile dans une mise en page <acronym>CSS</acronym>)&#160;;</para>
        </listitem>
        <listitem>
          <para>des images typographiques&#160;: les images typographiques sont par exemple les puces et les boulets&#160;; ceux-ci peuvent être remplacés par des listes <acronym>HTML</acronym> <token>&lt;ul&gt;&lt;li&gt;</token>&#8230; que les navigateurs non-graphiques sauront interpréter, avec toute liberté de spécifier pour les navigateurs graphiques l'image de votre choix à l'aide de la propriété <acronym>CSS</acronym> <programlisting>list-style-image: url(<varname>&#8230;</varname>)</programlisting>. On peut y ranger également les barres de séparation horizontales, qui seront avantageusement remplacées par l'élément <token>hr</token> ou par les techniques de bordure <acronym>CSS</acronym>&#160;;</para>
        </listitem>
        <listitem>
          <para>Des images strictement décoratives&#160;: relevant de l'ordre de la présentation, celles-ci peuvent fréquemment être gérées par la feuille de style, à l'aide des propriétés <token>background-image</token> ou <token>content</token>. La difficulté réside dans l'évaluation de la quantité d'information ainsi perdue&#160;: cette information est-elle nécessaire à une pleine compréhension de la page&#160;? La perte d'information est-elle admissible&#160;? Chaque page et chaque image constituent un cas unique&#8230;</para>
          <para>A titre d'exemple, le pied de page OpenWeb comporte le logo de l'<acronym>APINC</acronym> (<inlinemediaobject><imageobject><imagedata fileref="/img/apinc.png"/></imageobject><textobject>                <phrase>une petite fleur</phrase></textobject></inlinemediaobject>) accompagnant la mention de notre hébergeur. Cette image ne comporte pas de texte alternatif&#160;: nous avons estimé que, dans le cadre de ces pages, ce logo n'apportait pas une information significative et que le fait de savoir qu'une petite fleur était affichée à la suite de la mention <quote>Site hébergé par l'<acronym>APINC</acronym></quote> n'était pas nécessaire à la pleine compréhension du texte. Il en serait évidemment tout autrement sur la page d'accueil de l'<acronym>APINC</acronym>.</para>
        </listitem>
      </itemizedlist>
      <para>Lorsque vous consultez une page web dans un navigateur graphique, vous faites abstraction de la majorité des images décoratives et des détails graphiques affichés par votre navigateur. Vous avez la possibilité de ne vous concentrer sur le contenu significatif (le texte que vous lisez, par exemple).</para>
      <para>Mais quelqu'un qui écoute une page dans un lecteur d'écran ne peut pas en ignorer des portions de texte de la même manière. Si une image non significative n'est pas dotée d'un attribut <token>alt</token> vide, le contenu de cet attribut (ou un contenu attribué par défaut par le navigateur) sera répété autant de fois qu'il y a d'images de ce type, parasitant la compréhension et rendant la consultation de la page particulièrement pénible&#8230; De même, un navigateur texte insèrera le nom du fichier image, souvent dénué d'intérêt et de sens pour le lecteur.</para>
      <para>Pour des images purement décoratives, des graphismes utilisés comme espacement, des images typographiques, il est donc indispensable d'utilisez un attribut <token>alt</token> «&#160;vide&#160;». L'attribut vide indique que l'image n'a pas de signification ou de contenu. Sa valeur étant nulle, le navigateur ne l'affichera pas ou ne le lira pas. Cependant&#160;:</para>
      <itemizedlist>
        <listitem>
          <para>n'ajoutez pas d'espace entre les guillemets&#160;: <token>alt=""</token> et non <token>alt=" "</token>&#160;;</para>
        </listitem>
        <listitem>
          <para>n'omettez pas l'attribut <token>alt</token>&#160;: ce n'est pas l'équivalent d'un attribut vide.</para>
        </listitem>
      </itemizedlist>
    </section>
  </section>
  <section>
    <title>Exemple 1&#160;: dans une mise en page à l'ancienne</title>
    <para>Nous prendrons comme exemple la <ulink url="annexes/microsoft.comfrance.html">page d'accueil du site Microsoft France</ulink> telle qu'elle se présentait dans notre navigateur (Opera 7) au moment où cet article a été écrit. Nous conserverons la mise en page d'origine de celle-ci, qui repose sur l'emploi des tableaux et de nombreuses images invisibles.</para>
    <para>Cette page présente en effet 3 types d'images non significatives&#160;:</para>
    <itemizedlist>
      <listitem>
        <para>une image décorative servant à donner un effet de courbe dans l'angle d'un tableau de présentation&#160;: 
            <inlinemediaobject>
              <imageobject>
                <imagedata fileref="annexes/curve000.gif"/>
              </imageobject>
              <textobject>
                <phrase>Une courbe noir sur fond blanc</phrase>
              </textobject>
            </inlinemediaobject>
            &#160;;
          </para>
      </listitem>
      <listitem><para>24 boulets utilisés dans les listes apparentes&#160;: 
            <inlinemediaobject>
              <imageobject>
                <imagedata fileref="annexes/bulletK0.gif"/>
              </imageobject>
              <textobject>
                <phrase>un boulet bleu</phrase>
              </textobject>
            </inlinemediaobject>
            &#160;;
          </para>
      </listitem>
      <listitem>
        <para>52 images invisibles d'un pixel de côté, servant à <emphasis>caler</emphasis> la mise en page.</para>
      </listitem>
    </itemizedlist>
    <para>Voici comment se présente la partie supérieure de cette page dans un navigateur texte&#160;:</para>
    <mediaobject>
      <imageobject>
        <imagedata fileref="annexes/lynx1.png"/>
      </imageobject>
      <textobject>
        <phrase>aperçu de la page Microsoft dans Lynx</phrase>
      </textobject>
    </mediaobject>
    <para>Et voici comment se présentent les listes où figure le boule&#160; :</para>
    <mediaobject>
      <imageobject>
        <imagedata fileref="annexes/lynx2.png"/>
      </imageobject>
      <textobject>
        <phrase></phrase>
      </textobject>
    </mediaobject>
    <para>Enfin, dans <ulink url="annexes/ms_sans_images.html">cette simulation des images dénuées d'attribut <token>alt</token></ulink>, nous avons remplacé les boulets et le <acronym>GIF</acronym> spacer par des images de couleur rouge, au même format.</para>
    <para>Pour améliorer l'accessibilité de cette page, il suffit de préciser un attribut <token>alt=""</token> pour chacune de ces images.</para>
    <para>Voici comment un navigateur texte rendra la page ainsi modifiée&#160;:</para>
    <mediaobject>
      <imageobject>
        <imagedata fileref="annexes/lynx3.png"/>
      </imageobject>
      <textobject>
        <phrase>aperçu de la nouvelle page Microsoft dans Lynx</phrase>
      </textobject>
    </mediaobject>
    <para>Dans notre page <ulink url="annexes/microsoft.comfrance2.html">Microsoft France finale</ulink>, nous avons conservé la mise en page traditionnelle pour les besoins de l'exemple. Mais une bien meilleure démarche consisterait à reconstruire cette page selon les standards <acronym>HTML</acronym> et <acronym>CSS</acronym> en évitant de recourir aux tableaux de présentation (pas moins de 25 tableaux dans ce cas). Dès lors, images transparentes et boulets disparaissent.</para>
  </section>
  <section>
    <title>Exemple 2&#160;: tirer parti d'une mise en page <acronym>CSS</acronym></title>
    <para>Nous prendrons comme exemple la <ulink url="annexes/laposte_net.html">page d'accueil du site laposte.net</ulink> telle que nous l'avons enregistrée au moment où cet article a été écrit. Dans sa version d'origine, aucune image significative n'est dotée d'un attribut alt. Pour mesurer la perte d'information liée aux images significative, il suffit de consulter <ulink url="annexes/laposte_net_sans_img.html">cette version de laposte.fr où ces images ont été simplement suprimées</ulink>.</para>
    <para>Cette fois, nous avons réalisé <ulink url="annexes/laposte_net2.html">une nouvelle version de laposte.net</ulink>, conforme aux standards et sans recours à des tableaux pour la présentation (grâce à une feuille de style <ulink url="annexes/laposte_net2.css">laposte_net2.css</ulink>).</para>
    <para>Ceci nous a permis de régler le problème des images non significatives&#160;:</para>
    <itemizedlist>
      <listitem><para>23 images invisibles d'un pixel de côté, supprimées&#160;;</para></listitem>
      <listitem>
        <para>15 boulets remplacés par des éléments de liste <token>ul</token> dotés d'une image <acronym>CSS</acronym> définie par <token>list-style-image: url(&#8230;)</token>.</para>
        <para>code <acronym>HTML</acronym> original&#160;:</para>
        <programlisting>
&lt;img src="<varname>boulet.gif</varname>"&gt;<varname>item de liste</varname>
        </programlisting>
        <para>code <acronym>HTML</acronym> standard&#160;:</para>
        <programlisting>
&lt;ul&gt;
  &lt;li&gt;<varname>item de liste</varname>&lt;/li&gt;
&lt;/ul>
        </programlisting>
        <para>acompagné en <acronym>CSS</acronym> par&#160;:</para>
        <programlisting>
li {
  list-style-image: url(<varname>boulet.gif</varname>)
}
        </programlisting>
      </listitem>
    </itemizedlist>
    <para>Quelles images significatives avons-nous dû traiter&#160;?</para>
    <itemizedlist>
      <listitem>
        <para>le logo principal&#160;:</para>
        <mediaobject>
          <imageobject>
            <imagedata fileref="annexes/logo_lap.gif"/>
          </imageobject>
          <textobject>
            <phrase>laposte.fr</phrase>
          </textobject>
        </mediaobject>
        <para>il devient accessible grâce à son texte alternatif&#160;:</para>
        <programlisting>
&lt;img src="<varname>logo_lap.gif</varname>" width="<varname>210</varname>"
 height="<varname>59</varname>"&gt;
        </programlisting>
        <para>devient&#160;:</para>
        <programlisting>
&lt;img src="<varname>logo_lap.gif</varname>" width="<varname>210</varname>"
 height="<varname>59</varname>" alt="<varname>laposte.fr</varname>" /&gt;
        </programlisting>
      </listitem>
      <listitem>
        <para>le logo du pied de page&#160;:</para>
        <mediaobject>
          <imageobject>
            <imagedata fileref="annexes/logo_laq.gif"/>
          </imageobject>
          <textobject>
            <phrase>La Poste</phrase>
          </textobject>
        </mediaobject>
        <para>de la même manière, on écrira simplement <token>alt="La Poste"</token>&#160;;</para>
     </listitem>
    <listitem>
        <para>un bandeau publicitaire (<acronym>GIF</acronym> animé)&#160;:</para>
        <mediaobject>
          <imageobject>
            <imagedata fileref="annexes/pub_la_poste_animee.gif"/>
          </imageobject>
          <textobject>
            <phrase>Publicité pour le moteur de recherche de laposte.net</phrase>
          </textobject>
        </mediaobject>
        <para>Le texte utile réparti sur plusieurs images successives est reproduit dans l'attribut <token>alt="Sur laposte.net, qui cherche trouve: découvrez notre moteur de recherche francophone"</token>, ce qui est un peu long&#160;: cette image justifie donc un <emphasis>lien D</emphasis> et un attribut <token>longdesc</token>&#160;:</para>
        <programlisting>
&lt;a href="<varname>&#8230;</varname>"&gt;
&lt;img src="<varname>&#8230;</varname>" width="<varname>&#8230;</varname>"
 height="<varname>&#8230;</varname>" 
 alt="Sur la Poste.net, qui cherche trouve:
 découvrez notre moteur de recherche francophone" 
 longdesc="longdesc.html" /&gt;
&lt;/a&gt;
&lt;br /&gt;
- &lt;a href="longdesc.html"
 title="Description détaillée"&gt;D&lt;/a&gt; -
        </programlisting>
      </listitem>
      <listitem>
        <para>un texte en image animé&#160;:</para>
        <mediaobject>
          <imageobject>
            <imagedata fileref="annexes/animcorr.gif"/>
          </imageobject>
          <textobject>
            <phrase>Pour annoncer un heureux événement, ou inviter des amis, envoyez une carte électronique !</phrase>
          </textobject>
        </mediaobject>
        <para>l'animation consistant en un simple clignotement de couleur, nous l'avons remplacée par un texte normal&#160;;</para>
      </listitem>
      <listitem>
        <para>3 icônes associées aux titres-liens principaux de la page&#160;:
            <inlinemediaobject>
              <imageobject>
                <imagedata fileref="annexes/echanger.gif"/>
              </imageobject>
              <textobject>
                <phrase>Une enveloppe</phrase>
              </textobject>
            </inlinemediaobject>
            (Echanger),
            <inlinemediaobject>
              <imageobject>
                <imagedata fileref="annexes/acces_hp.gif"/>
              </imageobject>
              <textobject>
                <phrase>Une fiche électrique</phrase>
              </textobject>
            </inlinemediaobject>
            (Accéder à Internet),
            <inlinemediaobject>
              <imageobject>
                <imagedata fileref="annexes/recherch.gif"/>
              </imageobject>
              <textobject>
                <phrase>Un oeil ?</phrase>
              </textobject>
            </inlinemediaobject>
            (Rechercher).
          </para>
          <para>Le texte accompagnant ces images en restitue parfaitement le sens utile&#160;: elles peuvent donc en fait être considérées comme non-significatives dès lors qu'elles ne sont plus un support de lien. Leur attribut sera alors <token>alt=""</token>.</para>
          <para>Le code original&#160;:</para>
          <programlisting>
&lt;tr&gt;
  &lt;td width="<varname>&#8230;</varname>" rowspan="<varname>&#8230;</varname>"
   align="<varname>&#8230;</varname>" valign="<varname>&#8230;</varname>"&gt;
    &lt;a href="<varname>&#8230;</varname>"&gt;
      &lt;img src="<varname>echanger.gif</varname>" width="<varname>&#8230;</varname>"
       height="<varname>&#8230;</varname>" border="<varname>&#8230;</varname>"&gt;
    &lt;/a&gt;
  &lt;/td&gt;
  &lt;td&gt;
    &lt;img src="<varname>1pix0000.gif</varname>" width="<varname>5</varname>"
     height="<varname>7</varname>"&gt;
  &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;
  &lt;a href="<varname>&#8230;</varname>" class="<varname>&#8230;</varname>"
   target="_top"&gt;<varname>Echanger</varname>&lt;/a&gt;
  &lt;/td&gt;
          </programlisting>
          <para>Devient plus simplement&#160;:</para>
          <programlisting>
&lt;h2&gt;
  &lt;img src="<varname>echanger.gif</varname>" width="<varname>&#8230;</varname>"
   height="<varname>&#8230;</varname>" alt="" /&gt; 
  &lt;a href="<varname>&#8230;</varname>"><varname>Echanger</varname>&lt;/a&gt; :
&lt;/h2&gt;
          </programlisting>
      </listitem>
      <listitem>
        <para>2 icônes isolées&#160;:
            <inlinemediaobject>
              <imageobject>
                <imagedata fileref="annexes/bt_nouve.gif"/>
              </imageobject>
              <textobject>
                <phrase>Nouveau</phrase>
              </textobject>
            </inlinemediaobject>
          </para>
          <para>Cette image apportant une information spécifique, celle-ci est reprise dans <token>alt="Nouveau !"</token>. L'image originale clignotante est remplacée par une image statique
            <inlinemediaobject>
              <imageobject>
                <imagedata fileref="annexes/nouveau.png"/>
              </imageobject>
              <textobject>
                <phrase>nouveau</phrase>
              </textobject>
            </inlinemediaobject> (au format <acronym>PNG</acronym>, que les anciens navigateurs graphiques ne supportent pas, ce qui donne une raison d'être de plus à l'attribut <token>alt</token>).
          </para>
          <para>
            <inlinemediaobject>
              <imageobject>
                <imagedata fileref="annexes/lesplus0.gif"/>
              </imageobject>
              <textobject>
                <phrase>Les 'plus'</phrase>
              </textobject>
            </inlinemediaobject>
          </para>
          <para>Cette image apporte également une information spécifique, d'autant plus importante qu'elle est le seul support d'un lien vers la page consacrée à ce sujet&#160;: deux raisons d'écrire <token>alt="Les 'plus'"</token>&#160;;</para>
      </listitem>
      <listitem>
        <para>2 images-liens faisant office de bouton de soumission des formulaires&#160;:
            <inlinemediaobject>
              <imageobject>
                <imagedata fileref="annexes/bt_ok_ec.gif"/>
              </imageobject>
              <textobject>
                <phrase>Ok</phrase>
              </textobject>
            </inlinemediaobject>
            <inlinemediaobject>
              <imageobject>
                <imagedata fileref="annexes/bt_trouv.gif"/>
              </imageobject>
              <textobject>
                <phrase>Trouve</phrase>
              </textobject>
            </inlinemediaobject>
          </para>
          <para>Ces deux images sont remplacées par des <token>input type="image"</token> dont les attributs <token>alt</token>, <token>name</token>, <token>title</token> et <token>value</token> reproduisent le texte correspondant. Cette redondance a priori surprenante permet de répondre aux comportements très variés observés côté navigateurs face à cet élément particulier.</para>
          <para>Le code original&#160;:</para>
          <programlisting>
&lt;a href="<varname>&#8230;</varname>" onMouseOver="<varname>&#8230;</varname>"
 onMouseOut="<varname>&#8230;</varname>" onFocus="<varname>&#8230;</varname>"&gt;
  &lt;img src="bt_ok_ec.gif" width="<varname>&#8230;</varname>" height="<varname>&#8230;</varname>"
   align="<varname>&#8230;</varname>" border="<varname>&#8230;</varname>"&gt;
&lt;/a&gt;
          </programlisting>
          <para>Devient plus simplement&#160;:</para>
          <programlisting>
&lt;input type="image" src="<varname>bt_ok_ec.gif</varname>" alt="<varname>OK</varname>"
 name="<varname>OK</varname>" value="<varname>OK</varname>" title="<varname>OK</varname>" /&gt;
          </programlisting>
      </listitem>
    </itemizedlist>
  </section>
  <section>
    <title>Conclusion</title>
    <para>On voit que le recours aux techniques <acronym>CSS</acronym> et le respect du standard <acronym>HTML</acronym> simplifient considérablement l'accessibilité d'une page en supprimant une grande partie des images non-significatives, ou en les «&#160;masquant&#160;» dans le code <acronym>CSS</acronym>, et en s'affranchissant en grande partie des textes mis en image. Il devient dès lors plus aisé de déterminer les images porteuses de sens, indispensables à la compréhension de la page, et de mettre en pratique la règle élémentaire de leur accessibilité&#160;: en donner un texte alternatif pertinent.</para>
  </section>
</article>
