Bonjour à tous,

J'ai découvert ce site ce matin ainsi que ce tutoriel : "Créer un menu déroulant “accordéon” avec jQuery".
Il est super bien fait, mais je n'arrive pas à créer un "sous menu déroulant" au "sous menu"...
Bref un menu déroulant avec au moins 3 niveaux...

Si l'un de vous savais me donner un pti coup de pouce, ce serait génial.

Merci Smiley cligne
Modifié par SegmaMic (18 Feb 2010 - 12:26)
Heuu oui d'accord (je pensais que ce n'était pas nécessaire).
Pour reprendre le code du Tutoriel.




<ul class="navigation"> 
    <li><a href="#" title="Aller à la page 1">Item 1</a></li> 
 
    <li class="toggleSubMenu"><span>Item 2</span> 
        <ul class="subMenu"> 
            <li><a href="#" title="Aller à la page 2.1">Item 2.1</a></li> 
 
            <li><a href="#" title="Aller à la page 2.2">Item 2.2</a></li> 
            <li><a href="#" title="Aller à la page 2.3">Item 2.3</a></li> 
 
        </ul> 
    </li> 
    <li class="toggleSubMenu"><span>Item 3</span> 
        <ul class="subMenu"> 
 
            <li><a href="#" title="Aller à la page 3.1">Item 3.1</a></li> 
            <li><a href="#" title="Aller à la page 3.2">Item 3.2</a></li> 
 
        </ul> 
    </li> 
    <li><a href="#" title="Aller à la page 4">Item 4</a></li> 
 
</ul>




Voici quand même le JavaScript From the tuto



<script type="text/javascript" src="jquery-1.2.1.js"></script> 
 
<script type="text/javascript"> 
<!-- 
$(document).ready( function () { 
    // On cache les sous-menus : 
    $(".navigation ul.subMenu").hide(); 
    // On sélectionne tous les items de liste portant la classe "toggleSubMenu" 
 
    // et on remplace l'élément span qu'ils contiennent par un lien : 
    $(".navigation li.toggleSubMenu span").each( function () { 
        // On stocke le contenu du span : 
        var TexteSpan = $(this).text(); 
        $(this).replaceWith('<a href="" title="Afficher le sous-menu">' + TexteSpan + '<\/a>') ; 
    } ) ; 
 
    // On modifie l'évènement "click" sur les liens dans les items de liste 
    // qui portent la classe "toggleSubMenu" : 
    $(".navigation li.toggleSubMenu > a").click( function () { 
        // Si le sous-menu était déjà ouvert, on le referme : 
        if ($(this).next("ul.subMenu:visible").length != 0) { 
            $(this).next("ul.subMenu").slideUp("normal"); 
        } 
        // Si le sous-menu est caché, on ferme les autres et on l'affiche : 
        else { 
            $(".navigation ul.subMenu").slideUp("normal"); 
            $(this).next("ul.subMenu").slideDown("normal"); 
        } 
        // On empêche le navigateur de suivre le lien : 
        return false; 
    });     
 
 
} ) ; 
// --> 
</script>    



Et la CSS Also from the tuto




.navigation { 
      margin: 0; 
      padding: 0; 
      list-style: none; 
      background: #000; 
      color: #fff; 
      width: 200px; 
      font: 1.2em "Trebuchet MS", sans-serif; 
      } 
   .navigation a, .navigation span { 
      display: block; 
      padding: 4px 10px; 
      color: #fff; 
      text-decoration: none; 
      background: #000 url(menu-item.png) left bottom no-repeat; 
      } 
   .navigation .toggleSubMenu a, .navigation .toggleSubMenu span { 
      background-image: url(menu-item-deroule.png); 
      } 
   .navigation .open a, .navigation .open span { 
      background-image: url(menu-item-enroule.png); 
      } 
   .navigation a:hover, .navigation a:focus, .navigation a:active { 
      text-decoration: underline; 
      } 
   .navigation .subMenu { 
      font-size: .8em; 
      background: #ccc url(subMenu.png) 0 0 repeat-x; 
      font-size: .9em; 
      margin: 0; 
      padding: 0; 
      border-bottom: 1px solid #666; 
      } 
   .navigation ul.subMenu a { 
      background: none; 
      padding: 3px 20px; 
      }




Voilà je voudrait simplement rajouter un item 2.1.1, 2.1.2, etc puis 2.1.1.1, 2.1.1.2, etc etc
Qui s'ouvrirait également en "accordéon" si on clique sur le parent.
J'ai eu le même problème, je l'ai résolu en ajoutant un subMenu2 et un toggleSubmenu2, voici mon code :


<!--
    $(document).ready( function () {
        // On cache les sous-menus
        // sauf celui qui porte la classe "open_at_load" :
        $("ul.subMenu:not('.open_at_load')").hide();
        // On selectionne tous les items de liste portant la classe "toggleSubMenu"
    
        // et on remplace l'element span qu'ils contiennent par un lien :
        $("li.toggleSubMenu span").each( function () {
            // On stocke le contenu du span :
            var TexteSpan = $(this).text();
            $(this).replaceWith('<a href="" title="Afficher le sous-menu">' + TexteSpan + '</a>') ;
        } ) ;
		
		
		// pareil avec submenu2
        $("ul.subMenu2:not('.open_at_load2')").hide();
        $("li.toggleSubMenu2 span").each( function () {
            var TexteSpan = $(this).text();
            $(this).replaceWith('<a href="" title="Afficher le sous-menu">' + TexteSpan + '</a>') ;
        } ) ;
    
        // On modifie l'evenement "click" sur les liens dans les items de liste
        // qui portent la classe "toggleSubMenu" :
        $("li.toggleSubMenu > a").click( function () {
            // Si le sous-menu etait deja ouvert, on le referme :
            if ($(this).next("ul.subMenu:visible").length != 0) {
                $(this).next("ul.subMenu").slideUp("normal", function () { $(this).parent().removeClass("open") } );
            }
            // Si le sous-menu est cache, on ferme les autres et on l'affiche :
            else {
                $("ul.subMenu").slideUp("normal", function () { $(this).parent().removeClass("open") } );
                $(this).next("ul.subMenu").slideDown("normal", function () { $(this).parent().addClass("open") } );
            }
            // On empêche le navigateur de suivre le lien :
            return false;
        });
		
		// pareil avec "toggleSubMenu2" :
        $("li.toggleSubMenu2 > a").click( function () {
            if ($(this).next("ul.subMenu2:visible").length != 0) {
                $(this).next("ul.subMenu2").slideUp("normal", function () { $(this).parent().removeClass("open") } );
            }
            else {
                $("ul.subMenu2").slideUp("normal", function () { $(this).parent().removeClass("open") } );
                $(this).next("ul.subMenu2").slideDown("normal", function () { $(this).parent().addClass("open") } );
            }
            return false;
        });
    
    } ) ;
    // -->


Bien sûr il faut aussi les ajouter au code html et à ton css Smiley cligne
Wouaw, Nickel !! Smiley eek Smiley biggrin

Merci beaucoup lilalou !! Smiley smile

J'espère que des gens vont savoir t'aider pour ton post. Smiley ohwell
Salut,

Je n'ai pas de réponse concernant jquery, mes compétences en javascript étant très limitées.

Cependant, je tiens à te faire une remarque concernant l'ergonomie, si tu as besoin de faire un menu sur plus de 2 niveaux, c'est que tu as très certainement des choses à revoir dans la structure de ton site, et aux moyens d'accéder à l'information. Pense au confort pour les visiteurs de ton site. Smiley cligne
Il s'agit en fait d'un petit E-Shop. Les utilisateurs auront plusieurs moyen d'accéder aux articles, et notamment ce menu déroulant "assez rapide" pour guider les utilisateurs averti directement au produit qu'il cherche. Et il y aura aussi une méthode plus "conviviale" pour les utilisateurs "non avertis" Smiley cligne

Mais merci pour le conseil Mikachu, Smiley cligne

Ps : forum et site : super !! Smiley smile