Menu fixe mais flottant selon la scrollbar (JS + CSS)

Photo of author
Écrit par Mimie

Mon goût pour la liberté : internet, lectures, culture, et quelques tutos utiles.

⇒ Mon roman

Certains ne comprennent peut-être pas ce dont je veux parler par « menu fixe mais flottant selon la scrollbar », en fait je fais référence au nouveau menu dans Gmail qui est figé en haut mais suit la scrollbar lorsque nous descendons l’ascenseur.
Cet effet permet d’avoir toujours à disposition le menu où que nous soyons dans la lecture de nos mails.

Ça semble anodin au premier abord pour la plupart des gens, un peu de CSS, un petit « position: fixed » et le tour est joué ? hé bien non, c’est plus fort que ça, car au départ le menu est incrusté et c’est seulement lorque la scrollbar atteint un point précis (ici lorsque le haut de la fenêtre atteint le menu) que le menu devient flottant, c’est donc dynamique, à comprendre qu’il va falloir utiliser du JavaScript.

Ce menu m’a intrigué dès le départ car je ne savais pas moi-même réaliser un tel effet, jusqu’au jour où j’en ai eu besoin pour l’affichage d’un deck de type « Commander » sur MS.

Démo

En effet au niveau de la vue d’un deck, le survol de la souris sur le nom d’une carte fait afficher l’image de celle-ci sur le côté gauche. Le problème c’est que la quantité de cartes d’un deck « Commander » fait que l’image ne devient plus visible lorsque nous scrollons vers le bas pour voir l’intégralité des cartes. D’où l’idée de rendre flottante l’image de la carte lorsque la scrollbar tente de la masquer.

Code

Finalement c’est assez simple à comprendre et donc à mettre en place.

CSS

Votre élément (menu, image, bandeau, div, etc.) a rendre flottant a par défaut une position « relative » par rapport à son conteneur, cette position devra passée à « fixed » au moment où nous le choisirons, dans notre cas lorsque la scrollbar tentera de masquer notre élément.

Le changement d’état de notre élement se fera par le biais d’une classe CSS, appliquée par du JavaScript, la voici :

votre_menu_ou_votre_image_ou_votre_element.floatable {
 position: fixed;
 top: 10px; // non-obligatoire
 }

JS

Pour détecter qu’il est temps de changer la position de notre élément, il faut connaître le positionnement de la scrollbar et la comparer au positionnement de notre élément. Pour cela j’utilise la fonction $(window).scroll() de jQuery.
Voici le mécanisme à mettre en place :

// listen for scroll
 var positionElementInPage = $('#votre_menu_ou_votre_image_ou_votre_element').offset().top;
 $(window).scroll(
 function() {
 if ($(window).scrollTop() >= positionElementInPage) {
 // fixed
 $('#votre_menu_ou_votre_image_ou_votre_element').addClass("floatable");
 } else {
 // relative
 $('#votre_menu_ou_votre_image_ou_votre_element').removeClass("floatable");
 }
 }
 );

Lorsque nous descendons l’image nous suit et reste visible, lorsque nous remontons, elle se recale à l’endroit du départ si nous dépassons son emplacement d’origine.

Sources

Si mes explications ne sont pas claires, voici un fichier d’exemple : menu_fixe_mais_flottant.html.

Catégories Web
VPN - Explorer Internet librement

Promo spéciale NordVPN : jusqu'à -74%
Sécurise tes connexions et navigue librement en quelques clics.

114 réflexions au sujet de “Menu fixe mais flottant selon la scrollbar (JS + CSS)”

  1. Pour info, j’ai ajouté le z-index parce-que sans lui, le menu apparaissait en dessous des images et du texte de mes articles. M’enfin…

  2. C’est incroyable de réagir comme ça. Tu ne respectes pas le fait que je suis débutante. Si c’est pour me faire agresser, je préfère encore me débrouiller seule. Peace…

  3. Zen Mimie… Je n’avais pas vu le .floatable, je viens de l’ajouter. Ca donne ça :

    #HTML9.floatable {

    z-index: 999;
    }

    Pour la hauteur du menu, je ne trouve pas.

  4. Normal il doit etre fixe seulement qd la scrollbar le masque … l’ajout de la classe css « floatable » tu l’as mis où ??? là elle s’applique bien à ton menu mais vu qu’il ne trouve pas le CSS à appliquer bah il ne fait rien ….
    Il te faut quelque chose du genre #HTML9.floatable { … } quelque part dans tes styles

    Ensuite il faut retirer la hauteur de ton menu en pixels à ta variable elementInPage, environ 40px dans ton cas (elementInPage -= 40; )

  5. Mimie > Merci ! Je viens d’essayer ta méthode, malheureusement toujours rien ?
    Benjamin > Je viens d’enlever le position: fixed dans le CSS, mais pas de changement non plus…

  6. J’ai regardé rapidement, il ne devrait pas avoir de position fixed dans ton css pour ton menu en tout . La class qui fixed le menu est à appelé avec le bout de code jQuery mis plus haut ..

  7. Mimie, mille merci pour cette précision, pas évident de s’en sortir au début.
    J’ai déplacé le javascript et je ne vois pourtant aucun changement ?

  8. Lut Vydja, ton javascript doit être placé avant la fermeture de la balise body (tout en bas de page) et non tout au début …

  9. Je ne vois pas ton code, par contre je suis sur ton blog, je regarde et te redis si je trouve l’erreur
    ;D

  10. J’ai envoyé un message plus haut où je donnais tout mon code, mais je ne sais pas s’il est passé.
    J’ai finalement réussi à enlever les caractères spéciaux affichés sur la page.
    Je souhaiterais simplement de l’aide pour ce qui est du menu fixe.
    Désolée pour le nombre de messages ! 😉

  11. Tu as du surement laissé un caractère inattendu.. Regarde ce que tu as écrit. Tu as peu être oublier de fermer une balise ou quelque chose de ce genre. .. Je peux voir le bug ?

  12. Rebonjour,

    j’ai fait une grosse bourde dans mon code que je ne sais pas réparer, et sur mon blog s’affiche un pavé de code.
    Help !

  13. Bonjour,
    je bloque complètement depuis quelques heures sur mon menu en haut de page.
    C’est la première fois que j’utilise jQuery donc j’ai sûrement fait une erreur quelque part.
    Pouvez-vous m’aider ?
    Merci 🙂

  14. tu devrais lire l’article que je t’ai mise en lien, il te serait pas mal utile pour faire ce que tu souhaite.. il y a des exemples pour que tu comprennes les possibilités des margin, padding,etc.

    solution magicien :

    il faut que tu comble l’écart entre tes deux menus par une ligne de couleur qui correspond à ton arrière plan.. et on ne verra plus le contenu au travers tes menus.. par exemple avec une div et un padding…

  15. bon, en fait, mon pb c’est que j’ai 2 menus en haut de ma page, ok? et entre les 2 menus il y a un petit espace à travers lequel on peut voir le bckground.
    je veux que le défilement s’arrête juste avant le 2ème menu (celui en bas) . quand je fixe le margin à 0, les deux menus seront collés , alors que moi je désire garder le petit espace
    🙂

  16. Ok… là j’ai compris ! 😀

    En fait tu vois dans l’exemple, il n’y a pas de règles de margin sur pou les autres éléments du coup par défaut une marge est créée pour tout le monde. .. pour qu’il n’y ait plus cette espace/marge il faut que tu rajoute margin: 0 auto; le 0 pour les marges hautes et basses et l’auto pour la gauche et la droite. ..

    si tu veux tu peux regarder l’article : http://www.alsacreations.com/article/lire/629-fusion-des-marges.html

  17. Je ne suis pas sûr d’avoir compris, le menu doit rester au dessus du contenu ? j’avoue ne pas vraiment comprendre.

    .. .essaie de rajouter un z-index : 50 (par exemple) à ton menu, il devrait passer au dessus de ton contenu ..
    Sinon rajoute une marge à ton contenu pour faire la différence de hauteur conteneur/menu.. .

    Vu que je ne suis pas certain d’avoir compris ce que tu demandais je réponds un peu au pif. . Bon courage

  18. bonjour

    merci pour l’article, sauf que j’ai un petit soucis, je souhaite que mon contenu s’arrête juste au dessous de mon menu, c-à-d que lorsque je défile, mon contenu ne passe pas derrière mon menu, ça défile et puis ça disparait, je ne le vois pas passer au dessus du menu.

    j’espère avoir été claire 🙂 🙂

Laisser un commentaire