Créer une barre de progrès (scroll) en React

31 déc. 2021

Oui oui, c'est la petite barre qui se remplit lorsque vous scroller sur un article de kimdontdoit à l'heure de l'écriture de ce post. Connu aussi sous des termes comme une "scroll progress bar indicator", c'est un petit atout UX pour un lecteur.

Voici un component React pour l'indicateur de progrès de lecture que vous pouvez réutiliser et adapter à vos besoins.

import React, { useState, useEffect } from "react";

import * as classes from "./ScrollProgress.module.scss";

const ScrollProgress = ({ target }) => {
  const [readingProgress, setReadingProgress] = useState(0);

  const scrollListener = () => {
    if (!target.current) {
      return;
    }

    const element = target.current;

    const windowScrollTop =
      window.pageYOffset ||
      document.documentElement.scrollTop ||
      document.body.scrollTop ||
      0;

    if (windowScrollTop <= element.offsetTop) {
      setReadingProgress(0);
    } else {
      setReadingProgress(
        ((windowScrollTop - element.offsetTop) /
          (element.clientHeight - element.offsetTop - window.innerHeight)) *
          100
      );
    }
  };

  useEffect(() => {
    window.addEventListener("scroll", scrollListener);
    return () => window.removeEventListener("scroll", scrollListener);
  });

  return (
    <div className={classes.progressContainer}>
      <div
        className={classes.progress}
        style={{ width: `${readingProgress}%` }}
      />
    </div>
  );
};

export { ScrollProgress };

Une particularité de ce component est le ref target reçu en props pour que le progrès commence seulement lorsque l'élément fourni atteint le haut du navigateur (voir la variable windowScrollTop)

Publié le 31 décembre 2021

Composé par Vladislav Kim