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 相关文章推荐
Iframe thickbox2.0使用的方法
Mar 05 Javascript
JQuery 操作select标签实现代码
May 14 Javascript
jquery中eq和get的区别与使用方法
Apr 14 Javascript
js获取控件位置以及不同浏览器中的差别介绍
Aug 08 Javascript
JQuery中clone方法复制节点
May 18 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
May 12 Javascript
JavaScript常用代码书写规范的超全面总结
Sep 11 Javascript
利用Node.js编写跨平台的spawn语句详解
Feb 12 Javascript
React Native之ListView实现九宫格效果的示例
Aug 02 Javascript
angular4 如何在全局设置路由跳转动画的方法
Aug 30 Javascript
vue路由守卫+登录态管理实例分析
May 21 Javascript
JavaScript中10个Reduce常用场景技巧
Jun 21 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
我的论坛源代码(五)
2006/10/09 PHP
PHP 获取指定地区的天气实例代码
2017/02/08 PHP
JavaScript 乱码问题
2009/08/06 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
Javascript 按位与赋值运算符 (&amp;=)使用介绍
2014/02/04 Javascript
JavaScript生成二维码图片小结
2015/12/27 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
2016/09/14 Javascript
jQuery中页面返回顶部的方法总结
2016/12/30 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
2017/02/23 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
Nodejs连接mysql并实现增、删、改、查操作的方法详解
2018/01/04 NodeJs
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
浅谈实现在线预览PDF的几种解决办法
2020/08/10 Javascript
基于openlayers实现角度测量功能
2020/09/28 Javascript
跟老齐学Python之使用Python查询更新数据库
2014/11/25 Python
简单的抓取淘宝图片的Python爬虫
2014/12/25 Python
python使用tkinter实现简单计算器
2018/01/30 Python
查看TensorFlow checkpoint文件中的变量名和对应值方法
2018/06/14 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
python mac下安装虚拟环境的图文教程
2019/04/12 Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
2019/06/27 Python
django创建最简单HTML页面跳转方法
2019/08/16 Python
Python定义一个函数的方法
2020/06/15 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
python 下载m3u8视频的示例代码
2020/11/11 Python
Python下载的11种姿势(小结)
2020/11/18 Python
XD健身器材:Kevlar球、Crossfit健身球
2019/03/26 全球购物
简历自我评价怎么写呢?
2014/01/06 职场文书
遗嘱公证书标准样本
2014/04/08 职场文书
公司宣传语大全
2015/07/13 职场文书
儿子满月酒致辞
2015/07/29 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书
毕业季聚会祝酒词!
2019/07/04 职场文书
pd.DataFrame中的几种索引变换的实现
2022/06/16 Python