jQuery & WordPress – Une sidebar flottante

Mis à jour le :

Il arrive parfois que le contenu d’une page soit long et que votre molette de souris chauffe à force de faire des allez-retours pour pouvoir accéder aux éléments de la sidebar.

Une manipulation très simple vous permet en CSS de fixer cette sidebar afin qu’elle soit toujours visible à l’écran. Mais ce n’est pas suffisamment swag pour votre site alors nous allons-y ajouter un effet de décalage, en utilisant la fonction animate de jQuery.

Tout d’abord, nous n’allons pas agir sur le CSS. Le jQuery fera tout le travail, ça évite les possibles problèmes de compatibilité.

Le principe du petit bout de code que nous allons voir est simple.  A chaque coup de molette, le code comparera la position du haut de la fenêtre par rapport à la position de notre sidebar. Tant que le haut de la fenêtre dépasse le haut de la sidebar, la marge du haut de la sidebar est décalée d’un nombre égal à la position du bord de la fenêtre – la position du bord de la sidebar.

Ce décalage se fait évidement en douceur en l’incluant dans un effet animate.

Enfin, pour faire les choses bien, nous allons ajouter à l’équation une troisième valeur qui empêchera la sidebar de venir se coller sur le bord haut de la fenêtre.
Et suite à la suggestion d’un de nos lecteurs, nous allons inclure également un test de longueur de la sidebar qui va couper tout ce qui dépasse 🙂 et le remplacer par une barre de déroulement.

$(function() { var elmt = $("#sidebar"); // L'élément "sidebar" stocké dans une variable var offset = $(elmt).offset(); var paddingTop = 150; // A adapter selon vos envies, ici 150px fixe la sidebar à 150px par rapport au haut de la fenêtre. var windowHeight = $(window).height(); // Capture de la hauteur du viewport if ($(elmt).height() > windowHeight) { $(elmt).css('overflow' , 'scroll'); $(elmt).css('height', windowHeight-paddingTop-15  'px'); } $(window).scroll(function() { if ($(window).scrollTop() > offset.top) { $(elmt).stop().animate({ marginTop: $(window).scrollTop() - offset.top   paddingTop },"linear"); } else { $(elmt).stop().animate({ marginTop: 0 },"linear"); } }); });

Explications :

  • offset reprend tout les décalages de l’élément sidebar. Donc offset.top correspond au décalage haut de l’élément #sidebar
  • paddingTop reprend le décalage ajouter en plus de celui calculé

Remplacer l’id #sidebar par l’ID ou la classe de votre bloc et le tour est joué.

N’oubliez pas d’insérer jQuery avant ce code et la sidebar doit être en float:right;

Vous pouvez jouer sur l’animation en ajoutant un paramètre temps et sur le easing dans les fonctions animate :

Paramètre temps :

$("#sidebar").stop().animate({ ... }, 200);

Easing :

$("#sidebar").stop().animate({ ... }, "linear");
  • jQuery – Sidebar flottante
    Thème de démonstration pour faire flotter une sidebar sous WordPress via jQuery.
    Taille du fichier :
    33.83 KB

Vous pouvez télécharger le thème joint à cet article et l’installer comme un nouveau thème WordPress pour tester le tutoriel en démo.

Avatar de Christopher Hennuyez

Protégez votre site WordPress

Vos données sont précieuses,
ne prenez pas le risque de tout perdre.
Confiez-moi votre maintenance !

Ces articles devraient t’intéresser…

15 réponses
  1. Avatar de virginie DUCHAUFFOUR
    virginie DUCHAUFFOUR

    Bonjour à tous, tout d’abord merci pour cet article. Le code fonctionne très bien sur mon site par contre je rencontre le même soucis que certains c’est à dire que cela repousse mon footer. Je dois dire que je débute en wordpress et en JQuery. J’aurais tendance à vouloir toucher:
    $(« #sidebar »).stop().animate({
    marginTop: 0
    }, »linear »);
    mais non n’y aurait pas une taille à préciser ou dès qu’on arrive à l’élément footer on arrête.??
    Désolée je débute vraiment

  2. Avatar de Survival Gear
    Survival Gear

    Parfait ! C’est exactement ce que je cherchais. J’avais vu ça sur le theme Sahifa et je cherchais le même système à adapter sur un autre thème.

  3. Avatar de bulle
    bulle

    bonjour à tous,
    merci pour ce script, qui fonctionne parfaitement sur mon site, mais même problème que Rogers et Reno:
    comment dire en langage JS à la sidebar de s’arrêter quand elle arrive au footer?
    un grand merci à celui/celle qui pourra nous aider.

  4. Avatar de rogers
    rogers

    Bonjour,

    C’est très pratique, mais la sidebar repousse systématiquement mon footer qui du fait n’est plus visible 🙁
    Je ne connais rien en javascript, si quelqu’un a un début de piste.
    Merci 🙂

  5. Avatar de Jonathan
    Jonathan

    Bonjour,
    Je me permets de te laisser un message car j’ai utilisé ton code mais je ne comprends pas pourquoi mon bloc se retrouve au milieu de la page lorsque je scrolle.
    As-tu une idée ? Merci d’avance

    Jonathan

  6. Avatar de Valen
    Valen

    Question très bête car je suis débutant sur WP mais dans quel fichier placez-vous cette fonction?
    Merci.

  7. Avatar de Kim Xuan
    Kim Xuan

    Bonjour, Christopher,

    Tout d’abord, merci pour ton fix qui tombe à pic, j’ai testé ta version démo en local, ça marche nickel avec ton thème. Ayant moi aussi un problème de sidebar flottante avec le thème Paragon multipurpose, j’ai essayé d’implémenter ton script dans mon footer.php (comme j’ai pu aussi le voir dans ton thème) et bien entendu, j’ai bien mis ton script.js dans mon dossier js de mon thème. J’ai essayé tous les tests possibles, mais rien ne fonctionne, ma sidebar ne décolle pas d’un px et reste décalé en bas.

    – <script src=" »>
    – de créer la variable:

    var templateDirectory = «  »;

    – echo  »;

    Je ne vois pas où est mon erreur, quelqu’un pourrait – il m’aider?

    Merci d’avance et bonne journée.

    1. Avatar de bilel
      bilel

      j’ai eu le même problème, sur un autre thème, puis j’ai rajouté en css une position absolute à la sidebar et ça marche impécable.

  8. Avatar de Reno
    Reno

    Bonjour,
    Merci pour la fonction qui fonctionne très bien chez moi.
    Le seul petit souci, c’est quand j’arrive en bas de page :
    la sidebar pousse mon footer dans lequel j’ai placé mon formulaire de contact, etc… du coup il est impossible d’accéder à la totalité de celui-ci.
    N’y aurait-il pas une fonction supplémentaire pour que la sidebar s’arrête à la fin du contenu ?

    Merci.

  9. Avatar de Magda
    Magda

    Bonjour,
    Il faut bien reconnaitre que wp est le meilleur cms pour les blogs et les rédactionnels. Et vos tutos aident beaucoup, même les plus débutant…

  10. Avatar de Jean-JacquesvSchaeffer
    Jean-JacquesvSchaeffer

    Excellente idée, mais… comment atteindre les items du bas de la sidebar, qui disparaissent quasi instantanément lors du scrolling ?

    1. Avatar de Christopher Hennuyez
      Christopher Hennuyez

      Excellente question. Et à vrai dire, j’y avais pas pensé :
      – Tu n’applique pas ce procédé.
      – Tu applique un overflow:scroll; sur le conteneur de la sidebar en appliquant une hauteur définie. Ce qui aura pour effet de créer une scrollbar à droite de ta sidebar. Moche, mais ça fonctionne.
      – Tu attend que je crée un « fix » pour calculer la taille en hauteur de la sidebar.

      Merci de ta suggestion 🙂

    2. Avatar de Christopher Hennuyez
      Christopher Hennuyez

      Voici un petit fix pour ce genre de problème.:

      $(function() {
      var elmt = $(« #sidebar »);
      var offset = $(elmt).offset();
      var paddingTop = 150; // A adapter selon vos envies, ici 150px fixe la sidebar à 150px par rapport au haut de la fenêtre.
      var windowHeight = $(window).height(); // Capture de la hauteur du viewport

      if ($(elmt).height() > windowHeight) {
      $(« #sidebar »).css(‘overflow’ , ‘scroll’);
      $(« #sidebar »).css(‘height’, windowHeight-paddingTop-15 +’px’);
      }
      $(window).scroll(function() {
      if ($(window).scrollTop() > offset.top) {
      $(elmt).stop().animate({
      marginTop: $(window).scrollTop() – offset.top + paddingTop
      }, »linear »);
      } else {
      $(« #sidebar »).stop().animate({
      marginTop: 0
      }, »linear »);
      }
      });
      });

      1. Avatar de MamaFati
        MamaFati

        J’ai l’impression que tout ça est destiné aux avertis comme tout WP d’ailleurs. Il ne faut oublier que tous les blogueurs ne sont pas forcément des développeurs. Moi de mon côté, je n’arrive même pas à créer ma news-letter….
        Passez tous une bonne journée, MamaFati

        1. Avatar de Aurélien Denis
          Aurélien Denis

          Bonjour, certains tutoriels sont pour les débutants et d’autres sont plus techniques. Nous écrivons pour un public très large et il n’est jamais aisé de contenter tout le monde. 😉