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 相关文章推荐
在Javascript中定义对象类别
Dec 22 Javascript
jQuery 中关于CSS操作部分使用说明
Jun 10 Javascript
JavaScript中的console.trace()函数介绍
Dec 29 Javascript
jQuery实现切换字体大小的方法
Mar 10 Javascript
JS动态改变表格边框宽度的方法
Mar 31 Javascript
充分发挥Node.js程序性能的一些方法介绍
Jun 23 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
Oct 18 Javascript
JS产生随机数的用法小结
Dec 10 Javascript
JS判断微信扫码的方法
Aug 07 Javascript
vue中使用refs定位dom出现undefined的解决方法
Dec 21 Javascript
如何用Node写页面爬虫的工具集
Oct 26 Javascript
在vue-cli中引入lodash.js并使用详解
Nov 13 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 Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
深入PHP FTP类的详解
2013/06/13 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
分享php分页的功能模块
2015/06/16 PHP
设定php简写功能的方法
2019/11/28 PHP
小型js框架veryide.librar源代码
2009/03/05 Javascript
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
2012/02/27 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
jquery带翻页动画的电子杂志代码分享
2015/08/21 Javascript
JavaScript利用HTML DOM进行文档操作的方法
2016/03/28 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
2016/04/07 Javascript
jQuery简单注册和禁用全局事件的方法
2016/07/25 Javascript
AngularJS表单详解及示例代码
2016/08/17 Javascript
自定义require函数让浏览器按需加载Js文件
2016/11/24 Javascript
微信小程序图表插件(wx-charts)实例代码
2017/01/17 Javascript
基于AngularJS实现的工资计算器实例
2017/06/16 Javascript
Vue-router路由判断页面未登录跳转到登录页面的实例
2017/10/26 Javascript
通过一次报错详细谈谈Point事件
2018/05/17 Javascript
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
vue实现倒计时获取验证码效果
2020/04/17 Javascript
vue请求服务器数据后绑定不上的解决方法
2019/10/30 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
Python3.5字符串常用操作实例详解
2019/05/01 Python
Python input函数使用实例解析
2019/11/22 Python
Python代码生成视频的缩略图的实例讲解
2019/12/22 Python
基于python实现对文件进行切分行
2020/04/26 Python
文员自我评价怎么写
2013/09/19 职场文书
电子专业毕业生自我鉴定
2014/01/22 职场文书
亲子阅读的活动方案
2014/08/15 职场文书
奥巴马上海演讲稿
2014/09/10 职场文书
党政领导班子民主生活会整改措施
2014/09/18 职场文书
小学班主任个人总结
2015/03/03 职场文书
改进工作作风心得体会
2016/01/23 职场文书
创业计划书之都市休闲农庄
2019/12/28 职场文书
vue判断按钮是否可以点击
2022/04/09 Vue.js
Go gorilla securecookie库的安装使用详解
2022/08/14 Golang