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 相关文章推荐
functional继承模式 摘自javascript:the good parts
Jun 20 Javascript
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
Feb 27 Javascript
js onload事件不起作用示例分析
Oct 09 Javascript
jQuery获取和设置表单元素的方法
Feb 14 Javascript
js获取判断上传文件后缀名的示例代码
Feb 19 Javascript
js实现交换运动效果的方法
Apr 10 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
May 18 Javascript
javascript弹出带文字信息的提示框效果
Jul 19 Javascript
node网页分段渲染详解
Sep 05 Javascript
JavaScript制作简单分页插件
Sep 11 Javascript
Ext JS 实现建议词模糊动态搜索功能
May 13 Javascript
node.js操作mysql简单实例
May 25 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新手上路(十)
2006/10/09 PHP
php 删除无限级目录与文件代码共享
2008/11/22 PHP
php读取xml实例代码
2010/01/28 PHP
php单例模式的简单实现方法
2016/06/10 PHP
Array.prototype 的泛型应用分析
2010/04/30 Javascript
jquery获取div宽度的实现思路与代码
2013/01/13 Javascript
jquery提交form表单简单示例分享
2014/03/03 Javascript
中文输入法不触发onkeyup事件的解决办法
2014/07/09 Javascript
JavaScript设计模式之观察者模式(发布者-订阅者模式)
2014/09/24 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
关于 angularJS的一些用法
2017/11/29 Javascript
浅析js中mvvm模式实现的原理
2018/10/06 Javascript
原生JS实现的放大镜特效示例【测试可用】
2018/12/08 Javascript
vue项目前端知识点整理【收藏】
2019/05/13 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
javascript实现前端成语点击验证
2020/06/24 Javascript
vue3.0 项目搭建和使用流程
2021/03/04 Vue.js
[07:20]2018DOTA2国际邀请赛寻真——逐梦Mineski
2018/08/10 DOTA
Python实现抓取百度搜索结果页的网站标题信息
2015/01/22 Python
Python中文件操作简明介绍
2015/04/13 Python
Python实现Kmeans聚类算法
2020/06/10 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
python如何爬取个性签名
2018/06/19 Python
详解Appium+Python之生成html测试报告
2019/01/04 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
2019/05/16 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
css3实现二维码扫描特效的示例
2020/10/29 HTML / CSS
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
JSF面试题:Jsf中导航的标签是什么
2013/04/20 面试题
如何写一份好的英文求职信
2014/03/19 职场文书
党课培训主持词
2014/04/01 职场文书
团委竞选演讲稿
2014/04/24 职场文书
寒山寺导游词
2015/02/03 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL
Pandas实现DataFrame的简单运算、统计与排序
2022/03/31 Python
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server