前面的话

  元素的渲染结果是多个CSS样式博弈后的最终结果,这也是CSS中的C(cascade)层叠的含义。访问第一篇中的style属性只能获取行间样式,这通常来说,并不是我们想要的结果。本文将详细介绍如何查询计算样式

getComputedStyle()

  元素的计算样式(computedStyle)是一组在显示元素时实际使用的属性值,也是用一个 CSSStyleDeclaration对象来表示的,但计算样式是只读的,主要通过getComputedStyle()方法实现

  getComputedStyle()方法接收两个参数:要取得计算样式的元素和一个伪元素字符串。如果不需要伪元素信息,第二个参数可以是null。getComputedStyle()方法返回一个CSSStyleDeclaration对象,其中包含当前元素的所有计算的样式

  [注意]IE8-浏览器不支持

  getComputedStyle()方法原本是window对象下的方法,后来“DOM2级样式”增强了document.defaultView,也提供了getComputedStyle()方法。所以getComputedStyle()方法一共有下面3种写法

  1、document.defaultView.getComputedStyle(div).width

  2、window.getComputedStyle(div).width

  3、getComputedStyle(div).width

  其中第3种写法最简单

<div id="test" style="width: 100px;"></div>
<script>
//下面三行代码的结果都一样,IE8-浏览器报错,其他浏览器返回'100px'
console.log(document.defaultView.getComputedStyle(test).width);
console.log(window.getComputedStyle(test).width);
console.log(getComputedStyle(test).width);
</script>

伪元素

  第二个参数代表伪元素字符串,包括":before"、":after"、":first-line"等,如果设置为null或省略不写,则返回自身元素的CSSStyleDeclaration对象

  [注意]关于伪元素的详细内容移步至此

<style>
#test:before{content:'';
width:20px;
display:inline-block;
}
</style>
<div id="test" style="width: 100px;"></div>
<script>
//IE8-浏览器报错,其他浏览器返回'20px'
console.log(getComputedStyle(test,':before').width);
</script>

注意事项

  在使用getComputedStyle()方法的过程中,有如下注意事项:

  【1】对于font、background、border等复合样式,各浏览器处理不一样。chrome会返回整个复合样式,而IE9 、firefox和safari则输出空字符串''

<div id="test" style="font-size:20px"></div>
<script>
//IE8-浏览器报错,chrome返回normal normal normal normal 20px / normal Simsun,其他浏览器返回''
console.log(getComputedStyle(test).font);
</script>

  【2】不论以什么格式设置颜色,浏览器都以rgb()或rgba()的形式输出

<div id="test" style="color:red"></div>
<script>
//IE8-浏览器报错,其他浏览器返回rgb(255, 0, 0)
console.log(getComputedStyle(test).color);
</script>

  【3】在计算样式中,类似百分比等相对单位会转换为绝对值

<div id="test" style="width:20%;"></div>
<script>
//IE8-浏览器报错,其他浏览器返回'304px'
console.log(getComputedStyle(test).width);
</script>

currentStyle

  IE8-浏览器不支持getComputedStyle()方法,但在IE中每个具有style属性的元素有一个currentStyle属性,这个属性是CSSStyleDeclaration的实例,包含当前元素全部计算后的样式

<div id="test" style="font-size:20px;color:red;width:20%;"></div>
<script>
//IE8-浏览器返回undefined,IE9 浏览器返回''
console.log(test.currentStyle.font);
//IE浏览器返回red
console.log(test.currentStyle.color);
//IE浏览器返回20%
console.log(test.currentStyle.width);
</script>

  由以上结果看出,currentStyle属性中的计算样式并不会输出集合样式,对颜色、百分比设置不会进行相应转换,而是原样输出

兼容

function getCSS(obj,style){
if(window.getComputedStyle){
return getComputedStyle(obj)[style];
}
return obj.currentStyle[style];
}
<div id="test" style="width:20px;"></div>
<script>
function getCSS(obj,style){
if(window.getComputedStyle){
return getComputedStyle(obj)[style];
}
return obj.currentStyle[style];
}
console.log(getCSS(test,'width'));//20px
</script>

IE

  IE9 浏览器的getComputedStyle()方法和IE浏览器的currentStyle属性有一个特别的地方,就是可以识别自定义样式的值,虽然无法正常渲染,但是可以取出值

<div id="test" style="a:1"></div>
<script>
//其他浏览器输出undefined,而IE9 浏览器输出1
console.log(getComputedStyle(test).a);
//其他浏览器输出undefined,而IE浏览器输出1
console.log(test.currentStyle.a);
</script>

opacity

  虽然IE8-浏览器无法对opacity属性进行正常渲染,但可以读出opacity属性的值。这对于opacity属性来说无疑是一个好消息

<div id="test" style="opacity:0.5"></div>
<script>
function getCSS(obj,style){
if(window.getComputedStyle){
return getComputedStyle(obj)[style];
}
return obj.currentStyle[style];
}
console.log(getCSS(test,'opacity'));//0.5
</script>    

最后

  一般地,我们通过getComputedStyle()方法或currentStyle属性获得元素的计算样式,但要获得元素精确的位置和尺寸信息,查询元素的计算样式并不是个好主意,因为类似padding、width等单一样式并不直接反映元素的位置和尺寸信息,这些信息是多个样式综合作用的结果。所以,最好使用前面介绍过的关于元素视图的offset、client、scroll和getBoundingClientRect()等来获取

  欢迎交流

更多专业前端知识,请上 【猿2048】www.mk2048.com

深入理解脚本化CSS系列第二篇——查询计算样式相关推荐

  1. 深入理解脚本化CSS系列第五篇——动态样式

    前面的话 很多时候,DOM操作比较简单明了,因此用javascript生成那些通常原本是HTML代码生成的内容并不麻烦.但由于浏览器充斥着隐藏的陷阱和不兼容问题,处理DOM中的某些部分时要复杂一些,比 ...

  2. 深入理解javascript选择器API系列第二篇——getElementsByClassName

    前面的话 既然有getElementById()和getElementsByTagName()方法,为什么没有getElementsByClassName()呢?id属性.标签名.class属性并没有 ...

  3. 深入理解javascript函数系列第二篇——函数参数

    前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传进来的参数是什么数据类型,甚至可以不传参数.本文是深入理解javascript函数 ...

  4. 第17章 脚本化CSS

    第17章 脚本化CSS CSS脚本化是网页交互效果的技术基础,使用CSS和JavaScript可以设计网页动画.利用脚本化CSS可以动态地改变HTML属性,如字体颜色.字体大小等,还可以用它设置和改变 ...

  5. 前端工程师技能之photoshop巧用系列第二篇——测量篇

    前端工程师使用photoshop进行的大量工作实际上是测量.本文是photoshop巧用系列第二篇--测量篇 测量信息 在网页制作中需要使用photoshop测量的信息分为两类,分别是尺寸信息和颜色信 ...

  6. 焱老师带你学习MYSQL系列 第二篇 (MYSQL 数据结构)

    相关系列链接 焱老师带你学习MYSQL系列 第六篇 (MYSQL是如何实现锁的) 焱老师带你学习MYSQL系列 第五篇 (MYSQL事务隔离级别是如何实现的) 焱老师带你学习MYSQL系列 第四篇 ( ...

  7. 9_js 日期对象Date()、js定时器、获取窗口属性、获取dom尺寸、脚本化css

    日期对象Date() 封装函数,打印当前是何年何月何日何时,几分几秒 直接看w3c上的介绍吧 https://www.w3school.com.cn/js/jsref_obj_date.asp js定 ...

  8. 阿里出品移动研发“神器” 阿里移动云系列第二篇|“移”步到位:一站式移动应用研发体系...

    摘要:2017杭州云栖大会阿里移动云峰会专场上,阿里巴巴高级技术专家小木带来一站式应用研发体系方面的演讲.本文主要以互联网的应用背景开始谈起,进而阐述了已拥有APP的企业在APP的生命周期中会遇见哪些 ...

  9. [游戏开发]Python打表工具系列 [第二篇] [打表流程描简述]

    [上一篇链接] [游戏开发]Python打表工具系列 [第一篇][IDE开发环境部署] VSCode Python环境调试_Little丶Seven的博客-CSDN博客 [前言] 第二篇文章是对流程的 ...

最新文章

  1. (0046) iOS开发之View的frame和bounds之解惑
  2. 终端下中文乱码解决方法
  3. 遍历聚合对象中的元素——迭代器模式(二)
  4. Js 模拟鼠标点击事件
  5. 串口数据波形显示_【专题教程第6期】SEGGER的J-Scope波形上位机软件,RTT模式波形上传可飙到500KB/S...
  6. 华为谷歌互利合作曝光:或将推Nexus手表
  7. android github 评分控件_「开源」Arcgis for Android测量工具更新至V1.9,新增绘制控件...
  8. spark streaming python实例_kafka+spark streaming代码实例(pyspark+python)
  9. Centos修改默认网卡名
  10. Idea下的springboot mysql8.0等报错解决随笔
  11. oracle拼音匹配,求完整简洁的Oracle获得汉字字符串拼音首字母和全拼的函数
  12. android+表情符号乱码,Android Emoji表情截取不完整,乱码
  13. 一个系统同时装office2007和2019时遇到的问题及解决方案
  14. apk编辑器制作共存失败的一个可能的原因(第一次手动制作的教训)
  15. HC32F460 SPI DMA 驱动 TFT显示屏
  16. React 之 Expected an assignment or function call and instead saw an expression 解决办法
  17. 用python画星空-用python画星空源代码是什么?
  18. QUB的中文帮助文档
  19. 【Arduino】重生之Arduino 学僧(1)----Arduino简介
  20. 【C++ MFC开发】串口通信之多个编辑框输出

热门文章

  1. json文件读取之reader.onload中的定义的变量在其函数外部进行处理
  2. 服务器系统授权,授权方案说明
  3. LintCode-A + B 问题
  4. android代码画出波浪球,Android绘制波浪曲线,效果很赞的。
  5. Java 将数据写入磁盘并读取磁盘上的文件
  6. C语言-第8课 - 注释符号
  7. 《python网络数据采集》读后感 第六章:读取文档
  8. Andrew Ng - 深度学习工程师 - Part 2. 改善深层神经网络:超参数调试、正则化以及优化(Week 1. 机器学习的实用层面)...
  9. canvas绘制多边形
  10. 洛谷 P3146 [USACO16OPEN]248