Faites défiler vers le haut de la page en utilisant JavaScript?

1594

Comment faire défiler vers le haut de la page en utilisant un JavaScript? Il est souhaitable même si la barre de défilement saute instantanément vers le haut. Je ne recherche pas un défilement fluide.

KingNestor
la source
2019, pour éviter «Ce site semble utiliser un effet de positionnement lié au défilement. Cela peut ne pas fonctionner correctement avec le panoramique asynchrone », utilise mon script stackoverflow.com/a/57641938/5781320
Constantin

Réponses:

2173

Si vous n'avez pas besoin du changement pour animer, vous n'avez pas besoin d'utiliser de plugins spéciaux - j'utiliserais simplement la méthode native window.scrollTo de JavaScript - passer 0,0 fera défiler la page en haut à gauche instantanément .

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

Paramètres

  • x-coord est le pixel le long de l'axe horizontal.
  • coordonnée y est le pixel le long de l'axe vertical.
daniellmb
la source
176
C'était mon point, si vous n'avez pas besoin d'animer un défilement fluide, vous n'avez pas besoin d'utiliser jQuery.
daniellmb
23
Drôle car le commentaire de jeff est honnêtement pour les personnes qui veulent simplement que les choses fonctionnent dans tous les navigateurs 95% du temps devraient simplement utiliser jQuery. Cela vient de quelqu'un qui doit écrire beaucoup de javascript pur en ce moment parce que nous ne pouvons pas nous permettre les frais généraux d'une bibliothèque ralentissant le code d'annonce :(
Will
11
Cette réponse n'a rien à voir avec la question. Ce serait bien si la question était: Quel script et quelles méthodes dois-je utiliser pour faire défiler vers le haut de la page? La bonne réponse est ici: stackoverflow.com/questions/4147112/…
skobaljic
2
Travailler pour moi dans Firefox 40 et Chrome 44 (pour répondre au commentaire de Mikhail)
Tony
10
Faites défiler vers le bas de la pagewindow.scrollTo(0, document.body.scrollHeight);
emix
1347

Si vous voulez un défilement fluide, essayez quelque chose comme ceci:

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

Cela prendra n'importe quelle <a>balise href="#top"et la rendra lisse défiler vers le haut.

Mark Ursino
la source
+1. Je me demandais juste comment faire quelque chose comme ça et Google m'a conduit ici. Question cependant, où est la fonction "scrollTop" dans les documents? J'ai juste regardé mais je n'ai pas pu le trouver.
sqram
22
scrollTop n'est pas une fonction, c'est une propriété de l'élément window
Jalal El-Shaer
1
Cela ne fonctionne pas correctement lors de l'utilisation du rappel complet d'animation, car il sera exécuté deux fois.
David Morales
5
"html" et "body" sont tous deux requis pour la compatibilité du navigateur, c'est-à-dire que Chrome v27 ne fait défiler qu'avec "body" et IE8 non. IE8 défile avec juste "html" mais pas Chrome v27.
SushiGuy
1
@jalchr En fait, window.pageYOffsetserait la propriété de l'objet window e̶l̶e̶m̶e̶n̶t̶.
Alex W
176

Essayez ceci pour faire défiler en haut

<script>
 $(document).ready(function(){
    $(window).scrollTop(0);
});
</script>
mehmood
la source
c'est la même chose: if ('scrollRestoration' dans l'histoire) {history.scrollRestoration = 'manual'; }
Vasilii Suricov
123

Meilleure solution avec une animation fluide:

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

Référence: https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo#Example

Ganesh Ghalame
la source
Il se peut que vous ayez encore besoin de polyfill pour ScrollOptions(pour certains navigateurs): github.com/iamdustan/smoothscroll
jneuendorf
J'aime beaucoup cette solution.
SuperManEver
Quelqu'un peut-il tester cela sur Safari ou Internet Explorer et voir si cela fonctionne bien? Merci
Fabio Magarelli
1
@FabioMagarelli Son fonctionne bien sur Safari, non testé sur IE. Pour votre test sur safari, ouvrez n'importe quelle page qui a défilement et copiez collez le code ci-dessus dans Developer Tools -> Console, il défilera vers le haut vérifié (Safari version 13.0.5).
Ganesh Ghalame
104

Vous n'avez pas besoin de jQuery pour ce faire. Une balise HTML standard suffira ...

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

<a target="#jump_to_me">Click Here To Destroy The World!</a>
Mathew
la source
12
+1 C'est bien si vous devez naviguer vers un élément spécifique plutôt que vers le haut.
Ish
38
Utilisez «<a href="#"> Haut </a>» pour passer en haut de la page.
Bakanekobrain
3
Cela semble être la meilleure façon de faire face aux SPA
Phil
Agréable! Existe-t-il un moyen de rendre le défilement fluide?
stallingOne
65

Toutes ces suggestions fonctionnent très bien pour diverses situations. Pour ceux qui trouvent cette page par une recherche, on peut aussi donner ce un essai. JQuery, pas de plug-in, faites défiler jusqu'à l'élément.

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

défilement fluide, pur javascript:

(function smoothscroll(){
    var currentScroll = document.documentElement.scrollTop || document.body.scrollTop;
    if (currentScroll > 0) {
         window.requestAnimationFrame(smoothscroll);
         window.scrollTo (0,currentScroll - (currentScroll/5));
    }
})();
réveil-néo
la source
31
<script>
$(function(){
   var scroll_pos=(0);          
   $('html, body').animate({scrollTop:(scroll_pos)}, '2000');
});
</script>

Éditer:

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

Une autre façon de faire défiler avec la marge supérieure et gauche:

window.scrollTo({ top: 100, left: 100, behavior: 'smooth' });
Kamlesh
la source
4
Êtes-vous sûr que la durée de la chaîne fonctionne dans la fonction d'animation?
yogesh
Vous ne pouvez pas utiliser de chaîne pour la durée de la animatefonction, vous devez plutôt utiliser: $('html, body').animate({scrollTop:(scroll_pos)}, 2000);
Kenny Alvizuris
1
Quel est l'intérêt de mettre 0 entre parenthèses? ((0)) sera simplement évalué à 0.
Jack Vial
Oui @ Jack, vous le pouvez.
Kamlesh
29
<script>

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

en html

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

Vraiment étrange: cette question est active depuis cinq ans maintenant et il n'y a toujours pas de réponse JavaScript vanille pour animer le défilement… Alors c'est parti:

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)

Si vous le souhaitez, vous pouvez envelopper cela dans une fonction et l'appeler via l' onclickattribut. Vérifiez ce jsfiddle

Remarque: il s'agit d'une solution très basique et peut-être pas la plus performante. Un exemple très élaboré peut être trouvé ici: https://github.com/cferdinandi/smooth-scroll

AvL
la source
6
Cependant, la question demande explicitement une solution jQuery. donc pas étrange
Will
2
La meilleure solution pour moi. Pas de plugins, pas de bibliothèque jquery volumineuse, juste du javascript simple. Félicitations
user2840467
Mec, j'ai aussi créé cette même logique XD après 5 ans, exactement la même logique, seules les valeurs sont différentes comme, l'intervalle de temps et cet entier que nous utilisons pour soustraire, ne peuvent pas croire XD. TBH, est venu ici pour répondre, mais il est déjà là, alors votez pour votre réponse.
Germa Vinsmoke
27

Si vous souhaitez effectuer un défilement fluide, veuillez essayer ceci:

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

Une autre solution est la méthode JavaScript window.scrollTo:

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

Paramètres :

  • La valeur x est le pixel le long de l'axe horizontal.
  • La valeur y est le pixel le long de l'axe vertical.
Gaurang Sondagar
la source
7
copycat ... voir les réponses des utilisateurs ... Ceci est juste une compilation des 2 meilleures réponses ....
Laurent B
c'est une façon légitime d'utiliser stackoverflow - il est plus pratique de l'avoir au même endroit. Joel Spolsky a utilisé la réutilisation des réponses existantes comme exemple de la façon dont stackoverflow est censé fonctionner à un moment donné. Si vous êtes intéressé, je peux essayer de trouver le billet de blog
Edgar H
26

Avec window.scrollTo(0, 0);est très rapide
, j'ai essayé l'exemple de Mark Ursino, mais dans Chrome, rien ne se passe
et j'ai trouvé cela

$('.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);
    });
});

testé les 3 navigateurs et cela fonctionne
, j'utilise le plan directeur css
c'est lorsqu'un client clique sur le bouton "Réserver maintenant" et n'a pas la période de location sélectionnée, se déplace lentement vers le haut où se trouvent les calendriers et ouvre une boîte de dialogue pointant vers les 2 champs, après 3sec il s'estompe

Luiggi ZAMOL
la source
Merci d'avoir souligné que vous devez cibler à la fois le HTML et le corps. Je ne le faisais que pour du HTML et je me demandais pourquoi cela ne fonctionnait pas dans Chrome.
Jared
L'animation du corps fonctionne dans Safari, donc je mets à jour votre réponse en conséquence.
Dave DuPlantis
46
"Testé tous les 3 navigateurs "? Midori, LuaKit et Konqueror, non? : p
Anko
14
Pourquoi ne pas simplement faire $ ('html', 'body'). Animate ({scrollTop: 0}) au lieu d'ajouter deux lignes?
Matt Smith
23

Un grand nombre d' utilisateurs est recommandé de sélectionner les balises html et le corps pour la compatibilité multi-navigateur, comme suit:

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

Cela peut vous faire trébucher si vous comptez que votre rappel ne s'exécute qu'une seule fois. Il s'exécutera en fait deux fois car vous avez sélectionné deux éléments.

Si cela vous pose problème, vous pouvez faire quelque chose comme ceci:

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

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

La raison pour laquelle cela fonctionne est que Chrome $('html').scrollTop()renvoie 0, mais pas dans d'autres navigateurs tels que Firefox.

Si vous ne voulez pas attendre la fin de l'animation dans le cas où la barre de défilement est déjà en haut, essayez ceci:

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

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

    callback();
}
Big McLargeÉnorme
la source
19

Les vieux #toppeuvent faire l'affaire

document.location.href = "#top";

Fonctionne bien dans FF, IE et Chrome

pollirrata
la source
Agréable! Existe-t-il un moyen de rendre le défilement fluide?
stallingOne
vous devriez éviter les solutions basées sur la navigation, voir les commentaires sur la réponse de Sriramajeyam.
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
la source
3
Bien que ce code puisse répondre à la question, fournir des informations sur comment et pourquoi il résout le problème améliore sa valeur à long terme
L_J
Expliquez votre réponse!
Ullas Hunka
Dans la page Web, tout utilisateur cliquera sur le bouton de défilement supérieur, puis la page défilera en haut avec animation.
arvinda kumar
Pourquoi animer () au lieu de jquery scroll ()?
Akin Hwan le
14

Essaye ça

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

$(document).scrollTop(0); fonctionne également.

Hari Ganesan
la source
2
Notez que lorsque vous n'utilisez pas Firefox, cela ne fonctionnera pas. Vous obtenez une erreur en ne donnant qu'un seul argument (Erreur: Pas assez d'arguments [nsIDOMWindow.scrollTo]).
Husky
14

Solution non jQuery / JavaScript pur:

document.body.scrollTop = document.documentElement.scrollTop = 0;
tfont
la source
14

Cela fonctionnera:

window.scrollTo(0, 0);

Santosh Jadi
la source
3
Ce fut la meilleure réponse
OG Sean
10

Essayez ce code:

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

div => Dom Element où vous souhaitez déplacer le défilement.

time => millisecondes, définissez la vitesse de défilement.

Wasif Ali
la source
9

Solution JavaScript pure:

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

J'écris une solution animée sur Codepen

Vous pouvez également essayer une autre solution avec la scroll-behavior: smoothpropriété CSS .

html {
    scroll-behavior: smooth;
}

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

Pourquoi n'utilisez-vous pas la fonction intégrée de JQuery scrollTop:

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

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

Court et simple!

Sandeep Gantait
la source
Vous manquez juste le lien vers le doc
Cyril Duchon-Doris
8

Vous n'avez pas besoin de JQuery. Vous pouvez simplement appeler le script

window.location = '#'

en cliquant sur le bouton "Aller en haut"

Exemple de démonstration:

output.jsbin.com/fakumo#

PS: N'utilisez pas cette approche lorsque vous utilisez des bibliothèques modernes comme angularjs. Cela pourrait briser le hashbang URL.

Sriramajeyam Sugumaran
la source
9
Malheureusement, ce n'est pas la meilleure solution car vous changez l'emplacement physiquement dans ce cas au lieu de faire défiler la page. Cela pourrait causer des problèmes si l'emplacement est important (en cas d'utilisation du routage angulaire ou ainsi)
Yaroslav Rogoza
2
@YaroslavRogoza a raison. Bien que cela puisse fonctionner dans des cas simples, je ne recommanderais pas cette solution. La localisation devient de plus en plus importante et les applications d'une seule page utilisent largement le hachage pour gérer la navigation. Vous introduiriez immédiatement un bogue d'effet secondaire lors de l'ajout de la navigation basée sur le hachage après ceci ou ceci à la navigation basée sur le hachage.
Andrew Grothe
8

Utilisez simplement ce script pour faire défiler vers le haut directement.

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

Si vous ne voulez pas de défilement fluide, vous pouvez tricher et arrêter l'animation de défilement fluide dès que vous la démarrez ... comme ceci:

   $(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;                              
      });
  });

Je ne sais pas si c'est recommandé / autorisé, mais ça marche :)

Quand utiliseriez-vous cela? Je ne suis pas sûr, mais peut-être quand vous voulez utiliser un clic pour animer une chose avec Jquery, mais en faire une autre sans animation? c'est-à-dire ouvrir un panneau de connexion administrateur en haut de la page et sauter instantanément en haut pour le voir.

Jon Story
la source
7

Motivation

Cette solution simple fonctionne de manière native et implémente un défilement fluide vers n'importe quelle position.

Cela évite d'utiliser des liens d'ancrage (ceux avec #) qui, à mon avis, sont utiles si vous souhaitez créer un lien vers une section, mais ne sont pas aussi confortables dans certaines situations, en particulier lorsque vous pointez vers le haut, ce qui pourrait conduire à deux URL différentes pointant vers le même emplacement ( http://www.example.org et http://www.example.org/# ).

Solution

Mettez un identifiant à la balise que vous souhaitez faire défiler, par exemple votre première section , qui répond à cette question, mais l' identifiant peut être placé partout dans la page.

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

Ensuite, en tant que bouton, vous pouvez utiliser un lien, modifiez simplement l' attribut onclick avec un code comme celui-ci.

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

Où l'argument document.getElementByIdest l' identifiant de la balise à laquelle vous souhaitez faire défiler après un clic.

Gianluca Casati
la source
Merci! est une excellente solution
Hugo Stiven Laguna Rueda
@HugoStivenLagunaRueda vous souhaite la bienvenue, je l'ai trouvé sur MDN, donc merci à Mozilla. C'est génial combien de choses sont déjà là, prises en charge nativement. J'adore la vanille JS.
Gianluca Casati
5

Vous pouvez simplement utiliser une cible à partir de votre lien, comme #someid, où #someid est l'ID du div.

Ou, vous pouvez utiliser n'importe quel nombre de plugins de défilement qui rendent cela plus élégant.

http://plugins.jquery.com/project/ScrollTo en est un exemple.

ScottE
la source
4

Vous pouvez essayer d'utiliser JS comme dans ce Fiddle http://jsfiddle.net/5bNmH/1/

Ajoutez le bouton "Aller en haut" dans le pied de page:

<footer>
    <hr />
    <p>Just some basic footer text.</p>
    <!-- Go to top Button -->
    <a href="#" class="go-top">Go Top</a>
</footer>
asertym
la source
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
la source
4

Aucune des réponses ci-dessus ne fonctionnera dans SharePoint 2016.

Cela doit être fait comme ceci: /sharepoint/195870/

var w = document.getElementById("s4-workspace");
w.scrollTop = 0;
jeancallisti
la source