JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记


Posted in Javascript onJuly 15, 2020

全文参考:https://github.com/iuap-design/blog/issues/38 、MDN

clientHeight,只读

clientHeight可以用公式 CSS height + CSS padding - 水平滚动条的高度 (如果存在) 来计算。

JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记

如图,这样一个div,它的clientHeight为95,计算:50(height)+30(padding-top)+30(padding-bottom)-15(经测量滚动条高度就是15)=95

clientTop,只读

一个元素顶部边框的宽度(以像素表示)。嗯。。就只是border-top-width

类似的属性还有一个clientLeft,顾名思义……

offsetHeight,只读

元素的offsetHeight是一种元素CSS高度的衡量标准,包括元素的边框、内边距和元素的水平滚动条(如果存在且渲染的话),是一个整数。

还是上面的图,div的offsetHeight为112。计算:50+60(上下内边距)+2(上下边框)=112

offsetTop,只读

HTMLElement.offsetParent是一个只读属性,返回一个指向最近的包含该元素的定位元素。如果没有定位的元素,则offsetParent为最近的table,table cell或根元素(标准模式下为html;quirks 模式下为body)。当元素的style.display设置为 "none" 时,offsetParent返回null。

它返回当前元素相对于其offsetParent元素的顶部的距离。

还是上面那张图,div的offsetTop为20,因为margin-top是20,距离html顶部的距离是20...

scrollHeight,只读

实话,这么久了,竟然一直搞错这个scroll相关属性,其实它描述的是outer的属性,而窝一直取inner的属性值,难怪scrollTop一直是0。。。

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
 <style>
  #outer {
   margin: 100px 50px;
   background: url(http://images.cnblogs.com/cnblogs_com/wenruo/873448/o_esdese.jpg);
   height: 100px;
   width: 50px;
   padding: 10px 50px;
   overflow: scroll;
  } 
  #inner {
   height: 200px;
   width: 50px;
   background-color: #d0ffe3;
  }
 </style>
</head>
<body>
 <div id="outer">
  <div id="inner"></div>
 </div>
</body>
</html>

因为限制了父元素的高度,所以不能全部显示子元素,设置了overflow之后,可以通过滚动条的形式滑动查看子元素。效果如图1,如果没有限制父元素的高度,那么效果将如图2显示。

JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记(图1) JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记(图2)

scrollHeight就是图2的高度,没有高度限制时,能够完全显示子元素时的高度(clientHeight)。

所以这里scrollHeight为220,计算:200+10+10=220

scrollTop,可写

是这些元素中唯一一个可写可读的。

下面的图是用微信截图随便画的:D(不小心混入了一个光标。。

JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记

JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记

JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记

所以当滚动条在最顶端的时候,scrollTop=0,当滚动条在最低端的时候,scrollTop=115

这个115怎么来的(滚动条高度是15,我量的),见下图。(实为我主观臆测,不保证准确性。。。_(:з」∠)_

JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记

scrollTop是一个整数。

如果一个元素不能被滚动,它的scrollTop将被设置为0

设置scrollTop的值小于0,scrollTop被设为0。

如果设置了超出这个容器可滚动的值,scrollTop会被设为最大值。

判定元素是否滚动到底:

element.scrollHeight - element.scrollTop === element.clientHeight

返回顶部

element.scrollTop = 0

一个简单的返回顶部的时间,一个需要注意的地方是,动画是由快到慢的。

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>返回顶部</title>
 <style>
  #outer { height: 100px; width: 100px; padding: 10px 50px; border: 1px solid; overflow: auto; }
 </style>
</head>
<body>
 <div id="outer">
  <div id="inner"></div>
 </div>
 <button onclick="toTop(outer)">返回顶部</button>
 <script>
  function toTop(ele) {
   // ele.scrollTop = 0;
   let dy = ele.scrollTop / 4; // 每次更新scrollTop改变的大小
   if (ele.scrollTop > 0) {
    ele.scrollTop -= Math.max(dy, 10);
    setTimeout(() => {
     toTop(ele, dy);
    }, 30);
   }
  }
  // 初始化
  window.onload = () => {
   for (let i = 0; i < 233; i++) inner.innerText += `第${i}行\n`;
  }
 </script>
</body>
</html>

到此这篇关于JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记的文章就介绍到这了,更多相关JavaScript scrollTop scrollHeight offsetTop offsetHeight内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
海量经典的jQuery插件集合
Jan 12 Javascript
javascript instanceof 内部机制探析
Oct 15 Javascript
JavaScript高级程序设计 扩展--关于动态原型
Nov 09 Javascript
jquery中show()、hide()和toggle()用法实例
Jan 15 Javascript
jQuery原生的动画效果
Jul 10 Javascript
基于Bootstrap使用jQuery实现简单可编辑表格
May 04 Javascript
基于input框覆盖掉数字英文的实例讲解
Jul 21 Javascript
js 概率计算(简单版)
Sep 12 Javascript
基于es6三点运算符的使用方法(实例讲解)
Oct 12 Javascript
看看“疫苗查询”小程序有温度的代码
Jul 31 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
Sep 17 Javascript
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
Nov 04 Javascript
JavaScript实时更新当前的时间的示例代码
Jul 15 #Javascript
jQuery 添加元素和删除元素的方法
Jul 15 #jQuery
vue如何在项目中调用腾讯云的滑动验证码
Jul 15 #Javascript
Vue中keep-alive的两种应用方式
Jul 15 #Javascript
js实现浏览器打印功能的示例代码
Jul 15 #Javascript
详解Vue中的MVVM原理和实现方法
Jul 15 #Javascript
详解JavaScript 作用域
Jul 14 #Javascript
You might like
PHP封装的非对称加密RSA算法示例
2018/05/28 PHP
javascript CSS画图之基础篇
2009/07/29 Javascript
jquery.lazyload  实现图片延迟加载jquery插件
2010/02/06 Javascript
javascript与CSS复习(三)
2010/06/29 Javascript
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
JavaScript表单通过正则表达式验证电话号码
2014/03/14 Javascript
javascript实现按回车键切换焦点
2015/02/09 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
Easyui form combobox省市区三级联动
2016/01/13 Javascript
理解JavaScript中Promise的使用
2016/01/18 Javascript
JavaScript计算器网页版实现代码分享
2016/07/15 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
2017/11/09 Javascript
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
vue2路由方式--嵌套路由实现方法分析
2020/03/06 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
2020/08/22 Javascript
Python2.5/2.6实用教程 入门基础篇
2009/11/29 Python
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
探寻python多线程ctrl+c退出问题解决方案
2014/10/23 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
Python在cmd上打印彩色文字实现过程详解
2019/08/07 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
python正则表达式实例代码
2020/03/03 Python
Python3中FuzzyWuzzy库实例用法
2020/11/18 Python
python中字符串的编码与解码详析
2020/12/03 Python
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
Trina Turk官网:美国时装和泳装品牌
2018/06/10 全球购物
大学生优秀的自我评价分享
2013/10/22 职场文书
岗位说明书标准范本
2014/07/30 职场文书
关于运动会广播稿200字
2014/10/08 职场文书
法律讲堂观后感
2015/06/11 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书
关于感恩的素材句子(38句)
2019/11/11 职场文书