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控件autocomplete 0.11演示及下载 1月5日已更新
Jan 09 Javascript
用js代码改变单选框选中状态的简单实例
Dec 18 Javascript
详解AngularJS中的作用域
Jun 17 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
Oct 25 Javascript
AngularJs实现ng1.3+表单验证
Dec 10 Javascript
gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
Feb 21 Javascript
基于jquery实现表格内容筛选功能实例解析
May 09 Javascript
JS实现复制内容到剪贴板功能
Feb 05 Javascript
JavaScript实现form表单的多文件上传
Mar 27 Javascript
详解Angular4 路由设置相关
Aug 26 Javascript
详解vue静态资源打包中的坑与解决方案
Feb 05 Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
Nov 15 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创建多级目录代码
2008/06/05 PHP
一道求$b相对于$a的相对路径的php代码
2010/08/08 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
PHP重载基础知识回顾
2020/09/10 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
得到jQuery detach()后节点中的某个值实现代码
2013/02/05 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
JavaScript实现LI列表数据绑定的方法
2015/08/04 Javascript
异步JS框架的作用以及实现方法
2015/10/29 Javascript
基于Javascript实现返回顶部按钮
2016/02/29 Javascript
JS函数arguments数组获得实际传参数个数的实现方法
2016/05/28 Javascript
快速解决brew安装特定版本flow的问题
2018/05/17 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
在vue-cli3中使用axios获取本地json操作
2020/07/30 Javascript
VUE 单页面使用 echart 窗口变化时的用法
2020/07/30 Javascript
Flexible.js可伸缩布局实现方法详解
2020/11/13 Javascript
python实现socket端口重定向示例
2014/02/10 Python
python获取本地计算机名字的方法
2015/04/29 Python
pytorch 调整某一维度数据顺序的方法
2018/12/08 Python
Python.append()与Python.expand()用法详解
2019/12/18 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
详解pandas映射与数据转换
2021/01/22 Python
Java语言的优势
2015/01/10 面试题
理工大学毕业生自荐信
2013/11/01 职场文书
竞职演讲稿范文
2014/01/11 职场文书
夜不归宿检讨书
2014/02/25 职场文书
婚前协议书标准版
2014/10/19 职场文书
2014年团队工作总结
2014/11/24 职场文书
建议书格式
2015/02/04 职场文书
小学德育工作总结2015
2015/05/12 职场文书
家长会开场白和结束语
2015/05/29 职场文书
浅谈Redis中的RDB快照
2021/06/29 Redis
各国货币符号大全
2022/02/17 杂记