Skip to content

jQuery 瀏覽器事件:resize 與 scroll 的用法

jQuery 瀏覽器事件:resize 與 scroll

常用的 瀏覽器事件 介紹及參數設定。這兩個事件的監聽對象通常都是 window

resize()

當目標元素的大小改變時觸發。

js
// 即將棄用
resize(handler);

// 改用
on('resize', handler);

參數

功能說明型別範例備註
handler執行事項Functionfunction() {}必填

範例

注意最後多呼叫了一次 resizeHandler() 。因為 resize 只在尺寸改變時才觸發,頁面剛載入時並不會執行,先手動叫一次畫面上才會有初始值。

html
<div id="Dom"></div>
js
function resizeHandler() {
  $('#Dom').text('width: ' + $(window).width() + 'px');
}

resizeHandler();
$(window).on('resize', resizeHandler);

與 RWD 的分工

純樣式的斷點變化交給 CSS 的 媒體查詢 處理就好,只有需要依寬度改變 JavaScript 行為時,才需要監聽 resize

scroll()

當目標元素捲動時觸發。

js
// 即將棄用
scroll(handler);

// 改用
on('scroll', handler);

參數

與前述相同。

範例

html
<div id="Dom" class="dom"></div>
js
$(window).on('scroll', function () {
  console.log('scrolling');
});
css
.dom {
  width: 100%;
  height: 1000px;
}

觸發非常頻繁

resizescroll 在操作過程中每秒可能觸發數十次。處理函式若牽涉大量的 DOM 讀寫 就容易造成畫面卡頓,實務上建議搭配節流(throttle)或防抖(debounce),相關的計時器用法可參考 定時與排程

想取得目前捲動的位置,可以搭配 scrollTop()

常見問題

resize 只能監聽 window 嗎?

實務上絕大多數都是監聽 window。一般元素的尺寸變化不會觸發 resize,若真的需要,應該改用 ResizeObserver。

為什麼範例要先手動呼叫一次處理函式?

因為 resize 只在尺寸改變時才觸發,頁面剛載入時並不會執行。先呼叫一次,畫面上才會有初始值。

resize 和 scroll 會不會影響效能?

會。兩者在操作過程中都可能每秒觸發數十次,處理函式若牽涉大量 DOM 讀寫就容易造成卡頓,建議搭配節流(throttle)或防抖(debounce)。

scroll 可以監聽某個容器嗎?

可以。只要該容器本身有捲軸,就能對它註冊 scroll,取得捲動位置則使用 scrollTop()

RWD 的斷點判斷一定要用 resize 嗎?

不一定。純樣式的變化交給 CSS 的媒體查詢 處理即可,只有需要依寬度改變 JavaScript 行為時,才需要監聽 resize

延伸閱讀

參考資料:jQuery API:Browser Events