JavaScript元素尺寸與位置

目錄

client?家族與?offset?家族

一、client?家族:內容區域 + 內邊距

示例代碼

應用場景

二、offset?家族:內容區域 + 內邊距 + 邊框 + 滾動條

示例代碼

應用場景

三、綜合應用場景

1. 動態調整元素高度

2. 拖拽元素

3. 判斷元素是否在視口內

四、注意事項

五、總結

getBoundingClientRect()

一、DOMRect?對象屬性

二、關鍵特性

1.?相對視口坐標系

2.?包含邊框和內邊距

3.?兼容性與性能

三、與其他方法的對比

四、代碼示例

示例:電梯導航


client?家族與?offset?家族

在 JavaScript 中,元素的尺寸和位置信息可通過?client?和?offset?系列屬性獲取。這兩組屬性分別描述了元素不同維度的幾何特征,適用于動態布局、拖拽交互、滾動計算等場景。


一、client?家族:內容區域 + 內邊距

屬性說明
clientWidth元素內容區域的寬度 + 左右內邊距(不包含滾動條、邊框、外邊距)
clientHeight元素內容區域的高度 + 上下內邊距(不包含滾動條、邊框、外邊距)
clientTop元素上邊框的寬度(等同于?border-top-width
clientLeft元素左邊框的寬度(等同于?border-left-width
示例代碼
const box = document.querySelector('.box');
console.log('內容寬度:', box.clientWidth);  // 內容 + padding
console.log('上邊框寬度:', box.clientTop);  // 上邊框寬度
應用場景
  • 計算元素內部可用空間(如文本容器)。

  • 動態調整內容區域大小(結合滾動條狀態)。


二、offset?家族:內容區域 + 內邊距 + 邊框 + 滾動條

屬性說明
offsetWidth元素總寬度(內容 + 內邊距 + 邊框 + 垂直滾動條寬度,若存在)
offsetHeight元素總高度(內容 + 內邊距 + 邊框 + 水平滾動條高度,若存在)
offsetTop元素上外邊框距離最近定位父元素(或文檔)上內邊框的垂直距離
offsetLeft元素左外邊框距離最近定位父元素(或文檔)左內邊框的水平距離
offsetParent元素的最近定位祖先元素(position?不為?static,若沒有則指向?body
示例代碼
const box = document.querySelector('.box');
console.log('元素總寬度:', box.offsetWidth); // 內容 + padding + border + 滾動條
console.log('距離父元素頂部:', box.offsetTop);
應用場景
  • 獲取元素的完整尺寸(包含邊框和滾動條)。

  • 計算元素在文檔中的絕對位置(結合?offsetParent)。


三、綜合應用場景

1. 動態調整元素高度
// 根據窗口高度調整容器高度
function adjustHeight() {const viewportHeight = window.innerHeight;const headerHeight = document.querySelector('header').offsetHeight;const container = document.querySelector('.container');container.style.height = `${viewportHeight - headerHeight}px`;
}
window.addEventListener('resize', adjustHeight);
2. 拖拽元素
let isDragging = false;
let startX, startY, initialX, initialY;document.querySelector('.draggable').addEventListener('mousedown', (e) => {isDragging = true;const rect = e.target.getBoundingClientRect();initialX = rect.left; // 元素當前文檔位置initialY = rect.top;startX = e.clientX;   // 鼠標按下位置startY = e.clientY;
});document.addEventListener('mousemove', (e) => {if (!isDragging) return;const deltaX = e.clientX - startX;const deltaY = e.clientY - startY;e.target.style.left = `${initialX + deltaX}px`;e.target.style.top = `${initialY + deltaY}px`;
});document.addEventListener('mouseup', () => {isDragging = false;
});
3. 判斷元素是否在視口內
function isElementInViewport(el) {const rect = el.getBoundingClientRect();return (rect.top >= 0 &&rect.left >= 0 &&rect.bottom <= window.innerHeight &&rect.right <= window.innerWidth);
}

四、注意事項

  1. 布局抖動:頻繁讀取尺寸屬性(如?offsetWidth)會強制瀏覽器重排,應盡量減少讀取次數。

  2. 隱藏元素:若元素為?display: none,其尺寸屬性值為?0

  3. 小數精度:部分瀏覽器返回的尺寸值可能是小數,需按需取整。

  4. 邊框與滾動條:滾動條的存在會影響?clientWidth?和?offsetWidth?的值。


五、總結

  • client?系列:關注元素內容與內邊距,適合內部空間計算。

  • offset?系列:包含邊框和滾動條,用于獲取元素整體占位或定位。

  • scroll?系列:處理內容滾動與溢出部分。

  • 組合使用:結合?getBoundingClientRect()?或?offsetParent?實現精準布局控制。


??

getBoundingClientRect()

Element.getBoundingClientRect()?是 JavaScript 中用于獲取元素精確尺寸和位置的核心方法。它返回一個?DOMRect?對象,包含元素相對于瀏覽器視口(viewport)的幾何信息,適用于動態布局計算、滾動檢測、交互定位等場景。


一、DOMRect?對象屬性

調用?getBoundingClientRect()?返回的對象包含以下屬性(單位:像素):

屬性說明
x/left元素左邊界到視口左側的距離(x?是?left?的別名,兼容性稍差)
y/top元素上邊界到視口頂部的距離(y?是?top?的別名,兼容性稍差)
right元素右邊界到視口左側的距離(right = left + width
bottom元素下邊界到視口頂部的距離(bottom = top + height
width元素的寬度(包含?padding?+?border,不包含?margin
height元素的高度(包含?padding?+?border,不包含?margin

二、關鍵特性

1.?相對視口坐標系
  • 所有值基于視口左上角計算,頁面滾動會改變結果(視口位置動態變化)。

  • 轉換為文檔坐標(絕對位置):

    const rect = element.getBoundingClientRect();
    const absoluteLeft = rect.left + window.scrollX;
    const absoluteTop = rect.top + window.scrollY;
2.?包含邊框和內邊距
  • width?和?height?包含元素的?padding?和?border,與?offsetWidth/offsetHeight?一致。

  • 對比其他尺寸屬性

    屬性包含內容
    clientWidth內容 + padding(不含邊框/滾動條)
    offsetWidth內容 + padding + border
    scrollWidth實際內容寬度(含溢出部分)
3.?兼容性與性能
  • 兼容性:所有現代瀏覽器均支持,包括 IE9+。

  • 性能:頻繁調用可能觸發重排(reflow),建議緩存結果或使用優化策略(如防抖)。


三、與其他方法的對比

方法特點
offsetTop/offsetLeft返回相對于最近定位父元素的偏移,不提供完整尺寸信息
clientWidth/clientHeight僅包含內容 + padding,無位置信息
scrollIntoView()滾動元素到視口,但無法直接獲取位置數據

四、代碼示例

const element = document.getElementById('target');
const rect = element.getBoundingClientRect();console.log('元素尺寸:', rect.width, 'x', rect.height);
console.log('視口內位置:', rect.left, rect.top);
console.log('文檔絕對位置:', rect.left + window.scrollX, rect.top + window.scrollY);

示例:電梯導航

  <!-- 電梯 --><div class="xtx-elevator"><ul class="xtx-elevator-list"><li><a href="javascript:;" data-name="new">新鮮好物</a></li><li><a href="javascript:;" data-name="popular">人氣推薦</a></li><li><a href="javascript:;" data-name="brand">熱門品牌</a></li><li><a href="javascript:;" data-name="topic">最新專題</a></li><li><a href="javascript:;" data-name="backTop"><i class="sprites"></i>頂部</a></li></ul></div><script>//導航隱藏與顯示const elevator = document.querySelector('.xtx-elevator')const entry = document.querySelector('.xtx_entry')window.addEventListener('scroll', function () {let scrolltop = document.documentElement.scrollTopelevator.style.opacity = scrolltop > entry.offsetTop ? 1 : 0})function clear() {if (document.querySelector('.xtx-elevator .active'))document.querySelector('.xtx-elevator .active').classList.remove('active')}//點擊導航跳轉const ul = document.querySelector('.xtx-elevator-list')ul.addEventListener('click', function (e) {clear()e.target.classList.add('active')if (e.target.dataset.name === 'backTop') {document.documentElement.scrollTop = 0}else {const distance = document.querySelector(`.xtx_goods_${e.target.dataset.name}`).offsetTopdocument.documentElement.scrollTop = distance}})//頁面滾動更新導航const newsTop = Math.floor(document.querySelector('.xtx_goods_new').offsetTop)const popularTop = Math.floor(document.querySelector('.xtx_goods_popular').offsetTop)const brandTop = Math.floor(document.querySelector('.xtx_goods_brand').offsetTop)const topicTop = Math.floor(document.querySelector('.xtx_goods_topic').offsetTop)window.addEventListener('scroll', function () {let scrolltop = document.documentElement.scrollTopclear()if (scrolltop >= newsTop && scrolltop < popularTop) {document.querySelector('[data-name = new]').classList.add('active')}else if (scrolltop >= popularTop && scrolltop < brandTop) {document.querySelector('[data-name = popular]').classList.add('active')}else if (scrolltop >= brandTop && scrolltop < topicTop) {document.querySelector('[data-name = brand]').classList.add('active')}else if (scrolltop >= topicTop) {document.querySelector('[data-name = topic]').classList.add('active')}})</script>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/74211.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/74211.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/74211.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GZ073網絡系統管理賽項賽題第1套模塊A:網絡構建解題筆記

2. 設備 接口或VLAN VLAN名稱 二層或三層規劃 說明 S1 VLAN10 CAIWU Gi0/1至Gi0/4 財務部 VLAN20 XIAOSHOU Gi0/5至Gi0/8 銷售部 VLAN30 YANFA Gi0/9至Gi0/12 研發部 VLAN40 SHICHANG Gi0/13至Gi0/16 市場部 VLAN50 AP Gi0/20至Gi0/21 無線AP管理 VL…

jmeter web壓力測試 壓測

下載地址 Apache JMeter - Download Apache JMeter 1. 設置線程組 2. 設置http請求頭 3. 設置http請求體 4. 設置結果條目 常用函數 ${__RandomString(8, abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789)}${__javaScript( ${__Random(1000, 10000)} /…

大語言模型(LLM)應用開篇 | RAG方法論概述 | 構建知識庫探索

大型語言模型應用開篇 | RAG技術 | 構建知識庫探索 1、大語言模型&#xff08;LLM&#xff09;應用開篇2、RAG技術2.1 基于RAG實現知識庫問答系統的基本步驟2.2 RAG與其他技術的關系與區別 1、大語言模型&#xff08;LLM&#xff09;應用開篇 現在是2025年&#xff0c;DeepSeek…

fbx bip互轉 測試OK

目錄 fbx bip互轉 3dmax插件fbx轉bip: 測試可以轉: MotionBuilder fbx轉bip fbx bip互轉 3dmax插件fbx轉bip: 測試可以轉: 不用插件!!無腦把Mxiamo轉bip骨骼動畫 - CG軟件插件腳本交流 - Powered by Discuz!

8個實用銷售工具

CRM系統&#xff08;客戶關系管理系統&#xff09; 特點&#xff1a;能集中管理客戶信息&#xff0c;如聯系方式、交易記錄、偏好等&#xff0c;還可對銷售流程進行自動化管理。 用途&#xff1a;幫助銷售團隊跟蹤客戶&#xff0c;分析客戶行為&#xff0c;預測銷售趨勢&am…

【家政平臺開發(6)】筑牢家政平臺安全防線:全方位隱私與安全需求解析

本【家政平臺開發】專欄聚焦家政平臺從 0 到 1 的全流程打造。從前期需求分析&#xff0c;剖析家政行業現狀、挖掘用戶需求與梳理功能要點&#xff0c;到系統設計階段的架構選型、數據庫構建&#xff0c;再到開發階段各模塊逐一實現。涵蓋移動與 PC 端設計、接口開發及性能優化…

IP 地址規劃中的子網劃分:/18 網絡容納 64 個 C 段(/24)的原理與應用解析

整體表格說明 這是某市教育城域網中某縣教育相關機構的IP地址規劃表&#xff0c;明確了某縣一中和某縣教育局的IP地址范圍&#xff0c;包括終端使用地址段、業務互訪地址段。 概念解析 64個C段終端及互聯地址 C段地址&#xff1a;一個C段是IP地址中的一個/24網絡&#xff08;…

python生成并繪制各種類型聲音噪聲

python生成并繪制各種類型聲音噪聲 1、效果 白噪聲: 工業設備振動噪聲: 2、噪聲類型 主要噪聲類型有: 白噪聲:全頻段能量均勻分布 直接生成高斯分布隨機數粉紅噪聲:能量隨頻率增加按1/f衰減(適合聲學測試) 使用IIR濾波器對白噪聲進行濾波處理布朗噪聲:能量隨頻率增加…

軟考-數據庫系統工程師第四版pdf

軟考-數據庫系統工程師第四版pdf git中的文件相對沒有那么清楚&#xff0c;網盤的有高清版 github下載 這里我給出倉庫地址 鏈接: https://github.com/yaodada123/ruankao-pdf https://github.com/yaodada123/ruankao-pdf gitee下載 https://gitee.com/yao-hengchao/ruank…

Linux(24)——系統調優

目錄 一、tuned 軟件包&#xff1a; 1、安裝并啟用 tuned &#xff1a; 2、驗證 tuned 軟件包&#xff1a; &#xff08;1&#xff09;是否安裝&#xff1a; &#xff08;2&#xff09;是否啟用&#xff1a; &#xff08;3&#xff09;是否正在運行&#xff1a; 二、系統…

文件系統--軟硬鏈接/動靜態庫

inode 是文件系統中的一個重要概念&#xff0c;用于存儲文件的元數據。 inode 的結構和內容 文件權限&#xff1a;定義了文件所有者、所屬組以及其他用戶對文件的讀、寫、執行權限。文件所有者和所屬組&#xff1a;記錄了文件的所有者和所屬的用戶組信息。文件大小&#xff1…

WebSocket原理詳解(二)

WebSocket原理詳解(一)-CSDN博客 目錄 1.WebSocket協議的幀數據詳解 1.1.幀結構 1.2.生成數據幀 2.WebSocket協議控制幀結構詳解 2.1.關閉幀 2.2.ping幀 2.3.pong幀 3.WebSocket心跳機制 1.WebSocket協議的幀數據詳解 1.1.幀結構 WebSocket客戶端與服務器通信的最小單…

MySQL 進階 面經級

會用數據庫&#xff0c;找大廠工作是遠遠不夠的。 本人2025美團暑期AI面試好幾個MySQL場景問題不會答&#xff0c;已臟面評。遂在此整理學習&#xff01; 文章目錄 美團AI面1.數據庫分片sharding的概念&#xff0c;它有什么優勢和挑戰?優勢Sharding 挑戰 2. 分庫分表的常見策…

基于單片機的智能奶茶機(論文 +源碼)

1總體架構設計 本課題為基于單片機的智能奶茶機設計&#xff0c;其系統架構上設計如圖2.1所示&#xff0c;整個系統包括了DS18B20溫度傳感器、繼電器模塊、LCD液晶、蜂鳴器、按鍵、STC89C52單片機等器件&#xff0c;在功能上用戶可以通過按鍵鍵控制選擇甜度和添加物以及設置溫度…

Hue:一個大數據查詢工具

Hue&#xff08;Hadoop User Experience&#xff09;是一個用于大數據平臺、數據庫以及數據倉庫查詢的開源工具&#xff0c;旨在通過 Web 界面簡化用戶與 Hadoop 生態系統以及各種數據存儲的交互。 Hue 支持的數據源包括數據庫&#xff08;Apache Hive、Apache Impala、MySQL、…

并發多線程八股

并發多線程 1.Java里面的線程和操作系統的線程一樣嗎&#xff1f;2.Java的線程安全在三個方面體現&#xff1a;3.保證數據一致性的方案4.線程創建的方式1&#xff09;Thread類2&#xff09;Runnable接口3&#xff09;Callable接口和FutureTask4&#xff09;線程池&#xff08;e…

VBA數據庫解決方案第二十講:SQL在VBA中幾種常見的表達方式

《VBA數據庫解決方案》教程&#xff08;版權10090845&#xff09;是我推出的第二套教程&#xff0c;目前已經是第二版修訂了。這套教程定位于中級&#xff0c;是學完字典后的另一個專題講解。數據庫是數據處理的利器&#xff0c;教程中詳細介紹了利用ADO連接ACCDB和EXCEL的方法…

大語言模型智體的綜述:方法論、應用和挑戰(下)

25年3月來自北京大學、UIC、廣東大亞灣大學、中科院計算機網絡信息中心、新加坡南陽理工、UCLA、西雅圖華盛頓大學、北京外經貿大學、喬治亞理工和騰訊優圖的論文“Large Language Model Agent: A Survey on Methodology, Applications and Challenges”。 智體時代已經到來&a…

《STL 六大組件之容器篇:簡單了解 list》

目錄 一、list 簡介二、list 的常用接口1. 構造函數&#xff08;constructor &#xff09;2. 迭代器&#xff08;iterator&#xff09;3. 容量、修改和訪問&#xff08;capacity 、modify and access&#xff09; 一、list 簡介 簡單來說&#xff0c;list 就是數據結構初階中學…

nmslib 是一個 超快、適用于高維向量的最近鄰搜索庫,基于 HNSW 算法,被廣泛用于 語義搜索、推薦系統、人臉識別等任務

nmslib 是什么&#xff1f; nmslib&#xff08;Non-Metric Space Library&#xff09;是一個 高效的最近鄰搜索&#xff08;ANN, Approximate Nearest Neighbor Search&#xff09; 庫&#xff0c;專門用于 高維向量搜索&#xff0c;適用于 文本、圖像、語音等嵌入向量 的相似…