Babylon Design

par Samuel Le Morvan

Chez vous aussi, utilisez un Web de qualité

Tutoriels HTML/CSS

Revigorez vos travaux d’intégration en suivant les préconisations des instances mondiales de l’Internet !

Tutoriels HTML/CSS

Faire un menu accessible en CSS

Voici un méthode simple et pratique pour créer de A à Z son menu en CSS proprement. Fini les 28 images gif servant à créer tout les effets d’un menu réactif avec des noms barbares finissant par des _04 ou _12. Ce procédé possède d’énormes avantages : il permet de concentrer la totalité de son menu dans un seul document Photoshop, évite de dupliquer 36 fois la modification d’un effet sur 12 documents, évite la surpopulation des fichiers images, procure non pas un préchargement d’image mais un chargement unique d’image, esquive les JavaScripts foireux, etc. Bref ! l’essayer c’est l’adopter !

Préparons notre menu dans Photoshop. Dessinez, créez votre menu à votre guise en prenant soin de placer votre création dans un dossier de calques spécifique.

Une fois votre menu créé, tracez les repères (Ctrl+R). Les repères verticaux se placent librement, tandis que les horizontaux doivent être obligatoirement equidistants.

Dupliquez trois fois votre dossier de calques en les renommant (personellement je les nomme suivant leur statut, :link, :visited, :hover et :active) et déplacez chacun des dossiers dans une rangée crée avec les repères.

Créez chacun de vos effets, déplacement, surbrillance, apparition d’icône, changement de police, bref tout ce qu’il vous plaît !

Une fois votre menu prêt, il faut l’intégrer !


Il suffit tout d’abord de créer un menu en XHTML simplement :

[html] <ul> <li><a href="test_01.html">Accueil</a></li> <li><a href="test_02.html">Présentation</a></li> <li><a href="test_03.html">Forum</a></li> <li><a href="test_04.html">Contact</a></li> </ul>

Puis, ajoutez des identifiants pour pouvoir agir en CSS et des <span> afin de faire disparaître visuellement les textes.

[html] <ul id="menu"> <li id="menu_accueil"><a href="test_01.html"><span>Accueil</span></a></li> <li id="menu_presentation"><a href="test_02.html"><span>Présentation</span></a></li> <li id="menu_forum"><a href="test_03.html"><span>Forum</span></a></li> <li id="menu_contact"><a href="test_04.html"><span>Contact</span></a></li> </ul>

Vous voyez donc exactement la même chose que ce que verra un internaute utilisant un navigateur qui ne prend pas en compte les CSS.

Dans le cas présent, nous souhaitons un menu horizontal. Il faut donc redéfinir quelques balises.

Premièrement, effacez les marges automatiques des éléments <ul> et <li>. Passez les <li> en élément block flottant avec une hauteur fixe.

Les liens doivent également passer en type block avec la même hauteur que les <li> afin que le lien recouvre entièrement la surface du bouton.

Personellement j’ajoute souvent des bordures aux éléments lors de la création pour me repérer plus facilement. Ici sur les <li>.

[css] ul#menu { 	margin:0; } ul#menu li { 	display:block; 	float:left; 	height:65px; 	margin:0; 	border:1px solid #F00; } ul#menu a { 	display:block; 	height:65px; }

Notre menu se forme petit à petit.

A présent il est temps d’insérer notre image.

Pour cela, il suffit d’appliquer l’image en fond à tous les liens puis defénir les largeurs exactes de tous les items du menu.

Par la même occasion, on en profite pour faire disparaître les textes grâce aux <span>.

[css] ul#menu a { 	display:block; 	height:65px; 	background:url(menu.png) 0 0 no-repeat; } ul#menu span { 	display:none; } ul#menu li#menu_accueil 	{width:135px;} ul#menu li#menu_presentation 	{width:200px;} ul#menu li#menu_forum 		{width:114px;} ul#menu li#menu_contact 	{width:133px;}

Positionnons exactement chacun des items. Dans Photoshop, mesurez l’espace à partir de la gauche de chaque item puis appliquez-la en valeur négative au positionnement du fond.

Rappel : background-position: (distance à partir de la gauche)px (distance à partir du haut)px.

[css] ul#menu li#menu_presentation a:link	{background-position:-135px 0;} ul#menu li#menu_forum a:link		{background-position:-335px 0;} ul#menu li#menu_contact a:link		{background-position:-449px 0;}

A noter : inutile de placer le premier item car le positionnement par défaut est son propre positionnement.

Hop ! chaque item est maintenant positionné !

Maintenant mettons en place la réactivité des boutons.

[css] ul#menu li#menu_accueil a:hover		{background-position:0 -65px;} ul#menu li#menu_presentation a:hover	{background-position:-135px -65px;} ul#menu li#menu_forum a:hover		{background-position:-335px -65px;} ul#menu li#menu_contact a:hover		{background-position:-449px -65px;}

Pour l’effet de survol, le positionnement à partir du haut sera toujours de 65px car on se décale d’un cran pour se situer sur la zone de l’image consacrée au :hover.

[css] ul#menu li#menu_accueil a:active	{background-position:0 -130px;} ul#menu li#menu_presentation a:active	{background-position:-135px -130px;} ul#menu li#menu_forum a:active		{background-position:-335px -130px;} ul#menu li#menu_contact a:active	{background-position:-449px -130px;}

Pour l’effet au moment du clic, le positionnement à partir du haut sera toujours de 130px (65px × 2) car on se décale de deux crans pour se situer sur la zone de l’image consacrée au :active.

[css] ul#menu li#menu_accueil a:visited	{background-position:0 -195px;} ul#menu li#menu_presentation a:visited	{background-position:-135px -195px;} ul#menu li#menu_forum a:visited		{background-position:-335px -195px;} ul#menu li#menu_contact a:visited	{background-position:-449px -195px;}

Pour l’effet au moment du clic, le positionnement à partir du haut sera toujours de 195px (65px × 3) car on se décale de trois crans pour se situer sur la zone de l’image consacrée au :visited.

Attention ! N’oubliez pas de placer vos évenements dans l’ordre : link, visited, hover puis active (moyen mnémo-technique : LoVe HAte).


Et voilà ! Votre nouveau menu top moumoute est prêt !

Le résultat est par ici


Ce que nos lecteurs en disent :

  1. an.archi

    Salut !

    Malheureusement, l’emploi de "display: none" rend le menu justement complètement inaccessible dans pas mal de cas, apparemment.
    À terme, tu aboutis même à une complète disparition du menu pour les lecteurs d’écran. :)

    Je te laisse lire deux articles de Laurent Denis à ce sujet :
    blog-and-blues.org/weblog…
    blog-and-blues.org/weblog…

    Définitivement, ce monde n’est pas parfait. ;)

  2. Shemu

    Salut an.archi ;)

    J’ai employé une méthode qui me parait la plus simple et la plus compréhensible pour le tuto… Il est sûr que ce n’est pas la meilleure méthode.

    Mais "dans le meilleur des mondes" un display ou un visibility ne serait pas pris en compte par un navigateur texte…

    Si l’on veut être sûr de réaliser ce tuto en totale accessibilité, je vous conseille effectivement comme an.archi de vous reporter à ces articles de Blog & Blues. ;-)

  3. an.archi

    (en fait, c’était surtout pour dire que le titre de ce post devrait plutôt se situer dans le domaine de la validité par rapport aux spécifications des standards que d’une réelle accessibilité, du coup.
    Aller, je cesse de faire mon empêcheur de tourner en rond pour la journée…

  4. Shemu

    Ark ! Oui c’est juste ;-)

  5. M0uTe

    salut! moi j’ai suivi le tuto et je suis arrivé à ça :
    m0ute.free.fr/index.html

    vous en pensez quoi?

  6. Shemu

    Bin c’est pas mal du tout !

  7. M0uTe

    merci :)

  8. Chmel

    Bonjour,
    il est possible de rendre ce menu accessible aux lecteurs d’écran et aux navigateurs avec images désactivées :
    en cachant les textes alternatifs par les images au lieu du "display:none".

    1 – Déplacer les textes "accueil, presentation …" dans les éléments LI et supprimer les tags span, le HTML :
    <ul id="menu">
    <li id="menu_accueil">Accueil<a href="http://www.google.fr/">&...
    <li id="menu_presentation">Présentation<a href="http://www.yahoo.fr/">&l...
    <li id="menu_forum">Forum<a href="http://www.php.net/">&lt...
    <li id="menu_contact">Contact<a href="http://www.w3.org/"><...
    </ul>
    2 – Modifier le style, de manière à ce que les éléments A supperposent les éléments LI :
    #menu a{position:relative;margin-top:-35px}

    Style à supprimer :
    ul#menu span {
    display:none;
    }
    Voilà, c’est tout. Pour tester :
    perso.wanadoo.fr/michel.d…

    Tester sans images avec IE :
    Menu/Outils/Options internet../avancé/Multimédia/Afficher les images à décocher. Cliquer sur OK et recharger la page…

  9. robby

    voici, pour ceux que cela intéresse, ma version des faits de cette technique dite de "rollover" (menu css):
    http://www.nekodesign.net/?/Webd...

  10. Wite

    je voudrais juste dire que pour faitre des menus tu peux prendre un lmogiciel qui s’apelle lab et qui est beaucoup plus facile que ca sinon trés bon tut!

  11. paco

    Au lieu de chercher des complications , autant faire des menus avec flash…je trouve ca a la limite beaucoup plus simple^^

  12. grunchy

    Finalement fallait que je me creuse un peu la tête, par contre selon les navigateurs les images ne ressortent pas de la même manière et jamais comme je veux, si vous avez un conseil je suis prenneur! merci

  13. grunchy

    Finalement c’est tu tout bon, je vous laisse découvrir : natan.kerbellec.free.fr

  14. boudouba

    salut, déjà merci pour ce tutoriel bien sympathique!
    j’ai un léger problème, c’est que lorsque que je redimentionne la fenetre de mon navigateur les boutons du menu reviennent à la ligne. J’aimerais savoir ce qu’il faut faire pour remédier a ça car cela fait bugger mon menu sous mozilla et j’ai un bouton qui revient à la ligne.
    Merci

  15. Greg-J

    "Premièrement, effacez les marges automatiques des éléments <ul> et <li>. Passez les <li> en élément block flottant avec une hauteur fixe.

    Les liens doivent également passer en type block avec la même hauteur que les <li> afin que le lien recouvre entièrement la surface du bouton."

    est-il possible d’avoir un peu plus de détails sur ce passage là… Effacer les marges automatiques,ok, mais après je suis plus :s

  16. Khalil

    Bonjour,

    Excellente façon de faire un menu, je voulais savoir quelle méthode adopter pour faire le même menu mais vertical cette fois ! pour le moment je n’ai pas trouvé je débute tout juste en CSS ;o)

  17. sebastien

    Merci pour ce tuto, j’aurai pensé galérer mais c’est bien détaillé quand on est dedans, alors merci beaucoup ;)

Les commentaires sont clos.