window.scrollTo(Infinity, Infinity)

絶対的なスクロールはwindow.scrollTo()で、相対的なスクロールはwindow.scrollBy()で可能だ。このあたりのことを決めているCSSOM View Moduleではwindow.scroll()のショートカットとしてscrollTo()が決められていたりするが、大抵はこのどちらかで行うことになる。しかしページ最下部への移動をちゃんと行うとなると、色々面倒くさい(スクロール・バーとか)。そのためありえないくらいの大きな値を渡して誤魔化すことが多かったが、それならとInifityを渡したらChrome 42やInternet Explorer 11ではうまく動いた。

View 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);

4. Extensions to the Window Interface

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)とか書き続けることになるようだ。