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 相关文章推荐
js 静态动态成员 and 信息的封装和隐藏
May 29 Javascript
与Math.pow 相反的函数使用介绍
Aug 04 Javascript
通过AngularJS实现图片上传及缩略图展示示例
Jan 03 Javascript
jquery PrintArea 实现票据的套打功能(代码)
Mar 17 Javascript
React中使用collections时key的重要性详解
Aug 07 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
Aug 24 Javascript
vue router demo详解
Oct 13 Javascript
vue做网页开场视频的实例代码
Oct 20 Javascript
js时间戳与日期格式之间相互转换
Dec 11 Javascript
解决Vue打包后访问图片/图标不显示的问题
Jul 25 Javascript
微信小程序实用代码段(收藏版)
Dec 17 Javascript
vue mvvm数据响应实现
Nov 11 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
discuz安全提问算法
2007/06/06 PHP
使用NetBeans + Xdebug调试PHP程序的方法
2011/04/12 PHP
Session保存到数据库的php类分享
2011/10/24 PHP
php实现可运算的验证码
2015/11/10 PHP
PHP针对字符串开头和结尾的判断方法
2016/07/11 PHP
PHP使用ActiveMQ实现消息队列的方法详解
2019/05/31 PHP
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
javascript 图片上一张下一张链接效果代码
2010/03/12 Javascript
基于jQuery UI CSS Framework开发Widget的经验
2010/08/21 Javascript
js的写法基础分析
2011/01/17 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
浅谈javascript实现八大排序
2015/04/27 Javascript
JavaScript实现自动对页面上敏感词进行屏蔽的方法
2015/07/27 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
微信小程序 数据访问实例详解
2016/10/08 Javascript
js/jq仿window文件夹框选操作插件
2017/03/08 Javascript
AngularJS+bootstrap实现动态选择商品功能示例
2017/05/17 Javascript
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
2017/09/19 Javascript
vue自定义表单生成器form-create使用详解
2019/07/19 Javascript
Vue使用Element实现增删改查+打包的步骤
2020/11/25 Vue.js
一篇不错的Python入门教程
2007/02/08 Python
用Python遍历C盘dll文件的方法
2015/05/06 Python
浅谈python 四种数值类型(int,long,float,complex)
2016/06/08 Python
python的scikit-learn将特征转成one-hot特征的方法
2018/07/10 Python
python基础 range的用法解析
2019/08/23 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
Python-for循环的内部机制
2020/06/12 Python
什么是典型的软件三层结构?软件设计为什么要分层?软件分层有什么好处?
2012/03/14 面试题
简述数组与指针的区别
2014/01/02 面试题
初中班主任寄语
2014/04/04 职场文书
重大事项社会稳定风险评估方案
2014/06/15 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
小学运动会前导词
2015/07/20 职场文书
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android