177

I am building a website which I am publishing with divs. When I refresh the page after it was scrolled to position X, then the page is loaded with the scroll position as X.

How can I force the page to be scrolled to the top on page refresh?

  • What I can think of is of some JS or jQuery run as onLoad() function of the page to SET the pages scroll to top. But I don't know how I could do that.

  • A better option would be if there is some property or something to have the page loaded with its scroll position as default (i.e. at the top) which will be kind of like page load, instead of page refresh.

MC Emperor
  • 22,334
  • 15
  • 80
  • 130
Moon
  • 19,518
  • 56
  • 138
  • 200
  • Surprisingly, none of the solutions here worked for me, but this one did: http://stackoverflow.com/a/11486546/470749 – Ryan Feb 21 '17 at 16:17
  • I came here because I want the opposite behavior of what @Moon is asking for. EMACS impatient-mode keeps sending my web browser to the top of the document when I type new text into a buffer. This is disorientating and I wish I could make EMACS impatent-mode stop doing that. – Shawn Eary Mar 21 '23 at 16:35

17 Answers17

246

For a simple plain JavaScript implementation:

window.onbeforeunload = function () {
  window.scrollTo(0, 0);
}
ProfNandaa
  • 3,210
  • 2
  • 18
  • 19
190

You can do it using the scrollTop method on DOM ready:

$(document).ready(function(){
    $(this).scrollTop(0);
});
Pat
  • 25,237
  • 6
  • 71
  • 68
  • 10
    Does not work on Safari. But this -> http://stackoverflow.com/a/18633915/102133 does. – Ben Apr 26 '14 at 15:02
39

The answer here does not works for safari, document.ready is often fired too early.

Ought to use the beforeunload event which prevent you form doing some setTimeout

$(window).on('beforeunload', function(){
  $(window).scrollTop(0);
});
tokyovariable
  • 1,656
  • 15
  • 23
Ben
  • 5,030
  • 6
  • 53
  • 94
28

To reset window scroll back to top, $(window).scrollTop(0) in the beforeunload event does the tricks, however, I tested in Chrome 80 it will go back to the old location after the reload.

To prevent that, set the history.scrollRestoration to "manual".

//Reset scroll top

history.scrollRestoration = "manual";

$(window).on('beforeunload', function(){
      $(window).scrollTop(0);
});
Julio Betta
  • 2,275
  • 1
  • 25
  • 25
Alex Having Fun
  • 430
  • 4
  • 5
27

Again, best answer is:

window.onbeforeunload = function () {
    window.scrollTo(0,0);
};

(thats for non-jQuery, look up if you are searching for the JQ method)

EDIT: a little mistake its "onbeforunload" :) Chrome and others browsers "remember" the last scroll position befor unloading, so if you set the value to 0,0 just before the unload of your page they will remember 0,0 and won't scroll back to where the scrollbar was :)

David
  • 3,285
  • 1
  • 37
  • 54
N.K
  • 1,601
  • 2
  • 19
  • 31
11

You can also try

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

If you want to scroll at x position than you can change the value of 0 to x.

Ankit
  • 760
  • 6
  • 15
11

The JS history API has the scrollRestoration property, which when set to manual, prevents the last scroll location on the page to be restored:

if (history.scrollRestoration) {
    history.scrollRestoration = 'manual';
} else {
    window.onbeforeunload = function () {
        window.scrollTo(0, 0);
    }
}
Pecata
  • 683
  • 8
  • 13
  • 1
    This is a great answer, you can even simply use the `history.scrollRestoration = 'manual';` oneliner if you're working on a project where you know the browser will support it. – rebane2001 May 23 '21 at 16:16
  • Thanks, changing to one liner might make a difference if you are using SSR and window is not available. – Pecata May 26 '21 at 17:52
10

Check the jQuery .scrollTop() function here

It would look something like

$(document).load().scrollTop(0);
jon3laze
  • 3,188
  • 6
  • 36
  • 69
7

Instead of location.reload(), simply use location.href = location.href. It will not scroll to the previous position as location.reload() does.

Note: This will not reload if there is any # in the URL

Nauphal
  • 6,194
  • 4
  • 27
  • 43
5
<script> location.hash = (location.hash) ? location.hash : " "; </script>

Put the above script in <head> tag of your html. Not sure how single page apps behave! But sure works like charm in regular pages.

harshes53
  • 419
  • 1
  • 6
  • 17
4

The answer here(scrolling in $(document).ready) doesn't work if there is a video in the page. In that case the page is scrolled after this event is fired, overriding our work.

Best answer should be:

$(window).on('beforeunload', function(){
    $(window).scrollTop(0);
});
DrPollit0
  • 113
  • 1
  • 5
3
$(document).ready(function(){
    $(window).scrollTop(0);
});

did not work for me as google chrome would just scroll back down after the page finished loading. What I used was

$(document).ready(function() {
    var url = window.location.href;
    console.log(url);
    if( url.indexOf('#') < 0 ) {
        window.location.replace(url + "#");
    } else {
        window.location.replace(url);
    }
});

// This loads the page with a # at the end. So it will always load at the top.

Daut
  • 2,537
  • 1
  • 19
  • 32
3

I found that these CSS styles force the page to always scroll to top on reload/refresh:

html {
    height: 100%;
    overflow: hidden;
    width: 100%;
}

body {
    height: 100%;
    overflow-x: hidden;
    overflow-y: auto;
    width: 100%;
}
centhous
  • 93
  • 1
  • 3
  • Can confirm that this works. Would love if someone could get an explanation but nevertheless, this should be 2nd highest answer (above all those very, very repetitive `.scrollTop(0)`s), – Tigerrrrr May 24 '22 at 15:55
2

This is one of the best way to do so:

<script>
$(window).on('beforeunload', function() {
  $('body').hide();
  $(window).scrollTop(0);
});
</script>
Blitz
  • 21
  • 2
1

You can use location.replace instead of location.reload:

location.replace(location.href);

This way page will reload with scroll on top.

Fernando
  • 1,013
  • 2
  • 10
  • 23
  • This seems to work, but I can't find documentation to explain why it works. If anyone has that, please share! – Jake Worth Jul 29 '21 at 15:08
1

you can use it it your html page to as:

history.scrollRestoration = "manual";

$(window).on('beforeunload', function(){
    $(window).scrollTop(0);
});
shadow2020
  • 1,315
  • 1
  • 8
  • 30
  • Can you please explain what your code is doing and why this works? Seems legit, but you will want to explain this more for other readers. – shadow2020 Nov 28 '22 at 18:22
  • 1
    Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Nov 28 '22 at 18:22
0

The supercalifragilisticexpialidocious answer is:

add this at the top of your js file or script tag

document.documentElement.scrollTop = 0; // For Chrome, Firefox, IE and Opera

document.body.scrollTop = 0; // For Safari
Mayur Karmur
  • 2,119
  • 14
  • 35