JavaScript中DOM尺寸測(cè)量與節(jié)流技巧總結(jié)
前言
在開(kāi)發(fā)網(wǎng)頁(yè)時(shí),我們經(jīng)常需要獲取元素的寬高,或者處理一些像滾動(dòng)、窗口調(diào)整這樣的事件。不過(guò),如果不加以?xún)?yōu)化,頻繁觸發(fā)這些事件可能會(huì)影響頁(yè)面性能。今天這篇文章會(huì)介紹如何通過(guò) JavaScript 獲取 DOM 元素的尺寸,同時(shí)聊聊如何使用節(jié)流(Throttle)來(lái)優(yōu)化高頻事件處理,讓你的網(wǎng)頁(yè)跑得更流暢。
一、如何獲取元素的尺寸
JavaScript 提供了不少方法來(lái)獲取元素的寬度和高度,下面是幾個(gè)常用的。
1. Element.clientHeight 和 Element.clientWidth
clientHeight
:返回元素的高度,包括padding
,但不包括border
、margin
和滾動(dòng)條。clientWidth
:返回元素的寬度,邏輯跟clientHeight
類(lèi)似。
這些屬性很適合用來(lái)獲取元素的實(shí)際可見(jiàn)區(qū)域,比如你需要知道某個(gè)元素在頁(yè)面上占了多大的空間。
// 獲取瀏覽器視口的高度 let viewportHeight = document.documentElement.clientHeight; // 獲取某個(gè)元素的寬度 let elementWidth = document.querySelector('.my-element').clientWidth;
2. Element.scrollHeight 和 Element.scrollWidth
這兩個(gè)屬性代表元素的總高度和總寬度,包括那些超出可視范圍的內(nèi)容,適用于有滾動(dòng)條的元素。
// 獲取頁(yè)面的總高度 let pageHeight = document.documentElement.scrollHeight; // 獲取某個(gè)滾動(dòng)區(qū)域的總寬度 let elementScrollWidth = document.querySelector('.scrollable-element').scrollWidth;
3. Element.scrollTop 和 Element.scrollLeft
scrollTop
:表示已經(jīng)向下滾動(dòng)了多少像素。scrollLeft
:表示已經(jīng)向右滾動(dòng)了多少像素。
這兩個(gè)屬性經(jīng)常用來(lái)監(jiān)聽(tīng)滾動(dòng)事件,比如你想在用戶(hù)滾動(dòng)到一定位置時(shí)觸發(fā)加載更多內(nèi)容。
// 獲取當(dāng)前頁(yè)面滾動(dòng)的垂直距離 let scrollTop = document.documentElement.scrollTop;
二、節(jié)流(Throttle)與防抖(Debounce)
在開(kāi)發(fā)中,像滾動(dòng)、窗口調(diào)整這樣的事件有時(shí)候觸發(fā)得非常頻繁。如果每次事件觸發(fā)都去執(zhí)行某些耗時(shí)操作,頁(yè)面可能會(huì)變得很卡。這時(shí)我們可以使用節(jié)流和防抖來(lái)優(yōu)化這些操作。
1. 節(jié)流(Throttle)
節(jié)流的作用是讓某個(gè)函數(shù)在固定時(shí)間內(nèi)只能執(zhí)行一次。不管這個(gè)時(shí)間段內(nèi)事件被觸發(fā)了多少次,函數(shù)都只會(huì)在時(shí)間間隔內(nèi)執(zhí)行一次。
function throttle(fn, delay) { let valid = true; return function() { if (!valid) { return; } valid = false; setTimeout(() => { fn(); valid = true; }, delay); }; } // 示例:每隔 300 毫秒打印一次滾動(dòng)條的位置 function showScrollPosition() { let scrollTop = document.documentElement.scrollTop; console.log('滾動(dòng)條位置:' + scrollTop); } window.onscroll = throttle(showScrollPosition, 300);
2. 節(jié)流和防抖的應(yīng)用場(chǎng)景
- 搜索框:當(dāng)用戶(hù)在搜索框中輸入時(shí),使用節(jié)流來(lái)減少過(guò)于頻繁的請(qǐng)求,比如每隔 500 毫秒發(fā)送一次請(qǐng)求。
- 窗口調(diào)整(resize):在頁(yè)面調(diào)整大小時(shí),通常我們只想在用戶(hù)停止調(diào)整后執(zhí)行一次操作,這時(shí)候可以使用防抖。
總結(jié)
今天通過(guò) JavaScript 獲取 DOM 元素的尺寸,以及使用節(jié)流(Throttle)來(lái)優(yōu)化高頻事件處理的內(nèi)容到此為止
到此這篇關(guān)于JavaScript中DOM尺寸測(cè)量與節(jié)流技巧的文章就介紹到這了,更多相關(guān)JS中DOM尺寸測(cè)量與節(jié)流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使一個(gè)函數(shù)作為另外一個(gè)函數(shù)的參數(shù)來(lái)運(yùn)行的javascript代碼
使一個(gè)函數(shù)作為另外一個(gè)函數(shù)的參數(shù)來(lái)運(yùn)行的javascript代碼...2007-08-08javascript 計(jì)算兩個(gè)整數(shù)的百分比值
用來(lái)計(jì)算兩個(gè)整數(shù)的百分比值的代碼,需要的可以看看。2009-12-12微信小程序圖片上傳組件實(shí)現(xiàn)圖片拖拽排序
最近在寫(xiě)小程序過(guò)程中遇到一個(gè)拖拽排序需求,上網(wǎng)一頓搜索未果,遂自行實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于微信小程序圖片上傳組件實(shí)現(xiàn)圖片拖拽排序的相關(guān)資料,需要的朋友可以參考下2022-03-03el-input限制輸入只允許輸入浮點(diǎn)型的解決思路
本文主要是記錄,el-input怎么限制輸入只允許輸入浮點(diǎn)型,注意是輸入的時(shí)候限制只允許輸入浮點(diǎn)型,而不是輸入完提交的時(shí)候再校驗(yàn)提示,感興趣的朋友跟隨小編一起看看吧2024-03-03用Node.js通過(guò)sitemap.xml批量抓取美女圖片
這篇文章主要介紹了用Node.js通過(guò)sitemap.xml批量抓取美女圖片的方法和相關(guān)代碼,有需要的小伙伴可以參考下。2015-05-05JavaScript中的atob和btoa函數(shù)及base64編碼解碼詳解
在JavaScript中btoa和atob是兩個(gè)處理Base64編碼的全局函數(shù),它們通常用于在瀏覽器環(huán)境中對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行編碼和解碼,這篇文章主要介紹了JavaScript中atob和btoa函數(shù)及base64編碼解碼的相關(guān)資料,需要的朋友可以參考下2025-04-04