2013-05-10 15 views
133

Ich stelle die Seite so ein, dass sie nach oben blättert, wenn auf eine Schaltfläche geklickt wird. Aber zuerst habe ich eine if-Anweisung verwendet, um zu sehen, ob der obere Rand der Seite nicht auf 0 gesetzt wurde. Wenn es nicht 0 ist, animiere ich die Seite, um nach oben zu scrollen.jQuery .scrollTop(); + Animation

var body = $("body"); 
var top = body.scrollTop() // Get position of the body 

if(top!=0) 
{ 
    body.animate({scrollTop:0}, '500'); 
} 

Der schwierige Teil ist nun etwas zu animieren, nachdem die Seite nach oben gescrollt wurde. Also mein nächster Gedanke ist, herauszufinden, was die Seitenposition ist. Also habe ich das Konsolenprotokoll benutzt, um es herauszufinden.

console.log(top); // the result was 365 

Dies gab mir ein Ergebnis von 365, ich nehme an, dass die Position der Nummer I bei nur nach oben, bevor Scrollen war ist.

Meine Frage ist, wie setze ich die Position auf 0, so dass ich eine weitere Animation hinzufügen kann, die ausgeführt wird, sobald die Seite bei 0 ist?

Danke!

+1

es ist erforderlich, dass diese taste, auf der sie feuern, immer sichtbar ist? Wenn nicht, dann habe ich einen Code, der keine Bedingung braucht, die für Ihre erste Bedingung leicht sein kann –

+0

Es sollte keine Anführungszeichen um die Millisekunden geben. Die "Zeichenfolge", auf die sich die Dokumentation bezieht, sind die langsamen/schnellen – mplungjan

Antwort

238

Um dies zu tun, können Sie eine Rückruffunktion für den Animate-Befehl festlegen, die ausgeführt wird, nachdem die Bildlaufanimation beendet wurde.

Zum Beispiel:

var body = $("html, body"); 
body.stop().animate({scrollTop:0}, 500, 'swing', function() { 
    alert("Finished animating"); 
}); 

Wo der Alarm-Code ist, können Sie mehr Javascript ausführen in weiterer Animation hinzuzufügen.

Auch die 'Swing' ist da, um die Lockerung zu setzen. Check out http://api.jquery.com/animate/ für weitere Informationen.

+1

Danke Thomas, das habe ich gebraucht. Ich habe auch eine Verzögerung hinzugefügt, da die Klasse so schnell hinzugefügt wird. if (top! = 0) { console.log ("verdeckte Scroll"); body.animate ({scrollTop: 0}, '500', 'schwingen', function() { \t console.log ("Fertige Animation"); \t leftitems.delay (1000) .removeClass ("Folie") ; \t }); } –

+0

Ich musste animieren Dauer ohne Anführungszeichen, wenn ich nur 2 Parameter für Animate-Funktion hatte. Das war merkwürdig. – iMatoria

+5

Ich bin nicht sicher, ob es ist, weil dieser Beitrag 4 Jahre alt ist, aber ich denke, in neueren Versionen von jQuery müssen Sie diese einfachen Anführungszeichen um das Timing entfernen: body.animate ({scrollTop: 0}, 500, 'swing' , function() { alert ("Beendetes Animieren"); }); – Andrew

4

für das Sie Callback-Methode

body.animate({ 
     scrollTop:0 
    }, 500, 
    function(){} // callback method use this space how you like 
); 
6

Versuchen Sie stattdessen verwenden können:

var body = $("body, html"); 
var top = body.scrollTop() // Get position of the body 
if(top!=0) 
{ 
     body.animate({scrollTop :0}, 500,function(){ 
     //DO SOMETHING AFTER SCROLL ANIMATION COMPLETED 
      alert('Hello'); 
     }); 
} 
35

diesen Code Versuchen:

$('.Classname').click(function(){ 
     $("html, body").animate({ scrollTop: 0 }, 600); 
     return false; 
}); 
+3

'$ (" html ")' sollte stattdessen verwendet werden, denn in Ihrem Fall, wenn Sie eine Callback-Funktion hinzufügen, wird es zweimal aufgerufen, einmal für * html * und einmal für * body *. Und mit * body * wird nichts gemacht. – Flawyte

+5

scheint das vom Browser abhängig zu sein. in einigen Fällen kann $ ('html') nichts tun, also müssen Sie beide verwenden und auf den Rückruf, der zweimal ausgelöst wird, achten. – commonpike

20

verwenden:

$('a[href^="#"]').on('click', function(event) { 

    var target = $($(this).attr('href')); 

    if(target.length) { 
     event.preventDefault(); 
     $('html, body').animate({ 
      scrollTop: target.offset().top 
     }, 500); 
    } 

}); 
+0

Das ist der beste Weg. Vielen Dank. – programmer138200

+0

np hoffe, dass Sie es nützlich fanden – Beep

+0

Eine andere Abstimmung dafür, nett und prägnant. – phynam

2

Code mit Klick-Funktion()

var body = $('html, body'); 

    $('.toTop').click(function(e){ 
     e.preventDefault(); 
     body.animate({scrollTop:0}, 500, 'swing'); 

}); 

.toTop = Klasse geklickt Element vielleicht img oder a

0
jQuery("html,body").animate({scrollTop: jQuery("#your-elemm-id-where you want to scroll").offset().top-<some-number>}, 500, 'swing', function() { 
     alert("Finished animating"); 
    }); 
0

Einfache Lösung:

auf ein beliebiges Element von ID oder Verschieben des Namens:

SmoothScrollTo("elementId", 1000); 

code:

function SmoothScrollTo(id_or_Name, timelength){ 
    var timelength = timelength || 1000; 
    $('html, body').animate({ 
     scrollTop: $("#"+id_or_Name).offset().top-70 
    }, timelength, function(){ 
     window.location.hash = id_or_Name; 
    }); 
}