61 votes

Jquery faire défiler en douceur vers une ancre?

Y a-t-il un moyen de faire défiler jusqu'à un lien d'ancre en utilisant jQuery ?

Comme :

$(document).ready(function(){
  $("#gotomyanchor").click(function(){
      $.scrollSmoothTo($("#myanchor"));
  });
});

?

121voto

hanoo Points 1380

Voici comment je le fais :

    var hashTagActive = "";
    $(".scroll").on("click touchstart" , function (event) {
        if(hashTagActive != this.hash) { //this will prevent if the user click several times the same link to freeze the scroll.
            event.preventDefault();
            //calculate destination place
            var dest = 0;
            if ($(this.hash).offset().top > $(document).height() - $(window).height()) {
                dest = $(document).height() - $(window).height();
            } else {
                dest = $(this.hash).offset().top;
            }
            //go to destination
            $('html,body').animate({
                scrollTop: dest
            }, 2000, 'swing');
            hashTagActive = this.hash;
        }
    });

Ensuite, il vous suffit de créer votre ancre comme ceci :

Destination 1

Une démo est également disponible ici : http://jsfiddle.net/YtJcL/

47voto

David Points 261

Je vais utiliser le simple extrait de code de CSS-Tricks.com :

$(function() {
  $('a[href*=#]:not([href=#])').click(function() {
    if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
      var target = $(this.hash);
      target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
      if (target.length) {
        $('html,body').animate({
          scrollTop: target.offset().top
        }, 1000);
        return false;
      }
    }
  });
});

Source: http://css-tricks.com/snippets/jquery/smooth-scrolling/

38voto

aruizca Points 173

La meilleure solution que j'ai vue jusqu'à présent : jQuery: Smooth Scrolling Internal Anchor Links

HTML:

Faire défiler vers les commentaires

Script:

jQuery(document).ready(function($) {
    $(".scroll").click(function(event){     
        event.preventDefault();
        $('html,body').animate({scrollTop:$(this.hash).offset().top}, 500);
    });
});

12voto

Mark Biek Points 41769

jQuery.scrollTo fera tout ce que vous voulez et plus encore!

Vous pouvez lui passer toutes sortes de choses différentes :

  • Un nombre brut
  • Une chaîne de caractères ('44', '100px', '+=30px', etc)
  • Un élément DOM (logiquement, enfant de l'élément défilable)
  • Un sélecteur, qui sera relatif à l'élément défilable
  • La chaîne 'max' pour défiler jusqu'à la fin.
  • Une chaîne spécifiant un pourcentage pour défiler jusqu'à cette partie du conteneur (par exemple : 50% va à * vers le milieu).
  • Un hash { top:x, left:y }, x et y peuvent être n'importe quel type de nombre/chaîne comme ci-dessus.

4voto

teh_senaus Points 444

Voici le code que j'ai utilisé pour lier rapidement jQuery scrollTo à tous les liens d'ancrage :

// Smooth scroll
$('a[href*=#]').click(function () {
    var hash = $(this).attr('href');
    hash = hash.slice(hash.indexOf('#') + 1);
    $.scrollTo(hash == 'top' ? 0 : 'a[name='+hash+']', 500);
    window.location.hash = '#' + hash;
    return false;
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X