Le but de ce tutoriel est de réaliser un menu en utilisant au maximum les nouvelles possibilités de CSS3 afin de réduire au mieux l’utilisation d’images.
Ce tutoriel a été réalisé à partir de deux sources :
- La première, c’est le design du menu. Il provient de Tuttoaster qui le propose en téléchargement gratuitement sur son site avec 10 associations de couleurs différentes.
- La deuxième source, c’est le script du menu. Il a été réalisé par Soh Tanaka qui a fait un tutoriel sur la réalisation d’un méga menu avec jQuery.
Etape 1 : la structure HTML
Du fait de la particularité du bouton d’accueil, j’ai choisi de le placer en dehors du <ul> afin de pouvoir le styler plus facilement. Pour le reste, c’est classique. Les <li> qui ont un sous-menu possèdent une classe « liSub » afin de les différencier.
Le sous-menu est placé dans une <div> que l’on cache par défaut. La catégorisation du sous-menu a été faite de façon à pouvoir afficher beaucoup de rubriques. Il est bien sûr possible de le simplifier en supprimant des <ul>.
<div id="nav_wrapper">
<span id="menu_start"><a class="home" href="#">Home</a></span>
<ul id="topnav">
<li class="liSub">
<a href="#">
<span class="dd_wrapper">
Tutorials
<span class="dd_action"><img src="arrow.png" alt="" /></span>
</span>
</a>
<div class="sub" style="opacity: 0; display: none; width: 300px;">
<ul>
<li><a href="#">Painting</a></li>
<li><a href="#">Photo Effects</a></li>
<li><a href="#">Text Effects</a></li>
<li><a href="#">Drawing</a></li>
<li><a href="#">Illustration</a></li>
</ul>
<ul>
<li><a href="#">Interface</a></li>
<li><a href="#">Designing</a></li>
<li><a href="#">HTML & CSS</a></li>
<li><a href="#">JavaScript & AJAX</a></li>
<li><a href="#">PHP</a></li>
</ul>
</div></li>
<li class="liSub">
<a href="#">
<span class="dd_wrapper">
Resources
<span class="dd_action"><img src="arrow.png" alt="" /></span>
</span>
</a>
<div class="sub" style="opacity: 0; display: none; width: 450px;">
<div class="row">
<ul style="width: 225px;">
<li>
<h2><a href="#">Deal of the Week</a></h2>
</li>
<li><a href="#">Navigation Link - 2 Column</a></li>
<li><a href="#">Navigation Link - 2 Column</a></li>
<li><a href="#">Navigation Link - 2 Column</a></li>
<li><a href="#">Navigation Link - 2 Column</a></li>
</ul>
<ul style="width: 225px;">
<li>
<h2><a href="#">Clearance Items</a></h2>
</li>
<li><a href="#">Navigation Link - 2 Column</a></li>
<li><a href="#">Navigation Link - 2 Column</a></li>
<li><a href="#">Navigation Link - 2 Column</a></li>
<li><a href="#">Navigation Link - 2 Column</a></li>
</ul>
</div>
<div class="row" style="margin: 0pt;">
<ul>
<li>
<h2><a href="#">Deal of the Week</a></h2>
</li>
<li><a href="#">Navigation Link</a></li>
<li><a href="#">Navigation Link</a></li>
<li><a href="#">Navigation Link</a></li>
<li><a href="#">Navigation Link</a></li>
</ul>
<ul>
<li>
<h2><a href="#">Clearance Items</a></h2>
</li>
<li><a href="#">Navigation Link</a></li>
<li><a href="#">Navigation Link</a></li>
<li><a href="#">Navigation Link</a></li>
<li><a href="#">Navigation Link</a></li>
</ul>
<ul>
<li>
<h2><a href="#">Open Box Items</a></h2>
</li>
<li><a href="#">Navigation Link</a></li>
<li><a href="#">Navigation Link</a></li>
<li><a href="#">Navigation Link</a></li>
<li><a href="#">Navigation Link</a></li>
</ul>
</div>
</div></li>
<li>
<a href="#">
<span class="single_wrapper">Wordpress</span>
</a></li>
<li>
<a href="#">
<span class="single_wrapper">Community news</span>
</a></li>
<li>
<a href="#">
<span class="single_wrapper">About</span>
</a></li>
<li>
<a href="#">
<span class="single_wrapper">Archives</span>
</a></li>
<li id="last-li">
<a href="#">
<span class="single_wrapper">Contact</span>
</a></li>
</ul>
<span id="menu_end"><img src="last_li.png" alt="" width="5" height="46" /></span></div>
Etape 2 : Styler le menu en CSS
La partie la plus intéressante du tutoriel réside dans la création de la plupart des éléments graphiques du menu avec l’utilisation des propriétés CSS3 qui permettent d’éviter l’accumulation d’images.
Pour ce menu, très peu d’images sont utilisées; cela permet d’optimiser le chargement de la page. En plus de cela, j’ai opté pour l’utilisation de sprite CSS. Pour ceux qui ne savent pas ce qu’est un sprite et à quoi ça sert, voici un petit schéma explicatif qui démontre l’intérêt de grouper ses images en une seule, surtout dans le cas ou elles sont quasiment identiques.
![]()
Les 5 autres images à droite sont les seules utilisées pour réaliser ce menu.
Je vais maintenant m’attarder sur l’utilisation des propriétés CSS3 qui ont permis d’obtenir un menu identique à sa version Photoshop.
L’ombre sur le texte : propriété text-shadow

La propriété text-shadow comporte 4 paramètres : décalage horizontal, décalage vertical, flou, couleur.
Ici, j’applique une ombre sur « TUTORIALS » qui est au même niveau horizontal et vertical, de couleur noir et de flou 2px.
ul#topnav li.liSub a, ul#topnav li a {
text-shadow: 0 0 2px black;
}
Les bords arrondis : propriété border-radius

Le sous-menu ainsi que le passage de la souris sur les éléments du menu ont des bords arrondis fait grâce à la propriété border-radius.
border-radius: 7px; /* Propriété CSS3 */ -moz-border-radius: 7px; /* Propriété CSS3 pour Firefox */ -khtml-border-radius: 7px; /* Propriété CSS3 pour navigateurs KHTML */ -webkit-border-radius: 7px; /* Propriété CSS3 pour navigateurs Webkit */
L’ombre : propriété box-shadow

La div qui contient le sous-menu possède une ombre tout autour d’elle. La propriété CSS3 box-shadow permet d’obtenir cet effet qui utilise la même syntaxe que text-shadow.
Malheureusement, Internet Explorer ne supporte pas encore cette propriété dans ses versions actuelles du navigateur… Il faudra patienter jusqu’à la version 9 qui est actuellement en développement pour pouvoir utiliser toutes les propriétés CSS3.
Donc pour IE 8 et inférieur, j’ai juste utilisé un hack pour appliquer un background-color à la div.
box-shadow: 0px 0px 2px #343333; /* Propriété CSS3 */ -webkit-box-shadow: 0px 0px 2px #343333; /* Propriété CSS3 pour Firefox */ -moz-box-shadow: 0px 0px 2px #343333; /* Propriété CSS3 pour navigateurs Webkit */ background-color: #f8f8f8\9; /* Hack pour cibler IE8, IE7, IE6 */
Le dégradé : propriété background-image

Pour cet effet, le CSS a appliqué nécessite ici une syntaxe particulière en fonction des navigateurs :
filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr=#dfdfdf, endColorstr=#f8f8f8); /* Pour IE */ background-image: -moz-linear-gradient( top, #e5e5e5, #FFFFFF); /* Pour Firefox */ background-image: -webkit-gradient( linear, left top, left bottom, from(#e5e5e5), to(#FFFFFF)); /* Pour Webkit */
Pour que le dégradé fonctionne sur Internet Explorer, il faut utiliser la propriété « filter« . Là encore la syntaxe est un peu différente pour Firefox et pour les navigateurs sous Webkit.
Pour vous faciliter la tâche, voici un site bien conçu qui vous permet de générer des dégradés CSS3 de façon très intuitive et rapide. Voir le site
Etape finale : Le résultat
Au final, le CSS3 aura permis une nouvelle approche dans la création d’effets visuels sur des éléments qui auraient auparavant été automatiquement et par défaut des images.
Il est désormais possible de substituer les techniques habituelles d’intégration par les nouveautés apportées par le CSS3.
Malheureusement, ce menu ne va pas être visualisé de la même façon sur tous les navigateurs…
Il a le mérite de s’y afficher correctement, mais pour ce qui concerne Internet Explorer, voici les différences que l’on obtient :

Internet Explorer 8 et 7 ne s’en tirent pas très bien, ces deux versions du navigateurs ne possèdent pas le support complet du CSS3, mais ce n’est pas pour autant que le menu s’affiche mal, il est juste beaucoup plus carré et moins esthétique. Internet Explorer 9 va pouvoir devenir un vrai rival lorsqu’il remplacera la version 8 d’ici peu de temps on l’espère.
En ce qui concerne Opera, il est entre les deux car il ne supporte pas encore les dégradés.
Conclusion
Je pense que même si les propriétés CSS3 peuvent paraîtres encore expérimentales du fait de l’utilisation de différentes syntaxes pour chaque navigateur, il est néanmoins important de commencer à s’y intéresser.
J’espère que ce tutoriel vous aura fait découvrir les possibilités très étendues du CSS3. D’autres tutoriels suivront pour vous apprendre à maîtriser toutes ses facettes.
Pour aller plus loin :
29 commentaires
S'abonner au RSS des commentaires-
m
Bravo pour le tuto,
Petite remarque le menu ne fonctionne pas sous netscape 7 à 9.
-
Conseil en organisat
J’ai utilisé. Ca marche. Merci
-
Tiz, agence web à St
Merci pour ce tuto.
C’est vrai que ces menus sont extrêmement pratiques notamment pour tout les sites e-commerce. -
Vincent lauv
Thanks, this is great tutorials
-
EskiS
Super tuto une fois de plus merci pour tous j’adore !
Continuez comme ça je vous encourage fortement !
-
Stéphane
Oui, je t’en prie.
-
Orion
Je tiens juste aussi à te dire que j’ai bien précisé dans le widget les différentes sources qui ont contribué à ce menu.
En attente de ta confirmation -
Orion
Bravo pour ce magnifique menu qui est un exemple d’utilisation des propriétés CSS3 !
J’aurais aimé savoir si t’était d’accord que j’exporte ce menu sur la plate-forme "Adobe Widget Browser" ?Le widget est déjà prêt.
-
pyrou
Petit indice pour répondre au bug du double-click (dans la demo sur le menu Resources par exemple
dans le html de demo.. à la ligne 432, remplacer
$("ul#topnav").find("li.current").removeClass().removeAttr("class");
PAR
$("ul#topnav").find("li.current").removeClass("current");
(cela permet de garder la classe liSub sur le <li>)
-
MichaelM
Bonjour, votre menu est génial, cependant sous IE, des bugs apparaissent, lorsque j’inscris une ligne au dessus du <doctype html …>
Exemple j’ai un <?php require(‘nom.php’) ?> en premiere ligne
Le menu se trouve décalé a gauche, les backgrounds hover en blancs ne fonctionne plus et les 2 premier "li sub" sont possitionné au haut du li au lieu d’être centré, une solution ? merciBUG SOUS IE UNIQUEMENT
-
michael
J’ai trouvé une solution raisonnable :
-moz-box-shadow: #5a5a5a 4px 4px 5px;
Cela va décaler sur la droite et en bas l’ombre.
Donc plus d’ombre sur la partie haute. -
michael
Merci beaucoup pour cette indication, car effectivement j’ai eu le meme probleme au survol, avec des "div" juste sous le menu.
Solution :
passer z-index:-10; à 0pxMerci à Adri3n
-
Adri3n
Bon finalement, j’ai réussi a faire passer le contenu au premier plan en modifiant le z-index:-10; à 0… Mais

il y a un mai. l’onglet apparait quand on pointe le bouton juste au dessus, ça c’est ok, mais maintenant le bouton en lui meme est en dessous de l’onglet et l’ombre de l’onglet apparait au dessus du bouton… on a plus la continuité de blanc bouton/onglet…
petite capture http://yfrog.com/2dcapturexpp
sinon comment faire pour que la largeur totale de la barre face 975px ?
Merci d’avance pour vos rep

-
Adri3n
dernier souci,
quand je clique sur le menu tutorials ou ressource, les onglets s’ouvrent sous mes autres div!comment faire ?
merci
-
Adri3n
Oups j’ai aussi un souci, j’ai du text en dessous le menu et il remonte sur le coté droit a droite de contact…
j’ai pourtant mis clear:left comme le tuto mais ca ne marche pas.
-
Adri3n
Salut.
Super menu

j’ai cependant une question, comment faire si je souhaire que mon menu fasse 980px de large ?
Merci a bientot
-
Mario
Bonjour,
Et tout d’abord merci pour ce très bon tutoriel !
Ce menu va a ravir sur mon wordpress …
J’ai juste un problème encore ce fichu IE7 qui fait des siennes grrrr
Plus que des mots je vous laisse 2 images vous allez comprendre :
Menu OK sur chrome, Firefox, IE8 etc … : http://img405.imageshack.us/img405/8963/menuok.jpgMenu pas OK du tout sous IE7 : http://img249.imageshack.us/img249/6521/ie7p.jpg (l’onglet Nous contacter ce retrouve en bas à gauche)
(Site en question sur mon pseudo)
Seriez vous d’ou ça pourrais venir ?
Pourriez vous m’aider à résoudre ce problème ?D’avance merci.
-
Olivier
[citation][de]Réponse à Trib:[/de]
J’ai voulu faire évolué le design en dessous du menu, histoire de voir se que cela pourrais donner.
Mais mon soucis sais que dès que je développe un menu il me l’affiche incruster dans les cellules du dessous, il me les affiches mais je peux pas aller dessus avec ma souris.
[/citation]J’ai peut-être la solution à ton problème essaies, dans ton css du menu de mettre ou changer la valeur z-index et passe la à 100 pour ul#topnav li .sub.
@+
-
Olivier
Super tuto, pleins de ressources.
-
Ken
il me semble qu’en laissant la feuille de style dans le src.html au lieu de l’importer
la resolution, la typo, et le submenusubover fonctionne. -
FireSKT
J’ai finalement trouvé, la propriété z-index à mettre en positif. Merci de la réponse rapide Stéphane !
Pour la compréhension, la fenêtre du subMenu disparaissait quand je dirigeais ma souris dessus et plus précisément lors du passage de la barre menu au subMenu.J’espère avoir été clair

Cordialement
-
Stephane
Si j’ai bien compris, c’est lorsque tu clique un lien dans le sous-menu que ensuite tu n’aperçois plus le hover ?
Si c’est ça, c’est normal, car normalement, lors du clique, tu es censé être redirigé vers une autre page.
-
FireSKT
Très belle réussite ce tuto !
Néanmoins j’ai un petit soucis. Il semble que le hover ne marche plus quand je dirige ma souris sur le subMenu.
Concrètement : Je pointe sur "TUTORIALS" et au moment ou je déplace ma souris sur le subMenu pour sélectionner quelque chose sa ne marche pas.PS : Je ne suis, à priori, pas le seul. Auriez-vous une (des) solution(s) ?
Merci d’avance.
-
aurel
Excellent tuto, merci !!
Sous Opera, dernière version, je vois le dégradé dans la démo. peut-être ajuster corriger le tuto
-
Ghost
salut trib j’ai une solution partielle a ton problème joue avec les Z-index de ton css pour faire passer ton menu par dessus tes cellules. Le problème c’est que le menu n’est plus totalement incruster dans le design …
je recherche une solution actuellement mais c’est c’est pas évident.
bon courage pour la suite
ps: excellent tutoriel merci snoupix.
-
Trib
[citation][de]Réponse à Trib:[/de]Salut déjà super tuto merci de le faire partager !
J’ai juste un petit soucis et j’arrive pas à mettre la main sur la solutionJ’ai voulu faire évolué le design en dessous du menu, histoire de voir se que cela pourrais donner.
Mais mon soucis sais que dès que je développe un menu il me l’affiche incruster dans les cellules du dessous, il me les affiches mais je peux pas aller dessus avec ma souris.
Si je vire tout se qu’il y a en dessous du menu sa marche. Donc c pas une erreur sur le code du menu lui même.
Je pense que je dois rajoute ou une fonction au javascript ou modifie mon css.
Mais la je suis perdu
As tu une idée par hasard stp ?Si ta besoin de plus d’info hésite pas![/citation]
Voici mes 2 bouts de code que je rajoute
<div id="apDiv1">Contenu</div>
Juste avant la fermeture de la div conteneuret mon css
#apDiv1 {
display:block;
position:absolute;
left:230px;
top:220px;
width:960px;height:390px;
}J’ai beau essaye dans tout les sens il m’affiche tjrs le mot contenu incruste dans le 1er menu…
Si quelqu’un à la solution merci d’avance -
Medic
J’adore vos tutoriels, c’est juste excellent… Big Merci ^^
-
Trib
Salut déjà super tuto merci de le faire partager !
J’ai juste un petit soucis et j’arrive pas à mettre la main sur la solutionJ’ai voulu faire évolué le design en dessous du menu, histoire de voir se que cela pourrais donner.
Mais mon soucis sais que dès que je développe un menu il me l’affiche incruster dans les cellules du dessous, il me les affiches mais je peux pas aller dessus avec ma souris.
Si je vire tout se qu’il y a en dessous du menu sa marche. Donc c pas une erreur sur le code du menu lui même.
Je pense que je dois rajoute ou une fonction au javascript ou modifie mon css.
Mais la je suis perdu
As tu une idée par hasard stp ?
Si ta besoin de plus d’info hésite pas! -
Léo
Le temps où l’on pourra utiliser les dernières technos sans se soucier des compatibilités est loin d’être arrivé (encore merci à Microsoft) mais c’est déjà une grande avancée.





