--- title: 'Element: scroll イベント' slug: Web/API/Element/scroll_event tags: - API - Element - Event - Reference - Scroll translation_of: Web/API/Element/scroll_event ---
{{APIRef}}
scroll イベントは、要素がスクロールしたときに発行されます。
| バブリング | なし |
|---|---|
| キャンセル | 不可 |
| インターフェイス | {{DOMxRef("Event")}} |
| イベントハンドラープロパティ | {{DOMxRef("GlobalEventHandlers.onscroll", "onscroll")}} |
注: iOS の UIWebViews では、 scroll イベントはスクロールしている最中には発行されません。スクロールが完了した後に発行されます。 Bootstrap issue #16202 を参照してください。 Safari と WKWebViews はこのバグの影響を受けません。
scroll イベントは高い頻度で発行されるため、イベントハンドラーで DOM の変更のような計算が重い操作を実行するべきではありません。代わりに、次のように {{DOMxRef("Window.requestAnimationFrame()", "requestAnimationFrame()")}}, {{DOMxRef("WindowOrWorkerGlobalScope.setTimeout()", "setTimeout()")}}, {{DOMxRef("CustomEvent")}} などを使用してイベントを間引くことをお勧めします。
なお、ただし、 input イベントやアニメーションフレームがおよそ同じ頻度で発行されるため、以下の最適化は必要ないことがあります。この例は requestAnimationFrame の scroll イベントを最適化します。
// 参照: http://www.html5rocks.com/en/tutorials/speed/animations/
let last_known_scroll_position = 0;
let ticking = false;
function doSomething(scroll_pos) {
// スクロール位置で何かをする
}
window.addEventListener('scroll', function(e) {
last_known_scroll_position = window.scrollY;
if (!ticking) {
window.requestAnimationFrame(function() {
doSomething(last_known_scroll_position);
ticking = false;
});
ticking = true;
}
});
注: それ以外例が {{domxref("Document/resize_event", "resize")}} イベントページにあります。
| 仕様書 | 状態 |
|---|---|
| {{SpecName('CSSOM View', '#scrolling-events')}} | {{Spec2('CSSOM View')}} |
{{Compat("api.Element.scroll_event")}}