Mit JavaScript zum Anfang der Seite scrollen?

1593

Wie scrolle ich mit JavaScript zum Anfang der Seite? Dies ist auch dann wünschenswert, wenn die Bildlaufleiste sofort nach oben springt. Ich suche kein reibungsloses Scrollen.

KingNestor
quelle
2019, um dies zu vermeiden „Diese Site scheint einen durch Scrollen verknüpften Positionierungseffekt zu verwenden. Dies funktioniert möglicherweise nicht gut mit asynchronem Schwenken. “Verwenden Sie mein Skript stackoverflow.com/a/57641938/5781320
Constantin

Antworten:

2172

Wenn Sie die Änderung nicht zum Animieren benötigen, müssen Sie keine speziellen Plugins verwenden. Ich würde nur die native JavaScript-Methode window.scrollTo verwenden. Wenn Sie 0,0 übergeben, wird die Seite sofort nach links oben gescrollt .

window.scrollTo(x-coord, y-coord);

Parameter

  • x-Koordinate ist das Pixel entlang der horizontalen Achse.
  • y-Koordinate ist das Pixel entlang der vertikalen Achse.
daniellmb
quelle
176
Das war mein Punkt, wenn Sie kein reibungsloses Scrollen animieren müssen, müssen Sie jQuery nicht verwenden.
Daniellmb
23
Witzig, da Jeffs Kommentar ehrlich gesagt für Leute ist, die nur wollen, dass die Dinge in 95% der Fälle browserübergreifend funktionieren, sollten sie einfach jQuery verwenden. Dies kommt von jemandem, der gerade viel reines Javascript schreiben muss, weil wir uns den Overhead einer Bibliothek nicht leisten können, die den Anzeigencode verlangsamt :(
Will
11
Diese Antwort hat nichts mit der Frage zu tun. Es wäre in Ordnung, wenn die Frage lauten würde: Welches Skript und welche Methoden sollte ich verwenden, um zum Anfang der Seite zu scrollen? Die richtige Antwort finden Sie hier: stackoverflow.com/questions/4147112/…
skobaljic
2
Ich arbeite für mich in Firefox 40 und Chrome 44 (um Mikhails Kommentar anzusprechen)
Tony
10
Scrollen Sie zum Ende der Seitewindow.scrollTo(0, document.body.scrollHeight);
Emix
1346

Wenn Sie reibungslos scrollen möchten, versuchen Sie Folgendes:

$("a[href='#top']").click(function() {
  $("html, body").animate({ scrollTop: 0 }, "slow");
  return false;
});

Das wird jedes <a>Tag nehmen, dessen href="#top"und es glatt nach oben scrollen.

Mark Ursino
quelle
+1. Ich habe mich nur gefragt, wie ich so etwas machen soll und Google hat mich hierher geführt. Frage: Wo ist die Funktion "scrollTop" in den Dokumenten? Ich habe nur geschaut, konnte es aber nicht finden.
sqram
22
scrollTop ist keine Funktion, es ist eine Eigenschaft des Fensterelements
Jalal El-Shaer
1
Dies funktioniert nicht richtig, wenn der vollständige Rückruf von animiert verwendet wird, da er zweimal ausgeführt wird.
David Morales
5
"html" und "body" sind beide für die Browserkompatibilität erforderlich, dh Chrome v27 scrollt nur mit "body" und IE8 nicht. IE8 scrollt nur mit "html", Chrome v27 jedoch nicht.
SushiGuy
1
@jalchr Eigentlich window.pageYOffsetwäre das Eigentum des Fensters e̶l̶e̶m̶e̶n̶t̶ Objekt.
Alex W
176

Versuchen Sie dies, um nach oben zu scrollen

<script>
 $(document).ready(function(){
    $(window).scrollTop(0);
});
</script>
mehmood
quelle
Dies ist das gleiche: if ('scrollRestoration' in der Geschichte) {history.scrollRestoration = 'manual'; }
Vasilii Suricov
123

Bessere Lösung mit flüssiger Animation:

// this changes the scrolling behavior to "smooth"
window.scrollTo({ top: 0, behavior: 'smooth' });

Referenz: https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo#Example

Ganesh Ghalame
quelle
Möglicherweise müssen Sie noch Polyfill-Unterstützung für die ScrollOptions(für bestimmte Browser): github.com/iamdustan/smoothscroll
jneuendorf
Ich mag diese Lösung sehr.
SuperManEver
Kann jemand dies auf Safari oder Internet Explorer testen und sehen, ob es gut funktioniert? Danke
Fabio Magarelli
1
@FabioMagarelli Es funktioniert gut auf Safari, nicht auf IE getestet. Um es auf Safari zu testen, öffnen Sie eine Seite, auf der gescrollt und kopiert wurde, und fügen Sie den obigen Code in Developer Tools -> Console ein. Es wird nach oben gescrollt (Safari Version 13.0.5).
Ganesh Ghalame
104

Dazu benötigen Sie jQuery nicht. Ein Standard-HTML-Tag reicht aus ...

<div id="jump_to_me">
    blah blah blah
</div>

<a target="#jump_to_me">Click Here To Destroy The World!</a>
Mathew
quelle
12
+1 Dies ist gut, wenn Sie zu einem bestimmten Element navigieren müssen und nicht nur nach oben.
Ish
38
Verwenden Sie '<a href="#"> Oben </a>', um zum Anfang der Seite zu springen.
Bakanekobrain
3
Dies scheint der beste Weg zu sein, wenn es um SPAs geht
Phil
Nett! Gibt es eine Möglichkeit, das Scrollen reibungslos zu gestalten?
StallingOne
65

Alle diese Vorschläge eignen sich hervorragend für verschiedene Situationen. Für diejenigen, die diese Seite über eine Suche finden, kann man dies auch ausprobieren. JQuery, kein Plug-In, scrollen Sie zum Element.

$('html, body').animate({
    scrollTop: $("#elementID").offset().top
}, 2000);
D. Alexander
quelle
47

glatte Schriftrolle, reines Javascript:

(function smoothscroll(){
    var currentScroll = document.documentElement.scrollTop || document.body.scrollTop;
    if (currentScroll > 0) {
         window.requestAnimationFrame(smoothscroll);
         window.scrollTo (0,currentScroll - (currentScroll/5));
    }
})();
wach auf-neo
quelle
31
<script>
$(function(){
   var scroll_pos=(0);          
   $('html, body').animate({scrollTop:(scroll_pos)}, '2000');
});
</script>

Bearbeiten:

$('html, body').animate({scrollTop:(scroll_pos)}, 2000);

Eine andere Möglichkeit, mit dem oberen und linken Rand zu scrollen:

window.scrollTo({ top: 100, left: 100, behavior: 'smooth' });
Kamlesh
quelle
4
Sind Sie sicher, dass die Dauer als Zeichenfolge in der Animationsfunktion funktioniert?
Yogesh
Sie können für die Dauer der animateFunktion keine Zeichenfolge verwenden. Stattdessen sollten Sie $('html, body').animate({scrollTop:(scroll_pos)}, 2000);
Folgendes
1
Was bringt es, 0 in Klammern zu setzen? ((0)) wird einfach mit 0 bewertet.
Jack Vial
Ja @Jack, du kannst.
Kamlesh
29
<script>

  $("a[href='#top']").click(function() {
     $("html, body").animate({ scrollTop: 0 }, "slow");
     return false;
  });
</script>

in html

<a href="#top">go top</a>
hasancse016
quelle
28

Wirklich seltsam: Diese Frage ist seit fünf Jahren aktiv und es gibt immer noch keine Vanille-JavaScript-Antwort, um das Scrollen zu animieren. Also los geht's:

var scrollToTop = window.setInterval(function() {
    var pos = window.pageYOffset;
    if ( pos > 0 ) {
        window.scrollTo( 0, pos - 20 ); // how far to scroll on each step
    } else {
        window.clearInterval( scrollToTop );
    }
}, 16); // how fast to scroll (this equals roughly 60 fps)

Wenn Sie möchten, können Sie dies in eine Funktion einbinden und über das onclickAttribut aufrufen . Überprüfen Sie diese jsfiddle

Hinweis: Dies ist eine sehr einfache Lösung und möglicherweise nicht die leistungsstärkste. Ein sehr ausführliches Beispiel finden Sie hier: https://github.com/cferdinandi/smooth-scroll

AvL
quelle
6
In der Frage wird jedoch explizit nach einer jQuery-Lösung gefragt. also nicht seltsam
Will
2
Beste Lösung für mich. Keine Plugins, keine umfangreiche JQuery-Bibliothek, nur einfaches Javascript. Kudos
user2840467
Mann, ich habe auch dieselbe Logik XD nach 5 Jahren erstellt, genau dieselbe Logik, nur Werte sind unterschiedlich wie, die Intervallzeit und die ganze Zahl, die wir zum Subtrahieren verwenden, können XD nicht glauben. TBH, bin hierher gekommen, um zu antworten, aber es ist schon da, also habe ich deine Antwort positiv bewertet.
Germa Vinsmoke
27

Wenn Sie reibungslos scrollen möchten, versuchen Sie Folgendes:

$("a").click(function() {
     $("html, body").animate({ scrollTop: 0 }, "slow");
     return false;
});

Eine andere Lösung ist die JavaScript-Methode window.scrollTo:

 window.scrollTo(x-value, y-value);

Parameter:

  • Der x-Wert ist das Pixel entlang der horizontalen Achse.
  • Der y-Wert ist das Pixel entlang der vertikalen Achse.
Gaurang Sondagar
quelle
7
Nachahmer ... siehe Benutzerantworten ... Dies ist nur eine Zusammenstellung der Top 2 Antworten ....
Laurent B
Dies ist eine legitime Möglichkeit, den Stackoverflow zu verwenden. Es ist praktischer, ihn an einem Ort zu haben. Joel Spolsky verwendete die Wiederverwendung vorhandener Antworten als Beispiel dafür, wie der Stapelüberlauf an einem Punkt funktionieren soll. Wenn Sie interessiert sind, kann ich versuchen, den Blog-Beitrag zu finden
Edgar H
26

Mit window.scrollTo(0, 0);ist sehr schnell,
also habe ich das Mark Ursino-Beispiel ausprobiert, aber in Chrome passiert nichts
und ich habe dies gefunden

$('.showPeriodMsgPopup').click(function(){
    //window.scrollTo(0, 0);
    $('html').animate({scrollTop:0}, 'slow');//IE, FF
    $('body').animate({scrollTop:0}, 'slow');//chrome, don't know if Safari works
    $('.popupPeriod').fadeIn(1000, function(){
        setTimeout(function(){$('.popupPeriod').fadeOut(2000);}, 3000);
    });
});


Ich habe alle 3 Browser getestet und es funktioniert. Ich verwende Blueprint-CSS.
Wenn ein Kunde auf die Schaltfläche "Jetzt buchen" klickt und die Mietdauer nicht ausgewählt ist, bewegt er sich langsam an die Spitze der Kalender und öffnet einen Dialog, auf den div zeigt die 2 Felder, nach 3 Sekunden wird es ausgeblendet

Luiggi ZAMOL
quelle
Vielen Dank für den Hinweis, dass Sie sowohl auf HTML als auch auf den Körper abzielen müssen. Ich habe es nur für HTML gemacht und mich gefragt, warum es in Chrome nicht funktioniert hat.
Jared
Die Körperanimation funktioniert in Safari, daher aktualisiere ich Ihre Antwort entsprechend.
Dave DuPlantis
46
" Alle 3 Browser getestet "? Midori, LuaKit und Konqueror, richtig? : p
Anko
14
Warum nicht einfach $ ('html', 'body'). Animieren ({scrollTop: 0}), anstatt zwei Zeilen hinzuzufügen?
Matt Smith
23

Eine Menge von Benutzern empfiehlt die Auswahl sowohl die HTML - und Body - Tags für Cross-Browser - Kompatibilität, etwa so:

$('html, body').animate({ scrollTop: 0 }, callback);

Dies kann Sie jedoch stören, wenn Sie darauf zählen, dass Ihr Rückruf nur einmal ausgeführt wird. Es wird tatsächlich zweimal ausgeführt, da Sie zwei Elemente ausgewählt haben.

Wenn das ein Problem für Sie ist, können Sie Folgendes tun:

function scrollToTop(callback) {
    if ($('html').scrollTop()) {
        $('html').animate({ scrollTop: 0 }, callback);
        return;
    }

    $('body').animate({ scrollTop: 0 }, callback);
}

Der Grund dafür ist, dass in Chrome $('html').scrollTop()0 zurückgegeben wird, in anderen Browsern wie Firefox jedoch nicht.

Wenn Sie nicht warten möchten, bis die Animation abgeschlossen ist, falls sich die Bildlaufleiste bereits oben befindet, versuchen Sie Folgendes:

function scrollToTop(callback) {
    if ($('html').scrollTop()) {
        $('html').animate({ scrollTop: 0 }, callback);
        return;
    }

    if ($('body').scrollTop()) {
        $('body').animate({ scrollTop: 0 }, callback);
        return;
    }

    callback();
}
Big McLargeHuge
quelle
19

Der Alte #topkann den Trick machen

document.location.href = "#top";

Funktioniert gut in FF, IE und Chrome

Pollirrata
quelle
Nett! Gibt es eine Möglichkeit, das Scrollen reibungslos zu gestalten?
StallingOne
Sie sollten navigationsbasierte Lösungen vermeiden, siehe Kommentare zu Sriramajeyams Antwort.
Andrew Grothe
15

$(".scrolltop").click(function() {
  $("html, body").animate({ scrollTop: 0 }, "slow");
  return false;
});
.section{
 height:400px;
}
.section1{
  background-color: #333;
}
.section2{
  background-color: red;
}
.section3{
  background-color: yellow;
}
.section4{
  background-color: green;
}
.scrolltop{
  position:fixed;
  right:10px;
  bottom:10px;
  color:#fff;
}
<html>
<head>
<title>Scroll top demo</title>
<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
</head>
<body>
<div class="content-wrapper">
<div class="section section1"></div>
<div class="section section2"></div>
<div class="section section3"></div>
<div class="section section4"></div>
<a class="scrolltop">Scroll top</a>
</div>

</body>
</html>

Arvinda Kumar
quelle
3
Während dieser Code die Frage beantworten kann, verbessert die Bereitstellung von Informationen darüber, wie und warum er das Problem löst, seinen langfristigen Wert
L_J
Erkläre deine Antwort!
Ullas Hunka
Auf einer Webseite klickt jeder Benutzer auf die Schaltfläche "Bildlauf nach oben" und die Seite mit der Animation nach oben.
Arvinda Kumar
Warum animieren () statt jquery scroll ()?
Akin Hwan
14

Versuche dies

<script>
    $(window).scrollTop(100);
</script>
Renjith
quelle
14

$(document).scrollTop(0); funktioniert auch.

Hari Ganesan
quelle
2
Beachten Sie, dass dies nicht funktioniert, wenn Sie Firefox nicht verwenden. Sie erhalten eine Fehlermeldung, wenn Sie nur ein Argument angeben (Fehler: Nicht genügend Argumente [nsIDOMWindow.scrollTo]).
Husky
14

Nicht-jQuery-Lösung / reines JavaScript:

document.body.scrollTop = document.documentElement.scrollTop = 0;
tfont
quelle
14

Das wird funktionieren:

window.scrollTo(0, 0);

Santosh Jadi
quelle
3
Dies war die beste Antwort
OG Sean
10

Versuchen Sie diesen Code:

$('html, body').animate({
    scrollTop: $("div").offset().top
}, time);

div => Dom Element, in das Sie den Bildlauf verschieben möchten.

Zeit => Millisekunden, definieren Sie die Geschwindigkeit des Bildlaufs.

Wasif Ali
quelle
9

Reine JavaScript-Lösung:

function scrollToTop() {
  window.scrollTo({
    top: 0,
    behavior: 'smooth'
});

Ich schreibe eine animierte Lösung auf Codepen

Sie können auch eine andere Lösung mit CSS- scroll-behavior: smoothEigenschaft ausprobieren .

html {
    scroll-behavior: smooth;
}

@media (prefers-reduced-motion: reduce) {
    html {
        scroll-behavior: auto;
    }
}
Saeed Hassanvand
quelle
8

Warum verwenden Sie nicht die in JQuery integrierte Funktion scrollTop:

$('html, body').scrollTop(0);//For scrolling to top

$("body").scrollTop($("body")[0].scrollHeight);//For scrolling to bottom

Kurz und einfach!

Sandeep Gantait
quelle
Sie vermissen nur den Link zum Dokument
Cyril Duchon-Doris
8

Sie brauchen JQuery nicht. Sie können einfach das Skript aufrufen

window.location = '#'

Klicken Sie auf die Schaltfläche "Nach oben"

Beispieldemo:

output.jsbin.com/fakumo#

PS: Verwenden Sie diesen Ansatz nicht, wenn Sie moderne Bibliotheken wie anglejs verwenden. Das könnte den URL-Hashbang kaputt machen.

Sriramajeyam Sugumaran
quelle
9
Leider ist dies nicht die beste Lösung, da Sie in diesem Fall den Standort physisch ändern, anstatt die Seite zu scrollen. Dies kann zu Problemen führen, wenn der Standort wichtig ist (bei Verwendung von Angular Routing oder so)
Yaroslav Rogoza
2
@ JaroslavRogoza ist korrekt. Obwohl es in einfachen Fällen funktionieren kann , würde ich diese Lösung nicht empfehlen. Der Standort wird immer wichtiger und Apps mit nur einer Seite verwenden den Hash häufig für die Navigation. Sie würden sofort einen Nebenwirkungsfehler einführen, wenn Sie entweder eine Hash-basierte Navigation danach oder eine Hash-basierte Navigation hinzufügen.
Andrew Grothe
8

Verwenden Sie einfach dieses Skript, um direkt nach oben zu scrollen.

<script>
$(document).ready(function(){
    $("button").click(function(){
        ($('body').scrollTop(0));
    });
});
</script>
Gayashan Perera
quelle
7

Wenn Sie keinen reibungslosen Bildlauf wünschen, können Sie die Animation für den reibungslosen Bildlauf betrügen und stoppen, sobald Sie sie starten ... wie folgt:

   $(document).ready(function() {
      $("a[href='#top']").click(function() {
          $("html, body").animate({ scrollTop: 0 }, "1");              
          $('html, body').stop(true, true);

          //Anything else you want to do in the same action goes here

          return false;                              
      });
  });

Ich habe keine Ahnung, ob es empfohlen / erlaubt ist, aber es funktioniert :)

Wann würden Sie dies verwenden? Ich bin mir nicht sicher, aber vielleicht, wenn Sie einen Klick verwenden möchten, um eine Sache mit Jquery zu animieren, aber eine andere ohne Animation? Öffnen Sie also oben auf der Seite ein Anmelde-Admin-Anmeldefenster und springen Sie sofort nach oben, um es anzuzeigen.

Jon Story
quelle
6

Motivation

Diese einfache Lösung funktioniert nativ und implementiert einen reibungslosen Bildlauf zu einer beliebigen Position.

Es wird vermieden, Ankerlinks (solche mit #) zu verwenden, die meiner Meinung nach nützlich sind, wenn Sie auf einen Abschnitt verlinken möchten, aber in einigen Situationen nicht so komfortabel sind, insbesondere wenn Sie nach oben zeigen, was dazu führen kann, dass zwei verschiedene URLs auf die verweisen gleicher Ort ( http://www.example.org und http://www.example.org/# ).

Lösung

Fügen Sie dem Tag, zu dem Sie scrollen möchten, eine ID hinzu , z. B. Ihrem ersten Abschnitt , in dem diese Frage beantwortet wird. Die ID kann jedoch überall auf der Seite platziert werden.

<body>
  <section id="top">
    <!-- your content -->
  </section>
  <div id="another"><!-- more content --></div>

Dann können Sie als Schaltfläche einen Link verwenden. Bearbeiten Sie einfach das onclick- Attribut mit einem Code wie diesem.

<a onclick="document.getElementById('top').scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' })">Click me</a>

Wobei das Argument von document.getElementByIddie ID des Tags ist, zu dem Sie nach dem Klicken scrollen möchten.

Gianluca Casati
quelle
Danke! ist eine großartige Lösung
Hugo Stiven Laguna Rueda
@HugoStivenLagunaRueda Gern geschehen, ich habe es auf MDN gefunden, also danke an Mozilla. Es ist großartig, wie viele Dinge bereits vorhanden sind, die von Haus aus unterstützt werden. Ich liebe Vanille JS.
Gianluca Casati
5

Sie können einfach ein Ziel aus Ihrem Link verwenden, z. B. #someid, wobei #someid die ID des Divs ist.

Sie können auch eine beliebige Anzahl von Bildlauf-Plugins verwenden, die dies eleganter machen.

http://plugins.jquery.com/project/ScrollTo ist ein Beispiel.

ScottE
quelle
4

Sie können versuchen, JS wie in dieser Geige zu verwenden http://jsfiddle.net/5bNmH/1/

Fügen Sie die Schaltfläche "Nach oben" in Ihre Seitenfußzeile ein:

<footer>
    <hr />
    <p>Just some basic footer text.</p>
    <!-- Go to top Button -->
    <a href="#" class="go-top">Go Top</a>
</footer>
Asertym
quelle
4
function scrolltop() {

    var offset = 220;
    var duration = 500;

    jQuery(window).scroll(function() {
        if (jQuery(this).scrollTop() > offset) {
            jQuery('#back-to-top').fadeIn(duration);
        } else {
            jQuery('#back-to-top').fadeOut(duration);
        }
    });

    jQuery('#back-to-top').click(function(event) {
        event.preventDefault();
        jQuery('html, body').animate({scrollTop: 0}, duration);
        return false;
    });
}
Mardzis
quelle
4

Keine der oben genannten Antworten funktioniert in SharePoint 2016.

Dies muss folgendermaßen erfolgen: /sharepoint/195870/

var w = document.getElementById("s4-workspace");
w.scrollTop = 0;
Jeancallisti
quelle