Scroll Automatically to the Bottom of the Page
Asked Answered
M

32

698

I have a list of questions. When I click on the first question, it should automatically take me to a specific element at the bottom of the page.

How can I do this with jQuery?

Mumford answered 30/7, 2012 at 5:3 Comment(3)
here:: #4249853Obscuration
css-only here: stackoverflow.com/a/68874831Gurl
Have you tried to use inline anchors? https://mcmap.net/q/54195/-scroll-automatically-to-the-bottom-of-the-pageAntepenult
T
1346

jQuery isn't necessary. Most of the top results I got from a Google search gave me this answer:

window.scrollTo(0, document.body.scrollHeight);

Where you have nested elements, the document might not scroll. In this case, you need to target the element that scrolls and use its scroll height instead.

nestedElement.scrollTo(0, nestedElement.scrollHeight);

Some additional sources you can take a look at:

Tenderloin answered 30/7, 2012 at 5:3 Comment(11)
Didn't work for me. I did this: element.scrollTop = element.scrollHeight.Pastille
May 4, 2016: Please note that that the "scrollTo" function is experimental and does not work in all browsers.Untitled
scrollto did not work on my browser, I came across this link below #8918421 which is very useful because the solutions work across the browsers I tried.Haricot
for a separate element, this is working solution: document.querySelector(".scrollingContainer").scrollTo(0,document.querySelector(".scrollingContainer").scrollHeight);Phio
May have to set html, body height to 100% to scroll to bottomLowland
This should work too: objectSelector.scrollTo({ top: objectSelector.scrollHeight }). Understanding that objectSelector is the element returned by document.getElementById. PD: adding behavior: 'smooth' in the scrollTo method options set up a predefined scrolling animation.Derrek
window.scrollTo(0,document.body.scrollHeight); // didn't work window.scrollTo({top:document.body.scrollHeight}); // work and did the trickGosplan
In many cases even JavaScript isn't necessary to keep a container bottom-scrolled.Gurl
One of the referred link is broken. Adding the correct linkl. stackstalk.com/2010/07/javascript-scroll-to-bottom-of-page.htmlShrine
hey, I cant scroll all the way to the bottom. It stucks at a particukar postion and can go beyond that. Why is this happening?Imperceptive
Little did he know, he would become the "quick google search"Soleure
S
194

To scroll entire page to the bottom:

const scrollingElement = (document.scrollingElement || document.body);
scrollingElement.scrollTop = scrollingElement.scrollHeight;

You can view the demo here

To scroll a specific element to the bottom:

const scrollToBottom = (id) => {
    const element = document.getElementById(id);
    element.scrollTop = element.scrollHeight;
}

Here is the demo

And here's how it works:

enter image description here

Ref: scrollTop, scrollHeight, clientHeight

UPDATE: Latest versions of Chrome (61+) and Firefox does not support scrolling of body, see: https://dev.opera.com/articles/fixing-the-scrolltop-bug/

Squilgee answered 18/10, 2015 at 2:23 Comment(2)
The solution works with Chrome, Firefox, Safari and IE8+. Check out this link for more detail quirksmode.org/dom/w3c_cssom.htmlSquilgee
@luochenhuan, I've just fixed the sample code by using "document.scrollingElement" instead of "document.body", see aboveAmbassadoratlarge
R
100

Vanilla JS implementation:

element.scrollIntoView(false);

https://developer.mozilla.org/en-US/docs/Web/API/element.scrollIntoView

Rosinweed answered 15/7, 2014 at 19:30 Comment(10)
with jQuery $('#id')[0].scrollIntoView(false);Gyniatrics
at the moment it's Firefox only thoughSugar
Works in newer versions of Chrome now, but some of the extra options (like smooth scrolling) don't seem to be implemented yet.Aslant
I added an empty div at the end of the page and used the id of that div. Worked perfectly.Historied
Even better: element.scrollIntoView({behavior: "smooth"});Acceptable
This should be the right answer! Worked on my ionic 1 appPoesy
{behavior: "smooth"} isn't very well supported as of 2019 but that's a good and native answer. caniuse.com/#feat=scrollintoviewWestmoreland
this answer only works if you add an empty element to end of page? Then isn't theelement.scrollTop = element.scrollHeight - element.clientHeight answer not needing that?Understudy
Why doesn't that work in a bookmarklet?Cholesterol
for smooth scroll to bottom: element.scrollIntoView({ behavior: 'smooth', block: 'end' })Buckskin
K
41

You can use this to go down the page in an animation format.

$('html,body').animate({scrollTop: document.body.scrollHeight},"fast");
Khanna answered 25/2, 2016 at 5:1 Comment(0)
R
39

one liner to smooth scroll to the bottom

window.scrollTo({ left: 0, top: document.body.scrollHeight, behavior: "smooth" });

To scroll up simply set top to 0

Radarscope answered 26/9, 2019 at 3:9 Comment(1)
This solution doesn't work in IE. Is there any workout that we can add to make this work in IE as well.Laclair
V
35

Below should be the cross browser solution. It has been tested on Chrome, Firefox, Safari and IE11

window.scrollTo(0, document.body.scrollHeight || document.documentElement.scrollHeight);

window.scrollTo(0,document.body.scrollHeight); doesn't work on Firefox, at least for Firefox 37.0.2

Vigorous answered 30/4, 2015 at 15:36 Comment(3)
It does work in Firefox 62.0.3, but I've got no clue when they fixed that.Recognizance
window.scrollTo(0, document.body.scrollHeight || document.documentElement.scrollHeight); - The scroll is not smooth. How will make the scrolling smooth @VigorousLaclair
You can add options to scrollingRopable
G
22

CSS-Only?!

An interesting CSS-only alternative:

display: flex; 
flex-direction: column-reverse;

  /* ...probably usually along with: */

overflow-y: scroll;  /* or hidden or auto */
height: 100px; /* or whatever */

It's not bullet-proof but I've found it helpful in several situations.

Documentation: flex, flex-direction, overflow-y


Demo:

var i=0, foo='Lorem Ipsum & foo in bar or blah ! on and'.split(' ');
setInterval(function(){demo.innerHTML+=foo[i++%foo.length]+' '},200)
#demo{ display:flex;
       flex-direction:column-reverse;
       overflow-y:scroll;
       width:150px; 
       height:150px;
       border:3px solid black; }
body{ font-family:arial,sans-serif; 
      font-size:15px; }
Autoscrolling demo:🐾
<div id='demo'></div>
Gurl answered 21/8, 2021 at 16:26 Comment(1)
Be aware that this will create a disconnect between the visual presentation and DOM order when using multiple elements – like paragraphs – to display the text, which will negatively affect users using screen readers. This type of user will not have access to the correct reading order.Purehearted
T
19

Sometimes the page extends on scroll to buttom (for example in social networks), to scroll down to the end (ultimate buttom of the page) I use this script:

var scrollInterval = setInterval(function() { 
    document.documentElement.scrollTop = document.documentElement.scrollHeight;
}, 50);

And if you are in browser's javascript console, it might be useful to be able to stop the scrolling, so add:

var stopScroll = function() { clearInterval(scrollInterval); };

And then use stopScroll();.

If you need to scroll to particular element, use:

var element = document.querySelector(".element-selector");
element.scrollIntoView();

Or universal script for autoscrolling to specific element (or stop page scrolling interval):

var notChangedStepsCount = 0;
var scrollInterval = setInterval(function() {
    var element = document.querySelector(".element-selector");
    if (element) { 
        // element found
        clearInterval(scrollInterval);
        element.scrollIntoView();
    } else if((document.documentElement.scrollTop + window.innerHeight) != document.documentElement.scrollHeight) { 
        // no element -> scrolling
        notChangedStepsCount = 0;
        document.documentElement.scrollTop = document.documentElement.scrollHeight;
    } else if (notChangedStepsCount > 20) { 
        // no more space to scroll
        clearInterval(scrollInterval);
    } else {
        // waiting for possible extension (autoload) of the page
        notChangedStepsCount++;
    }
}, 50);
Tsui answered 1/6, 2016 at 20:32 Comment(2)
let size = ($("div[class*='card-inserted']")).length; ($("div[class*='card-inserted']"))[size -1].scrollIntoView();Lonilonier
@Lonilonier this will work only if the page is loaded up to the end.Tsui
H
14

you can do this too with animation, its very simple

$('html, body').animate({
   scrollTop: $('footer').offset().top
   //scrollTop: $('#your-id').offset().top
   //scrollTop: $('.your-class').offset().top
}, 'slow');

hope helps, thank you

Hipolitohipp answered 8/5, 2014 at 17:13 Comment(0)
T
13

You can use this function wherever you need to call it:

function scroll_to(div){
   if (div.scrollTop < div.scrollHeight - div.clientHeight)
        div.scrollTop += 10; // move down

}

jquery.com: ScrollTo

Tun answered 30/7, 2012 at 5:9 Comment(1)
For me, document.getElementById('copyright').scrollTop += 10 doesn't work (in latest Chrome)... remains zero...Fetal
S
10

So many answers trying to calculate the height of the document. But it wasn't calculating correctly for me. However, both of these worked:

jquery

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

or just js

    window.scrollTo(0,9999);
Supersensitive answered 16/12, 2018 at 17:51 Comment(5)
LOL "worked". What if the document is longer than 9999?Clabo
@DanDascalescu 99999Supersensitive
What if the document is longer than 99999?!Salvatore
@BrendonMuir If the document is longer than 99999 you can define a javascript variable above the javascript code in the answer that gets the dynamic height of the document and use that variable instead of the hard coded 99999Involucrum
Sorry @nviens, I was just being silly, following on from DanDascalescu :DSalvatore
B
9

Here is a method that worked for me:

Expected outcome:

  • No scroll animation
  • Loads at bottom of page on first load
  • Loads on bottom of page for all refreshes

Code:

<script>
    function scrollToBottom() {
        window.scrollTo(0, document.body.scrollHeight);
    }
    history.scrollRestoration = "manual";
    window.onload = scrollToBottom;
</script>

Why this may work over other methods:

Browsers such as Chrome have a built-in preset to remember where you were on the page, after refreshing. Just a window.onload doesn't work because your browser will automatically scroll you back to where you were before refreshing, AFTER you call a line such as:

window.scrollTo(0, document.body.scrollHeight);

That's why we need to add:

history.scrollRestoration = "manual";

before the window.onload to disable that built-in feature first.

References:

Documentation for window.onload: https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onload

Documentation for window.scrollTo: https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo

Documentation for history.scrollRestoration: https://developer.mozilla.org/en-US/docs/Web/API/History/scrollRestoration

Britteny answered 27/3, 2021 at 8:11 Comment(0)
C
8

A simple way if you want to scroll down to a specific element.

Call this function whenever you want to scroll down.

function scrollDown() {
 document.getElementById('scroll').scrollTop =  document.getElementById('scroll').scrollHeight
}
ul{
 height: 100px;
 width: 200px;
 overflow-y: scroll;
 border: 1px solid #000;
}
<ul id='scroll'>
<li>Top Here</li>
<li>Something Here</li>
<li>Something Here</li>
<li>Something Here</li>
<li>Something Here</li>
<li>Something Here</li>
<li>Something Here</li>
<li>Something Here</li>
<li>Something Here</li>
<li>Something Here</li>
<li>Bottom Here</li>
<li style="color: red">Bottom Here</li>
</ul>

<br />

<button onclick='scrollDown()'>Scroll Down</button>
Calfee answered 17/6, 2018 at 16:25 Comment(3)
This is not simple, and requires creating a scroll element.Clabo
@DanDascalescu You're right! but my code works I don't think it deserves down voteCalfee
"Works" is not enough. All solutions on this page "work" to some extent. And there's a ton of them. How should a reader decide?Clabo
F
6

You can attach any id to reference attribute href of link element:

<a href="#myLink" id="myLink">
    Click me
</a>

In the example above when user clicks Click me at the bottom of page, navigation navigates to Click me itself.

Flaxman answered 10/1, 2017 at 0:31 Comment(1)
This did not for for me because it changes url and then my angular app redirects to something else!Costin
O
4

You may try Gentle Anchors a nice javascript plugin.

Example:

function SomeFunction() {
  // your code
  // Pass an id attribute to scroll to. The # is required
  Gentle_Anchors.Setup('#destination');
  // maybe some more code
}

Compatibility Tested on:

  • Mac Firefox, Safari, Opera
  • Windows Firefox, Opera, Safari, Internet Explorer 5.55+
  • Linux untested but should be fine with Firefox at least
Onagraceous answered 30/7, 2012 at 5:8 Comment(0)
D
4

Late to the party, but here's some simple javascript-only code to scroll any element to the bottom:

function scrollToBottom(e) {
  e.scrollTop = e.scrollHeight - e.getBoundingClientRect().height;
}
Dormouse answered 27/5, 2016 at 17:54 Comment(0)
B
4

For Scroll down in Selenium use below code:

Till the bottom drop down, scroll till the height of the page. Use the below javascript code that would work fine in both, JavaScript and React.

JavascriptExecutor jse = (JavascriptExecutor) driver; // (driver is your browser webdriver object) 
jse.executeScript("window.scrollBy(0,document.body.scrollHeight || document.documentElement.scrollHeight)", "");
Blair answered 24/10, 2017 at 7:13 Comment(0)
P
3

Here's my solution:

 //**** scroll to bottom if at bottom

 function scrollbottom() {
    if (typeof(scr1)!='undefined') clearTimeout(scr1)   
    var scrollTop = (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop;
    var scrollHeight = (document.documentElement && document.documentElement.scrollHeight) || document.body.scrollHeight;
    if((scrollTop + window.innerHeight) >= scrollHeight-50) window.scrollTo(0,scrollHeight+50)
    scr1=setTimeout(function(){scrollbottom()},200) 
 }
 scr1=setTimeout(function(){scrollbottom()},200)
Propinquity answered 26/1, 2016 at 8:34 Comment(1)
What... is even going on there? Care you explain your solution? Code-only answers are discouraged.Clabo
C
3

Here's a fairly modern react/typescript-ish utility I am using:

export const scrollToBottom = () => {
  // Assume a react re-render may need to happen first
  setTimeout(() => {
    requestAnimationFrame(() => {
      window.scrollTo({
        top: document.documentElement.scrollHeight - window.innerHeight,
        left: 0,
        behavior: 'smooth',
      })
    })
  }, 3)
}

See browser support on smooth scrolling here: https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo#browser_compatibility

This could probably be turned into a hook:

export const useScrollToBottomWhen = (condition: boolean) => {
  useEffect(() => {
    if (condition) {
      window.scrollTo({
        top: document.documentElement.scrollHeight - window.innerHeight,
        left: 0,
        behavior: 'smooth',
      })
    }
  }, [condition]);
}
Concertino answered 18/2 at 4:29 Comment(0)
C
2

I have an Angular app with dynamic content and I tried several of the above answers with not much success. I adapted @Konard's answer and got it working in plain JS for my scenario:

HTML

<div id="app">
    <button onClick="scrollToBottom()">Scroll to Bottom</button>
    <div class="row">
        <div class="col-md-4">
            <br>
            <h4>Details for Customer 1</h4>
            <hr>
            <!-- sequence Id -->
            <div class="form-group">
                <input type="text" class="form-control" placeholder="ID">
            </div>
            <!-- name -->
            <div class="form-group">
                <input type="text" class="form-control" placeholder="Name">
            </div>
            <!-- description -->
            <div class="form-group">
                <textarea type="text" style="min-height: 100px" placeholder="Description" ></textarea>
            </div>
            <!-- address -->
            <div class="form-group">
                <input type="text" class="form-control" placeholder="Address">
            </div>
            <!-- postcode -->
            <div class="form-group">
                <input type="text" class="form-control" placeholder="Postcode">
            </div>
            <!-- Image -->
            <div class="form-group">
                <img style="width: 100%; height: 300px;">
                <div class="custom-file mt-3">
                    <label class="custom-file-label">{{'Choose file...'}}</label>
                </div>
            </div>
            <!-- Delete button -->
            <div class="form-group">
                <hr>
                <div class="row">
                    <div class="col">
                        <button class="btn btn-success btn-block" data-toggle="tooltip" data-placement="bottom" title="Click to save">Save</button>
                        <button class="btn btn-success btn-block" data-toggle="tooltip" data-placement="bottom" title="Click to update">Update</button>
                    </div>
                    <div class="col">
                        <button class="btn btn-danger btn-block" data-toggle="tooltip" data-placement="bottom" title="Click to remove">Remove</button>
                    </div>
                </div>
                <hr>
            </div>
        </div>
    </div>
</div>

CSS

body {
    background: #20262E;
    padding: 20px;
    font-family: Helvetica;
}

#app {
    background: #fff;
    border-radius: 4px;
    padding: 20px;
    transition: all 0.2s;
}

JS

function scrollToBottom() {
    scrollInterval;
    stopScroll;

    var scrollInterval = setInterval(function () {
        document.documentElement.scrollTop = document.documentElement.scrollHeight;
    }, 50);

    var stopScroll = setInterval(function () {
        clearInterval(scrollInterval);
    }, 100);
}

Tested on the latest Chrome, FF, Edge, and stock Android browser. Here's a fiddle:

https://jsfiddle.net/cbruen1/18cta9gd/16/

Chronicle answered 11/6, 2020 at 20:41 Comment(0)
S
2

I found a trick to make it happen.

Put an input type text at the bottom of the page and call a jquery focus on it whenever you need to go at the bottom.

Make it readonly and nice css to clear border and background.

Symbolize answered 10/11, 2020 at 21:43 Comment(0)
G
2

I gave up with scrollto but instead tried anchor approach:

<a href="#target_id_at_bottom">scroll to the bottom</a>

Along with this CSS charm:

html,
body {
    scroll-behavior: smooth;
}

Have a nice day!

Globe answered 6/8, 2022 at 6:48 Comment(0)
T
2

If there is an ID in any kind of tag at or nearby where you want to scroll to, then all it takes is one line of JavaScript making use of the scrollIntoView function. For example, let's say your element in question is a DIV with the ID "mydiv1"

<div id="mydiv1">[your contents]</div>

then you would run the JavaScript command

document.getElementById("mydiv1").scrollIntoView();

No JQuery is necessary at all. Hope this helps.

They answered 16/12, 2022 at 9:24 Comment(0)
J
2

using reac.js here is the working code

        //auto scroll to the bottom 
    useEffect(()=>{
      const chatHolder = document.getElementById('chats-wrapper')
       if(chatHolder) {
          chatHolder.scrollIntoView({behavior: "smooth"})
       }
  },[chats])
Jolenejolenta answered 18/7, 2023 at 13:26 Comment(0)
H
1

window.scrollTo(0,1e10);

always works.

1e10 is a big number. so its always the end of the page.

Hoogh answered 9/7, 2019 at 10:8 Comment(0)
F
1

If any one searching for Angular

you just need to scroll down add this to your div

 #scrollMe [scrollTop]="scrollMe.scrollHeight"

   <div class="my-list" #scrollMe [scrollTop]="scrollMe.scrollHeight">
   </div>
Fastigium answered 17/9, 2019 at 8:37 Comment(0)
E
1

This will guaranteed scroll to the bottom

Head Codes

<script src="http://code.jquery.com/jquery-1.8.1.min.js"></script>
<script language="javascript" type="text/javascript">
function scrollToBottom() {
  $('#html, body').scrollTop($('#html, body')[0].scrollHeight);
}
</script>

Body code

<a href="javascript:void(0);" onmouseover="scrollToBottom();" title="Scroll to Bottom">&#9660; Bottom &#9660;</a>
Emee answered 5/1, 2020 at 22:17 Comment(0)
L
1

I've had the same issue. For me at one point in time the div's elements were not loaded entirely and the scrollTop property was initialized with the current value of scrollHeight, which was not the correct end value of scrollHeight.

My project is in Angular 8 and what I did was:

  1. I used viewchild in order to obtain the element in my .ts file.
  2. I've inherited the AfterViewChecked event and placed one line of code in there which states that the viewchild element has to take into the scrollTop value the value of scrollHeight (this.viewChildElement.nativeElement.scrollTop = this.viewChildElement.nativeElement.scrollHeight;)

The AfterViewChecked event fires a few times and it gets in the end the proper value from scrollHeight.

Lore answered 24/9, 2020 at 9:40 Comment(0)
T
1

We can use ref and by getElementById for scrolling specific modal or page .

 const scrollToBottomModel = () => {
    const scrollingElement = document.getElementById("post-chat");
    scrollingElement.scrollTop = scrollingElement.scrollHeight;
  };

In the modal body you can call above function

 <Modal.Body
          className="show-grid"
          scrollable={true}
          style={{
            maxHeight: "calc(100vh - 210px)",
            overflowY: "auto",
            height: "590px",
          }}
          ref={input => scrollToBottomModel()}
          id="post-chat"
        >

will work this

Triptolemus answered 23/3, 2022 at 13:33 Comment(0)
T
1

A simple example with jquery

$('html, body').animate({
    scrollTop:   $(this).height(),
  });
Typhogenic answered 14/4, 2022 at 1:24 Comment(1)
hmm, does not work with huge <pre>'s in Google Chrome 100 :/ it just scrolls down to the start of the <pre>Lemay
U
0

A picture is worth a thousand words:

The key is:

document.documentElement.scrollTo({
  left: 0,
  top: document.documentElement.scrollHeight - document.documentElement.clientHeight,
  behavior: 'smooth'
});

It is using document.documentElement, which is the <html> element. It is just like using window, but it is just my personal preference to do it this way, because if it is not the whole page but a container, it works just like this except you'd change document.body and document.documentElement to document.querySelector("#container-id").

Example:

let cLines = 0;

let timerID = setInterval(function() {
  let elSomeContent = document.createElement("div");

  if (++cLines > 33) {
    clearInterval(timerID);
    elSomeContent.innerText = "That's all folks!";
  } else {
    elSomeContent.innerText = new Date().toLocaleDateString("en", {
      dateStyle: "long",
      timeStyle: "medium"
    });
  }
  document.body.appendChild(elSomeContent);

  document.documentElement.scrollTo({
    left: 0,
    top: document.documentElement.scrollHeight - document.documentElement.clientHeight,
    behavior: 'smooth'
  });

}, 1000);
body {
  font: 27px Arial, sans-serif;
  background: #ffc;
  color: #333;
}

You can compare the difference if there is no scrollTo():

let cLines = 0;

let timerID = setInterval(function() {
  let elSomeContent = document.createElement("div");

  if (++cLines > 33) {
    clearInterval(timerID);
    elSomeContent.innerText = "That's all folks!";
  } else {
    elSomeContent.innerText = new Date().toLocaleDateString("en", {
      dateStyle: "long",
      timeStyle: "medium"
    });
  }
  document.body.appendChild(elSomeContent);

}, 1000);
body {
  font: 27px Arial, sans-serif;
  background: #ffc;
  color: #333;
}
Understudy answered 3/2, 2020 at 0:58 Comment(0)
B
0

Maybe there is "autofocus" somewhere in your code

Balsam answered 26/5, 2023 at 15:5 Comment(1)
As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.Mariannamarianne

© 2022 - 2024 — McMap. All rights reserved.