211 votes

Comment faire défiler le haut de la page avec JavaScript/jQuery ?

Existe-t-il un moyen de contrôler le défilement du navigateur avec JavaScript/jQuery ?

Lorsque je fais défiler ma page à mi-chemin vers le bas, puis que je déclenche un rechargement, je veux que la page revienne en haut, mais au lieu de cela, elle essaie de trouver la dernière position de défilement. J'ai donc fait ceci :

$('document').ready(function() {
   $(window).scrollTop(0);
});

Mais pas de chance.

EDIT :

Vos deux réponses ont donc fonctionné lorsque je les ai appelées après le chargement de la page - Merci. Cependant, si je rafraîchis la page, il semble que le navigateur calcule et revienne à son ancienne position de défilement APRÈS l'appel de la commande .ready (j'ai également testé la fonction onload() du corps).

La question qui se pose est donc la suivante : existe-t-il un moyen d'EMPECHER le navigateur de défiler jusqu'à sa position précédente, ou de le faire défiler à nouveau jusqu'en haut APRÈS qu'il ait fait son travail ?

1 votes

Que se passe-t-il lorsque vous le faites à partir de $(window).load() ?

2 votes

@MPD- Excellente idée ! ... mais je viens de l'essayer et l'ajustement du défilement se produit toujours après cela. Merci pour l'astuce, cela m'aide à répondre à une autre de mes questions : stackoverflow.com/questions/4210829/ . Si tu veux répondre à cette question, je vais t'en donner.

0 votes

@Yarin Désolé que vous ayez dû attendre 9 ans pour ça. Vous devez définir le paramètre history.scrollRestoration avant d'essayer de faire défiler la page. Voir ma réponse.

367voto

Niet the Dark Absol Points 154811

Solution multi-navigateurs, purement JavaScript :

document.body.scrollTop = document.documentElement.scrollTop = 0;

4 votes

Puisque vous utilisez jQuery, vous pouvez essayer ceci : $(window).one("scroll",function() { /* the code from my answer here */ });

0 votes

Pour que cela fonctionne sur mes navigateurs croisés IE/Chrome/FF, je dois combiner la réponse de Niet Dark Absol et celle de user113716 (en utilisant le timeout).

0 votes

Cela n'a pas fonctionné sur CentOS 6.7 avec FF 45.1.0. Je l'ai enveloppé dans un document.ready juste pour être sûr.

89voto

Jacob Relkin Points 90729

Vous presque Je l'ai - vous devez définir le scrollTop en body pas window :

$(function() {
   $('body').scrollTop(0);
});

EDIT :

Vous pouvez peut-être ajouter une ancre vide en haut de la page :

$(function() {
   $('<a name="top"/>').insertBefore($('body').children().eq(0));
   window.location.hash = 'top';
});

3 votes

J'ai essayé ça aujourd'hui et ça n'a pas marché dans FF16. En utilisant du JS pur, vu plus bas sur cette page, à la place : document.body.scrollTop = document.documentElement.scrollTop = 0 ;

2 votes

Le code ci-dessus fonctionnera correctement dans les navigateurs modernes comme FF, Chrome mais il ne fonctionnera pas dans IE8 et ci-dessous essayer d'ajouter les deux 'html','body' car les navigateurs modernes font défiler les pages en fonction du corps, mais IE8 et les versions inférieures ne font défiler les pages qu'en fonction de la taille. html, body

19voto

Matt Points 463

Existe-t-il un moyen d'EMPECHER que le navigateur de défiler jusqu'à sa position précédente, ou de défiler à nouveau vers le haut APRÈS qu'il ait fait son son action ?

La solution jquery suivante fonctionne pour moi :

$(window).unload(function() {
    $('body').scrollTop(0);
});

0 votes

Vous faites défiler jusqu'en haut avant le rafraîchissement

0 votes

Il n'est pas totalement compatible avec tous les navigateurs, mais il fonctionne pour la plupart. Associé à certaines des autres réponses, c'est un bon complément.

18voto

ulfryk Points 92

Voici une version de défilement animé en JavaScript pur pour ceux qui n'utilisent pas JQuery :D

var stepTime = 20;
var docBody = document.body;
var focElem = document.documentElement;

var scrollAnimationStep = function (initPos, stepAmount) {
    var newPos = initPos - stepAmount > 0 ? initPos - stepAmount : 0;

    docBody.scrollTop = focElem.scrollTop = newPos;

    newPos && setTimeout(function () {
        scrollAnimationStep(newPos, stepAmount);
    }, stepTime);
}

var scrollTopAnimated = function (speed) {
    var topOffset = docBody.scrollTop || focElem.scrollTop;
    var stepAmount = topOffset;

    speed && (stepAmount = (topOffset * stepTime)/speed);

    scrollAnimationStep(topOffset, stepAmount);
};

Et puis :

<button onclick="scrollTopAnimated(1000)">Scroll Top</button>

1 votes

Cool. Cependant, je préférerais requestAnimationStep au lieu de setTimeout . De plus, cela ne répond pas à la question de l'OP.

0 votes

J'ai mis en œuvre ce système dans Angular. Il fonctionne à merveille. Merci

12voto

user113716 Points 143363

Cela fonctionne pour moi :

window.onload = function() {
    // short timeout
    setTimeout(function() {
        $(document.body).scrollTop(0);
    }, 15);
};

Utilise un court setTimeout à l'intérieur de la onload pour donner au navigateur une chance de faire le scroll.

0 votes

Pour que cela fonctionne sur mes navigateurs croisés IE/Chrome/FF, je dois combiner la réponse de Niet Dark Absol et celle de user113716 (en utilisant le timeout).

0 votes

@Panini : votre suggestion fonctionne pour moi sur Chrome/FF, mais pas sur IE11.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X