指定した要素内で、スクロールした時に一番上もしくは一番下まで来たかどうかを判定します。
コード
Javascript
/**
* 一番上なら top、一番下なら bottom、その他は scrolling の文字列を返す
*
* @param {UIEvent} event
* @returns {String} 'top' | 'bottom' | 'scrolling'
*/
const getScrollVerticalPosition = e => {
const {
scrollHeight, scrollTop, clientHeight
} = e.target;
const isScrollTop = scrollTop === 0;
const isScrollBottom = scrollHeight - clientHeight === scrollTop;
if (isScrollTop) {
return 'top';
} else if (isScrollBottom) {
return 'bottom';
} else {
return 'scrolling';
}
}
UIEvent
オブジェクトのtarget
プロパティには、スクロール中の要素情報が含まれているので、それを元にして判定を行います。
scrollTop
… 要素のスクロール位置。一番上なら0
。scrollHeight
… 要素のスクロールしているコンテンツ部分の高さclientHeight
… 要素の高さ
使い方
スクロールできる.scroll-area
要素に対して使ってみます。console を見ると文字列が返ってきます。
const elem = document.querySelector('.scroll-area');
elem.addEventListener('scroll', e => {
const scrollPosition = getScrollVerticalPosition(e);
// ログに出力
console.log(scrollPosition);
});
<- 'top' | 'bottom' | 'scrolling' のいずれかが返る
jQuery の場合
$('.scroll-area').on('scroll', function(e) => {
const scrollPosition = getScrollVerticalPosition(e);
// ログに出力
console.log(e);
});