JavaScript動(dòng)態(tài)監(jiān)聽(tīng)DOM元素高度變化的實(shí)現(xiàn)方法
背景
在前端開(kāi)發(fā)中,監(jiān)聽(tīng)DOM元素的高度變化有時(shí)候是一個(gè)常見(jiàn)需求,尤其是在做響應(yīng)式設(shè)計(jì)或需要根據(jù)內(nèi)容變化調(diào)整布局時(shí)。常見(jiàn)的解決方案有兩種,一種是使用現(xiàn)代瀏覽器支持的 ResizeObserver,另一種是通過(guò)兼容性更強(qiáng)的 iframe 技術(shù)來(lái)實(shí)現(xiàn),適用于老款手機(jī)和IE瀏覽器。
1. ResizeObserver
ResizeObserver 是現(xiàn)代瀏覽器提供的一種監(jiān)聽(tīng)元素尺寸變化的 API。它可以監(jiān)聽(tīng)任意元素的大小變化,并在變化時(shí)觸發(fā)回調(diào)函數(shù),適合處理 DOM 元素高度變化的情況。
示例代碼:
// 選擇你想要監(jiān)聽(tīng)的 DOM 元素
const targetElement = document.querySelector('.target');
// 創(chuàng)建 ResizeObserver 實(shí)例,并傳入回調(diào)函數(shù)
const resizeObserver = new ResizeObserver(entries => {
// entries 是一個(gè)包含被監(jiān)聽(tīng)元素的數(shù)組
entries.forEach(entry => {
// 獲取目標(biāo)元素的當(dāng)前高度
const height = entry.contentRect.height;
console.log('元素的當(dāng)前高度:', height);
});
});
// 開(kāi)始監(jiān)聽(tīng)目標(biāo)元素的尺寸變化
resizeObserver.observe(targetElement);
使用說(shuō)明:
ResizeObserver會(huì)監(jiān)聽(tīng)目標(biāo)元素的大小變化,并返回一個(gè)entries數(shù)組,其中每一項(xiàng)代表一個(gè)被觀察的元素。entry.contentRect是一個(gè)包含元素尺寸信息的矩形對(duì)象,height屬性即為元素的高度。- 這個(gè)方法對(duì)于現(xiàn)代瀏覽器(Chrome、Firefox、Safari 等)都有效,支持程度較高。
2. Iframe
對(duì)于一些老款瀏覽器(如 IE 瀏覽器)或者需要兼容更多設(shè)備的情況,我們可以采用 iframe 技術(shù)來(lái)實(shí)現(xiàn)動(dòng)態(tài)監(jiān)聽(tīng)容器的高度變化。通過(guò)嵌入一個(gè)隱藏的 iframe 元素,可以監(jiān)聽(tīng) iframe 元素的 resize 事件來(lái)間接判斷容器的高度。
示例代碼(純 HTML 實(shí)現(xiàn)):
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>動(dòng)態(tài)監(jiān)聽(tīng)DOM元素高度變化 - iframe 示例</title>
<style>
.container {
width: 100%;
height: 200px; /* 初始高度 */
position: relative;
border: 1px solid #ccc;
}
.resize-iframe {
width: 100%;
height: 100%;
border: none;
position: absolute;
top: 0;
left: 0;
}
</style>
</head>
<body>
<div class="container">
<iframe class="resize-iframe" src="about:blank"></iframe>
</div>
<script>
const container = document.querySelector('.container');
const iframe = document.querySelector('.resize-iframe');
// 監(jiān)聽(tīng) iframe 的 resize 事件
iframe.contentWindow.addEventListener('resize', function () {
// 獲取容器的當(dāng)前高度
console.log('容器的當(dāng)前高度:', container.offsetHeight);
});
// 為了演示,在容器的高度變化時(shí)觸發(fā) resize 事件
setInterval(() => {
container.style.height = Math.random() * 500 + 'px'; // 隨機(jī)調(diào)整容器高度
}, 2000); // 每2秒調(diào)整一次高度
</script>
</body>
</html>
使用說(shuō)明:
- 這個(gè)方法通過(guò)將一個(gè)隱藏的 iframe 嵌套到目標(biāo)容器內(nèi),利用 iframe 的
resize事件來(lái)檢測(cè)容器的高度變化。 - 由于
iframe的resize事件會(huì)在容器的尺寸發(fā)生變化時(shí)觸發(fā),因此我們可以在事件回調(diào)中獲取容器的最新高度。 - 此方法的兼容性更廣,可以支持老舊瀏覽器,如 IE 瀏覽器。
總結(jié)
通過(guò)這兩種方法,我們可以動(dòng)態(tài)監(jiān)聽(tīng) DOM 元素的高度變化,選擇適合的方案可以保證跨瀏覽器和設(shè)備的兼容性。
到此這篇關(guān)于JavaScript動(dòng)態(tài)監(jiān)聽(tīng)DOM元素高度變化的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)JS監(jiān)聽(tīng)DOM元素高度變化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Javascript Cookie讀寫刪除操作的函數(shù)
Javascript Cookie讀寫刪除操作的函數(shù)代碼,需要操作cookies的朋友可以參考下。2010-03-03
js通過(guò)keyCode值判斷單擊鍵盤上某個(gè)鍵,然后觸發(fā)指定的事件方法
下面小編就為大家?guī)?lái)一篇js通過(guò)keyCode值判斷單擊鍵盤上某個(gè)鍵,然后觸發(fā)指定的事件方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
基于函數(shù)執(zhí)行的踩坑(addEventListener)
這篇文章主要介紹了基于函數(shù)執(zhí)行的踩坑(addEventListener),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
動(dòng)態(tài)規(guī)劃之使用備忘錄來(lái)改進(jìn)Javascript函數(shù)
這篇文章主要介紹了動(dòng)態(tài)規(guī)劃之使用備忘錄來(lái)改進(jìn)Javascript函數(shù),動(dòng)態(tài)規(guī)劃它既是一種數(shù)學(xué)優(yōu)化方法,也是一種計(jì)算機(jī)編程方法,下文相關(guān)資料介紹需要的小伙伴可以參考一下2022-04-04
如何使用JS寫個(gè)方法判斷當(dāng)前時(shí)區(qū)是否是夏令時(shí)
文章介紹了如何使用JavaScript判斷當(dāng)前時(shí)區(qū)是否處于夏令時(shí),由于JavaScript標(biāo)準(zhǔn)庫(kù)沒(méi)有直接提供此功能,可以通過(guò)比較本地時(shí)間和UTC時(shí)間的差異來(lái)推斷,文章還提供了使用moment.js和moment-timezone插件進(jìn)行更精確夏令時(shí)檢測(cè)的示例,感興趣的朋友一起看看吧2024-12-12
JavaScript查找文章中的高頻單詞的多種實(shí)現(xiàn)方案
本文將詳細(xì)介紹如何使用 JavaScript 查找一篇文章中出現(xiàn)頻率最高的單詞,包括完整的代碼實(shí)現(xiàn)、多種優(yōu)化方案以及實(shí)際應(yīng)用場(chǎng)景,感興趣的小伙伴跟著小編一起來(lái)看看吧2025-04-04

