47

I'm trying to determine how many pixels down I've scrolled using window.scrollY. But this isn't supported in IE8. What is the safe, cross-browser alternative?

5
  • 1
    Use a library like Mootools or jQuery to handle browser abstractions for you if at all possible. Commented May 17, 2013 at 22:30
  • 1
    Aren't the cross-browser versions to scrollX and scrollY, document.body.scrollLeft and document.body.scrollTop?
    – dsgriffin
    Commented May 17, 2013 at 22:32
  • 1
    ^^^^^ It's pageYOffset and document.body.scrollTop
    – adeneo
    Commented May 17, 2013 at 22:33
  • @adeneo Is it ok if I link to that article in my answer please?
    – dsgriffin
    Commented May 17, 2013 at 22:36
  • @Zenith - Sure, example 4 on that page shows a cross browser way to get the scroll position, even accounting for zoom !
    – adeneo
    Commented May 17, 2013 at 22:37

8 Answers 8

110

The cross-browser compatible version for window.scrollY is document.documentElement.scrollTop. Please see the 'Notes' section of this piece of Mozilla documentation for a full, detailed workaround in IE8 and before.

As mentioned here, pageYOffset is another alternative to window.scrollY (note though that this is only IE9+ compatible).

In regard to the link above, check Example 4 for a fully compatible way to get the scroll position (it even accounts for zoom as @adeneo mentioned!) using document.documentElement.scrollTop and document.documentElement.scrollLeft.

Here, try out the example for yourself!

5
  • 6
    document.documentElement.scrollTop gives 0 in Google Chrome 40
    – McX
    Commented Feb 19, 2015 at 10:59
  • 2
    @McX This is because of an ongoing Chrome bug that is yet to be resolved (but judging from the replies I've seen, it's in the process of being fixed) - code.google.com/p/chromium/issues/detail?id=157855
    – dsgriffin
    Commented Mar 3, 2015 at 14:18
  • January 2016, still not fixed.
    – Hacktisch
    Commented Jan 29, 2016 at 0:12
  • Nov 2016, still not fixed.
    – mcheah
    Commented Nov 23, 2016 at 0:52
  • 4
    April 4 2018, fixed :)
    – Suraj Jain
    Commented Apr 4, 2018 at 8:12
15

If you don't have to use it a lot, just do:

var scroll = window.scrollY //Modern Way (Chrome, Firefox) 
|| document.documentElement.scrollTop (Old IE, 6,7,8)
1
  • 4
    this works, though I don't think you need the second one (window.pageYOffset). While it works, all older IE browsers support the document.documentElement.scrollTop way of getting the scroll position. Newer IE browsers ("Edge") support window.scrollY, as mentioned in the MDN: developer.mozilla.org/en-US/docs/Web/API/Window/…
    – ps2goat
    Commented Apr 4, 2016 at 15:11
5

If you're using jQuery, I used $(window).scrollTop() to get the Y position in IE 8. It seemed to work.

3

If you have a valid reason for not just using a library to handle this kind of base functionality, don't hesitate 'not to re-invent the wheel'.

Mootools is open source, and you can just 'steal' its implementation, relevant snippets:

getScroll: function(){
    var win = this.getWindow(), doc = getCompatElement(this);
    return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop};
}

function getCompatElement(element){
    var doc = element.getDocument();
    return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
}

These 2 are the core of deciding which compatibility mode your current browser it has, and then whether to use window.pageYOffset or document.body.scrollTop based on that or even document.html.scrollTop for really ancient buggy browsers.

1

Based on Niels' answer, I come up with a slightly more compact solution when just the Y coord is needed:

function get_scroll_y() {
    return window.pageYOffset || document.body.scrollTop || document.html.scrollTop;
}
1

Based on Mozilla, and answers above, I have a created the functions below to more easily get the coords:

var windowEl = (function () {
    var isCSS1Compat = ((document.compatMode || "") === "CSS1Compat");
    function scroll() {
        return { left: scrollLeft, top: scrollTop };
    };
    function scrollLeft() {
        return window.scrollX || window.pageXOffset || (isCSS1Compat ? document.documentElement.scrollLeft : document.body.scrollLeft);
    };
    function scrollTop() {
        return window.scrollY || window.pageYOffset || (isCSS1Compat ? document.documentElement.scrollTop : document.body.scrollTop);
    };
    return {
        scroll: scroll,
        scrollLeft: scrollLeft,
        scrollTop: scrollTop
    }
})();

According to the Mozilla documentation, as cited by lifetimes above, the The pageXOffset property is an alias for the scrollX property, so is stictly speaking not necessary.

Anyhoo, usage is:

var scroll = windowEl.scroll();
// use scroll.left for the left scroll offset
// use scroll.top for the top scroll offset

var scrollLeft = windowEl.scrollLeft();
// the left scroll offset

var scrollTop = windowEl.scrollTop();
// the top scroll offset

Tested & works on Chrome, Firefox, Opera, Edge (8-Edge), IE (7-11), IE8 on XP

0

In angular, we use:

  var windowEl = angular.element($window);
  scrolldist = windowEl.scrollTop();
1
0

window.scrollY & window.scrollX works fine in all modern browers like (Chrome, FireFox & Safari) but does not work in IE so to fix the use window.pageXOffset or window.pageYOffset.

Here is a sample code I wrote to fix ie issue so that the programmatic scrolling works in all browsers including IE

if((window.scrollY || window.pageYOffset) >= 1100){
   //alert('Switch to land');
    $('#landTrst').trigger('click'); // your action goes here
}else if ((window.scrollY || window.pageYOffset) <= 900) {   
    //alert('Switch to Refernce Letter');
     $('#resLet').trigger('click'); // your action goes here
}                            

Not the answer you're looking for? Browse other questions tagged or ask your own question.