你不知道的getComputedStyle
你不知道的getComputedStyle
jQuery的css()的底层实现就用到了getComputedStyle这个方法,也许我们用到的很少,但是不得不说这时一个非常强大的函数,下面让我们一探究竟!
第一部分:基本语法
在mdn上,我们可以看到它是这样定义的:
The
Window.getComputedStyle()method gives the values of all the CSS properties of an element after applying the active stylesheets and resolving any basic computation those values may contain.
即这个方法会返回一个元素的所有属性,无论是我们预先定义的,还是继承的或默认的。
基本语法如下所示:
var style = window.getComputedStyle(element[, pseudoElt]);
它接受两个参数,第一个是一个元素,这时必选的;第一个是伪元素(pseudo element),它是可选的,所以用[]括起来,值得注意的是,如果没有伪元素时,我们可以用null来代替,当然也可以不写null。并且这个方法会返回一个CSSStyleDeclaration对象,它包含了所有的css属性。另外,这个语句也可以写成:
var style = window.defaultView.getComputedStyle(element[, pseudoElt]);
其中defaultView一般情况下是不需要写的,只有在FireFox3.6中才会使用。
第二部分:实例
正所谓是骡子是马,拉出来遛遛,他有什么用呢?
在页面的控制台中,在element下给一个元素添加id="testEL",然后再控制台中输入:
console.log(window.getComputedStyle(document.querySelector("#testEL"),null))
此时,我们可以得到如下的代码:
可以看到,的确得到了CSSStyleDeclaration对象,其中还包含了一大推属性,属性名是以数字开头的,还这么复杂?其实这大可不必担心,我们可以点击左方的小三角,这样属性我们就可以看到整齐的代码了,并且可以发现,这个对象中包含了所有的css属性,如果我们希望得到它的width属性,可以输入:
console.log(window.getComputedStyle(document.querySelector("#testEL"),null).width)
于是得到404px;
值得注意的是:因为这是通过js来获取,对于background-color和text-overflow这样的属性,我们需要写成驼峰式,如backgroundColor和textOverflow。而因为float在js中是保留字,所以需要写成cssFloat。
除此之外,我们还可以使用getPropertyValue方法,同样的,为了获取width可以写成:
console.log(window.getComputedStyle(document.querySelector("#testEL"),null).getPropertyValue("width"))
这样,如果需要得到float和background-color就可以直接传入了,如:
console.log(window.getComputedStyle(document.querySelector("#testEL"),null).getPropertyValue("background-color"))
第三部分:和element.style的区别
element.style是什么呢? 我们再控制台中输入:
console.log(document.querySelector("#testEL").style);
可以得到如下代码:

显然可以看到,这里的属性很少,并且没有数字为属性名的,也就是说该元素没有预定义的属性。
如果我在元素中加入内联样式width:50px;这时就可以看到控制台输入如下:

于是,我们可以得到element.style和getComputedStyle的第一个区别是:
getComputedStyle会返回该元素的所有属性,无论是预定的,还是继承或默认的;而element.style只返回元素的预定义的属性。
另外,我们再控制台中输入:
document.querySelector("#testEL").style.width="50px";
然后去审查元素,就可以发现,width的确成了50px;
如果在控制台输入:
console.log(window.getComputedStyle(document.querySelector("#testEL"),null).width)
控制台就会报错:

于是我们得到了两者的第二个区别:
getComputedStyle得到的属性时只读的,不可修改;而element.style得到的属性可以读也可以写。
第四部分:有伪元素的情况
有伪元素时,也非常简单,只需要传入第二个参数即可,值得注意的是,传入第二个参数需要用""括起来,如"::before"或"::after",举例如下。
html代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
<style>
a{
color:red;
font-size: 30px;
}
a::after{
content: "";
display: inline-block;
width: 20px;
height: 30px;
background-color: red;
}
</style>
</head>
<body>
<a href="" id="test">这时一个链接</a>
</body>
</html>
效果如下:

如果我们在控制台中输入console.log(window.getComputedStyle(document.querySelector("#test"),"::after")),可以得到:

这里我们就可以查看到关于这个伪元素的所有css信息。
第五部分: IE中存在的问题
在IE8及以下是不支持这个属性的,它自己使用currentStyle来获取css值。即使用element.currentStyle来获取所有元素的值。
另外,之前我们提到过使用getPropertyValue来获取某个属性的值,即
console.log(window.getComputedStyle(document.querySelector("#testEL"),null).getPropertyValue("background-color"))
同样IE不支持这样的方法,它使用getAttribute来完成同样的实现,如:
document.getElementById("testEl").currentStyle.getAttribute("width");
同样的,这里不需要写入cssFloat,但是对于-链接的样式属性,还是需要写成驼峰式的写法。注意:这里我用的是getElementById(),因为IE6和IE7是不支持querySelector的。
第六部分:
注意:element.style.width 和 window.getComputedStyel("").style.width 这两个是不同的, 如果我们之前没有设置width值,那么我们就不能通过element.style.width得到,然而window.getComputedStyle("").style.width始终都可以获取的到。
另外,使用ele.style.width得到的值是数字,我们再设置时往往需要添加px,但是使用getComputedStyle().width得到的是一个px,所以我们如果希望得到数字,就要parseInt
如果一个元素的position属性是absolute,那么使用getComputedStyle().left一定可以获得px的值。
但是如果不是, 那么得到的就是auto了。 即getComputedStyle并不是所有的时候都会得到数值。
注:原创文章,禁止转载。
你不知道的getComputedStyle的更多相关文章
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- MySQL 系列(二) 你不知道的数据库操作
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 本章内容: 查看\创建\使用\删除 数据库 用户管理及授权实战 局域网 ...
- 《你不知道的JavaScript》整理(二)——this
最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,这次研究了一下“this”. 当一个函数被调用时,会创建一个活动记录(执行上下文). 这个记录会包含函 ...
- 《你不知道的JavaScript》整理(一)——作用域、提升与闭包
最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,里面分析了很多基础性的概念. 可以更全面深入的理解JavaScript深层面的知识点. 一.函数作用域 ...
- currentStyle与getComputedStyle应用
getComputedStyle获取的是计算机(浏览器)计算后的样式,但是不兼容IE6.7.8(主要用于非IE浏览器) currentStyle方法兼容IE6.7.8,但是不兼容标准浏览器(主要用于I ...
- JS使用getComputedStyle()方法获取CSS属性值
在对网页进行调试的过程中,经常会用到js来获取元素的CSS样式,方法有很多很多,现在仅把我经常用的方法总结如下: 1. obj.style:这个方法只能JS只能获取写在html标签中的写在style属 ...
- style,currentStyle,getComputedStyle的区别和用法
先说说层叠样式表的三种形式(三种的叫法不一,按照各自的习惯): 一.内联样式:在HTML标签用style属性设置.如: 1 <p >这是内联样式</p> 二.嵌入样式:通过&l ...
- getComputedStyle/currentStyle/style之间的爱恨情仇
getComputedStyle是? getComputedStyle是一个可以获取当前元素所有最终使用的CSS属性值.返回的是一个CSS样式声明对象([object CSSStyleDeclarat ...
- getComputedStyle 方法
一:getComputedStyle getComputedStyle是一个可以获取当前元素所有最终使用的CSS属性值.返回的是一个CSS样式声明对象([object CSSStyleDeclarat ...
随机推荐
- ZOJ 3946 Highway Project
1.迪杰斯特拉最小堆 #include<cstdio> #include<cstring> #include<cmath> #include<map> ...
- 中文字符 unicode转utf-8函数 python实现
unicode编码范围 00000000-0000007F的字符,用单个字节来表示: 00000080-000007FF的字符用两个字节表示 (中文的编码范围) 00000800-0000FFFF的字 ...
- CentOS 5.8 x64 安装TomCat
简单记录一下...虽然安装很简单... 首先下载配置安装 jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u25-do ...
- 关于CH340在STM32实现一键下载电路的研究(转)
源:关于CH340在STM32实现一键下载电路的研究 在做基于STM32的多功能MP3播放器的课题时,在程序下载这部分时借鉴了正点原子开发板上的一键下载电路,采用CH340G这款芯片设计. 在画PCB ...
- IOS开发中重写init方法使用需谨慎
IOS开发中重写init方法使用需谨慎 今天在写一个小软件的时候出现一点问题,这个软件的功能是搜索全国学校,首页就是搜索输入框,在框中输入完要查询的学校所在省份,点击buttom后就会跳转到对应的视图 ...
- USB自定义HID设备实现-STM32
该文档使用USB固件库,在其基础上进行了自己的定制,完成了一个USB-HID设备,首先是usb_desc.c文件,里面存放了usb各种描述符的存在 #include "usb_desc.h& ...
- IIS日志路径,修改存放位置,清除日志方法
IIS存放日志文件的默认存储路径是c:\windows\system32\logfiles 我们依次打开“我的电脑”,C盘,Windows文件夹,system32文件夹,logfiles文件夹,发现里 ...
- double和real型有什么区别 [
DOUBLE是双精度浮点数REAL 是实数类型,他包括 DOUBLE,SINGLE等类型
- chorme加减乘除浮点数处理
在处理简单的1-0.7的时候发现chorme给的结果竟然是0.30000000000000004,瞬间蛋疼了,这数据能用?! 然后去百度找到了简单的两个数的加减乘除,然后修改了下,除了除法都可以多个数 ...
- vi的基本操作
vi的基本操作 a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command m ...