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读写(删除)Cookie实例详解
Apr 17 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
Apr 29 Javascript
js style动态设置table高度
Oct 21 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
Sep 21 Javascript
JavaScript动态创建form表单并提交的实现方法
Dec 10 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
May 11 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
May 30 Javascript
Node.js 文件夹目录结构创建实例代码
Jul 08 Javascript
JS匿名函数类生成方式实例分析
Nov 26 Javascript
js实现分页功能
May 24 Javascript
three.js实现3D模型展示的示例代码
Dec 31 Javascript
JS使用栈判断给定字符串是否是回文算法示例
Mar 04 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代码优化之成员变量获取速度对比
2014/02/28 PHP
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
JS获取浏览器版本及名称实现函数
2013/04/02 Javascript
nodejs获取本机内网和外网ip地址的实现代码
2014/06/01 NodeJs
JavaScript 浏览器对象模型BOM使用介绍
2015/04/13 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
js中unicode转码方法详解
2015/10/09 Javascript
javascript字符串替换函数如何一次性全部替换掉
2015/10/30 Javascript
jQuery实现滚动鼠标放大缩小图片的方法(附demo源码下载)
2016/03/05 Javascript
javascript insertAfter()定义与用法示例
2016/07/25 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
Bootstrap3下拉菜单的实现
2017/02/22 Javascript
Bootstrap3多级下拉菜单
2017/02/24 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
解决vue-cli中stylus无法使用的问题方法
2017/06/19 Javascript
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
jQuery中的for循环var与let的区别
2018/04/21 jQuery
vue 下列表侧滑操作实例代码详解
2018/07/24 Javascript
24行JavaScript代码实现Redux的方法实例
2019/11/17 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
python顺序的读取文件夹下名称有序的文件方法
2018/07/11 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
Python 实现国产SM3加密算法的示例代码
2020/09/21 Python
Guess欧洲官网:美国服饰品牌
2019/08/06 全球购物
如何进行有效的自我评价
2013/09/27 职场文书
《赵州桥》教学反思
2014/02/17 职场文书
英语一分钟演讲稿
2014/04/29 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
优秀班主任先进事迹材料
2014/12/16 职场文书
初中家长意见
2015/06/03 职场文书
小学运动会加油词
2015/07/18 职场文书
2016中秋节问候语
2015/11/11 职场文书
JavaScript异步操作中串行和并行
2021/11/20 Javascript
asyncio异步编程之Task对象详解
2022/03/13 Python