js中不同的height, top的区别对比


Posted in Javascript onSeptember 24, 2015

每次看到js中的 clientHeight(clientTop), offsetHeight(offsetTop),scrollHeight(scrollTop)就头大,根本分不清这几种的区别,然而碰到这些已经不 值一两次了,然后每次都要查看一下各自的区别,才能决定使用哪个。

本篇主要以chrome为准,可能各个浏览器之间还是有一些区别,但很多自己还未真正遇到过,还不是很清楚,等以后碰到了类似的兼容性问题,再记录到这里,这次就chrome浏览器中各个属性的区别做个记录,以方便以后的查看

一 clientHeight,offsetHeight,scrollHeight的区别

clientHeight在各个浏览器中基本是一样的,一致认为是内容可视区域的高度,也就是说页面浏览器中可以看到内容的这个区域的高度,不包括滚动条,不包括margin,但包括padding,也就是说实际的clientHeight = 当前对象可视区域的高度 + padding值,如下图所示 clientHeight = 对象可视区域高度(300) + 上下padding值(20) = 320

js中不同的height, top的区别对比

在不同浏览器都实用的javascript方案:

var w= document.documentElement.clientWidth || document.body.clientWidth;
var h= document.documentElement.clientHeight || document.body.clientHeight;

offsetHeight = 当前对象的高度 + 滚动条 + borde值 + padding值,上图中当前对象的高度和可视区域高度是一样的,所以offsetHeight = 300 + padding(20px ) + border(10px)  = 330

        scrollHeight是网页内容的实际高度,最小值就是clientHeight,也就是说可以是跟clientHeight相等的,但我们假设这样一个情形,如下代码所示,父div高度是300px,子div高度是500px,这时候就会形成滚动条,此时父div的结构图如下:

js中不同的height, top的区别对比

父div的的scrollHeight 就应该是scrollHeight = 500px + padding值

因为此时产生了滚动条,此时父div的可视区域高度为283,当前对象高度也就是父div的高度为300,因此

clientHeight = 283px + padding值(20px) = 303px

offsetHeight = 父div的高度(300px) + padding值(20px) + 边框(10px) = 330px

<div id="parent" style="padding:10px;border:5px red solid;height:300px;width:200px;overflow:auto">
  <div style="height:500px;width:400px"></div>
</div>

二 clientTop,offsetTop,scrollTop的区别

clientTop的理解可以参考clientHeight,clientHeight的的计算方式是当前可视区域的高度 加上 padding值,那么clientTop就可以理解为当前可视区域到上一级元素的距离。

 如上图所示,clientTop就是5px,大部分情况下,clientTop都是这个border值。

offsetTop是当前对象到body元素的距离,它的计算方式相对复杂,先从上图进行理解,当前对象指的是border边框之内的区域,所以计算offsetTop要从当前对象的margin开始,计算公式如下 offsetTop = 当前对象的margin-top + 当前对象所有上级元素的margin-top + 当前对象所有上级元素的border-top,需要注意的是offsetTop是不能进行直接赋值的,只能通过这样的计算方式得到。

scrollTop是当前对象的最顶部到当前对象在当前窗口显示的范围内的顶边的距离.即是在出现了纵向滚动条的情况下,滚动条拉动的距离。

以上就是js中不同的height、 top的区别对比,希望对大家的学习有所帮助。

Javascript 相关文章推荐
javascript事件模型代码
Jul 01 Javascript
JQuery 弹出框定位实现方法
Dec 02 Javascript
JQuery对表格进行操作的常用技巧总结
Apr 23 Javascript
JS数组(Array)处理函数整理
Dec 07 Javascript
node.js中的querystring.parse方法使用说明
Dec 10 Javascript
jQuery实现图片文字淡入淡出效果
Dec 21 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
May 29 Javascript
Angular2实现自定义双向绑定属性
Mar 22 Javascript
Vue编写多地区选择组件
Aug 21 Javascript
Element输入框带历史查询记录的实现示例
Jan 15 Javascript
vue(2.x,3.0)配置跨域代理
Nov 27 Javascript
jQuery实现倒计时功能完整示例
Jun 01 jQuery
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
Sep 24 #Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
Sep 24 #Javascript
JS+CSS实现简易的滑动门效果代码
Sep 24 #Javascript
JS实现网站菜单拖拽移位效果的方法
Sep 24 #Javascript
jQuery实现的经典竖向伸缩菜单效果代码
Sep 24 #Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
Sep 23 #Javascript
直接拿来用的15个jQuery代码片段
Sep 23 #Javascript
You might like
用PHP发电子邮件
2006/10/09 PHP
PHPMailer邮件类利用smtp.163.com发送邮件方法
2008/09/11 PHP
php动态添加url查询参数的方法
2015/04/14 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
新浪的图片新闻效果
2007/01/13 Javascript
比较详细的关于javascript中void(0)的具体含义解释
2007/08/02 Javascript
Firefox下无法正常显示年份的解决方法
2014/09/04 Javascript
javascript弹出页面回传值的方法
2015/01/28 Javascript
分享一些常用的jQuery动画事件和动画函数
2015/11/27 Javascript
JavaScript实现复制内容到粘贴板代码
2016/03/31 Javascript
JavaScript暂停和继续定时器的实现方法
2016/07/18 Javascript
jQuery实现的简单拖拽功能示例
2016/09/13 Javascript
深入理解JavaScript中的块级作用域、私有变量与模块模式
2016/10/31 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
2017/02/14 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
微信小程序实现页面跳转传值的方法
2017/10/12 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
如何解决jQuery 和其他JS库的冲突
2020/06/22 jQuery
如何在selenium中使用js实现定位
2020/08/18 Javascript
python在控制台输出进度条的方法
2015/06/20 Python
Python中文竖排显示的方法
2015/07/28 Python
python list元素为tuple时的排序方法
2018/04/18 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
python 删除字符串中连续多个空格并保留一个的方法
2018/12/22 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
2020/09/16 Python
英国最大的婴儿监视器网上商店:Baby Monitors Direct
2018/04/24 全球购物
融资合作协议书范本
2014/10/17 职场文书
简历自我评价模板
2015/03/11 职场文书
学校禁毒宣传活动总结
2015/05/08 职场文书
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL
使用ORM新增数据在Mysql中的操作步骤
2021/07/26 MySQL
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis
postgresql如何找到表中重复数据的行并删除
2023/05/08 MySQL