javascript获取元素的计算样式


Posted in Javascript onMay 24, 2019

背景

使用css控制页面有4种方式,分别为行内样式(内联样式)、内嵌式、链接式、导入式。

  • 行内样式(内联样式)即写在html标签中的style属性中,如 <div style="width:100px;height:100px;"></div>
  • 内嵌样式即写在style标签中,例如<style type="text/css">div{width:100px; height:100px}</style>
  • 链接式即为用link标签引入css文件,例如<link href="test.css" rel="external nofollow" type="text/css" rel="stylesheet" />
  • 导入式即为用import引入css文件,例如@import url("test.css")

如果想用javascript获取一个元素的样式信息,首先想到的应该是元素的style属性。但是元素的style属性仅仅代表了元素的内联样式,如果一个元素的部分样式信息写在内联样式中,一部分写在外部的css文件中,通过style属性是不能获取到元素的完整样式信息的。因此,需要使用元素的计算样式才获取元素的样式信息。

获取计算样式

元素的style下的属性,默认为空字符串;

获取计算后的样式(非行间样式):
getComputedStyle(element).属性

获取到的结果为 带单位的字符串 ,如 :100px;

写法: getComputedStyle(box).height;

获取宽高(尺寸)

  • ele.clientHeight/Width 支持padding,不包含边框,元素可视区宽度;
  • ele.offsetWidth/Height 包含padding、border
    以上2个,如果设置一个固定值,就以固定值为依据显示,不会以被内容撑开显示;
  • ele.scrollWidth/Height被内容撑开的高度(不包含边框);
    无论是否设置固定样式,都以被内容撑开我显示结果;
  • 边框尺寸
  1. clientLeft/clientTop边框尺寸
  2. getComputedStyle(box3).borderTopWidth 边框尺寸

以上获取到的都是不带单位的数字,并且范围为可视区;

绝对位置

元素距离

  • offsetParent  定位父级,没有定位父级走body;
  • offsetLeft  当前元素(左外边框)到定位父级的(左内边框)距离;
  • offsetTop  当前元素(上外边框)到定位父级的(上内边框)距离;
    获取的是不带单位的数字。

如果要使用上面的属性,一定要做到以下几点:
1、子集有绝对定位;
2、定位父级也一定要有定位;
3、自己和父级都要有宽高(触发haslayout,zoom:1);

  • getBoundingClientRect()

当前元素到页面可视区的尺寸、距离;

注意:

是跟滚动条走的。
也就是拖动滚动条值会变;

包含:width/height/left/right/top/bottom/x/y

写法:box2.getBoundingClientRect();

使用定位距离做一个小例子:

let timer = null;
 box.onclick =function (){
 timer = setInterval(()=>{
 box.style.left= box.offsetLeft + 1 +'px';
 },16.7)
 }

在此了解以下渲染帧:
渲染帧是指浏览器一次完整绘制过程,帧之间的时间间隔是DOM视图更新的最小间隔。 由于主流的屏幕刷新率都在60hz,因此渲染一帧的事件就必须控制在16.7ms内才能保证不掉帧。也就是说每一次渲染都要在 16.7ms 内页面才够流畅不会有卡顿感。

封装绝对位置

// 使用边框、定位位置
 class Tools {
 position(ele){ 
 let left = 0;
 let top = 0;
 let obj = ele;
 while(obj){
 // t = 当前元素的外边距 + 当前元素边框
 left += obj.offsetLeft + obj.clientLeft;
 top += obj.offsetTop + obj.clientTop;
 //重新设置Obj是谁,让obj变为当前的定位父级
 obj = obj.offsetParent; //box3 -> box2 -> box1 -> 
 }
 left -= ele.clientLeft; //多加一次box3的border,所以要减去
 top -= ele.clientTop;
 return {
 left,
 top
 }
 }
 }
 let t1 = new Tools;
 console.log(t1.position(box3).top);

返回顶部的小例子

<style>
*{
 margin:0;
 padding:0;
}
#box{
 width:100px;
 height:50px;
 font-size:20px;
 text-align: center;
 line-height: 50px;
 color:#fff;
 background: red;
 cursor: pointer;
 position:fixed;
 bottom:0;
 right:0;
 display: none;
}
body,html{
 height:3000px;
}
</style>
</head>
<body>
 <div id="box">返回顶部</div>
<script>
 window.onscroll = function(){
 // console.log(window.pageYOffset);
 if(window.pageYOffset >= 600){
 box.style.display = 'block';
 }else{
 box.style.display = 'none';
 }
 }
 let timer = null;
 box.onclick = function(){
 let t = window.pageYOffset;
 timer = setInterval(() => {
 t-=100;
 if(t <= 0){
 t = 0;
 clearInterval(timer);
 }
 window.scrollTo(0,t);
 }, 16.7);
 }
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
网页打开自动最大化的js代码
Aug 22 Javascript
JavaScript移除数组元素减少长度的方法
Sep 05 Javascript
js获取 type=radio 值的方法
May 09 Javascript
Javascript获取当前日期的农历日期代码
Oct 08 Javascript
JS数组排序技巧汇总(冒泡、sort、快速、希尔等排序)
Nov 24 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
Oct 15 Javascript
vuex的简单使用教程
Feb 02 Javascript
JS实现模糊查询带下拉匹配效果
Jun 21 Javascript
微信小程序实现手指触摸画板
Jul 09 Javascript
JavaScript偏函数与柯里化实例详解
Mar 27 Javascript
微信小程序日历插件代码实例
Dec 04 Javascript
JavaScript setTimeout()基本用法有哪些
Nov 04 Javascript
运用js实现图层拖拽的功能
May 24 #Javascript
了解javascript中let和var及const关键字的区别
May 24 #Javascript
如何用原生js写一个弹窗消息提醒插件
May 24 #Javascript
小程序登录/注册页面设计的实现代码
May 24 #Javascript
微信小程序+云开发实现欢迎登录注册
May 24 #Javascript
30分钟用Node.js构建一个API服务器的步骤详解
May 24 #Javascript
Electron-vue开发的客户端支付收款工具的实现
May 24 #Javascript
You might like
浅谈php serialize()与unserialize()的用法
2013/06/05 PHP
php curl post 时出现的问题解决
2014/01/30 PHP
php+mysql数据库查询实例
2015/01/21 PHP
php字符串分割函数用法实例
2015/03/17 PHP
php获取Google机器人访问足迹的方法
2015/04/15 PHP
php实现购物车功能(下)
2016/01/05 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
Yii安装与使用Excel扩展的方法
2016/07/13 PHP
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
js 创建快捷方式的代码(fso)
2010/11/19 Javascript
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
jquery.pagination.js 无刷新分页实现步骤分享
2012/05/23 Javascript
node.js中的fs.truncate方法使用说明
2014/12/15 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
javascript图片预加载实例分析
2015/07/16 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
node.js实现回调的方法示例
2017/03/01 Javascript
JavaScript引用类型Function实例详解
2018/08/09 Javascript
Node.js API详解之 V8模块用法实例分析
2020/06/05 Javascript
[01:33]真香警告!DOTA2勇士令状不朽珍藏Ⅱ饰品欣赏
2018/06/26 DOTA
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
Python面向对象类继承和组合实例分析
2018/05/28 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
使用Python将字符串转换为格式化的日期时间字符串
2019/09/01 Python
Python语言异常处理测试过程解析
2020/01/08 Python
Python参数传递及收集机制原理解析
2020/06/05 Python
浅谈python处理json和redis hash的坑
2020/07/16 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
Java语言程序设计测试题选择题部分
2014/04/03 面试题
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
《九寨沟》教学反思
2014/04/08 职场文书
机电一体化应届生求职信
2014/08/09 职场文书
公司委托书格式范本
2014/09/16 职场文书
爱心捐款活动总结
2015/05/09 职场文书
Qt自定义Plot实现曲线绘制的详细过程
2021/11/02 Python