Sticky : quand un élément est collé

En CSS, la position « sticky » permet de fixer un élément dés qu'il est sur le point de quitter le viewport. Mais cet état transitoire n'est identifié ni par une pseudo-classe CSS comme :hover par exemple, ni par un événement DOM. Voilà une petite solution rapide pour émuler l'un et l'autre.

  • Si on a besoin d'appliquer des styles particuliers quand un élément adhère, on joue sur l'ajout/suppression d'une classe HTML.
  • Si on veut appliquer des traitements supplémentaires, on émet un événement spécifique.
/**
 * @param {HTMLElement[]} elements 
 * @param {Number} [ratio=1]
 * @return {IntersectionObserver}
 */
export const sticky = (elements, ratio = 1) => {
    const observer = new IntersectionObserver(entries => {
        entries.forEach(e => {
            const el = e.target,
                state = e.intersectionRatio < ratio;
            el.classList.toggle('sticked', state);
            el.dispatchEvent(new CustomEvent('sticked', {detail: state}));
        });
    }, {threshold: ratio});
    elements.forEach(element => observer.observe(element));
    return observer;
};