[R]scrollspy qui ne fonctione -presque- pas

Le problème exposé dans ce sujet a été résolu.

Bonjour (je suis nouveau ici !),

Je suis actuellement en train de faire une faq pour mon site et j’aime bien le framework Materialize Css. Seulement, le scrollpsy ne fonctionne que sur le premier item… voilà le lien du site et donc du code source actuel : https://kagescan.legtux.org/about/faq.html

Pourtant, je ne reçois aucune erreur dans la console, mon code passe très bien dans le validateur w3 enfin bref, tout semble OK à mon avis donc je ne sais pas vraiment d’où peut venir l’erreur… J’ai aussi demandé sur quelques serveurs discord (messagerie en ligne comme skype), rien trouvé.

Avez-vous une idée sur mon problème? Merci !!

+0 -0

Normalement quand tu mets ton code dans une balise à la fin de ton body ça minimise le problème de ressources non chargés. Mais tu devrais attendre que ta page soit complètement chargé, au mieux attend aussi que tes autres éléments (images, etc…) soit chargé aussi (surtout pour ta variable sticky).

1
document.addEventListener("load", function() { /* ton code */ });

La documentation de Materialize conseille, l’événement avant load : DOMContentLoaded.

La doc :


Ensuite ce n’est pas querySelector que tu veux faire mais :

1
const elem = document.getElementsByClassName('scrollspy');

ou

1
const elem = document.querySelectorAll('.scrollspy');

Pour récupérer TOUS les éléments et non le premier.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
      //scrollspy
          var elem = document.querySelector('.scrollspy');
          var instance = M.ScrollSpy.init(elem);
      //scrollpsy nav// When the user scrolls the page, execute myFunction
          window.onscroll = function() {myFunction()};
          var header = document.getElementById("nav"); // Get the header
          var sticky = header.offsetTop; // Get the offset position of the navbar
          function myFunction() {
            if (window.pageYOffset >= sticky) {header.classList.add("navig");}
            else {header.classList.remove("navig");}
          } 

Ensuite quelques points supplémentaire sur ton code :

  1. Normalement la façon correcte de définir ton trigger onscroll est d’utiliser addEventListener (ce n’est pas ça qui corrigera ton problème).

  2. Si tu n’utilise pas load la variable sticky doit être obligatoirement définit dans ton trigger scroll.

J’écrirai ainsi le code, comme ceci :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
document.addEventListener("DOMContentLoaded", function() { // ou "load" pour être tranquille
    const elem = document.getElementsByClassName('scrollspy'); // ou querySelectorAll
    const instance = M.ScrollSpy.init(elem);

    window.addEventListener("scroll", function() { // ou "onscroll" à vérifier ?
        const header = document.getElementById("nav");
        const sticky = header.offsetTop; // Get the offset position of the navbar
        if (sticky <= window.pageYOffset) {
            header.classList.add("navig");
        } else {
            header.classList.remove("navig");
        }
    });
});

La doc :

+0 -0

(J’ai corrigé le titre du topic pour enlever le tag malformé, modifier scrollpsy -> scrollspy, et renommer le tag scrollpsy -> scrollspy. Si ça peut t’aider à retenir, spy signifie espion en anglais. Littéralement, tu veux espionner le scroll. Rien à voir avec un psy. ;) )

+3 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte