Himanshu P
Himanshu P

Reputation: 9935

body.scrollTop vs documentElement.scrollTop vs window.pageYOffset vs window.scrollY

When trying to find out how much a web page has been scrolled from the top, which of these should one use:

document.body.scrollTop,

document.documentElement.scrollTop,

window.pageYOffset,

window.scrollY

Which one(s) would I choose in these 2 separate scenarios:

a) If I wanted maximum compatibility (across the main browsers used currently)?

b) If I wanted code that was most standards compliant/future-proof/strict-mode-compatible (but didn't care about supporting old/non-standard browsers)?

Upvotes: 55

Views: 36904

Answers (5)

iamfnizami
iamfnizami

Reputation: 193

console.log('body.scrollTop : ' + document.body.scrollTop);
console.log('documentElement.scrollTop : ' + document.documentElement.scrollTop);
console.log('window.pageYOffset : ' + window.pageYOffset);
console.log('window.scrollY : ' + window.scrollY);

Output 1:

0

184.8000030517578

184.8000030517578

184.8000030517578

Output 2:

0

185.8000037517577

185.8000037517577

185.8000037517577

And so on...

Tested on Google Chrome - Version 85.0.4183.121 (Official Build) (64-bit)

document.body.scrollTop

It always gives 0 here but others three works perfectly.

Upvotes: 3

yaya
yaya

Reputation: 8253

Chrome uses documentElement.scrollTop, firefox uses body.scrollTop

Upvotes: 1

Prinzhorn
Prinzhorn

Reputation: 22508

I'm using three of them in the skrollr source

return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;

https://github.com/Prinzhorn/skrollr/blob/b98d40820b9864be275e81af382045d72cc5a08a/src/skrollr.js#L627

a) So far it's working across all browsers (nobody complaint in the past year).

b) Since it will use the first one that is defined, I guess it's pretty future proof and stable.

If you're fancy you could do this as well

Math.max(window.pageYOffset, document.documentElement.scrollTop, document.body.scrollTop)

Upvotes: 39

Tom
Tom

Reputation: 1122

To Prinzhorn's answear:

Since body and documentElement is undefined in Chrome/Firefox, better use:

return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;

Tested myself.

Upvotes: 3

jasonklein
jasonklein

Reputation: 61

Given that skrollr does not use window.scrollY, this may have been obvious, but as further answer to the original question: window.pageYOffset is an alias for window.scrollY. See Window.scrollY.

Upvotes: 5

Related Questions