scrollTopMaxを取得する JavaScript
element.scrollTopMax
は現在Firefoxだけにあるプロパティで、要素の最大スクロール可能量を返す。読み取り専用。window.scrollMaxY
のelement版。
これは他のブラウザなら
element.scrollHeight - element.clientHeight
で求められると思っていたが違った。
スクロール可能なのは、スタイルにoverflow:visible
以外が設定されているときで、visibleが設定、あるいは初期値がvisibleのときにはその要素はスクロールできない。
つまり、次の2つの条件を満たすときのみ要素はスクロールできる
- element.scrollHeight - element.clientHeightの戻り値がある(0でない)
- スタイルがoverflow:visibleではない
*1 ただしhtml, bodyは除く
*2 残念ながらIEだけこれでは不十分だった。
IEではoverflow:visibleやautoにした要素でも、scrollHeight - clientHeightの戻り値が0より大きくなってしまうことがある。よって実際にスクロール可能か試すしかないようだ。
getScrollTopMax
/** getScrollTopMax @test https://developer.mozilla.org/ja/docs/DOM/element.clientHeight */ var target = document.getElementById("idDiv") target.scrollHeight // 401 target.clientHeight // 102 target.scrollTopMax // 299 var target2 = document.getElementById("offsetContainer") target2.scrollHeight // 224 target2.clientHeight // 198 target2.scrollTopMax // 0 <- not scrollable function isScrollable(ele){ // except html, body if(ele.scrollTop || ele.scrollLeft){ return true } var style_overflow = window.getComputedStyle !== void 0 ? getComputedStyle(ele, null).overflow : ele.currentStyle.getAttribute("overflow") if (style_overflow === "visible") return false // for IE ele.scrollLeft += 1 ele.scrollTop += 1 return ele.scrollTop || ele.scrollLeft ? (ele.scrollLeft += -1, ele.scrollTop += -1, true) : false } function getScrollTopMax(ele){ return isScrollable(ele) ? ele.scrollHeight - ele.clientHeight : 0 } getScrollTopMax(target) // 299 getScrollTopMax(target2) // 0
isScrollableは別の名前にしたほうがいいかな?