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 弹出新页面避免被浏览器、ad拦截的一种新方法
Apr 30 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
Jun 07 Javascript
使用jQuery实现更改默认alert框体
Apr 13 Javascript
js+ajax实现获取文件大小的方法
Dec 08 Javascript
jquery+Jscex打造游戏力度条
Sep 12 Javascript
jquery实现文本框的禁用和启用
Dec 07 Javascript
使用snowfall.jquery.js实现爱心满屏飞的效果
Jan 05 Javascript
Vue.js弹出模态框组件开发的示例代码
Jul 26 Javascript
总结js中的一些兼容性易错的问题
Dec 18 Javascript
详解基于React.js和Node.js的SSR实现方案
Mar 21 Javascript
javascript原型链学习记录之继承实现方式分析
May 01 Javascript
微信小程序自定义toast组件的方法详解【含动画】
May 11 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 xml文件操作实现代码(二)
2009/03/20 PHP
php ZipArchive压缩函数详解实例
2013/11/06 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
PHP实现AES256加密算法实例
2014/09/22 PHP
php cookie用户登录的详解及实例代码
2017/01/03 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
JavaScript 常用函数
2009/12/30 Javascript
js读取注册表的键值示例
2013/09/25 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
使用jquery操作session方法分享
2015/01/22 Javascript
JavaScript插件化开发教程 (四)
2015/01/27 Javascript
JS中字符串trim()使用示例
2015/05/26 Javascript
jquery操作select元素和option的实例代码
2016/02/03 Javascript
JS Attribute属性操作详解
2016/05/19 Javascript
浅谈jQuery添加的HTML,JS失效的问题
2016/10/05 Javascript
详解用node.js实现简单的反向代理
2017/06/26 Javascript
区别JavaScript函数声明与变量声明
2018/09/12 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
JS异步处理的进化史深入讲解
2019/08/25 Javascript
Python Queue模块详细介绍及实例
2016/12/27 Python
python爬取网页内容转换为PDF文件
2020/07/28 Python
Python定义一个跨越多行的字符串的多种方法小结
2018/07/19 Python
使用Python创建简单的HTTP服务器的方法步骤
2019/04/26 Python
pytorch SENet实现案例
2020/06/24 Python
python实现从ftp上下载文件的实例方法
2020/07/19 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
香港化妆品经销商:我的公主
2016/08/05 全球购物
惠普美国官方商店:HP Official Store
2016/08/28 全球购物
出纳员岗位责任制
2014/02/11 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
教师个人学习总结
2015/02/11 职场文书
个人年终总结结尾
2015/03/06 职场文书
接待员岗位职责范本
2015/04/15 职场文书
2015年环卫工作总结
2015/04/28 职场文书
亮剑观后感600字
2015/06/05 职场文书
六一文艺汇演主持词
2015/06/30 职场文书