ResizeObserver 監(jiān)視 DOM大小變化示例詳解
引言
ResizeObserver
用于監(jiān)聽元素的大小尺寸變化,常見用于監(jiān)聽自適應(yīng)大小的元素變化引起的寬高變化時處理應(yīng)寬高變化而需要 JS
做特定處理的場景。
說下我自己使用中遇到的三個場景:
Tabs
組件的頭部區(qū)域在超過寬度/高度時需要展示出超出滾動按鈕- 組件中存在超出隱藏的場景,如多個標(biāo)簽超出一行后將剩余標(biāo)簽進(jìn)行壓縮等
Table
組件橫向滾動如果存在某幾列數(shù)據(jù)需要固定展示的情況下需要根據(jù)寬度來計算是否需要出現(xiàn)滾動條和滾動體室陰影
可以看出上面幾個場景共性:當(dāng)樣式需要自適應(yīng)寬高,而腳本又需要按照元素寬高來執(zhí)行某些操作時。這些場景使用 ResizeObserver
就可以比較方便的進(jìn)行處理。
使用
使用 ResizeObserver
第一步同樣是先需要實例化一個 observer
,第二步便是使用 observer
的 observe
將需要監(jiān)聽的元素添加到監(jiān)視列表中:
const observer = new ResizeObserver((entries, observer) => { entries.forEach(entry => { console.log(entry); }); }); observer.observe(target);
實例化時只需要接受一個參數(shù):尺寸變化時的回調(diào),回調(diào)函數(shù)中的 entries
則是所有添加到監(jiān)視列表中的元素的 entry
信息列表,而 observer
同樣是上面實例化的 observer
的引用。
Script
const observer = new ResizeObserver(entries => { entries.forEach(entry => { console.log(entry); }) }) observer.observe(document.getElementById('target'));
entry
entry
中包括以下五個屬性:
borderBoxSize
: 監(jiān)聽元素的borderBox
尺寸contentBoxSize
: 監(jiān)聽元素的contentBox
尺寸devicePixelContentBoxSize
: 監(jiān)聽元素的contentBox
尺寸,不過是設(shè)備像素維度,而不是展示維度contentRect
: 監(jiān)聽元素的contentRect
信息,同getClientRects
target
:entry
所屬的監(jiān)聽元素
borderBox
和 contentBox
就是我們常說的 CSS
盒模型中的 borderBox
和 contentBox
,entry
中的 borderBoxSize
和 contentBoxSize
中包含兩個屬性:blockSize
和 inlineSize
,這兩個屬性的值與頁面元素的 writing-mode
相關(guān),默認(rèn)情況下 blockSize
為縱向尺寸一般為高度,inlineSize
為橫向尺寸一般為寬度。而當(dāng)書寫模式為縱向時,blockSize
、inlineSize
的縱橫向關(guān)系會調(diào)換。
而 devicePixelContentBoxSize
則和設(shè)備像素比相關(guān),在移動設(shè)備或是高分辨率屏幕中會與 CSS
像素存在差異。
其它 API
除了 observe
外,observer
還提供了 unobserve
來解除某個元素的監(jiān)聽,或直接調(diào)用 disconnect
來關(guān)閉對所有元素的監(jiān)聽。
兼容與 polyfill
ResizeObserver
的兼容性較差,一般情況下推薦需要使用 polyfill
來進(jìn)行補全:
chrome
64edge
79firefox
69safari
13.1ie
不支持
常用的 polyfill
:www.npmjs.com/package/res…
以上就是ResizeObserver 監(jiān)視 DOM大小變化示例詳解的詳細(xì)內(nèi)容,更多關(guān)于ResizeObserver 監(jiān)視 DOM 的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
ComponentLoader?與動態(tài)組件實例詳解
這篇文章主要為大家介紹了ComponentLoader?與動態(tài)組件實現(xiàn)實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05electron創(chuàng)建新窗口模態(tài)框并實現(xiàn)主進(jìn)程傳值給子進(jìn)程
這篇文章主要為大家介紹了electron創(chuàng)建新窗口模態(tài)框并實現(xiàn)主進(jìn)程傳值給子進(jìn)程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Moment的feature導(dǎo)致線上bug解決分析
這篇文章主要為大家介紹了Moment的feature導(dǎo)致線上bug解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09