SPIP - Contrib

[ar] [en] [es] [fr] [it]



Accueil du site > Navigation > Menus déroulants

Menu en cascade automatique (tout CSS + javascript pour IE)

mercredi 23 février 2005, par Miss Mopi. Dernier ajout mardi 19 février 2008


Un menu déroulant en cascade simple basé sur des CSS avec un petit script javascript supplémentaire pour IE. Sa structure en fait le menu idéal par boucles récursives.


Introduction

Le menu présenté se révèle être d’une simplicité de mise en oeuvre une fois qu’on a compris son fonctionnement. Il est basé sur les CSS (plus un script pour permettre à IE de se comporter presque comme les autres navigateurs).

Quelques mots sur le fonctionnement

Le menu fonctionne grâce aux listes imbriquées :

<ul>
 <li>Niveau 1
   <ul>
     <li>Niveau 1.1</li>
     <li>Niveau 1.2
       <ul>
         <li>Niveau 1.2.1</li>
         <li>Niveau 1.2.2</li>
       </ul>
     </li>
     <li>Niveau 1.3
       <ul>
         <li>Niveau 1.3.1</li>
       </ul>
     </li>
   </ul>
 </li>
 <li>Niveau 2
   <ul>
     <li>Niveau 2.1</li>
     <li>Niveau 2.2</li>
     <li>Niveau 2.3
       <ul>
         <li>Niveau 2.3.1</li>
         <li>Niveau 2.3.2</li>
       </ul>
     </li>
   </ul>
 </li>
</ul>

Ce qui donne sans mise en forme particulière :

  • Niveau 1
    • Niveau 1.1
    • Niveau 1.2
      • Niveau 1.2.1
      • Niveau 1.2.2
    • Niveau 1.3
      • Niveau 1.3.1
  • Niveau 2
    • Niveau 2.1
    • Niveau 2.2
    • Niveau 2.3
      • Niveau 2.3.1
      • Niveau 2.3.2

Chaque niveau de liste sera un niveau du menu déroulant.

Préparation des pages du squelette :

Vous trouverez en bas de cet article le javascript à intégrer dans les pages. Personnellement je dépose le fichier dans un dossier "script" et je l’inclus avec le code suivant :

Il faut également ajouter ce code au niveau du body pour que le menu fonctionne sous IE :

menulist est à remplacer éventuellement par le nom de l’id que vous voulez utiliser.

Les boucles

Boucle de base

Voici la boucle "basique" permettant de générer le menu de tout le site :

Il suffit de nommer (id="menulist") et ensuite de styler la liste.

Les styles en provenance de l’exemple de Jep :

Exemple ici

Boucle détectant la présence de sous-menus

On va ajouter ici des éléments qui permettent d’identifier visuellement les rubriques en contenant d’autres en les mettant en italique et en ajoutant ">>>" derrière l’intitulé. Les styles en exemple derrière sont plus travaillés que l’exemple précédent et les boucles SPIP également (ajout de tri, suppression des numéros de titres, ...).

La boucle RUBRIQUES couplée à id_parent avec une restriction de 1 permet de détecter des sous-rubriques et ici d’appliquer un style particulier à la ligne (class="smenu") et d’ajouter ">>>" dans l’intitulé du menu.

Des styles mettant un peu plus le menu en valeur et exploitant la détection de sous-menus :

L’exemple situé ici est inspiré de ceci, mais il est plus joli et fonctionne uniquement sur les styles (pas d’ajout de ">>>"). La mise en forme ne se voit bien que sous des navigateurs récents (bien qu’il fonctionne sous IE sans avoir toutes ses subtilités visuelles). Sous les autres navigateurs, une flèche tourne lorsqu’on survole les éléments du menu.

J’ai préféré indiquer ci-dessus un exemple fonctionnant de manière vraiment similaire sous IE et les autres navigateurs.

Je trouve que dans cet exemple, l’utilisation de ce menu prend toute son ampleur.

Menu du secteur, menu de la rubrique courante, etc.

Il est très simple d’implémenter ce menu en exploitant le contexte de la page et en n’affichant que le secteur ou la rubrique courante. Il suffit de faire une boucle affichant le secteur courant ou la rubrique courante sous forme de liste.

Les exemples donnés ci-dessous correspondent à des boucles basiques sans tri et avec les styles basiques donnés au premier exemple.

Exemple de la rubrique courante

Exemple du secteur courant fonctionnant aussi bien dans une page affichant secteur, rubrique, article, breve, ...

Ce code peut être externalisé dans un fichier qu’on inclut en passant id_rubrique.

Il est possible d’inclure les articles aussi, les brèves, etc... Tout dépend après de vos envies.

Les fichiers à télécharger

Le fichier javascript :

Zip - 398 octets
Javascript du menu déroulant

Un ensemble de fichiers prêts à l’emploi qu’il suffit d’inclure dans les squelettes par la commande <INCLURE(spip-ex-md-menu.php3)> (ou un autre nom si vous renommez les fichiers) :

  • Un couple php3/html de type spip [1]
  • Un fichier css soit à inclure dans l’entête de vos squelettes, soit à copier/coller dans votre propre CSS.
  • Ne pas oublier le javascript et le code à préciser au niveau du body.
  • Il est présenté ici
Zip - 1.1 ko
Un exemple prêt à l’emploi

A noter que cet exemple supprime les numéros et trie par numéro.

Notes

[1] note admins : à adapter pour SPIP v1.9 et suite - plus de fichier php3


Répondre à cet article

  • Hi, je suis en train d’utiliser le menu css + javascript et ca ne fonctionne pas. J’ai l’impression que les boucles sont mal faites car Spip 1.9.2b me met des messages de bugs du genre :

    Spip 1.9.2b debug Beicip Inc Error(s) in template

    Incorrect loop (BOUCLE) syntax , BOUCLE_ssmenu : double definition

    Incorrect loop (BOUCLE) syntax , BOUCLE_smenuspip : double definition

    Incorrect loop (BOUCLE) syntax , BOUCLE_menuspiprub : missing closing tag

    Incorrect loop (BOUCLE) syntax , BOUCLE_smenr : double definition

    Incorrect loop (BOUCLE) syntax , BOUCLE_smen : double definition

    voila j’ai essaye toute les exemple de cet contrib et uniquement un seul marche. ce que je souhaiterai c’est un menu vertical deroulant contextuel qui affiche uniquement la rubrique courante(selectionnee avant dans un menu horizontal) et ses sous rubriques et facile a manipuler.. please I need your help.

    Thanks in advance a french-american desesperate IT

    Répondre à ce message

    • Hi again,

      je viens de trouver la solution au menu deroulant pour lequel on passe l’identifiant de la rubrique. en effet une erreur s’est glisse dans le code. la boucle “BOUCLE_menuspipsect /BOUCLE_menuspipsect” ne se terminait pas correctement. je pense qu’il faut bien verifier que toute les boucles SPIP sont bien ferme sinon on obtient ce genre de message d’erreur.

      a++

      A happy french american IT

      Répondre à ce message

    Retour au début des forums

  • Merci !

    13 juin 2007 15:27

    un grand merci pour cette contrib qui va me permettre de facilement animer un peu mon menu tout en le gardant simple et sobre. Il ne me reste plus qu’à adapter le css à ma sauce.

    Bravo et merci

    Répondre à ce message

    Retour au début des forums

  • Bonjour miss mopi, je suis débutant en spip html et css... mais j’ai réussi à intégrer ce menu sur spip 1.9. ma question est simple : j’aimerais en faire un menu à l’horizontale. donc deux trucs : comment afficher les rubriques à la racine à l’horizontale (je pense à text-align center mais bon) ? et comment faire pour que quand la souris passe sur une rubrique cela développe le menu verticalement ? en attendant un post de ta part je cherche de mon coté mais je pense que beaucoup de débutants comme moi sont hyper intéressés car ce menu vertical est au top ! merci encore pour ton travail

    Répondre à ce message

    Retour au début des forums

  • Bonjour.
    Un grand merci pour cette contrib qui rend bien des services ! J’ai cependant un léger problème sous IE :
    tout fonctionne impec sur tout le site, mais au survol de l’une des rubriques de premier niveau (et uniquement celle-là), il me faut attendre 5 secondes avant de voir s’afficher le premier sous-niveau ! Et idem pour les sous-niveaux suivants...
    J’imagine que cela vient du fait que cette branche contient pas moins d’une cinquantaine de sous-rubriques réparties sur une arborescence allant, par endroit jusqu’à 6 sous-niveaux...
    Mais bon, je n’ai pas conçu le site. Je suis juste censé en modifier l’apparence. Auriez-vous une solution ?
    Merci d’avance.

    Répondre à ce message

    Retour au début des forums

  • Bonjour a tous !! J’ai un petit probleme avec le menu déroulant, je travaille en local avec spip 1.9 et j’ai mis en place le menu mais les sous rubrique ne s’affiche pas quand je passe sur une rubrique avec ma souris... (en fait j’ai un menu juste avec les rubriques) j’ai modifié la balise body de ma page <body class="page_sommaire" onload="setHover('menulist')">

    et voila le code que j’ai mis pour afficher le menu :

    <script type="text/javascript" src="script/menuderoulant.js"></script>
    <ul id="menulist">
            <BOUCLE_smenuspipr(RUBRIQUES){racine}{par num titre}><li><a href="#URL_RUBRIQUE">[(#TITRE|supprimer_numero)]<BOUCLE_smenr(RUBRIQUES){id_parent}{0,1}><b> >></b></BOUCLE_smenr></a>
                    <B_smenuspip><ul>
                            <BOUCLE_smenuspip(RUBRIQUES){id_parent}{par num titre}><li><a href="#URL_RUBRIQUE">[(#TITRE|supprimer_numero)]<BOUCLE_smen(RUBRIQUES){id_parent}{0,1}><b> >></b></BOUCLE_smen></a>
                                            <BOUCLE_ssmenu(boucle_smenuspip)></BOUCLE_ssmenu>
                            </li></BOUCLE_smenuspip>
                    </ul></B_smenuspip>
            </li></BOUCLE_smenuspipr>
    </ul>

    Donc si vous avez quelques idées pour me sauver ca serait génial !!!

    Merci d’avance !

    Répondre à ce message

    Retour au début des forums

  • Bonjour à tous,

    J’ai réussi à installer le menu en cascade qui marche vraiment bien (le site que je crée est sur Spip 1.9). Par contre, je veux utiliser aussi un script qui gère le positionnement du pied de page du site : http://pompage.net/pompe/pieds/

    Apparemment, y a un problème de conflit dans les scripts, quand je mets les deux, le menu ne marche plus...

    Voici le code du script de gestion du pied de page :

    function getWindowHeight() var windowHeight = 0 ; if (typeof(window.innerHeight) == ’number’) windowHeight = window.innerHeight ; else if (document.documentElement && document.documentElement.clientHeight) windowHeight = document.documentElement.clientHeight ; else if (document.body && document.body.clientHeight) windowHeight = document.body.clientHeight ; return windowHeight ;

    function setFooter() if (document.getElementById) var windowHeight = getWindowHeight() ; if (windowHeight > 0) var contentHeight = document.getElementById(’page’).offsetHeight ; var footerElement = document.getElementById(’pied’) ; var footerHeight = footerElement.offsetHeight ; if (windowHeight - (contentHeight + footerHeight) >= 0) footerElement.style.position = ’relative’ ; footerElement.style.top = (windowHeight - (contentHeight + footerHeight)) + ’px’ ; else footerElement.style.position = ’static’ ; window.onload = function() setFooter() ; window.onresize = function() setFooter() ;

    et le menu déroulant :

    function hover(obj) if(document.all) UL = obj.getElementsByTagName(’ul’) ; if(UL.length > 0) sousMenu = UL[0].style ; if(sousMenu.display == ’none’ || sousMenu.display == ’’) sousMenu.display = ’block’ ; else sousMenu.display = ’none’ ;

    function setHover(id) LI = document.getElementById(id).getElementsByTagName(’li’) ; nLI = LI.length ; for(i=0 ; i < nLI ; i++) LI[i].onmouseover = function() hover(this) ; LI[i].onmouseout = function() hover(this) ;

    Merci pour votre aide !

    Répondre à ce message

    Retour au début des forums

  • bonjour, je suis nouvel utilisateur de spip et je voudrais savoir comment rajouter l’affichage des articles dans ce menu. Apparrement ce n’est pas sorcier il doit falloir rajouter une boucle, mais la j’avoue que je ne vois pas bien comment faire, j’attend donc votre aide avec impatience... Merci.

    Répondre à ce message

    Retour au début des forums

  • Menu en cascade automatique (tout CSS + javascript pour IE)

    23 juillet 2006 16:54, par FabriceC69

    Bonjour,

    Je suis en train de chercher à mettre en oeuvre la "pseudo classe de texte" first-letter pour modifier la première lettre de chaque ligne du menu mais je galère un peu (spip et css ont moins d’un mois pour moi !!!) et pour l’instant ça marche pas.

    J’ai essayé de mettre ça dans la feuille de style :

    /* Mod lettrine*/ ul#menu li:first-letter color : green ; font-size : 200% /* Fin Mod Lettrine */

    ça marche pas peut-être parce-que : "En effet, petit oubli : first-letter ne s’applique qu’au contenu d’un élément de type block, list-item, table-cell, table-caption et inline-block... Mais pas aux éléments inline. Pour conserver l’effet de first-letter : faire flotter les éléments li plutôt que de les mettre en inline."

    Pouvez-vous me dire si le problème est bien celui-ci et s’il est possible de le résoudre.

    Merci d’avance de votre aide.

    Fabrice Cizeron

    Répondre à ce message

    Retour au début des forums

  • Doubler la commande onload="setHover()"

    16 mai 2006 09:54, par damdam

    Bonjour, Tout d’abord je trouve cette contrib super efficace, on la retrouve d’ailleurs sur beaucoup de site sous spip. et moi même je ne m’en passe plus ! Seulement voilà, sur un de mes sites, j’ai fait un menu vertical et un autre horizontal. Ca marche super bien sur firefox, sur safari, mais pas sur IE à cause du javascript qui ne marche que sur l’un ou l’autre des deux menus. au moment de charger le script je dois choisir le menu à charger ( body onload="setHover(’menu’)" ) et je voudrais ajouter menu2 par exemple. j’ai essayer de les mettre dans la même balise séparée par une virgule mais dans ce cas il n’y en a toujours qu’un seul qui charge, et c’est le premier qui apparaît dans la syntaxe.

    Je pense qu’il doit y avoir une solution à ce problème, mais je dois surement pas chercher au bon endroit.

    Si quelqu’un a la solution... ou une proposition... Si ce que j’ai expliqué n’est pas claire, je peux toujours ajouter des précisions. Ceux qui sont intéréssés par l’affichage de deux menus peuvent toujours me contacter.

    Voir en ligne : site sur lequel apparaît mon problème (sur IE uniquement)

    Répondre à ce message

    Retour au début des forums

  • Exclusion des rubriques

    13 décembre 2005 09:27, par marcmebtouche

    Bonjour,

    Que faut-il ajouter à ce script pour exclure les rubriques avec les mots clés. Merci de votre réponse.

    Cordialement

    MARC MEBTOUCHE

    Répondre à ce message

    • Exclusion des rubriques 13 décembre 2005 09:36, par Miss Mopi

      Le mieux est d’utiliser les doublons ou les doublons nommés en fonction de votre besoin (si vous utilisez déjà des doublons dans votre page, il faut utiliser les doublons nommés pour éviter le catapultage) !

      Vous faites une première boucle qui recherche les rubriques ayant ce mot-clé en lui ajoutant l’attribut {doublons} (ou un doublons nommé) et vous rajoutez le critère {doublons} (ou un doublons nommé) dans les boucles rubriques de cette contribution.

      Bon courage.

      Répondre à ce message

    Retour au début des forums

  • Bonjour,

    Avec l’exemple que tu donnes tu écris ceci :

    "Attention ce menu ne s’affiche pas à l’identique sous IE et Firefox (par exemple, tout navigateur respectant les standards), mais fonctionne parfaitement sous IE ! "

    Pas tout à fait. Avec IE, dès que l’on quitte un menu pour explorer sa descendance, celui-ci revient à sa couleur de base, ce qui fait perdre l’information du chemin d’accès. Sur Firefox et Safari par contre, ton exemple fonctionne parfaitement.

    Voir en ligne : L’exemple

    Répondre à ce message

    Retour au début des forums

  • Bonjour Miss,

    Ce menu me plaît beaucoup mais ça ne marche pas avec ma mise en page pourtant pas compliquée. tu peux voir ce que ça donne avec IE sur le lien ci-dessous. La page a été simplifiée à l’extrême mais je n’ai pas trouvé de solution. Aurais tu une idée ?

    Voir en ligne : Une démo vaut un long discours

    Répondre à ce message

    Retour au début des forums

0 | 25 | 50 | 75



Suivre la vie du site RSS 2.0 | Plan du site | Espace privé | Charte et vie SPIP-Contrib | SPIP | L'autre.net