<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
  <head>
    <title>Openweb.eu.org - Faire un menu dynamique ouvert et accessible</title>
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
    <link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" />
    <meta name="DC.Language" scheme="RFC3066" content="fr" />
    <meta name="DC.Identifier" content="menu_universel" />
    <meta name="DC.Creator" content="Fabrice Bonny" />
    <meta name="DC.Date.created" scheme="W3CDTF" content="2003-05-12" />
    <meta name="DC.Date.modified" scheme="W3CDTF" content="2003-05-12" />
    <meta name="DC.Rights" content="Cet article est sous licence Creative Commons Attribution-ShareAlike." />
    <meta name="DC.Subject" content="debutant, expert, accessibilite, pages_dynamiques" />
  </head>
  <body>
    <h1>Faire un menu dynamique ouvert et accessible</h1>
    <ul>
      <li>
        <strong>Profil :</strong> <a href="/debutant/">Débutant</a>, <a href="/expert/">Expert</a>
      </li>
      <li>
        <strong>Thème :</strong> <a href="/accessibilite/">Accessibilité</a>, <a href="/pages_dynamiques/">Pages dynamiques</a>
      </li>
      <li>
        <strong>Auteur :</strong> <a href="mailto:fabrice.bonny%40openweb.eu.org">Fabrice Bonny</a>
      </li>
      <li>
        <strong>Mise à jour :</strong> 12/05/2003</li>
    </ul>
    <h2>En bref</h2>
    <p>Réalisons un menu déroulant qui soit à la fois portable, utilisable sans JavaScript et accessible aux personnes handicapées.</p>
    <hr />
    <h3>Un menu dynamique</h3>
    <p>Parfois, pour des raisons de place sur la page, on ajoute un menu dynamique. Seulement <strong>qui dit dynamique dit obligation d'avoir un navigateur supportant le langage de script utilisé</strong>. Comment faire un menu qui fonctionne sans ce langage ? Comment le rendre utilisable par tous, quelles que soient les capacités du matériel ou de l'internaute ? Nous allons tenter de relever ce défi pas à pas.</p>
    <p>Il est important que vous gardiez à l'esprit que le principal interêt d'un menu dynamique est de donner un <strong>double niveau d'entrée</strong>. Un clic sur un menu ouvre une page détaillant les éléments du sous-menu et permettant au visiteur indécis de faire un choix. Un survol de ce même lien fait apparaître un sous-menu permettant à l'internaute d'accéder en un clic à l'information, s'il a déjà fait son choix.</p>
    <div>
      <strong>Attention : —</strong>
      <p>Si vous êtes aveugle, vous ne devriez percevoir aucune différence entre les 3 étapes du menu puisque c'est le but de l'article. De plus, les liens ne sont pas renseignés et renvoient sur la même page.</p>
    </div>
    <h3>La page brute</h3>
    <p>Nous allons tout d'abord réaliser la page à proprement parler sans nous soucier ni du rendu, ni de l'interactivité mais <strong>en prenant en compte l'accessibilité</strong>.</p>
    <h4>Le code</h4>
    <pre>
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd"&gt;

&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;
      Test de menu
    &lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content=
      "text/html; charset=iso-8859-1"&gt;
  &lt;/head&gt;
  &lt;body lang="fr"&gt;
    &lt;p id="access"&gt;
      [&lt;a href="#" accesskey="0"&gt;Politique
        d'accessibilité&lt;/a&gt;]
      [&lt;a href="#texte" accesskey="1"&gt;Aller
        au contenu&lt;/a&gt;]
      [&lt;a href="#menu1" accesskey="2"&gt;Aller
        au menu&lt;/a&gt;]
    &lt;/p&gt;
    &lt;div id="texte"&gt;
      &lt;p&gt;
        Scrahascrit mohotis, rusn scratedeus en
        pronohus cremaquoranis. Phel vup, etrop
        usnuquori mu nutram demol. Stobaquadore
        ilirher, hisch themipam ol asnuplue thoticrat.
        Spem ahospum quiduhiquiduer, la scat satidam
        aspadront. Rhasadit in amuv omebras. Ecepore
        alaps sni taspes itocont. Ubriplue pribinatis,
        iquiduh orem ipu rimalius quidematanis. Arinam
        in cespus cinilas. Crequad ofopriem, quadop
        molines dad rasalon ilaspant. Igopr brugipam
        va gidosmam vobarotis. Smoquad thegecr al
        aniquidem cunitrant. Lofoti mapopr, cratr
        phiropeus cer togibit crahego.
      &lt;/p&gt;
      &lt;p&gt;
        Apher est. Cedinam cop uco sischa quoru
        psilascham est. Dipsam in rhigustam
        quorabanatis. Phenebron in spomamus
        stemeprotis. Anusch initiem pu tescha
        thehescranis. Ohiph plisch bolotam lu ecananis
        hut thehaquoratis. Quorav scem mesciem me
        cepemer pi aspitront. Ephaquad quorol ev
        psivaspem vehant. Usmispeus, ocimus men
        rilecit naphanis. Rutrue som bal mepres tof
        iproplem est. Smin scridupeus lovorher, na
        esiquad rulam itrisner. Quadisch udepli
        upraplant, rac muph truvibeus baranis.
      &lt;/p&gt;
    &lt;/div&gt;
    &lt;hr&gt;
    &lt;p id="menu1"&gt;
      &lt;a href="#" title="Menu 1"&gt;Animaux&amp;nbsp;:&lt;/a&gt;
    &lt;/p&gt;
    &lt;ul id="ssmenu1"&gt;
      &lt;li&gt;
        &lt;a href="#" title="Sous-menu 1"&gt;Girafe&lt;/a&gt;&amp;nbsp;;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title="Sous-menu 2"&gt;Pingouin&lt;/a&gt;.
      &lt;/li&gt;
    &lt;/ul&gt;
    &lt;p id="menu2"&gt;
      &lt;a href="#" title="Menu 2"&gt;Villes&amp;nbsp;:&lt;/a&gt;
    &lt;/p&gt;
    &lt;ul id="ssmenu2"&gt;
      &lt;li&gt;
        &lt;a href="#" title="Sous-menu 1"&gt;Lisbonne&lt;/a&gt;&amp;nbsp;;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title="Sous-menu 2"&gt;Varsovie&lt;/a&gt;&amp;nbsp;;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title="Sous-menu 3"&gt;Lima&lt;/a&gt;&amp;nbsp;;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title="Sous-menu 4"&gt;Nairobi&lt;/a&gt;.
      &lt;/li&gt;
    &lt;/ul&gt;
    &lt;p id="menu3"&gt;
      &lt;a href="#" title="Menu 3"&gt;Personnages&amp;nbsp;:&lt;/a&gt;
    &lt;/p&gt;
    &lt;ul id="ssmenu3"&gt;
      &lt;li&gt;
        &lt;a href="#" title="Sous-menu 1"&gt;Gandhi&lt;/a&gt;&amp;nbsp;;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title="Sous-menu 2"&gt;César&lt;/a&gt;&amp;nbsp;;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title="Sous-menu 3"&gt;Gengis
          Khan&lt;/a&gt;.
      &lt;/li&gt;
    &lt;/ul&gt;
    &lt;p id="copy"&gt;
      &amp;copy;Blablablabla
    &lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;
      </pre>
    <div>
      <strong>Note : —</strong>
      <p>Les différents éléments de la page sont identifiés grâce à l'attribut <code>id</code> afin de pouvoir les enjoliver et les manipuler par la suite.</p>
    </div>
    <p>Vous pouvez <a href="annexes/etape1.htm">tester</a> cette étape dans votre navigateur.</p>
    <h4>Les explications</h4>
    <p>Le menu se présente sous la forme d'une liste à puce numérotée en bas de page, ce qui permet de lire directement le contenu de la page. La typographie a été respectée en ce qui concerne les listes avec utilisation d'un point-virgule précédé d'une espace insécable afin d'éviter les retours à la ligne disgracieux, même s'ils sont improbables dans notre cas. Ceci permet aussi une <strong>meilleure accessibilité puisqu'une synthèse vocale marque des pauses lorsqu'elle en rencontre</strong>. Nous pourrions aussi utiliser des virgules.</p>
    <p>Puisque nous parlons d'accessibilité, nous avons des liens permettant de naviguer dans la page. En effet, si un aveugle se rend compte à la lecture du contenu que la page ne correspond pas à son attente, il doit pouvoir aller directement au menu. Il retournera en haut de la page et trouvera les liens adéquats. De plus, ces liens sont pourvus d'un accélérateur, via <code>accesskey</code>, qui permet de les lancer grâce à une combinaison de touches. Il existe plusieurs écoles quant à l'ordre de ces liens. Pour ma part, je recommande de commencer par la politique d'accessibilité car un aveugle peut tomber sur n'importe quelle page, depuis un moteur de recherche par exemple, et ces informations lui sont utiles. Vous pouvez consulter notre <a href="/openwebgroup/demarche_accessibilite/">politique d'accessibilité</a> pour en savoir plus.</p>
    <p>C'est bien beau, me direz-vous, mais nous sommes loin d'avoir une page habillée et dynamique. Certes mais notez toutefois que <strong>ce rendu sera celui d'un navigateur texte</strong>, par exemple. Vous voyez aussi que même ainsi, il est possible de cliquer sur « Animaux » pour avoir les détails des pages « Girafe » et « Pingouin » ou directement sur ces liens.</p>
    <h3>Mise en forme</h3>
    <p>Nous allons maintenant passer au rendu de notre page <acronym title="HyperText Markup Language" lang="en">HTML</acronym> grâce aux <acronym title="Cascading Style Sheets" lang="en">CSS</acronym>. Pour cet exemple, j'ai choisi un rendu sobre, tout comme le contenu de la page n'est formé que de simples paragraphes. <strong>Il est bien sûr possible de remplacer les couleurs de fond par des images et d'enrichir le contenu de photos ou de tableaux</strong>.</p>
    <h4>Le code <acronym>HTML</acronym>
    </h4>
    <pre>
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd"&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;
      Test de menu
    &lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content=
    "text/html; charset=iso-8859-1"&gt;
    &lt;link rel="stylesheet" type="text/css" href=
    "menu.css" title="défaut"&gt;
  &lt;/head&gt;
  &lt;body lang="fr"&gt;
    &lt;p id="access"&gt;
      [&lt;a href="#" accesskey="0"&gt;Politique
        d'accessibilité&lt;/a&gt;]
      [&lt;a href="#texte" accesskey="1"&gt;Aller
        au contenu&lt;/a&gt;]
      [&lt;a href="#menu1" accesskey="2"&gt;Aller
        au menu&lt;/a&gt;]
    &lt;/p&gt;
    &lt;div id="texte"&gt;
      &lt;p&gt;
        Scrahascrit mohotis, rusn scratedeus en
        pronohus cremaquoranis. Phel vup, etrop
        usnuquori mu nutram demol. Stobaquadore
        ilirher, hisch themipam ol asnuplue thoticrat.
        Spem ahospum quiduhiquiduer, la scat satidam
        aspadront. Rhasadit in amuv omebras. Ecepore
        alaps sni taspes itocont. Ubriplue pribinatis,
        iquiduh orem ipu rimalius quidematanis. Arinam
        in cespus cinilas. Crequad ofopriem, quadop
        molines dad rasalon ilaspant. Igopr brugipam
        va gidosmam vobarotis. Smoquad thegecr al
        aniquidem cunitrant. Lofoti mapopr, cratr
        phiropeus cer togibit crahego.
      &lt;/p&gt;
      &lt;p&gt;
        Apher est. Cedinam cop uco sischa quoru
        psilascham est. Dipsam in rhigustam
        quorabanatis. Phenebron in spomamus
        stemeprotis. Anusch initiem pu tescha
        thehescranis. Ohiph plisch bolotam lu ecananis
        hut thehaquoratis. Quorav scem mesciem me
        cepemer pi aspitront. Ephaquad quorol ev
        psivaspem vehant. Usmispeus, ocimus men
        rilecit naphanis. Rutrue som bal mepres tof
        iproplem est. Smin scridupeus lovorher, na
        esiquad rulam itrisner. Quadisch udepli
        upraplant, rac muph truvibeus baranis.
      &lt;/p&gt;
    &lt;/div&gt;
    &lt;hr&gt;
    &lt;p id="menu1" class="menu"&gt;
      &lt;a href="#" title=
      "Menu 1"&gt;Animaux&lt;span&gt;&amp;nbsp;:&lt;/span&gt;&lt;/a&gt;
    &lt;/p&gt;
    &lt;ul id="ssmenu1" class="ssmenu"&gt;
      &lt;li&gt;
        &lt;a href="#" title=
        "Sous-menu 1"&gt;Girafe&lt;/a&gt;&lt;span&gt;&amp;nbsp;;&lt;/span&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title=
        "Sous-menu 2"&gt;Pingouin&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
    &lt;p id="menu2" class="menu"&gt;
      &lt;a href="#" title=
      "Menu 2"&gt;Villes&lt;span&gt;&amp;nbsp;:&lt;/span&gt;&lt;/a&gt;
    &lt;/p&gt;
    &lt;ul id="ssmenu2" class="ssmenu"&gt;
      &lt;li&gt;
        &lt;a href="#" title=
        "Sous-menu 1"&gt;Lisbonne&lt;/a&gt;&lt;span&gt;&amp;nbsp;;&lt;/span&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title=
        "Sous-menu 2"&gt;Varsovie&lt;/a&gt;&lt;span&gt;&amp;nbsp;;&lt;/span&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title=
        "Sous-menu 3"&gt;Lima&lt;/a&gt;&lt;span&gt;&amp;nbsp;;&lt;/span&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title=
        "Sous-menu 4"&gt;Nairobi&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
    &lt;p id="menu3" class="menu"&gt;
      &lt;a href="#" title=
      "Menu 3"&gt;Personnages&lt;span&gt;&amp;nbsp;:&lt;/span&gt;&lt;/a&gt;
    &lt;/p&gt;
    &lt;ul id="ssmenu3" class="ssmenu"&gt;
      &lt;li&gt;
        &lt;a href="#" title=
        "Sous-menu 1"&gt;Gandhi&lt;/a&gt;&lt;span&gt;&amp;nbsp;;&lt;/span&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title=
          "Sous-menu 2"&gt;César&lt;/a&gt;&lt;span&gt;&amp;nbsp;;&lt;/span&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title="Sous-menu 3"&gt;Gengis
        Khan&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
    &lt;p id="copy"&gt;
      &amp;copy;Blablablabla
    &lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;
      </pre>
    <h4>Explications</h4>
    <p>Peu de changement, si ce n'est l'ajout du lien vers la feuille de style dans le head et des spans dans les menus pour pouvoir cacher la ponctuation.</p>
    <h4>Code <acronym>CSS</acronym>
    </h4>
    <pre>
body {
  background-color:#FFF;
  color:#333;
  font-family:Verdana, Geneva, Arial,
    Helvetica, sans-serif;
  margin:0;
  padding:0;
}

hr {
  display:none;
}

.menu, .ssmenu {
  background-color:#FFF;
  color:#333;
  border:0.1em solid #333;
  margin:1em;
}

.menu span, .ssmenu span {
  display:none;
}

.menu a, .ssmenu a {
  text-decoration:none;
  color:#333;
}

.menu {
  padding:0 1em;
}

.ssmenu {
  padding:0;
}

.ssmenu li {
  list-style-type:disc;
  list-style-position:inside;
  padding-left:0.2em;
  color:#F93;
}

.ssmenu li:hover, .ssmenu a:hover,
  .ssmenu a:focus  {
  background-color:#F93;
  color:#FFF;
}

.ssmenu li:hover {
  list-style-type:circle;
}

#access a, #texte a {
  color:#F93;
}

#access a:hover, #texte a:hover {
  text-decoration:none;
}

#access a:focus, #texte a:focus {
  text-decoration:none;
  background-color:#F93;
  color:#FFF;
}

#access {
  margin:1em;
  padding:0;
}

#texte {
  text-align:justify;
  margin:1em;
  padding:0;
}

#texte p {
  text-indent:1em;
}

#copy {
  padding:1em;
  margin:0;
  text-align:center;
}
      </pre>
    <h4>Explications</h4>
    <p>Nous réglons tout d'abord les paramètres globaux de la page. Ensuite, nous traitons la partie accessibilité et nous cachons la barre de séparation et la ponctuation dans le menu. Nous mettons en forme les menus et sous-menus ainsi que les liens qu'ils contiennent. Enfin nous traitons le texte et le bas de page.</p>
    <p>Le point sensible concerne les <code>:hover</code>. En effet, le survol des éléments d'une liste n'étant pas toujours bien compris par les navigateurs, on ajoute un survol des liens. De même la partie <code>:focus</code> concerne les personnes qui ne peuvent utiliser une souris et naviguent au clavier. Généralement, la touche <kbd>Tab</kbd> permet de sauter de lien en lien, ce que vous pouvez essayer sur votre navigateur.</p>
    <p>Vous pouvez <a href="annexes/etape2.htm">tester</a> cette étape.</p>
    <h3>Interactivité</h3>
    <p>Bon c'est bien beau mais où il est le menu dynamique, hum ? Et bien on y arrive.</p>
    <h4>Le code <acronym>HTML</acronym>
    </h4>
    <pre>
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd"&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;
      Test de menu
    &lt;/title&gt;
    &lt;meta http-equiv="Content-Type" content=
      "text/html; charset=iso-8859-1"&gt;
    &lt;link rel="stylesheet" type="text/css" href=
      "menu.css" title="défaut"&gt;
    &lt;script type="text/javascript" src="menu.js"&gt;
    &lt;/script&gt;
  &lt;/head&gt;
  &lt;body lang="fr" onload="Chargement();"&gt;
    &lt;p id="access" onmouseover="CacherMenus();"&gt;
      [&lt;a href="#" accesskey="0"
        onfocus="CacherMenus();"&gt;Politique
        d'accessibilité&lt;/a&gt;]
      [&lt;a href="#texte" accesskey="1"
        onfocus="CacherMenus();" &gt;Aller
        au contenu&lt;/a&gt;]
      [&lt;a href="#menu1" accesskey="2"
        onfocus="CacherMenus();"&gt;Aller
        au menu&lt;/a&gt;]
    &lt;/p&gt;
    &lt;div id="texte" onmouseover="CacherMenus();"&gt;
      &lt;p&gt;
        Scrahascrit mohotis, rusn scratedeus en
        pronohus cremaquoranis. Phel vup, etrop
        usnuquori mu nutram demol. Stobaquadore
        ilirher, hisch themipam ol asnuplue thoticrat.
        Spem ahospum quiduhiquiduer, la scat satidam
        aspadront. Rhasadit in amuv omebras. Ecepore
        alaps sni taspes itocont. Ubriplue pribinatis,
        iquiduh orem ipu rimalius quidematanis. Arinam
        in cespus cinilas. Crequad ofopriem, quadop
        molines dad rasalon ilaspant. Igopr brugipam
        va gidosmam vobarotis. Smoquad thegecr al
        aniquidem cunitrant. Lofoti mapopr, cratr
        phiropeus cer togibit crahego.
      &lt;/p&gt;
      &lt;p&gt;
        Apher est. Cedinam cop uco sischa quoru
        psilascham est. Dipsam in rhigustam
        quorabanatis. Phenebron in spomamus
        stemeprotis. Anusch initiem pu tescha
        thehescranis. Ohiph plisch bolotam lu ecananis
        hut thehaquoratis. Quorav scem mesciem me
        cepemer pi aspitront. Ephaquad quorol ev
        psivaspem vehant. Usmispeus, ocimus men
        rilecit naphanis. Rutrue som bal mepres tof
        iproplem est. Smin scridupeus lovorher, na
        esiquad rulam itrisner. Quadisch udepli
        upraplant, rac muph truvibeus baranis.
      &lt;/p&gt;
    &lt;/div&gt;
    &lt;hr&gt;
    &lt;p id="menu1" class="menu"&gt;
      &lt;a href="#" title="Menu 1" onmouseover=
        "MontrerMenu('ssmenu1');" onfocus=
        "MontrerMenu('ssmenu1');"&gt;Animaux&lt;span&gt;&amp;nbsp;:&lt;/span&gt;&lt;/a&gt;
    &lt;/p&gt;
    &lt;ul id="ssmenu1" class="ssmenu"&gt;
      &lt;li&gt;
        &lt;a href="#" title=
          "Sous-menu 1"&gt;Girafe&lt;/a&gt;&lt;span&gt;&amp;nbsp;;&lt;/span&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title=
          "Sous-menu 2"&gt;Pingouin&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
    &lt;p id="menu2" class="menu"&gt;
      &lt;a href="#" title="Menu 2" onmouseover=
        "MontrerMenu('ssmenu2');" onfocus=
        "MontrerMenu('ssmenu2');"&gt;Villes&lt;span&gt;&amp;nbsp;:&lt;/span&gt;&lt;/a&gt;
    &lt;/p&gt;
    &lt;ul id="ssmenu2" class="ssmenu"&gt;
      &lt;li&gt;
        &lt;a href="#" title=
          "Sous-menu 1"&gt;Lisbonne&lt;/a&gt;&lt;span&gt;&amp;nbsp;;&lt;/span&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title=
          "Sous-menu 2"&gt;Varsovie&lt;/a&gt;&lt;span&gt;&amp;nbsp;;&lt;/span&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title=
          "Sous-menu 3"&gt;Lima&lt;/a&gt;&lt;span&gt;&amp;nbsp;;&lt;/span&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title=
          "Sous-menu 4"&gt;Nairobi&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
    &lt;p id="menu3" class="menu"&gt;
      &lt;a href="#" title="Menu 3" onmouseover=
        "MontrerMenu('ssmenu3');" onfocus=
        "MontrerMenu('ssmenu3');"&gt;Personnages&lt;span&gt;&amp;nbsp;:&lt;/span&gt;&lt;/a&gt;
    &lt;/p&gt;
    &lt;ul id="ssmenu3" class="ssmenu"&gt;
      &lt;li&gt;
        &lt;a href="#" title=
          "Sous-menu 1"&gt;Gandhi&lt;/a&gt;&lt;span&gt;&amp;nbsp;;&lt;/span&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title="Sous-menu 2"&gt;César&lt;/a&gt;
          &lt;span&gt;&amp;nbsp;;&lt;/span&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;a href="#" title="Sous-menu 3"&gt;Gengis
          Khan&lt;/a&gt;&lt;span&gt;.&lt;/span&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
    &lt;p id="copy"&gt;
      &amp;copy;Blablablabla
    &lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;
      </pre>
    <p>Les seuls changements sont l'ajout de l'appel du script dans le head et le mise en place des événements <code>onload</code>, <code>onmouseover</code> et <code>onfocus</code>. Ce dernier sert là encore à intercepter les déplacements sur un lien effectués à l'aide du clavier et non de la souris.</p>
    <h4>Le code JavaScript</h4>
    <pre>
var blnOk=true;

function Chargement() {

  if(document.body.style.backgroundColor!="") { blnOk=false; }
  if(document.body.style.color!="") { blnOk=false; }
  if(document.body.style.marginTop!="") { blnOk=false; }
  if(document.getElementById) {
    with(document.getElementById("texte").style) {
      if(position!="") { blnOk=false; }
      if(top!="") { blnOk=false; }
      if(left!="") { blnOk=false; }
      if(width!="") { blnOk=false; }
      if(height!="") { blnOk=false; }
      if(zIndex!="") { blnOk=false; }
      if(margin!="") { blnOk=false; }
      if(padding!="") { blnOk=false; }
      if(visibility!="") { blnOk=false; }
    }
  }
  else{
  blnOk=false;
  }

  if(blnOk) {
    with(document.body.style) {
      backgroundColor="#333";
      color="#FFF";
      marginTop="5.2em";
    }
      
    with(document.getElementById("access").style) {
      position="absolute";
      top="1em";
      left="1em";
      margin="0";
    }
      
    with(document.getElementById("texte").style) {
      margin="0";
      padding="1em";
      backgroundColor="#FFF";
      color="#333";
    }
    
    for(i=1;i&lt;=3;i++) {
      with(document.getElementById("menu"+i).style) {
        position="absolute";
        top="3em";
        left=(((i-1)*11)+1)+"em";
        width="10em";
        height="1.2em";
        textAlign="center";
        margin="0";
        padding="0";
        zIndex="2";
      }
    }
    
    for(i=1;i&lt;=3;i++) {
      with(document.getElementById("ssmenu"+i).style) {
        position="absolute";
        top="4.4em";
        left=(((i-1)*11)+1)+"em";
        width="12em";
        margin="0";
        padding="0";
        zIndex="3";
      }
    }
    
    with(document.getElementById("copy").style) {
      backgroundColor="#333";
      color="#FFF";
    }
    
    CacherMenus();
  }
}

function MontrerMenu(strMenu) {
  if(blnOk) {
    CacherMenus();  
    document.getElementById(strMenu).style.visibility="visible";
  }
}

function CacherMenus() {
  if(blnOk) {
    for(i=1;i&lt;=3;i++) {
      with(document.getElementById("ssmenu"+i).style) {
        visibility="hidden";
      }
    }
  }
}
      </pre>
    <h4>Explications</h4>
    <p>Voilà enfin la partie tant attendue. Nous avons 3 fonctions :</p>
    <ul>
      <li>Chargement qui est appelée au chargement de la page grâce au <code>onload</code> sur le body ;</li>
      <li>MontrerMenu qui affiche le menu dont le nom lui est passé en argument ;</li>
      <li>CacherMenus qui cache les menus.</li>
    </ul>
    <p>La première fonction met en place les éléments. On vérifie d'abord que le <strong>navigateur supporte les fonctions qui vont être utilisées</strong>. L'instruction <code>with</code> évite d'avoir à répéter le début des instructions. Si le navigateur passe les tests, on éloigne le texte du haut de l'écran afin de laisser la place pour le menu et de faire apparaître la couleur de fond de la page avec <code>marginTop</code>. Ensuite, on place la partie accessibilité et on met en forme le texte.</p>
    <p>A ce stade, vous vous demandez peut-être pourquoi on utilise <code>em</code> comme unité. C'est simple : en faisant ainsi, <strong>on tient compte de la taille de la police choisie par l'internaute et notre page supportera un agrandissement harmonieux</strong>, la rendant ainsi accessible aux mal-voyants. Vous pouvez essayer de modifier la taille de votre police sur l'exemple. Elle se trouve généralement dans le menu affichage de votre navigateur.</p>
    <p>La commande suivante mérite quelques explications. On utilise une boucle <code>for</code> afin de traiter les différents menus. C'est à cet endroit qu'il faudra changer le 3 suivant le nombre de menus que vous mettrez en place. Le petit calcul effectué nécessite aussi des éclaircissements. Le but est de positionner les menus tous les 11em, soit en laissant 1em entre chaque, puisqu'il en mesure 10. Le dernier 1 correspond au décalage par rapport au bord gauche. Nous procédons de la même manière pour les sous-menus. Notez au passage qu'ils mesurent 12em… de façon arbitraire.</p>
    <p>Nous finissons en changeant les couleurs du bas de page et en cachant les sous-menus. Les deux autres fonctions vont respectivement montrer un sous-menu après avoir cacher les autres et tous les cacher.</p>
    <p>Vous pouvez <a href="annexes/etape3.htm">tester</a> cette étape.</p>
    <h3>Oui mais…</h3>
    <p>Après avoir adapté ce menu à votre cas, vous vous rendez compte que si vous ajoutez une cinquième rubrique, par exemple, la page déborde en 640 par 480. Ah, si le menu était à la verticale… Très simple : il suffit de décaler le texte vers la droite et non plus vers le haut et de repositionner les éléments. <strong>Quelques lignes à changer dans le fichier menu.js et tout votre site change d'aspect</strong>.</p>
    <pre>
if(blnOk) {
    with(document.body.style) {
      backgroundColor="#333";
      color="#FFF";
      marginLeft="12.2em";
    }
    
    with(document.getElementById("access").style) {
      position="absolute";
      top="8em";
      left="1em";
      width="10em";
      margin="0";
    }
    
    with(document.getElementById("texte").style) {
      margin="0";
      padding="1em";
      backgroundColor="#FFF";
      color="#333";
    }
    
    for(i=1;i&lt;=3;i++) {
      with(document.getElementById("menu"+i).style) {
        position="absolute";
        top=(((i-1)*2)+1)+"em";
        left="1em";
        width="10em";
        height="1.2em";
        textAlign="center";
        margin="0";
        padding="0";
        zIndex="2";
      }
    }
    
    for(i=1;i&lt;=3;i++) {
      with(document.getElementById("ssmenu"+i).style) {
        position="absolute";
        top=(((i-1)*2)+1)+"em";
        left="11.2em";
        width="12em";
        margin="0";
        padding="0";
        zIndex="3";
      }
    }
    
    with(document.getElementById("copy").style) {
      backgroundColor="#333";
      color="#FFF";
    }
    
    CacherMenus();
  }
    </pre>
    <p>Vous pouvez <a href="annexes/variante.htm">tester</a> cette variante.</p>
    <h3>Conclusion</h3>
    <p>Nous venons de poser les bases d'<strong>un menu qui marche dans pratiquement tous les cas de figure</strong>. Pour information, il a été testé sur <acronym title="MicroSoft Internet Explorer" lang="en">MSIE</acronym>, les navigateurs basés sur Gecko (Mozilla, Netscape, Camino), Opera, les navigateurs basés sur KHTML (Konqueror, Safari) ainsi que sur des navigateurs texte ou adaptés aux handicapés. Et ceci sur Windows, Macintosh et Linux lorsqu'ils étaient disponibles.</p>
    <p>Nous avons vu aussi qu'il était <strong>très simple d'adapter ce menu ou de le faire évoluer</strong>. Tout ceci est dû à une <strong>forte séparation</strong> entre les différentes composantes : le contenu, son rendu et son interactivité. L'emploi d'une <acronym>CSS</acronym> et d'un <acronym title="JavaScript" lang="en">JS</acronym> externes prouve ici toute leur <strong>souplesse</strong> et leur <strong>réutilisabilité</strong>.</p>
    <p>Voici les divers éléments de cet article :</p>
    <ul>
      <li>le <a href="annexes/etape1.htm">
          <acronym>HTML</acronym>
        </a> de l'étape 1 ;</li>
      <li>le <a href="annexes/etape2.htm">
          <acronym>HTML</acronym>
        </a> de l'étape 2 ;</li>
      <li>le <a href="annexes/etape3.htm">
          <acronym>HTML</acronym>
        </a> de l'étape 3 ;</li>
      <li>la <a href="annexes/menu.css">
          <acronym>CSS</acronym>
        </a> ;</li>
      <li>le <a href="annexes/menu.js">
          <acronym>JS</acronym>
        </a> ;</li>
      <li>le <a href="annexes/menu2.js">
          <acronym>JS</acronym>
        </a> de la variante.</li>
    </ul>
    <p>Pour utiliser la variante, il faut soit changer l'appel du script dans le <code>head</code> en menu2.js, soit renommer ce fichier en menu.js.</p>
    <div>
      <strong>Note : —</strong>
      <p>Cet article a servi de base à de nombreux travaux dérivés. Deux d'entre eux ont particulièrement retenu mon attention et vous permettront d'aller plus loin dans la conception de menus dynamiques :</p>
      <ul>
        <li>
          <a href="http://www.r-wils.com/perso/scripts/menu-dynamique.html">www.r-wils.com/perso/scripts/menu-dynamique.html</a> ;</li>
        <li>
          <a href="http://iubito.free.fr/prog/menu.php">iubito.free.fr/prog/menu.php</a>.</li>
      </ul>
    </div>
  </body>
</html>
