三剑客:offset、client和scroll还傻傻分不清?


Posted in Javascript onDecember 04, 2020

在学习前端的过程中,我们经常会碰到offset, client与scroll,所以我就把它们称作为‘三剑客'。

01  offset - 偏移量

定义:元素在屏幕上占用的所有的可见的空间。

元素可见的大小由其高度、宽度决定,包括所有内边距,滚动条和边框大小四个属性

三剑客:offset、client和scroll还傻傻分不清?

offset

css的样式:

<style>
 .son {
  width: 100px;
  height: 100px;
  padding: 10px;
  border: 10px solid #ccc;
 }

 .father {
  width: 140px;
  height: 140px;
  padding: 10px;
  border: 10px solid black;
 }

 .grand {
  width: 180px;
  height: 180px;
  margin: 100px;
  padding: 10px;
  border: 10px solid orange;
 }
 </style>

HTML部分:

<div class="grand">
 <div class="father">
  <div class="son"></div>
 </div>
 </div>

offsetHeight:

元素正在垂直方向上占用的大小空间,px,元素的高度,水平滚动条的高度 + 上边框高度

offsetWidth:

元素在垂直方向上占用的大小空间,px,元素的宽度,垂直滚动条的宽度,左右边框的宽度

var grand = document.getElementsByClassName('grand')[0];
 var father = document.getElementsByClassName('father')[0];
 var son = document.getElementsByClassName('son')[0];

 console.log(grand.offsetHeight); // 220
 console.log(grand.offsetWidth); // 220

三剑客:offset、client和scroll还傻傻分不清?

offsetWidth,offsetHeight

offsetLeft:

元素的左外边框至包含元素的左内边框之间的像素距离

offsetTop

元素的上外边框至包含元素的上内边框之间的像素距离

offsetParent:

offsetLeft与offsetTop属性与包含元素有关,包含元素的引用保存在offsetParent属性中

offsetParent属性不一定与parentNode的值相等其实就是看看父元素们是否都有position:定位属性

console.log(son.offsetParent); // <body></body>
console.log(son.offsetLeft); // 148 // body的8pxmargin
console.log(son.offsetTop); // 140

当我们去修改某一个父元素的position的时候发生了这样的变化

grand.style.position = 'relative';
console.log(son.offsetParent); // grand作为了包含元素
console.log(son.offsetLeft); // 30
console.log(son.offsetTop); // 30

offsetLeft与offsetTop的值不一样了

这样我们就可以封装成一个方法,一直到获取最顶层的距离

function getOffset(ele) {
 var offset = {
  top: 0,
  left: 0
 }

 while (ele.offsetParent) {
  offset.top += ele.offsetTop;
  offset.left += ele.offsetLeft;
  ele = ele.offsetParent;
  console.log(ele, offset); // grand {left: 138, top: 130}
       // body {top: 130, left: 138}
 }
 return offset;
 }
 console.log(getOffset(son)); // {top: 130, left: 138}

02  客户区  client

三剑客:offset、client和scroll还傻傻分不清?

client

元素的客户区大小(client dimension)指的是元素内容及其内边距所占距的空间大小

clientWidth:

元素内容区宽度 + 左右内边距宽度

clientHeight:

元素内容区高度 + 山下内边距高度

我们可以用来获取浏览器视口大小代码如下

function getView() {
 return {
  w: document.body.clientWidth || document.documentElement.clientWidth,
  h: document.body.clientHeight || document.documentElement.clientHeight
 }
 }

03 scroll 滚动条的大小

我们一般看到的默认滚动条的宽度是17px;

滚动大小:指的是包含滚动内容的元素的大小

三剑客:offset、client和scroll还傻傻分不清?

scroll

scrollHeight: 在没有滚动条的情况下,元素内容的总高度

scrollWidth:在没有滚动条的情况下,元素内容的总宽度

HTML部分

<body>
 <div class="grand">
 <div class="father">
  <div class="son"></div>
 </div>
 </div>
</body>

JS打印:

console.log(son.scrollHeight);

此时返回的结果是120  在没有滚动条的情况下(子元素内容未超出的情况)

内容超出的情况

HTML部分

<div class="grand">
  <div class="father">
   <div class="son">
(备注:以下内容为乱打测试内容)
    四大皆空来得及啊电视机卡十九大达科技的萨克
    可视对讲阿克苏进度款垃圾的卡死了的健康垃圾
    肯德基卡萨阶段啦科技的卡拉胶打开链接的垃圾
    打卡大抗裂砂浆打卡机打卡机的刷卡机的拉家带
    口杀戮空间打卡机的阿克苏交大老师就打开打开
   </div>
  </div>
 </div>

JS部分:

console.log(son.scrollHeight); // 409 

//在子元素内容超出的情况下

scrollLeft: 被隐藏在内容区域左侧的像素值,通过设置这个属性可以改变元素的滚动位置

scrollTop:被隐藏在内容区域上方的像素值,通过这个属性可以改变元素的滚动位置

scrollWidth和scrollHeight主要用于确定元素内容的实际大小

var docHeight = Math.max(document.documentElement.scrollHeight, document.documentElement.clientHeight);

 var docWidth = Math.max(document.documentElement.scrollWidth, document.documentElement.clientWidth);

以上就是我们的‘三剑客'啦,不用再傻傻分不清啦!

参考资料:《高级语言程序设计》

到此这篇关于三剑客:offset,client和scroll的文章就介绍到这了,更多相关offset,client和scroll内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jQuery的实现原理的模拟代码 -1 核心部分
Aug 01 Javascript
jquery数组封装使用方法分享(jquery数组遍历)
Mar 25 Javascript
网页收藏夹显示ICO图标(代码少)
Aug 04 Javascript
利用vue-router实现二级菜单内容转换
Nov 30 Javascript
js实现模糊匹配功能
Feb 15 Javascript
JavaScript实现获取远程的html到当前页面中
Mar 26 Javascript
使用jQuery 操作table 完成单元格合并的实例
Dec 27 jQuery
解决vue js IOS H5focus无法自动弹出键盘的问题
Aug 30 Javascript
vue插件mescroll.js实现移动端上拉加载和下拉刷新
Mar 07 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
Aug 12 Javascript
在Vue项目中,防止页面被缩放和放大示例
Oct 28 Javascript
vue响应式原理与双向数据的深入解析
Jun 04 Vue.js
简单谈谈offsetleft、offsetTop和offsetParent
Dec 04 #Javascript
HTML元素拖拽功能实现的完整实例
Dec 04 #Javascript
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
Dec 04 #Vue.js
vue基于Echarts的拖拽数据可视化功能实现
Dec 04 #Vue.js
addEventListener()和removeEventListener()追加事件和删除追加事件
Dec 04 #Javascript
vue使用echarts图表自适应的几种解决方案
Dec 04 #Vue.js
原生JS实现拖拽效果
Dec 04 #Javascript
You might like
咖啡豆分级制度 咖啡豆等级分类 咖啡豆是按口感分类的吗?
2021/03/05 新手入门
php面向对象全攻略 (二) 实例化对象 使用对象成员
2009/09/30 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
2015/07/04 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
laravel 使用auth编写登录的方法
2019/09/30 PHP
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
2015/11/24 Javascript
Jquery操作cookie记住用户名
2016/03/29 Javascript
微信小程序开发教程-手势解锁实例
2017/01/06 Javascript
原生JS实现层叠轮播图
2017/05/17 Javascript
详解nodeJS之二进制buffer对象
2017/06/03 NodeJs
vue2.x+webpack快速搭建前端项目框架详解
2017/11/30 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
浅谈redux以及react-redux简单实现
2018/08/28 Javascript
在vue中更换字体,本地存储字体非引用在线字体库的方法
2018/09/28 Javascript
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
Python冲顶大会 快来答题!
2018/01/17 Python
Python通过for循环理解迭代器和生成器实例详解
2019/02/16 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
2019/10/17 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
2019/11/11 Python
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
三年级音乐教学反思
2014/01/28 职场文书
青春演讲稿范文
2014/05/08 职场文书
广告学专业求职信
2014/06/19 职场文书
2014年依法行政工作总结
2014/11/19 职场文书
2014年职称评定工作总结
2014/11/26 职场文书
写景作文评语集锦
2014/12/25 职场文书
学生检讨书范文
2015/01/27 职场文书
超级实用的公文标题大全!
2019/07/19 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
详解JS WebSocket断开原因和心跳机制
2021/05/07 Javascript
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL