--- 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")}}