当前位置: 首页 > news >正文

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;
http://www.cnnetsun.cn/news/95915.html

相关文章:

  • 【收藏必备】零基础入门AI Agent:概念、结构、方法与开发框架全解析
  • vue基于Springboot框架实现新能源汽车4s店销售管理系统
  • 开关频率可调的永磁同步电机svpwm发电仿真模型,可调稳定发电电压,负载,母线电容可调,可用于...
  • C语言高阶玩法:函数指针与回调函数实战指南,让你的代码拥有“灵魂”
  • 基于SpringBoot的校园二手书交易平台的设计与实现
  • 数据结构与算法--007三数之和(medium)
  • C++ 模板初阶:泛型编程的入门指南
  • 基于Java实现优雅关闭的规范化方案设计与实现
  • 时序数据战场巅峰对决:金仓数据库 VS InfluxDB深度解析
  • Windows任务管理器中CPU相关指标怎么看?
  • 【必藏】大模型入行晚了?现在就是黄金时机!小白到入门的完整路线
  • 系统思考与认知习惯
  • 速藏!2026年免费免版权音乐素材网站推荐!正规版权保障,商用无压力不侵权
  • 【数据分享】1951-2024年我国省市县三级逐日、逐月和逐年近地面气温数据(Shp/Excel格式)
  • 金融行业广告投放:在合规的赛道上,实现精准增长
  • 长安汽车11月销量28.3万辆,同比增长2.3%
  • 1688 商品详情接口深度解析:从百川签名突破到供应链数据重构
  • LobeChat心理情绪日记分析工具
  • 一文搞懂纸老虎-布隆过滤器
  • LobeChat周年庆感恩回馈活动
  • 运维系列数据库系列【仅供参考】:DM JOB作业的邮件发送
  • 当AI面临伦理投诉时,AI应用架构师该怎么办?这5个解决步骤
  • 主存编址是什么
  • Python 整合 Redis 哨兵(Sentinel)与集群(Cluster)实战指南
  • HLS技术的局限性说明
  • 水文监测站:水资源管理的“千里眼”与“顺风耳”
  • 白银波动幅度大于黄金的原因:市场规模与属性差异深度解析
  • 【2026版】Spring Boot面试题
  • 办公小程序开发----提高工作效率
  • Jmeter 命令行压测生成HTML测试报告