So scrollen Sie mit der Funktion JQuery $ .scrollTo () durch das Fenster


98

Ich versuche jedes Mal, wenn der Benutzer sich dem oberen Rand des Dokuments nähert, um 100 Pixel nach unten zu scrollen.

Ich habe die Funktion ausgeführt, wenn der Benutzer sich dem oberen Rand des Dokuments nähert, aber die .scrollTo-Funktion funktioniert nicht.

Ich habe nach und vor eine Warnung eingefügt, um zu überprüfen, ob tatsächlich die Leitung sie gestoppt hat oder nicht, und nur die erste Warnung wird ausgelöst. Hier ist der Code:

alert("starting");
$.scrollTo({ top: '+=100px', left: '+=0px' }, 800);
alert("finished");

Ich weiß, dass ich die JQuery-Seite richtig verlinkt habe, weil ich viele andere JQuery-Funktionen verwende und sie alle gut funktionieren. Ich habe auch versucht, das 'px' von oben zu entfernen, und es scheint keinen Unterschied zu machen.


3
Jquery selbst funktioniert einwandfrei, aber sind Sie sicher, dass das scrollTo-Plugin richtig verlinkt ist? Ändern Sie eine dieser Warnungen in Warnung ($. ScrollTo).
Andrew

Antworten:


97

Wenn es nicht funktioniert, warum versuchen Sie es nicht mit der scrollTop-Methode von jQuery?

$("#id").scrollTop($("#id").scrollTop() + 100);

Wenn Sie reibungslos scrollen möchten, können Sie die grundlegende Javascript-Funktion setTimeout / setInterval verwenden, um einen Bildlauf in Schritten von 1 Pixel über einen festgelegten Zeitraum durchzuführen.


8
Hinweis: Wenn Sie die gesamte Seite und nicht ein einzelnes Element scrollen möchten, verwenden Sie $ ('html, body'), genau wie Tim es hier gezeigt hat. Nur $ ('body') funktioniert nicht in allen Browsern.
i--

321
$('html, body').animate({scrollTop: $("#page").offset().top}, 2000);

19
Ich habe mich oft gefragt, warum Leute 'html, body' für scrollTop anstelle von 'html' verwenden. Irgendwelche Gedanken dazu?
Scott Greenfield

+1 hat für mich gearbeitet;) Ich bin auch interessiert zu wissen warum warum html, bodystatt nur html?
Kato

9
@ScottGreenfield, @Kato: Ich weiß nicht warum, aber dieser Kommentar besagt body, dass dies in Chrome 4 nicht enthalten ist: stackoverflow.com/questions/1890995/…
Yuji 'Tomita' Tomita

scrollTop: 0funktioniert auch gut. Aber die Dauer sinkt. Funktioniert gut, wenn 1000 in Geschwindigkeit eingestellt ist
Shashwat

Dies ist eine gute Lösung, bis Sie eine vollständige Methode hinzufügen möchten - sie wird zweimal ausgeführt. Die Lösung von @complistic ist eleganter und wird dies verhindern.
Plankguy

41

jQuery unterstützt jetzt scrollTop als Animationsvariable.

$("#id").animate({"scrollTop": $("#id").scrollTop() + 100});

Sie müssen setTimeout / setInterval nicht mehr einstellen, um reibungslos zu scrollen.


Ich habe einige Syntaxfehler - es fehlt Ihr Abschluss {. Ansonsten ist dies ein guter Punkt.
Joshua

1
Sollte es $("#id").offset().topstattdessen sein?
Codeulike

15

Um das htmlvs- bodyProblem zu umgehen , habe ich dies behoben, indem ich das CSS nicht direkt animierte, sondern window.scrollTo();jeden Schritt aufrief :

$({myScrollTop:window.pageYOffset}).animate({myScrollTop:300}, {
  duration: 600,
  easing: 'swing',
  step: function(val) {
    window.scrollTo(0, val);
  }
});

Dies funktioniert gut ohne Aktualisierungsprobleme, da es browserübergreifendes JavaScript verwendet.

Werfen Sie einen Blick auf http://james.padolsey.com/javascript/fun-with-jquerys-animate/ für weitere Informationen darüber , was Sie mit jQuery animieren Funktion tun können.


1
Das ist brilliant. Ich habe nur window.pageYOffsetzu $(window).scrollTop()und window.scrollTo(0, val)zu gewechselt , $(window).scrollTop(val)damit ich mir keine Sorgen um die Browserkompatibilität machen muss.
leftclickben

1
Ich hätte nie gedacht, ein Objekt so an jQuerys Animationsmethode zu übergeben. So viele Verwendungsmöglichkeiten. Diese Lösung ist großartig, danke.
Synexis

Ja, Technik ist ein bedeutender Beitrag. Bisher wurden Browserprobleme durch die direkte Verwendung von "window.scrollTo ()" umgangen, aber dies ermöglicht weder einen "vollständigen" Rückruf noch ein Versprechen. Vielen Dank an @complistic für diese Lösung. Auch mein Dank geht an @leftclickben; Ich habe seine Variation mit ".scrollTop ()" implementiert. Auch der Artikel "james.padolsey" pro Link ist eine knappe, sehr lohnende Lektüre.
IAM_AL_X

Ich denke, dass "window.scrollTo ()" mit allen modernen Browsern kompatibel sein sollte.
IAM_AL_X

7

Sieht so aus, als hätten Sie eine etwas falsche Syntax ... Ich gehe davon aus, dass Sie basierend auf Ihrem Code versuchen, 100px in 800 ms nach unten zu scrollen. Wenn ja, funktioniert dies (mit scrollTo 1.4.1):

$.scrollTo('+=100px', 800, { axis:'y' });

6

Eigentlich so etwas wie

function scrollTo(prop){
    $('html,body').animate({scrollTop: $("#"+prop).offset().top +
 parseInt($("#"+prop).css('padding-top'),10) },'slow');
}

funktioniert gut und unterstützt die Polsterung. Sie können Ränder auch problemlos unterstützen - zur Vervollständigung siehe unten

function scrollTo(prop){
    $('html,body').animate({scrollTop: $("#"+prop).offset().top 
+ parseInt($("#"+prop).css('padding-top'),10) 
+ parseInt($("#"+prop).css('margin-top'),10) +},'slow');
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.