getBoundingClientRect

  • getBoundingClientRect().top拿到的是真实dom部分到顶部的距离,不把行高算在内
  • getBoundingClientRect().height获取的也是内容部分的高度,如果没有设置样式height

某些情况下

需要拿到包括行高导致的间隙在内盒子到顶部的距离,也就是绿色开始位置到顶部的距离(但是无法读取容器#box的任何属性的场景,本篇笔记就是基于这样一个场景下开始的)

代码截图:

在线访问

代码查看

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>* {margin: 0;padding: 0;}span {line-height: 40px;background: red;font-size: 14px;}#box {background: green;font-size: 0;}.wrap {background: orange;padding: 10px 0;}</style>
</head><body><div class="wrap"><div id="box"><span>aaaaa</span></div></div><div id="info"></div><script>window.onload = function() {let div = document.querySelector("#box");var span = document.querySelector("span");var info = document.querySelector("#info");var spanLineHeight = parseInt(window.getComputedStyle(span).lineHeight);let spanRect = span.getBoundingClientRect();let spanLineRange = Math.floor((spanLineHeight - spanRect.height) / 2); //向下取证,这里直接除2页并不是特别准确,实际渲染文字不一定完全上架【居中】// let spanLineRange = (spanLineHeight - spanRect.height) / 2; //向下取证console.log("spanLineRange", spanLineRange)let txt = `<div>#box: offsetY, ${div.offsetTop}, getBoundingClientRect().top, ${div.getBoundingClientRect().top}</div><div>span:"offsetY", ${span.offsetTop}, "getBoundingClientRect().top", ${spanRect.top} <b>span内容高:${spanRect.height}</b> <B>行高${spanLineHeight}</B></div><div>红色部分和绿色部分的间隙是行高导致的</div><div>getBoundingClientRect().top拿到的是真实dom部分到顶部的距离,不把行高算在内</div><div>getBoundingClientRect().height获取的也是内容部分的高度,如果没有设置样式height</div><div><strong>某些情况下,应该拿到行高到顶部的距离,也就是绿色开始位置到顶部的距离</strong></div><div>拿到红色部分包括lineheight在内的距离顶部距离${spanRect.top - spanLineRange}</div><div>实际上这里拿到的lineheight距离顶部的距离并不准确,理想状态下设置了行高后内容到上下间距的距离是相等的</div><div>但是当前demo再window 谷歌浏览器上面出现了底部间距比上面多了1px的情况</div><div>当前代码,文字行高内,文字到span顶部的间隙的获取是直接除2后向下取整的,查看代码<B>spanLineRange</b>变量</div><div>所以当前这种方式取值方式,并不是很<strong>准确</strong>,对准确性要求很高的场景不适用</div>`;console.log(spanRect.top, "spanLineHeight 顶部- spanRect.height", spanLineHeight - spanRect.height, spanRect.top - spanLineRange)document.querySelector("#info").innerHTML = txt;}</script>
</body></html>

#box

绿色部分,无高度设置,被红色部分的行高撑开,相关属性

  • offsetTop:10
  • getBoundingClientRect().top: 10

span

红色部分,设置了行高40px,span内容高:19 ,相关属性:

  • offsetTop: 20,
  • getBoundingClientRect().top:20
  • getBoundingClientRect().height:19

很明显这里span的getBoundingClientRect().top得到是红色部分到顶部的距离,但是我们现在需要拿到的不是span内容部分到顶部的距离而是包括行高在内的容器到顶部的距离

红色部分和绿色部分的间隙是行高导致的

拿到红色部分包括lineheight在内的距离顶部距离10

实际上这里拿到的lineheight距离顶部的距离并不准确,理想状态下设置了行高后内容到上下间距的距离是相等的

但是当前demo在window 谷歌浏览器上面出现了span文字底部间距比上面多了1px的情况

当前代码,文字行高内,文字到span顶部的间隙的获取是直接除2后向下取整的,查看代码spanLineRange变量

所以当前这种方式取值方式,并不是很准确

js获取span到浏览器窗口顶部的距离,包括被lineHeight撑开的部分在内相关推荐

  1. 元素随着滚动条滚动而滚动,但是到浏览器窗口顶部的距离是固定的功能代码...

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  2. 关于使用“JS获取屏幕,浏览器,网页高度宽度”的个人思考

    在js开发中免不了获取屏幕或文档的宽度高度问题.今天在搜索引擎中搜索时,看到最多的就是这篇文章 这张图片已经被转载了很多了,我想说的是,在转载之前能否先思考下,是否完全懂了,而不是囫囵吞枣(虽然我也记 ...

  3. JS获取屏幕分辨率 及 窗口尺寸

    网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...

  4. angular js 打开新的浏览器窗口

    1.带参数打开新窗口 const newPath = location.origin + '/list' + '?name=' + name + '&sex=' + sex ; const w ...

  5. JS如何关闭当前浏览器窗口?

    在浏览器中,如何进行当前浏览器窗口的关闭呢? <script>function close() {window.open("about:blank", "_t ...

  6. js获取屏幕、浏览器、页面的宽度和高度

    介绍 容器的尺寸是指当前分辨率下的高度和宽度(分辨率不同,值就不相同) 屏幕信息 screen.height:屏幕高度 screen.availHeight:屏幕可用宽度 screen.height ...

  7. javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度

    一.先来大致了解下基本的信息 上图时一张我从别人的博客中找到的,比较系统形象的展示了一些基本的信息. 二.显示器的屏幕信息 screeen.height:屏幕分辨率的高 screen.width:屏幕 ...

  8. JS 获取元素到浏览器页面最左侧和顶部的距离

    // offsetParent:父级元素 function getElementLeft(element){var left = element.offsetLeft;// 当前元素左边距var to ...

  9. JQ和Js获取span标签的内容

    转自:https://www.cnblogs.com/anniey/p/6439021.html html: 1 <span id="content">'我是span标 ...

最新文章

  1. POJ-1860-Currency Exchange
  2. netfilter与iptables表规则建立
  3. nGQL-为什么路径越长,数量越多呢,直觉是条件越严格,路径数量会越少
  4. Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮...
  5. python之函数用法startswith()
  6. sketch怎么移动图层_什么是Photoshop Express,Fix,Mix和Sketch移动应用程序?
  7. 重磅盘点!2018年更受欢迎的技术干货,来来回回也就看了几十遍吧
  8. 【jeecg-mybatis版本】 mybatis+spring mvc 完美整合方案 查询,保存,更新,删除自动生成...
  9. 【基础】枚举学习笔记
  10. error: cast from ‘void*’ to ‘int’ loses precision报错
  11. Linux下source ./bashrc出现的command not found: shopt问题
  12. 第13章 集成学习和随机森林 学习笔记上
  13. 信息论与编码_4G与5G分别采用什么信道编码技术_卷积码_Turbo码_LDPC码_Polar码
  14. LeetCode:934. Shortest Bridge - Python
  15. 二级路由器配置网址无法访问的解决方法
  16. mac 设置mysql登录快捷键_史上最详细的苹果Macbook快捷键使用
  17. Redis(八):zset/zadd/zrange/zrembyscore 命令源码解析
  18. 感染 <SCRIPT Language=VBScript> DropFileName = “svchost.exe” Ramnit 蠕虫病毒 HTML清除工具
  19. 《人类简史》个人读书笔记
  20. 张正友棋盘法定标--Matlab【Camera Calibration Toolbox】

热门文章

  1. 印制板敷铜铜箔种类对插损的影响
  2. python GUI 显示图片与文字
  3. 【路径规划】基于和声算法改进灰狼算法实现机器人栅格地图路径规划matlab源码
  4. 基于PHP鲜花花卉销售网站
  5. Qt Creator 或者VS+Qt运行OpenGL程序,部分opengl语句执行,但部分效果没有出现,且报错。
  6. 线刷一加5t android 9,11万条评价0差评,一加5T为什么这么牛?
  7. RecyclerView库中的遗珠
  8. python+selenium 上传文件方法
  9. 双11预售日,淘宝竟然崩了!不熬夜的你们这么猛吗
  10. H5C3基础学习总结之(毛玻璃)滤镜及动画过渡