news 2026/5/1 4:45:35

dom 相关api getBoundingClientRect

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
dom 相关api getBoundingClientRect

getBoundingClientRect()是 JavaScript 中一个非常重要的DOM API,用于获取元素在视口(viewport)中的位置和尺寸信息

const rect = element.getBoundingClientRect();

返回一个DOMRect对象,包含以下只读属性(单位:像素):

属性含义
x/left元素左边缘到视口左侧的距离
y/top元素上边缘到视口顶部的距离
right元素右边缘到视口左侧的距离
bottom元素下边缘到视口顶部的距离
width元素宽度(等价于right - left
height元素高度(等价于bottom - top

💡 注意:xleft是等价的,ytop也是等价的(现代浏览器支持x/y)。

🖼️ 图示说明

视口顶部 │ │ top (y) │ ↓ ├───────────────┐ ← left (x) │ │ │ 元素 │ → right │ │ └───────────────┘ │ │ bottom ↓ 视口底部

假设你有一个很长的网页,其中有一个按钮:

<!-- 页面顶部 --> <h1>欢迎来到我的网站</h1> <!-- 中间有很多内容(比如 2000px 高的空白) --> <div style="height: 2000px; background: #eee;"></div> <!-- 目标按钮:距离页面顶部 2100px --> <button id="myBtn">点击我</button>
  • 按钮在整个页面中的绝对位置是:top = 2100px(从页面最顶端算起)
  • 浏览器窗口高度是:800px

情况一:页面没有滚动(刚打开时)

  • 你看到的是页面顶部(<h1>
  • 按钮在屏幕下方很远,甚至看不见
  • 此时调用:
const btn = document.getElementById('myBtn'); console.log(btn.getBoundingClientRect().top); // 输出:2100

✅ 因为视口顶部就是页面顶部,所以top = 2100(按钮在视口下方 2100px)

情况二:你向下滚动了 1500px

  • 现在你看到的是页面中间部分
  • 按钮离你更近了,可能已经出现在屏幕中
  • 此时再调用:
console.log(btn.getBoundingClientRect().top); // 输出:600

❓ 为什么变成600

因为:

  • 按钮在页面中的绝对位置还是2100px
  • 但你已经向下滚动了 1500px,所以视口的“顶部”现在对应的是页面的1500px
  • 所以按钮到当前视口顶部的距离 =2100 - 1500 = 600px

getBoundingClientRect().top始终告诉你:“这个元素现在离你眼前屏幕顶部有多远”

关键结论

  • getBoundingClientRect()的坐标系原点是当前可见屏幕的左上角(视口),不是整个网页的左上角。
  • 自动排除了滚动的影响,直接告诉你“元素现在在屏幕什么位置”。
  • 如果你想得到在整个页面中的绝对位置,需要手动加上滚动偏移:

js

编辑

const rect = el.getBoundingClientRect(); const absoluteTop = rect.top + window.scrollY; const absoluteLeft = rect.left + window.scrollX;
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 4:44:11

收藏!裁员潮下程序员破局:AI大模型是你的高薪“救生圈”

当下的程序员圈&#xff0c;早已不是“敲码就能稳坐钓鱼台”的时代&#xff0c;职业焦虑正以肉眼可见的速度蔓延。 就在前几天&#xff0c;某TOP3互联网大厂的技术主管在闭门交流群里抛出的消息&#xff0c;让不少人脊背发凉&#xff1a;年底优化已正式启动&#xff01;公司AI大…

作者头像 李华
网站建设 2026/4/26 4:58:06

# 【深度好文】一文读懂知识图谱:9大关键技术全解析(建议收藏)

知识图谱是揭示实体间关系的语义网络&#xff0c;构建包含九大核心技术&#xff1a;知识抽取(获取知识单元)、实体与关系抽取(识别实体及关系)、属性抽取(收集实体属性)、实体对齐(解决实体冲突)、知识表示(如RDF三元组)、知识融合(整合多源知识)、知识更新(数据与模式层更新)以…

作者头像 李华
网站建设 2026/4/25 5:22:06

Claude Skills全攻略:AI代理的“超能力“,让大模型为你打工

Claude 现已引入 Skills 功能&#xff0c;显著提升了其执行特定任务的能力。Skills 本质上是一个包含指令、脚本和资源的结构化文件夹&#xff0c;Claude 能够根据任务需求动态加载这些资源。 这一机制的核心优势在于按需加载&#xff1a;Claude 仅在检测到当前任务与特定技能相…

作者头像 李华
网站建设 2026/4/22 4:25:27

Linux相关基础

VMware1.下载所需软件&#xff0c;个人学习使用VMware&#xff0c;这里需要注意&#xff0c;下载vmware成功&#xff0c;会在网络里面产生如下图俩个网络&#xff0c;VMnet1对应仅主机模式使用&#xff0c;VMet8个人创建虚拟机时候使用&#xff0c;对应NAT模式。下载好之和&…

作者头像 李华
网站建设 2026/4/26 11:44:58

Python线程与协程:多任务编程进阶指南

一、引言昨天讲了多任务和多进程,今天咱们接着将线程和协程.二、多线程1.线程的概念线程是程序执行的最小单位 , 实际上进程只负责分配资源 , 而利用这些资源执行程序的是线程 , 也就说进程是线程的容器 , 一个进程中最少有一个线程来负责执行程序 。同时线程自己不拥有系统资源…

作者头像 李华