中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ResizeObserver?API如何使用

發布時間:2022-07-19 09:37:55 來源:億速云 閱讀:152 作者:iii 欄目:開發技術

這篇文章主要講解了“ResizeObserver API如何使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“ResizeObserver API如何使用”吧!

API介紹

當我們需要知道一個元素的大小變化或者屏幕橫豎屏時,我們需要監聽window.resize事件或者window.orientationchange方法。由于reize事件會在一秒內觸發將近60次,所以很容易在改變窗口大小時導致性能問題。換句話說,window.resize事件通常是浪費的,因為它會監聽每個元素的大小變化(只有window對象才有resize事件),而不是具體到某個元素的變化。如果我們只想監聽某個元素的變化的話,這種操作就很浪費性能了。

而ResizeObserver API就可以幫助我們:監聽一個DOM節點的變化,這種變化包括但不僅限于:

  • 某個節點的出現和隱藏

  • 某個節點的大小變化

ResizeObserver API是一個新的JavaScript API,與IntersectionObserver API非常相似,它們都允許我們去監聽某個元素的變化。

實際上,ResizeObserver API使用了觀察者模式,也就是我們常說的發布-訂閱模式。發布-訂閱模式是JavaScript中典型的設計模式,在很多地方都有使用到。如Nodejs的Event模塊,Vue的父子組件通信等等。

所以呢,我個人認為,ResizeObserver API的出現是用于替代window.resize方法糟糕的性能的。

瀏覽器兼容性

雖然可以用來替代resize事件。但是它,很新,新到只有部分瀏覽器支持。

ResizeObserver?API如何使用

但是不要慫呀,如果想使用它,可以使用其polyfill。最低可以兼容到IE8以上的瀏覽器啦。所以以后在開發過程中如果想使用resize事件監聽DOM的大小變化時,何不嘗試一下ResizeObserver API呢?

用法

使用ResizeObserver API非常簡單。ResizeObserver是個構造函數。在使用new關鍵字調用構造函數,返回實例對象時,需要傳入一個回調函數,這個回調用于監聽實例對象某個DOM節點的變化。如

      const myObserver = new ResizeObserver(entries => {
        entries.forEach(entry => {
          console.log('大小位置', entry.contentRect)
          console.log('監聽的DOM', entry.target)
        })
      })
      myObserver.observe(document.body)

以上,調用實例對象的observe方法,監聽整個body節點的變化,當改變窗口大小或者某個DOM節點出現或隱藏時時,就會觸發回調。

ResizeObserver?API如何使用

ResizeObserver?API如何使用

觸發回調后的第一個參數是一個ResizeObserverEntry對象。這里的entry.target是DOM節點本身,而entry.contentRect是一個對象,包含了節點的位置屬性,如width, height, left, right, bottom, left, x, y等。

width:指元素本身的寬度,不包含padding,border值

height:指元素本身的高度,不包含padding,border值

top:指padidng-top的值

left:指padding-left的值

right:指left + width的值

bottom: 值top + height的值

x:大小與top相同

y:大小與left相同,不知道具體是指什么

明白了contentRect之后,就可以在使用這個api的時候針對不同場景獲取不同的值進行業務的開發。

接著,如果想在監聽多個DOM節點的變化,直接在一個實例對象上調用多次observe方法就好了。如

const myObserver = new ResizeObserver(entries => {
// 注意,entres是個數組,數組項為每個需要監聽的DOM節點
   entries.forEach(entry => {
     console.log('大小位置 contentRect', entry.contentRect)
     console.log('監聽的DOM target', entry.target)
   })
})
myObserver.observe(document.body)
myObserver.observe(document.querySelector('#app'))

然后,實例對象myObserver方法除了有observe方法之外,還有disconnect方法和unobserve方法。

unobserve方法,顧名思義了,就是取消監聽某個DOM節點。比如說想在兩秒后取消監聽document.body,那么這樣做就好了

window.setTimeout(() => {
   myObserver.unobserve(document.body)   // 需要接收一個參數
}, 2000)

disconnect方法呢,就是取消對所有節點的監聽。比如說想在四秒后取消監聽所有節點,那么

window.setTimeout(() => {
   myObserver.disconnect()    // 此時就不會再監聽document.body,和#app節點了
}, 4000)

最后,在使用ResizeObserver API的時候,在每次觸發元素的大小變化時,會在1s內觸發回調蠻多次的。如果想進一步優化性能,可以加上throttle節流函數處理

// throttle需要自行引入哈
const myObserver = new ResizeObserver(throttle(entries => {
  entries.forEach(entry => {
    console.log('大小位置 contentRect', entry.contentRect)
    console.log('監聽的DOM target', entry.target)
  })
}), 500)

感謝各位的閱讀,以上就是“ResizeObserver API如何使用”的內容了,經過本文的學習后,相信大家對ResizeObserver API如何使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

仙游县| 江孜县| 南开区| 沛县| 虹口区| 邵东县| 双江| 乳山市| 霍州市| 枣阳市| 文水县| 平果县| 视频| 如皋市| 康乐县| 阳城县| 汤阴县| 息烽县| 育儿| 阿拉善左旗| 天峨县| 航空| 大新县| 临沧市| 如东县| 深水埗区| 津南区| 鄂尔多斯市| 克什克腾旗| 长岭县| 虹口区| 德惠市| 伊宁市| 祁阳县| 多伦县| 巴彦县| 革吉县| 万山特区| 喀喇沁旗| 修武县| 都兰县|