本文引自张鑫旭的博客,但是因为太唠叨了,所以算是节选吧。
getComputedStyle()
getComputedStyle
是一个可以获取当前元素所有最终使用的CSS属性值。返回的是一个CSS样式声明对象([object CSSStyleDeclaration]),只读。
语法:
var style = window.getComputedStyle("元素", "伪类");
//用法:
var dom = document.getElementById("test"),
style = window.getComputedStyle(dom , ":after");
就两个参数,大家都懂中文的,没什么好说的。只是额外提示下:Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1) 之前,第二个参数“伪类”是必需的(如果不是伪类,设置为null),不过现在嘛,不是必需参数了。
getComputedStyle与style的区别
我们使用element.style也可以获取元素的CSS样式声明对象,但是其与getComputedStyle方法还有有一些差异的。
只读与可写
正如上面提到的getComputedStyle
方法是只读的,只能获取样式,不能设置;而element.style
能读能写,能屈能伸。
获取的对象范围
getComputedStyle
方法获取的是最终应用在元素上的所有CSS属性对象(即使没有CSS代码,也会把默认的祖宗八代都显示出来);而element.style
只能获取元素style属性中的CSS样式。因此对于一个光秃秃的元素<p>,getComputedStyle
方法返回对象中length属性值(如果有)就是190+(据我测试FF:192, IE9:195, Chrome:253, 不同环境结果可能有差异), 而element.style就是0。
getComputedStyle与defaultView
如果我们查看jQuery源代码,会发现,其css()方法实现不是使用的window.getComputedStyle
而是document.defaultView.getComputedStyle
。在FireFox3.6上不使用defaultView
方法就搞不定的。
getComputedStyle与currentStyle
currentStyle
是IE浏览器自娱自乐的一个属性,其与element.style可以说是近亲,至少在使用形式上类似,element.currentStyle
,差别在于element.currentStyle
返回的是元素当前应用的最终CSS属性值(包括外链CSS文件,页面中嵌入的<style>属性等)。
因此,从作用上将,getComputedStyle
方法与currentStyle
属性走的很近,形式上则style
与currentStyle
走的近。不过,currentStyle
属性貌似不支持伪类样式获取,这是与getComputedStyle
方法的差异,也是jQuery css()方法无法体现的一点。
//张鑫旭: 如果你只知jQuery css()方法,你是不会知道伪类样式也是可以获取的,虽然部分浏览器不支持。
例如,我们要获取一个元素的高度,可以类似下面的代码:
alert((element.currentStyle? element.currentStyle : window.getComputedStyle(element, null)).height);
这个走个完整代码,自己测一下:
CSS代码:
.button {
height: 2em;
border: 0;
border-radius: .2em;
background-color: #34538b;
color: #fff;
font-size: 12px;
font-weight: bold;
}
HTML代码:
<input type="button" id="button" class="button" value="点击我,显示我" />
<p id="detail"></p>
JS代码:
var oButton = document.getElementById("button"),
oDetail = document.getElementById("detail");
if (oButton && oDetail) {
oButton.onclick = function() {
var oStyle = this.currentStyle? this.currentStyle : window.getComputedStyle(this, false);
var key, html = '本按钮CSS属性名和属性值依次为('+ !!this.currentStyle +'):
';
if (typeof oStyle === "object") {
for (key in oStyle) {
if (/^[a-z]/i.test(key) && oStyle[key]) {
html = html + '' + key + ":" + oStyle[key] + '';
}
}
} else {
html += '无法获取CSS样式!';
}
oDetail.innerHTML = html;
};
}
getPropertyValue方法
getPropertyValue
方法可以获取CSS样式申明对象上的属性值(直接属性名称),例如:
window.getComputedStyle(element, null).getPropertyValue("float");
如果我们不使用getPropertyValue
方法,直接使用键值访问,其实也是可以的。但是,比如这里的的float
,如果使用键值访问,则不能直接使用getComputedStyle(element, null).float
,而应该是cssFloat
与styleFloat
,自然需要浏览器判断了,比较折腾!
float浮动属性,FireFox浏览器下是这个(
cssFloat
):
IE7浏览器下则是
styleFloat
:而IE9浏览器下则是
cssFloat
和styleFloat
都有。等其他N多差异。
使用getPropertyValue
方法不必可以驼峰书写形式(不支持驼峰写法),例如:style.getPropertyValue("border-top-left-radius");
getPropertyValue
方法IE9+以及其他现代浏览器都支持
getPropertyValue和getAttribute
getAttribute是ie自有的一套与getPropertyVlaue类似功能的写法用来兼容ie6-8。
在老的IE浏览器(包括最新的),getAttribute方法提供了与getPropertyValue方法类似的功能,可以访问CSS样式对象的属性。用法与getPropertyValue类似:
style.getAttribute("backgroundColor");
注意到没,使用getAttribute方法也不需要cssFloat与styleFloat的怪异写法与兼容性处理。不过,还是有一点差异的,就是属性名需要驼峰写法,如下:
style.getAttribute("backgroundColor");
如果不考虑IE6浏览器,貌似也是可以这么写:
style.getAttribute("background-color");
完整测试一下吧
CSS代码:
.button {
height: 2em;
border: 0;
border-radius: .2em;
background-color: #34538b;
color: #fff;
font-size: 12px;
font-weight: bold;
}
HTML代码:
<input type="button" id="button" class="button" value="点击我,显示背景色" />
JS代码:
var oButton = document.getElementById("button");
if (oButton) {
oButton.onclick = function() {
var oStyle = this.currentStyle? this.currentStyle : window.getComputedStyle(this, null);
if (oStyle.getPropertyValue) {
alert("getPropertyValue下背景色:" + oStyle.getPropertyValue("background-color"));
} else {
alert("getAttribute下背景色:" + oStyle.getAttribute("backgroundColor"));
}
};
}
getPropertyValue和getPropertyCSSValue
从长相上看getPropertyCSSValue
与getPropertyValue
是近亲,但实际上,getPropertyCSSValue
要顽劣的多。
getPropertyCSSValue
方法返回一个CSS最初值(CSSPrimitiveValue
)对象(width, height, left, …)或CSS值列表(CSSValueList)对象(backgroundColor, fontSize, …),这取决于style属性值的类型。在某些特别的style属性下,其返回的是自定义对象。该自定义对象继承于CSSValue对象(就是上面所说的getComputedStyle以及currentStyle返回对象)。
getPropertyCSSValue
方法兼容性不好,IE9浏览器不支持,Opera浏览器也不支持(实际支持,只是老是抛出异常)。而且,虽然FireFox中,style对象支持getPropertyCSSValue
方法,但总是返回null. 因此,目前来讲,getPropertyCSSValue
方法可以先不闻不问。