[JS]Défilement fluide (smooth-scrolling)

NoSmoking

Préambule

La mise en œuvre d'un « défilement fluide » donne une impression agréable du site tout en ajoutant un petit côté « pro » supplémentaire même si cela peut vite devenir désagréable lors d'abus d'effets.

Réaliser un « défilement fluide », d'un endroit à un autre de la page, est normalement devenu une chose simple depuis l'introduction de la propriété CSS scroll-behavior.

Cette propriété peut être appliquée sur l'ensemble du document ou sur une boîte en particulier en utilisant les règles suivantes :

/* sur l'ensemble du document */
html {
  scroll-behavior: smooth;
}
/* sur un élément particulier */
#box-cible {
  scroll-behavior: smooth;
}

Cela ne s'applique toutefois pas aux défilements effectués par l'utilisateur lors d'un scroll via la molette de la souris ou la barre de défilement.

Il y a néanmoins un petit bémol à tout cela, à savoir que les navigateurs peuvent choisir d'ignorer cette propriété, ce que l'on appelle les réglages par défaut.

Activer/désactiver le « défilement fluide ».

Même si cela n'est pas vraiment le sujet ici, activer ou désactiver ce type de défilement n'est pas forcément très compliqué à réaliser mais doit se faire sur le navigateur de l'utilisateur sur lequel vous n'avez aucune emprise, et c'est tant mieux.

Sur Chrome 

Sur FireFox :

On ne s'étendra pas sur les autres navigateurs et on notera que d'autres paramètres sont également réglables sous FireFox.

Bon c'était juste pour information.

Comment faire en JavaScript ?

Tout le monde, ou presque, connaît la façon simple de faire en utilisant la bibliothèque jQuery et le code minimum suivant :

$(container).animate({
    scrollTop: $(element_target).offset().top
  });

De plus en cherchant un peu, on trouve de nombreux plugins reposant sur cette bibliothèque et faisant le travail.

Certes mais ici nous n'utilisons pas de bibliothèque externe, donc on réinvente la roue !

Fonction smoothScrolling([target[, parent]])

Cette fonction n'est pas compatible avec la règle CSS suivante :

element {
  scroll-behavior: smooth;
}

La fonction, sur base de la méthode window.requestAnimationFrame, entre en « conflit » avec le processus de défilement du navigateur, il ne faut donc pas l'insérer dans votre CSS et là vous avez la main.

Syntaxe

smoothScrolling([target[, parent]]);

Exemple d'appel

const cible = document.getElementById("cible");
const conteneur = document.getElementById("conteneur");
// remonte en haut de page
smoothScrolling();
// fait défiler la page jusqu'à l'élément cible
smoothScrolling(cible);
// fait défiler le contenu du conteneur jusqu'à l'élément cible
smoothScrolling(cible, conteneur);

Exemple utilisé dans cette page

const innerLinks = document.querySelectorAll("[href^='#']");
innerLinks.forEach((a) => {
  a.addEventListener("click", (e) => {
    e.preventDefault();
    const ancre = e.target. /*hash;*/ href.split("#").pop();
    const target = document.getElementById(ancre);
    smoothScrolling(target);
  });
});

Code de la fonction

Le code complet est disponible dans le fichier smoothscroll.js

Démo dans la boîte

Aquarelles de René CHARRIER

Défilement :
    • Echaillon

      Route de l'Echaillon

      Plus haut, c’est la station de ski de fond de l’Echaillon.
    • Col de Carri

      Col de Carri

      En venant des Grands Goulets en direction de la forêt de Lente.
    • Vassieux

      Carrefour vers Vassieux

      Carrefour de la route de Font d’Urle avant la descente vers Vassieux.
    • Chaud clapier

      Chaud clapier

      Aux abords de la forêt de Lente.
    • Font d'Urle

      Vers Font d'Urle

      A la sortie de la forêt de Lente, vers le plateau de Font d’Urle
    • Grand-Veymont

      Massif du Grand-Veymont

      Vu depuis le plateau de la montagne de Beure.

    Paragraphe de scroll

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum ultricies laoreet orci, sit amet molestie nulla efficitur ac. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas tellus elit, suscipit at laoreet et, tempor a orci. Nulla in tortor nec est placerat condimentum in nec magna. Nunc sollicitudin sem eget purus ultrices, bibendum pharetra augue aliquet. Mauris consectetur lectus ut laoreet finibus. In gravida, massa eget tempus fringilla, eros nisi gravida massa, at accumsan massa nisl vel quam. Donec maximus molestie enim, ac elementum nisi posuere a. Vivamus eu varius erat.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum ultricies laoreet orci, sit amet molestie nulla efficitur ac. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas tellus elit, suscipit at laoreet et, tempor a orci. Nulla in tortor nec est placerat condimentum in nec magna. Nunc sollicitudin sem eget purus ultrices, bibendum pharetra augue aliquet. Mauris consectetur lectus ut laoreet finibus. In gravida, massa eget tempus fringilla, eros nisi gravida massa, at accumsan massa nisl vel quam. Donec maximus molestie enim, ac elementum nisi posuere a. Vivamus eu varius erat.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum ultricies laoreet orci, sit amet molestie nulla efficitur ac. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas tellus elit, suscipit at laoreet et, tempor a orci. Nulla in tortor nec est placerat condimentum in nec magna. Nunc sollicitudin sem eget purus ultrices, bibendum pharetra augue aliquet. Mauris consectetur lectus ut laoreet finibus. In gravida, massa eget tempus fringilla, eros nisi gravida massa, at accumsan massa nisl vel quam. Donec maximus molestie enim, ac elementum nisi posuere a. Vivamus eu varius erat.

    Ressources