絶対的なスクロールはwindow.scrollTo()
で、相対的なスクロールはwindow.scrollBy()
で可能だ。このあたりのことを決めているCSSOM View Moduleではwindow.scroll()
のショートカットとしてscrollTo()
が決められていたりするが、大抵はこのどちらかで行うことになる。しかしページ最下部への移動をちゃんと行うとなると、色々面倒くさい(スクロール・バーとか)。そのためありえないくらいの大きな値を渡して誤魔化すことが多かったが、それならとInifity
を渡したらChrome 42やInternet Explorer 11ではうまく動いた。
Demo: window.scrollTo(Infinity, Infinity)
デモでは右と下の端までスクロールさせるボタンが三種類ある。もちろんX座標とY座標のどちらかだけInfinity
を指定してもそのどちらかの端までスクロールさせることができるということだ。どれもChrome 42とInternet Explorer 11ではスクロールされるが、Firefox 37と(Mobile )Safari 8ではそのようにはスクロールされず、ページの先頭に戻される。
どうやらFirefox 37とSafari 8の挙動が正しいようだ。2015/04/20版の開発中の仕様では以下のように定義されている。
void scroll(unrestricted double x, unrestricted double y);
Web IDLによるとunrestricted doubleは正負のInfinity (やNaN)を許容するので、window.scrollTo(Infinity, Infinity)
としても間違いではないということになる。しかし同時にnon-finite valueを0とするとも決められているので、window.scrollTo(0, 0)
と解釈されるべきということになる。
一方、最新のWDではdouble
となっており、Infinity
は許容されない(「Infinity
, -Infinity
and NaN
must not be used as the value of a float or double」)。そのためChrome 42やInternet Explorer 11の挙動はどちらの仕様をとったとしてもバグだと言える。Chromeではバグが立っており、既に修正されたようだ。Internet Explorerにはバグ報告はしておいた。
Infinity
で書けるとわかりやすそうかなと思ったが、そうはうまくいかなかった。結局window.scrollTo(99999999, 99999999)
とか書き続けることになるようだ。