当前位置: 首页 > 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.jsqmd.com/news/101963/

相关文章:

  • Linux相关基础
  • 台达DVP 16ES2与DT3系列温控器通讯程序(TDES-3)及昆仑通态、威纶通触摸屏操作手册
  • vue基于Springboot框架的医疗护工陪护系统的设计与实现
  • 微算法科技(NASDAQ MLGO)链下与机器学习融合:革新区块链可扩展性
  • 考虑风光出力的虚拟电厂和运营商的主从博弈,分别考虑电动汽车充放电,火电出力,储能设备充放电充放...
  • 总线的atmotic与lock/exclusive
  • 投影机选型核心技术解析:4大参数原理+实操选型指南
  • vue基于Springboot框架的在线导游预约系统
  • vue基于Springboot框架的在线教育课程购买作业平台的设计与实现
  • 为什么很少有大单元的游戏耳机?
  • vue基于Springboot框架的性格测试系统
  • 基于微信小程序的宠物领养系统的设计与实现论文
  • vue基于Springboot框架网上电子书店商城好书推荐管理系统 论坛
  • 工厂级绣花生产适配:威尔克姆 Wilcom9.0 精准还原设计软件下载安装教程
  • vue基于人脸识别基于spring boot的网络考试系统的设计与实现
  • 《Etsy 最狠的地方,不是封号,而是先让你注册成功》
  • 基于SpringBoot的演唱会售票系统设计与实现论文
  • 生产模型的分类、似然函数、最大似然函数与生成模型的关系
  • AI大模型正在“变笨”:一场看不见的认知退化危机
  • 【AI OCR加速新突破】:Dify + Tesseract 实现每秒百页文档识别的秘密
  • IoTDB详解
  • 【资深架构师亲授】:Dify+Agent文档生成的7大核心模式
  • 基于springboot的高校二手物品交易平台的设计与实现论文
  • 计算机毕业设计springboot健身房管理系统 基于Spring Boot的健身房信息化管理平台设计与实现 Spring Boot框架下的健身房综合管理系统开发
  • 基于SpringBoot的校园二手书交易平台的设计与实现
  • 基于Java的家政服务预约管理系统的设计与开发论文
  • 计算机毕业设计springboot基于web的动漫综合社区的设计与实现基于Spring Boot框架的Web动漫社区平台开发与实践 Web环境下Spring Boot驱动的动漫综合社区系统设计
  • Linux 环境下 SQL Server 自动收缩日志作业创建脚本(Shell 版)
  • 【Java毕设全套源码+文档】基于java的在线作业管理系统设计与实现(丰富项目+远程调试+讲解+定制)
  • RPA实战|亚马逊账号申诉自动化!3分钟搞定申诉材料,成功率提升300%[特殊字符]