IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

OnePage | Ajouter la class active lors du scroll


Sujet :

jQuery

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 6
    Points : 8
    Points
    8
    Par défaut OnePage | Ajouter la class active lors du scroll
    Bonjour,

    je suis en train de créer un site web (onepage) et j'aimerai ajouter la class active lorsque je scroll sur le href en question

    J'ai testais plein de truc plein de trucs mais rien y fait, quelqu'un saurai comment faire ?
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <ul class="navbar-nav ml-auto">
       <li class="nav-item"><a class="nav-link active" href="#home">HOME</a></li>
       <li class="nav-item"><a class="nav-link" href="#about">ABOUT</a></li>
       <li class="nav-item"><a class="nav-link" href="#gallery">GALLERY</a></li>
       <li class="nav-item"><a class="nav-link" href="#contact">CONTACT</a></li>
    </ul>
    <div id=#home>
       <!-- contenu -->
    </div>
    <div id=#about>
       <!-- contenu -->
    </div>
    <div id=#gallery>
       <!-- contenu -->
    </div>
    <div id=#contact>
       <!-- contenu -->
    </div>

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 410
    Points : 4 851
    Points
    4 851
    Par défaut
    Salut,
    supprime d'abord le diez "#", et utilise des apostrophes '' ou "" autour des id des div home,about,gallery,contact
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <div id='home'></div>
    <div id='about'></div>
    <div id='gallery'></div>
    <div id='contact'></div>

    Puis essaie ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $(function(){
       var cible;
       $(".nav-link").click(function(e){
            e.preventDefault();//empêcher le navigateur de suivre le lien du <a> sur lequel tu as cliqué 
        	cible=$('#'+$(this).attr('href').replace('#',''));
            $('.navbar-nav').find('.nav-link').removeClass('active');//supprime la class active de tout les a.nav-link
            $(this).addClass('active');//attribuer la classe active à l’élément cliqué
            console.log('le id cible :'+cible.attr('id')
                +' est à :'+cible.offset().top+'px du top.');
            $('html,body').scrollTop(cible.offset().top);
        });
    });
    une option supplémentaire c'est d'attacher l'événement clic aux <li> conteneurs des <a> :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    $(function(){
      var cible;
      $(".nav-item").click(function(e){
         $(this).closest('.navbar-nav')
         .find('.nav-link')
         .removeClass('active')
         .closest('.navbar-nav')
         .find($(this).find('.nav-link')).addClass('active');
         cible=$('#'+$(this)
         .find('.nav-link').attr('href')
         .replace('#',''));
         console.log('le id cible :'+cible.attr('id')
            +' est à :'+cible.offset().top+'px du top.');
          $('html,body').scrollTop(cible.offset().top);
      });
    });

  3. #3
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,
    Si j'ai bien compris, tu souhaites que la classe "active" soit appliquée sur l'élément dès lors qu'on a scrollé dessus (qu'on ait cliqué sur la navigation ou non).
    Il suffit pour cela d'intercepter l'événément scroll du navigateur, et de vérifier qu'on a "dépassé", en position de scroll, l'élément correspondant de la navigation.
    En gros un truc comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    var $navItems = $('.navbar-nav').find('a'), // on récupère tous les liens de la nav
        $previousActive = null, // on créé une variable qui va nous permettre de stocker l'élément précédemment actif
        threshold = 150; // débattement
     
    $(window).on('scroll', function(){ // à chaque fois qu'on scroll
        var currentScrollTop = $(this).scrollTop(); // on récupère la position du scroll
     
        var $active = null;
        $navItems.each(function(){ // on parcourt chacun des liens
            var $navItem = $(this),
                $target = $($navItem.attr('href')); // on va chercher dans le DOM l'élement correspondant ciblé
     
            if($target.offset().top <= currentScrollTop + threshold){ // si son offset top est supérieur à la position de scroll actuelle - le débattement
                $active = $navItem; // il est actif
            }
        });
     
        // on ne garde que le dernier élément actif
        if($active != null && $previousActive != $active){
            if($previousActive != null) $previousActive.removeClass('active'); // on supprime la classe active précédente
            $active.addClass('active'); // on l'ajoute sur l'élément actuellement scrollé
            $previousActive = $active;
        }
    });

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 6
    Points : 8
    Points
    8
    Par défaut
    Parfait, ça fonctionne nickel, reste plus qu'à comprendre comment cela fonctionne, merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajouter une class CSS a une nouvelle cellule
    Par Arfigado dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/09/2006, 10h08
  2. Probleme d'activation lors de l'installation du SP2
    Par pottiez dans le forum Windows XP
    Réponses: 10
    Dernier message: 25/09/2006, 10h55
  3. [PHP] ajout de backslash auto lors d'un ajout en DB
    Par FraktaL dans le forum Langage
    Réponses: 16
    Dernier message: 20/06/2006, 16h00
  4. activation lors de l'impression
    Par stan30160 dans le forum Access
    Réponses: 3
    Dernier message: 15/06/2006, 12h35
  5. [debutant] Comment ajouter des .class ?
    Par Slein dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 30/04/2004, 14h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo