In Chrome and Safari, $("body").scrollTop(1000)
goes where expected.
In IE and FF, nothing happens.
In IE and FF, $(window).scrollTop(1000)
works, but they go to different places. It also works in Chrome and Safari, but they both go to a different place as well. They seems to be up to 300-500 pixels off.
Is there any consistent way to set the scrollTop property that works cross browser, and if not, why doesn't jQuery abstract this?
I'd like to animate it as well, which works fine in Chrome and Safari, but not in the other browsers.
Is my only option to do browser detection? (bad practice) Or is there some better way?
In Chrome and Safari, $("body").scrollTop(1000)
goes where expected.
In IE and FF, nothing happens.
In IE and FF, $(window).scrollTop(1000)
works, but they go to different places. It also works in Chrome and Safari, but they both go to a different place as well. They seems to be up to 300-500 pixels off.
Is there any consistent way to set the scrollTop property that works cross browser, and if not, why doesn't jQuery abstract this?
I'd like to animate it as well, which works fine in Chrome and Safari, but not in the other browsers.
Is my only option to do browser detection? (bad practice) Or is there some better way?
Share Improve this question edited Jan 28, 2012 at 19:16 Andrew Whitaker 126k32 gold badges295 silver badges308 bronze badges asked Jan 27, 2012 at 23:24 Nathan LoyerNathan Loyer 1,3491 gold badge10 silver badges20 bronze badges 2- have you tried using $(document).scrollTop("...")? – epignosisx Commented Jan 27, 2012 at 23:30
- That actually worked. I had tried $('document') but that didn't. If you answer as a question I'll give you credit. – Nathan Loyer Commented Jan 27, 2012 at 23:53
3 Answers
Reset to default 11$(jQuery.browser.webkit ? "body": "html").animate({ scrollTop: myTop }, myDur);
Webkit browsers (Chrome/Safari, both Mac and Win) use "body", others (FF/Opera/IE 7-9) use "html"
Gotta love browser detection.
Try
$(document).scrollTop("...");
You need to apply scrollTop
to either body
or html
depending on the browser, but there's no harm applying it to both. Since .scrollTop()
applies to the first element in the set, but .animate()
applies to all elements, you can do this:
$('body, html').animate({
scrollTop: 1000
}, 'fast');
If you want the change to apply immediately, change the speed ('fast'
) to 0
. Alternatively, you can use the following, but I like the above syntax better:
$('body, html').each(function() { $(this).scrollTop(1000); });