三剑客: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 相关文章推荐
利用JS重写Cognos右键菜单的实现代码
Apr 11 Javascript
Javascript中定义方法的另类写法(批量定义js对象的方法)
Feb 25 Javascript
jquery对table中各数据的增加、保存、删除操作示例
May 14 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
Dec 31 Javascript
Javascript中获取对象的原型对象的方法小结
Feb 25 Javascript
jQuery实现图片轮播特效代码分享
Sep 15 Javascript
jQuery实现获取绑定自定义事件元素的方法
Dec 02 Javascript
jQuery实现图片加载完成后改变图片大小的方法
Mar 29 Javascript
Angular 2应用的8个主要构造块有哪些
Oct 17 Javascript
解决vue-cli项目webpack打包后iconfont文件路径的问题
Sep 01 Javascript
Vue extend的基本用法(实例详解)
Dec 09 Javascript
微信小程序订阅消息(java后端实现)开发
Jun 01 Javascript
简单谈谈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
PHP中实现进程间通讯
2006/10/09 PHP
PHP遍历数组的几种方法
2012/03/22 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
PHP通过CURL实现定时任务的图片抓取功能示例
2016/10/03 PHP
详解PHP中foreach的用法和实例
2016/10/25 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
2013/01/10 Javascript
javascript遍历控件实例详细解析
2014/01/10 Javascript
javascript 面向对象封装与继承
2014/11/27 Javascript
nodejs通过phantomjs实现下载网页
2015/05/04 NodeJs
Javascript递归打印Document层次关系实例分析
2015/05/15 Javascript
jquery插件Jplayer使用方法简析
2016/04/22 Javascript
Jquery跨域获得Json的简单实例
2016/05/18 Javascript
使用Bootstrap + Vue.js实现添加删除数据示例
2017/02/27 Javascript
easyui-datagrid开发实践(总结)
2017/08/02 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
原生js实现Flappy Bird小游戏
2018/12/24 Javascript
jQuery实现的简单歌词滚动功能示例
2019/01/07 jQuery
VUE+Element环境搭建与安装的方法步骤
2019/01/24 Javascript
详解Bootstrap 学习(一)入门
2019/04/12 Javascript
vuejs数据超出单行显示更多,点击展开剩余数据实例
2019/05/05 Javascript
vue项目实现减少app.js和vender.js的体积操作
2020/11/12 Javascript
Python网络爬虫中的同步与异步示例详解
2018/02/03 Python
python读取中文txt文本的方法
2018/04/12 Python
使用 Python 实现文件递归遍历的三种方式
2018/07/18 Python
Python实现将Excel转换成为image的方法
2018/10/23 Python
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
2017/03/15 HTML / CSS
全球性的在线时尚男装零售商:boohooMAN
2016/12/17 全球购物
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
C语言开发工程师测试题
2016/12/20 面试题
《值日生》教学反思
2014/02/17 职场文书
应届生求职自荐信
2014/07/04 职场文书
财务部会计岗位职责
2015/02/03 职场文书
2015毕业寄语大全
2015/02/26 职场文书
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android