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 利用className得到对象的实现代码
Nov 15 Javascript
js二级地域选择的实现方法
Jun 17 Javascript
jquery衣服颜色选取插件效果代码分享
Aug 28 Javascript
jQuery滚动加载图片实现原理
Dec 14 Javascript
javascript从定义到执行 你不知道的那些事
Jan 04 Javascript
百度多文件异步上传控件webuploader基本用法解析
Nov 07 Javascript
vue内置组件transition简单原理图文详解(小结)
Jul 12 Javascript
微信小程序手机号码验证功能的实例代码
Aug 28 Javascript
Angular ui-roter 和AngularJS 通过 ocLazyLoad 实现动态(懒)加载模块和依赖
Nov 25 Javascript
vue图片上传本地预览组件使用详解
Feb 20 Javascript
详解Vue-Router源码分析路由实现原理
May 15 Javascript
js实现圆形显示鼠标单击位置
Feb 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开发文件系统实例讲解
2006/10/09 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
2013/03/06 PHP
深入PHP autoload机制的详解
2013/06/09 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
Laravel学习教程之从入口到输出过程详解
2017/08/27 PHP
用Greasemonkey 脚本收藏网站会员信息到本地
2009/10/26 Javascript
JavaScript中的property和attribute介绍
2011/12/26 Javascript
Jquery实现页面加载时弹出对话框代码
2013/04/19 Javascript
基于jQuery选择器的整理集合
2013/04/26 Javascript
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
鼠标滑过出现预览的大图提示效果
2014/02/26 Javascript
60个很实用的jQuery代码开发技巧收集
2014/12/15 Javascript
jQuery中extend函数详解
2015/02/13 Javascript
jQuery插件 Jqplot图表实例
2016/06/18 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
Javascript使用function创建类的两种方法(推荐)
2016/11/19 Javascript
Postman模拟发送带token的请求方法
2018/03/31 Javascript
Vue无限滑动周选择日期的组件的示例代码
2018/07/18 Javascript
vuex的module模块用法示例
2018/11/12 Javascript
node crawler如何添加promise支持
2020/02/01 Javascript
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
python获取糗百图片代码实例
2013/12/18 Python
python绘制简单折线图代码示例
2017/12/19 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
2019/09/04 Python
Python装饰器用法与知识点小结
2020/03/09 Python
Python基于Hypothesis测试库生成测试数据
2020/04/29 Python
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
师范生实习的个人自我鉴定
2013/10/20 职场文书
《落花生》教学反思
2014/02/25 职场文书
数字化校园建设方案
2014/05/03 职场文书
社区维稳工作方案
2014/06/06 职场文书
周年庆典答谢词
2015/01/20 职场文书
辩护意见书
2015/06/04 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书
导游词之藏龙百瀑景区
2019/12/30 职场文书