top-restaurant

Créer un menu « stay-top » sous WordPress

Aujourd’hui, je vous dévoile les secrets de ces menus qui font le tour du Web. J’ai nommé le menu stay-top. Un menu stay-top c’est un menu qui, lorsque votre page Web est trop longue et que vous la faites défiler, s’ancre sur le bord supérieur de votre navigateur. A la base, il ne s’agit pas d’un tutoriel WordPress mais je vais vous montrer comment l’articuler sous notre CMS préféré.

Résultat final

Vous pouvez télécharger l’archive ZIP et visualisez dans votre navigateur favori le fichier index.html afin de vous donner une idée du résultat final. Pour visualiser l’effet, donnez quelques coups de molette de votre souris.

jQuery - Menu Stay Top

Taille : 122,0 KiB  •  Date : 17 septembre 2012 •  Hits : 1 345

Étape n°1 – Constitution du menu

Pour intégrer notre menu, je vais utiliser la fonction de menu personnalisé de WordPress. Je vous renvoi dans nos archives pour plus de détail sur la création de ce type de menu. Le but étant évidement de pouvoir le gérer en back-end sans devoir mettre les mains dans le cambouis.

Notre menu s’articulera de cette façon :

<div id="sticky_navigation_wrapper">
<li class="logo"><a href="{permalinkAccueil}"><img src="{logo}" /></a></li>
<?php wp_nav_menu('Primary Menu'); ?>
</div>

Voici le résultat en sortie :

<div id="sticky_navigation_wrapper">
<li class="logo"><a href="{permalinkAccueil}"><img src="{logo}" /></a></li>
<div class="menu-main-container">
<ul id="menu-main" class="menu">
<li id="menu-item-{id}" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home menu-item-{id}">
<a href="{permalink}" target="_blank">{Name}</a>
</li>
</ul>
</div>
</div>

La ligne 2 est optionnelle. Dans notre exemple nous pousserons l’idée plus loin en intégrant un logo qui s’affiche dans le menu, mais uniquement lorsque celui-ci viens s’ancrer sur le bord supérieur de votre navigateur…. Pure fioriture ! :)

Étape n°2 – CSS

Ce que vous devez retenir :

Le wrapper, comprenez la div qui englobe votre menu, doit  TOUJOURS être en index supérieur au reste du site. Dans notre exemple, il suffit d’ajouter z-index:2; aux attributs de l’ID #sticky_navigation_wrapper. Il doit être également égal à 100% de largeur, soit width:100%.

Votre menu peut-être inférieur à 100%, je pense au largeur fixe etc… Par exemple, le menu peut-être de 960px si vous appliquez un « 960-grid CSS framework ». N’oubliez tout de même pas d’y appliquer les attribut de centrage horizontaux (margin:0 auto 0 auto;).

Pour le reste, faites selon vos envies….

#sticky_navigation_wrapper {width:100%;z-index:2;}
.menu-main-container{width:960px;margin:0 auto 0 auto;height:35px;}
.menu-main-container ul{height:35px;list-style:none;margin:0;padding:0;}
.menu-main-container li{float:left;padding:0px;}
.menu-main-container li a{display:block;font-weight:normal;line-height:35px;margin:0px;padding:0px 25px;text-align:center;text-decoration:none;}
.menu-main-container li a:hover, .demo_container ul li:hover a{text-decoration:none;}
.logo, .logo a, .logo img{float:left;margin:0;padding:0;}

Voici le minimum syndical pour obtenir un menu de 960px de large sans fond. Attention de ne pas, justement, oublier de mettre un fond… Sinon votre menu passera au travers de votre site et ce n’est pas le but.A vous de mettre en forme comme vous savez si bien le faire.

Étape n°3 – jQuery

Dans notre menu, jQuery aura 2 rôles :

  • Modifier le CSS du wrapper pour le rendre fixed
  • Afficher le logo grâce à une animation lorsque le menu devient fixed

Au début de notre fonction, nous cacherons le logo, capturerons la largeur de celui-ci et la position de notre menu. Ensuite, à chaque coup de molette, nous allons comparer la position de notre vue par rapport à la position initiale du menu et enfin nous changeront le CSS en fonction de cette comparaison.

Nouvelle version du code

jQuery(function() {
jQuery('.logo:visible').hide();
var sticky_navigation_offset_top = jQuery('#sticky_navigation_wrapper').offset().top;
var sticky_navigation = function(){
var scroll_top = jQuery(window).scrollTop(); 
if (scroll_top > sticky_navigation_offset_top) { 
jQuery('#sticky_navigation_wrapper').css({ 'position': 'fixed', 'top':0, 'left':0.5 });
jQuery('.logo:hidden').animate({width: 'show'});
} else {
jQuery('#navigation').css({ 'position': 'relative' });
jQuery('.logo:visible').animate({width: 'hide'});
}   
};
jQuery(window).scroll(function() {
sticky_navigation();
});
});

Vous voilà propriétaire d’un joli menu stay-top. Petit bémol tout de même, ce menu n’est pas compatible avec les navigateurs sur mobile. Dans une optique responsive design, je vous conseillerai d’utiliser jQuery for Mobile. En effet, tout les navigateurs Mobile ne prennent pas en charge l’attribut CSS position:fixed.

Enjoy !

Crédits photo : Samantha Decker

Christopher, 26 ans. Je suis développeur et intégrateur Web ayant pour spécialisation les CMS (Content Management System) dont WordPress. J'ai commencé à utiliser WordPress, il y a plus de 6 ans, pour un projet personnel. Le système m'a tellement séduit que j'en ai fait mon passe-temps. Sur WordPress Channel, je partage mes connaissances sur ce système. Ayant pour but d'en faire découvrir toutes les possibilités.

26 commentaires

  1. Assez facile à mettre en place comme menu sur wordpress je trouve et le rendu final est vraiment sympa :)
    Dommage pour les versions mobiles, mais il doit bien avoir quelques solutions à creuse.

    Bon tuto :)

  2. Super tuto, facile a appliquer. Ça me donne des idées pour l’avenir. Merci pour le partage.

  3. jmlapam

    Le support de position:fixed sur mobile c’est :
    - Mobile Safari – iOS5++
    - Android 3 et plus
    - Blackberry 5.0 / Blackberry 7.0
    - Firefox Mobile 6++
    - WebOS – 2.0+
    - Amazon Kindle Fire
    - Amazon Kindle (Netfront)

    Pas de support pour opera mobile et opera mini et enfin Windows Phone 7

  4. Pierre

    Merci pour le tuto, j’étais en train de voir pour le coder, mais j’ai vu un tweet passer …

  5. top dès demain je vais tenter de me casser la tête avec mon thème lol. Si non je pense que je trouverais toujours une aide si ça foire … Merci pour le tuto qu’a même

  6. abdou hanne

    merci pour le tuto c très claire

  7. Hervé

    Auriez-vous un lien vers une démo SVP ?

    • Cybercraft

      Hélas, non… Il suffit de télécharger le projet et de cliquez sur « index.html ». Je pense que ça peut le faire ? Non ?…

  8. aem

    vraiment sympa cet effect, merci bcp !

    je cherchais comment faire ca sous wp … je pense que ca suffira le temps que je trouve ca sous forme de plugin …

    merci encore ;)

    Sebastien

  9. arsdy

    super tuto, merci bien.

    je me demandais s’il était possible de l’adapter et de faire de ce thème plutôt un thème latéral, qu’on pourrait utiliser sur les thèmes portfolio…ce serait vraiment cool :-)

  10. En effet le rendu est assez sympa. Je n’avais jamais entendu cette nomination par contre ^^ mais cela sonne bien STAY ON TOP, cela me motive pas vous ? :)

  11. Christopher Hennuyez

    J’attire votre attention sur le code jQuery qui à été retravaillé. Celui-ci corrige quelques bugs. Notamment, l’animation de l’icône au changement de page. Ainsique l’effet « mitraillette » lorsqu’on scroll rapidement. :)

  12. harddev

    Comment fait-on sous le thème twentyeleven ? :)

  13. Yoshizawa

    Oui oui, merci, j’ai deja un themes enfants, mais j’y arrive pas pour modifier le header sous twentyeleven…

  14. Yoshizawa

    Merci :) par contre, ca marche pas chez moi… est ce que vous auriez la gentillesse de me donnés le code source de header.php ? svp.. :) et le jquery, on le met ou mdr ? :) merci pour votre temps

  15. dugdug

    Franchement je n’arrive pas à comprendre qu’est ce qu’il faut copier et ou le copier ?
    J’ai mon thème enfant mon header dans le thème enfant et je commence par ou dans tout ça?
    Je suis pas au top en codage et je débute sur wordpress de puis quelques mois, merci.
    L’idée est génial je la veux sur mon site snif snif

  16. Cyril

    Bonjour,

    Merci pour votre tutoriel que j’ai hâte de mettre en place :)
    Cependant, je suis un véritable débutant et même si je me débrouille souvent, je bloque vraiment sur la partie jQuery.
    Auriez-vous un tutoriel sur son utilisation utilisation ?

    D’avance merci

  17. Frédé

    Bonjour et merci pour le tuto c’est quelque chose que je cherchais depuis un moment sans connaitre le nom (parfois ça ne tient pas à grand chose).
    J’ai tout de même plusieurs difficultés pour le mettre en place car voyez vous je ne comprends pas comment le code n°1 nous donne le code n°2 en sortie où visiblement, on n’a plus une gestion automatique des menus puisque que la fonction n’est plus appelée. Il semble (si j’ai tout compris) que cette fois on va chercher les indications pour appeler chaque ? On code donc le menu à la main?

    Ensuite je ne vois pas où mettre l’image du logo car je ne comprends pas bien à quoi {logo} fait référence (faut il changer l’url? ou le nom du fichier? est ce une fonction à ne pas changer?)

    Désolée pour toutes ces questions.

Rétrolien pour cet article

  1. L’Hebdo WordPress : Trac – BuddyCamp – Traduction | WordPress Francophone
  2. [veille]18 articles à lire » 4h18

Laisser un commentaire