jQuery faites défiler JUSQU'à L'ID de la page différente

J'essayais d'utiliser le défilement de page de jQuery dans certaines pages et je pouvais réussir à faire un défilement de page lisse. Le seul problème que j'ai maintenant est en essayant de le faire à partir d'une page différente. Ce que je veux dire par là, c'est que si je clique sur un lien dans une page, il devrait charger la nouvelle page, puis faire défiler jusqu'à l'élément div spécifique.

Voici le code que j'ai utilisé pour faire défiler la page:

var jump=function(e)
{
       //prevent the "normal" behaviour which would be a "hard" jump
       e.preventDefault();
   //Get the target
   var target = $(this).attr("href");
   //perform animated scrolling
   $('html,body').animate(
   {
           //get top-position of target-element and set it as scroll target
           scrollTop: $(target).offset().top
   //scrolldelay: 2 seconds
   },2000,function()
   {
           //attach the hash (#jumptarget) to the pageurl
           location.hash = target;
   });

}

$(document).ready(function()
{
       $('a[href*=#]').bind("click", jump);
       return false;
});

J'espère que l'idée est claire.

Merci

Très important Note : Ce code que j'ai posté ci-dessus fonctionne très bien dans la même page, mais ce que je recherche est de cliquer sur un lien d'une page et d'aller à une autre, puis de faire défiler jusqu'à la cible. J'espère que c'est clair maintenant. Merci

46
demandé sur Zach Saucier 2012-03-11 10:26:56

7 réponses

Vous devez essentiellement faire ceci:

  • incluez le hachage cible dans le lien pointant vers l'autre page (href="other_page.html#section")
  • dans votre gestionnaire ready effacez le défilement de saut dur normalement dicté par le hachage et faites défiler la page dès que possible vers le haut et appelez jump() - vous devrez le faire de manière asynchrone
  • dans jump() si aucun événement n'est donné, faire location.hash la cible
  • en outre, cette technique pourrait ne pas attraper le saut dans le temps, de sorte que vous feriez mieux de cacher le html,body tout de suite et montrez-le une fois que vous l'avez fait défiler à zéro

C'est votre code avec ce qui précède ajouté:

var jump=function(e)
{
   if (e){
       e.preventDefault();
       var target = $(this).attr("href");
   }else{
       var target = location.hash;
   }

   $('html,body').animate(
   {
       scrollTop: $(target).offset().top
   },2000,function()
   {
       location.hash = target;
   });

}

$('html, body').hide();

$(document).ready(function()
{
    $('a[href^=#]').bind("click", jump);

    if (location.hash){
        setTimeout(function(){
            $('html, body').scrollTop(0).show();
            jump();
        }, 0);
    }else{
        $('html, body').show();
    }
});

Vérifié travailler dans Chrome / Safari, Firefox et Opera. Je ne sais pas à propos de IE cependant.

61
répondu Petr Vostrel 2012-03-26 10:34:39

Sur le lien mettre un hachage:

<a href="otherpage.html#elementID">Jump</a>

Et sur une autre page, vous pouvez faire:

$('html,body').animate({
  scrollTop: $(window.location.hash).offset().top
});

Sur une autre page, vous devriez avoir un élément avec id défini sur elementID pour faire défiler vers. Bien sûr, vous pouvez changer le nom de celui-ci.

19
répondu Sarfraz 2012-03-11 06:35:19

En combinant les réponses de Petr et Sarfraz, j'arrive à ce qui suit.

À la page1.html:

<a href="page2.html#elementID">Jump</a>

Sur la page2.html:

<script type="text/javascript">
    $(document).ready(function() {
        $('html, body').hide();

        if (window.location.hash) {
            setTimeout(function() {
                $('html, body').scrollTop(0).show();
                $('html, body').animate({
                    scrollTop: $(window.location.hash).offset().top
                    }, 1000)
            }, 0);
        }
        else {
            $('html, body').show();
        }
    });
</script>
9
répondu zanetu 2012-10-26 04:33:53

Je recommande d'utiliser le plugin scrollTo

Http://demos.flesler.com/jquery/scrollTo/

Vous pouvez définir le scrollto par le sélecteur CSS jquery.

$('html,body').scrollTo( $(target), 800 );

J'ai eu beaucoup de chance avec la précision de ce plugin et de ses méthodes, où d'autres méthodes pour obtenir le même effet comme l'utilisation de .offset() ou .position() n'ont pas réussi à être cross browser pour moi dans le passé. Ne pas dire que vous ne pouvez pas utiliser de telles méthodes, je suis sûr qu'il y a un moyen de le faire cross browser, j'ai juste trouvé scrollTo pour être plus fiable.

6
répondu Fresheyeball 2012-03-21 18:35:37

J'ai fait un plugin réutilisable qui peut le faire... J'ai laissé la liaison aux événements en dehors du plugin lui-même parce que je pense qu'il est trop intrusif pour un si petit assistant....

jQuery(function ($) {

    /**
     * This small plugin will scrollTo a target, smoothly
     *
     * First argument = time to scroll to the target
     * Second argument = set the hash in the current url yes or no
     */
    $.fn.smoothScroll = function(t, setHash) {
        // Set time to t variable to if undefined 500 for 500ms transition
        t = t || 500;
        setHash = (typeof setHash == 'undefined') ? true : setHash;

        // Return this as a proper jQuery plugin should
        return this.each(function() {
            $('html, body').animate({
                scrollTop: $(this).offset().top
            }, t);

            // Lets set the hash to the current ID since if an event was prevented this doesn't get done
            if (this.id && setHash) {
                window.location.hash = this.id;
            }
        });
    };

});

Maintenant, nous pouvons onload juste faire ceci, vérifier un hachage et si c'est là essayer de l'utiliser directement comme sélecteur pour jQuery. Maintenant, je ne pouvais pas facilement tester cela à l'époque, mais j'ai fait des choses similaires pour les sites de production il n'y a pas longtemps, si cela ne fonctionne pas immédiatement, faites-le moi savoir et je vais regarder la solution que j'ai obtenue y.

(le script doit être dans une section onload)

if (window.location.hash) {
    window.scrollTo(0,0);
    $(window.location.hash).smoothScroll();
}

Ensuite, nous lions le plugin à onclick des ancres qui ne contiennent qu'un hachage dans leur attribut href.

(le script doit être dans une section onload)

$('a[href^="#"]').click(function(e) {
    e.preventDefault();

    $($(this).attr('href')).smoothScroll();
});

Puisque jQuery ne fait rien si le match lui-même échoue, nous avons une bonne solution de repli pour quand une cible sur une page ne peut pas être trouvée yay \ o /

Mise à Jour

Gestionnaire onclick alternatif pour faire défiler vers le haut quand il n'y a qu'un hachage:

$('a[href^="#"]').click(function(e) {
    e.preventDefault();
    var href = $(this).attr('href');

    // In this case we have only a hash, so maybe we want to scroll to the top of the page?
    if(href.length === 1) { href = 'body' }

    $(href).smoothScroll();
});

Voici aussi un simple jsfiddle qui démontre le défilement dans la page, onload est un peu difficile à mettre en place...

Http://jsfiddle.net/sg3s/bZnWN/

Mise à Jour 2

Vous pourriez donc avoir des problèmes avec la fenêtre qui défile déjà vers l'élément onload. Cela corrige que: window.scrollTo(0,0); il fait simplement défiler la page vers le haut à gauche. Ajouté à l'extrait de code ci-dessus.

2
répondu sg3s 2012-03-21 22:57:46
function scroll_down(){
    $.noConflict();
    jQuery(document).ready(function($) {
        $('html, body').animate({
            scrollTop : $("#bottom").offset().top
        }, 1);
    });
    return false;
}

Ici "bottom" est l'id de balise div où vous voulez faire défiler. Pour changer les effets d'animation, vous pouvez changer l'Heure de '1' à une valeur différente

2
répondu 2012-03-25 17:34:40

J'ai écrit quelque chose qui détecte si la page contient l'ancre sur laquelle on a cliqué, et sinon, va à la page normale, sinon elle défile vers la section spécifique:

$('a[href*=\\#]').on('click',function(e) {

    var target = this.hash;
    var $target = $(target);
    console.log(targetname);
    var targetname = target.slice(1, target.length);

    if(document.getElementById(targetname) != null) {
         e.preventDefault();
    }
    $('html, body').stop().animate({
        'scrollTop': $target.offset().top-120 //or the height of your fixed navigation 

    }, 900, 'swing', function () {
        window.location.hash = target;
  });
});
0
répondu John-Henry 2017-09-12 12:25:37