--- 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 イベントやアニメーションフレームがおよそ同じ頻度で発行されるため、以下の最適化は必要ないことがあります。この例は requestAnimationFramescroll イベントを最適化します。

// 参照: 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")}}

関連情報