js计算元素距离顶部的高度及元素是否在可视区判断
前言:
在业务当中,我们经常要计算元素的大小和元素在页面的位置信息。比如说,在一个滚动区域内,我要知道元素A是在可视区内,还是在隐藏内容区(滚动到外边看不到了)。有时还要进一步知道,元素是全部都显示在可视区,还是有部分在可视区部分在隐藏内容区。有时还要进一步知道,在隐藏内容区的那一部分是占多大的大小。so,来聊聊如何获取元素的大小和位置信息。
偏移量:计算元素距离顶部的高度
在二维的世界里,可以想象成一个二维坐标系。每一个元素在坐标系内都有两个基本的属性:大小和位置。
大小:
dom元素在页面的大小有两个属性:offsetWidth 、offsetHeight,
offsetHeight:元素在垂直方向上的占用空间大小,以像素计。包括元素的高度、(可见的)水平滚动条的高度、上边框高度和下边框高度。(我的理解:盒模型包括border内的高度总和,不包括margin)
offsetWidth: (同理)
位置:
offsetTop:元素的上外边框至包含元素的上内边框之间的像素距离。
offsetLeft:(同理)

元素大小和位置信息图解
原理:
计算元素距离顶部的高度:将元素的offsetTop与其offsetParent的相同属性相加,如此循环直至根元素,就可以得到一个基本准确的值。封装如下函数(开箱即用,函数返回值即为元素距离顶部高度)
function getElementTop (el) {
var actualTop = el.offsetTop
var current = el.offsetParent
while (current !== null) {
actualTop += current.offsetTop
current = current.offsetParent
}
return actuanlTop
}
分析一下代码:

计算元素距离顶部的高度:(同理可得)
元素是否在可视区判断:结合scrollTop
假如这样的业务场景:有一个wrap滚动容器,wrap的内容区content的高度超过wrap的高度,则出现纵向滚动条。随意拖动滚动条到某个位置,要判断content里面的子元素input输入框是否在可视区内,若不在可视区内,自动拖动滚动条,使其进入可视区。这样的业务场景其实经常有遇到。
原理:
首先,根据以上getElementTop(domInput)函数,得到元素input距离顶部的高度elementTop。再结合滚动容器domWrap的scrollTop属性得到滚动条高度scrollTop(被隐藏在内容区域上方的像素数),进行比较,即可判断
scrollTop > elementTop: 滚动条高度大于元素离顶部高度,说明元素进入了隐藏内容区,进入的量为 scrollTop - elementTop
scrollTop < elementTop:滚动条高度小于元素的离顶部高度,说明元素还没进入上方的隐藏内容区,如要保证元素在可视区内,则必须同时满足条件,元素不在下方的隐藏内容区: elementTop - scrollTop < document.documentElemnt.clientHeight
结论:
所以,元素在可视区的初步判断条件为:scrollTop < elementTop && elementTop - scrollTop < document.documentElemnt.clientHeight
以上判断还不太严谨,如果wrap还同时存在横向滚动条,还得再判断是否元素在横向的可视区内,如果要判断元素是否完全在可视区,还得加上自身的高度值,即为:scrollTop < elementTop && elementTop + input.offsetHeight - scrollTop < document.documentElemnt.clientHeight。
通过设置scrollTop属性的值domWrap.scrollTop = elementTop 可以让滚动条自动滚动,且input元素刚好在可视区的上方。
ps:书上是这么说的,对于简单的CSS布局的页面,getElementTop函数可以得到非常精确的结果。对于使用表格和内嵌框架布局的页面,由于不同浏览器实现这些元素的方式不同,因此得到的结果就不太精确。在我的业务中,我没有用到表格和内嵌框架的布局,计算结果确实是精确的,可放心使用。如果使用表格和内嵌框架布局的页面,Keeping a eye on it。
参考: Javascript高级程序设计(第三版)
js计算元素距离顶部的高度及元素是否在可视区判断的更多相关文章
- js获取元素的滚动高度,和距离顶部的高度
jq: 获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 : $(window).width(); 获取页面的文档高度 $(doc ...
- 原生js来写获取元素距离顶部距离,以及滚动条滚动指定距离和时间控制
这是我在写vue项目里封装的一个公共js类 里面还有一些其他的方法,一并拿过来了 class Public { isDesktop(){ //判断是否为pc端 return (window.scree ...
- 获取一个元素距离顶部的位置和window的滚动值
获取一个元素距离顶部的位置: $(".box").offset().top; 获取window的滚动值: $(window).scrollTop();
- JS获取滚动条距离顶部高度
一.jQuery获取的相关方法 jquery 获取滚动条高度 获取浏览器显示区域的高度 : $(window).height(); 获取浏览器显示区域的宽度 : $(window).width(); ...
- 原生JS 和 JQ 获取滚动条的高度,以及距离顶部的高度
JQ:相对比较简便 获取浏览器显示区域(可视区域)的高度 : $(window).height(); 获取浏览器显示区域(可视区域)的宽度 : $(window).width(); 获取页面的文档高度 ...
- JQ的offset().top与JS的getBoundingClientRect区别详解,JS获取元素距离视窗顶部可变距离
壹 ❀ 引 我在 JQ的offset().top与js的offsetTop区别详解 这篇博客中详细分析了JQ方法offset().top与JS属性offsetTop的区别,并得出了一条offset( ...
- js获取滚动条距离浏览器顶部,底部的高度,兼容ie和firefox
做web开发经常会碰到需要获取浏览器的滚动条与顶部和底部的距离,然后做相应的处理动作.下面作者就如何通过js来获取浏览器滚动条距离浏览器顶部和底部的高度做一下分享,这个是同时兼容ie和firefox的 ...
- js,jquery 获取滚动条高度和位置, 元素距顶部距离
一,获取滚动条高度和位置 jQuery 获取览器显示区域的高度: $(window).height(); 获取浏览器显示区域的宽度:$(window).width(); 获取页面的文档高度:$(do ...
- js获取页面元素距离浏览器工作区顶端的距离
先介绍几个属性:(暂时只测了IE和firefox,实际上我工作中用到的最多的是chrome) 网页被卷起来的高度/宽度(即浏览器滚动条滚动后隐藏的页面内容高度) (javascript) ...
随机推荐
- java 数据格式验证类
作为一个前端,懂一点java,php之类的,甚好. 我所在的项目前端采用的就是java的spring mvc框架,所以我们也写java,掐指一算,也快一年了. 前端而言,验证是一个坎,绕不过去的,前面 ...
- [Spark内核] 第37课:Task执行内幕与结果处理解密
本课主题 Task执行内幕与结果处理解密 引言 这一章我们主要关心的是 Task 是怎样被计算的以及结果是怎么被处理的 了解 Task 是怎样被计算的以及结果是怎么被处理的 Task 执行原理流程图 ...
- 前端js之JavaScript
知识预览 一小知识 二 JavaScript的基础 BOM对象 DOM对象 实例练习 js拓展 小知识 核心(ECMAScript) 文档对象模型(DOM) Document object model ...
- python3之socket&socketserver网络编程
1.套接字与套接模块 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并进行连接,如发送和接受数据.为了 ...
- Core Animation文档翻译 (第一篇)
Core Animation 文档翻译(第一篇) 前言 作为iOS 开发,官方文档的阅读是很有必要的,值此周末便写下此文.作为iOS 实际经验3年的开发,之前有阅读并实践过经典的<iOS核心动画 ...
- (5编译使用最新opencv)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html 2环境架设http://www.c ...
- 由浅入深SCF无服务器云函数实践
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:陈杰,腾讯云架构平台部技术专家 近年来,互联网服务从一开始的物理服务器托管,虚拟机,容器,发展到现在的云函数,逐步无服务器化,如下表所示. ...
- flexbox 弹性盒子
flexbox 弹性盒子 1.基本知识 container(容器)属性 flex-direction: row | row-reverse | column | column-reverse 属性决定 ...
- JAXB应用实例
过往的项目中数据存储都离不开数据库,不过最近做的一个项目的某些数据(比如人员信息.菜单.权限等等)却完全没有涉及任何数据库操作,直接XML搞定.这里无意比较优劣,因为数据库存储和XML存储本就有不同的 ...
- RED_HAWK:基于PHP实现的信息收集与SQL注入漏洞扫描工具
无事早上就去逛freebuf看到一款不错的工具,打算介绍给大家 RED_HAWK:基于PHP实现的信息收集与SQL注入漏洞扫描工具 RED HAWK 最新版本:v1.0.0[2017年6月11日] 下 ...