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 相关文章推荐
实现checkbox全选、反选、取消JavaScript小脚本异常
Apr 10 Javascript
js实现正方形颜色从下往上升的效果
Aug 04 Javascript
基于jquery实现表格内容筛选功能实例解析
May 09 Javascript
JS代码实现table数据分页效果
May 26 Javascript
关于网页中的无缝滚动的js代码
Jun 09 Javascript
js中遍历Map对象的方法
Jul 27 Javascript
简单分析javascript中的函数
Sep 10 Javascript
简单实现Bootstrap标签页
Aug 09 Javascript
svg动画之动态描边效果
Feb 22 Javascript
JS请求servlet功能示例
Jun 01 Javascript
Vue实现开心消消乐游戏算法
Oct 22 Javascript
Vue组件跨层级获取组件操作
Jul 27 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中eclipse 用空格替换 tab键
2013/06/24 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
php生成shtml类用法实例
2014/12/09 PHP
php根据指定位置和长度获得子字符串的方法
2015/03/17 PHP
PHP论坛实现积分系统的思路代码详解
2020/06/01 PHP
Prototype Array对象 学习
2009/07/19 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
Event altKey,ctrlKey,shiftKey属性解析
2013/12/18 Javascript
DOM 事件流详解
2015/01/20 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
2015/03/02 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
JavaScript保留关键字汇总
2015/12/01 Javascript
javascript中JSON.parse()与eval()解析json的区别
2016/05/19 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
jQuery图片拖动组件Dropzone用法示例
2017/01/17 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
javascript使用正则实现去掉字符串前面的所有0
2018/07/23 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
浅谈实现在线预览PDF的几种解决办法
2020/08/10 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
Python编程判断一个正整数是否为素数的方法
2017/04/14 Python
python实现屏保计时器的示例代码
2018/08/08 Python
Python中的正则表达式与JSON数据交换格式
2019/07/03 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
2020/03/12 Python
python使用hdfs3模块对hdfs进行操作详解
2020/06/06 Python
html5利用canvas实现颜色容差抠图功能
2019/12/23 HTML / CSS
巴西最大的玩具连锁店:Ri Happy
2020/06/17 全球购物
网上签名寄语活动留言
2014/01/18 职场文书
采购求职信
2014/03/17 职场文书
个人求职自荐信范文
2015/03/06 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
用python批量解压带密码的压缩包
2021/05/31 Python
PostgreSQL13基于流复制搭建后备服务器的方法
2022/01/18 PostgreSQL
漫画「古见同学有交流障碍症」第25卷封面公开
2022/03/21 日漫