getComputedStyle是一個可以獲取當前元素所有最終使用的CSS屬性值。返回的是一個CSS樣式聲明對象([object CSSStyleDeclaration]),只讀。
getComputedStyle()gives the final used values of all the CSS properties of an element.
語法如下:
var style = window.getComputedStyle("元素", "偽類");
例如:
var dom = document.getElementById("test"),
? ? style = window.getComputedStyle(dom , ":after");
就兩個參數(shù),大家都懂中文的,沒什么好說的。只是額外提示下:Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1) 之前,第二個參數(shù)“偽類”是必需的(如果不是偽類,設置為null),不過現(xiàn)在嘛,不是必需參數(shù)了。
三、getComputedStyle與style的區(qū)別
我們使用element.style也可以獲取元素的CSS樣式聲明對象,但是其與getComputedStyle方法還有有一些差異的。
只讀與可寫
正如上面提到的getComputedStyle方法是只讀的,只能獲取樣式,不能設置;而element.style能讀能寫,能屈能伸。
獲取的對象范圍
getComputedStyle方法獲取的是最終應用在元素上的所有CSS屬性對象(即使沒有CSS代碼,也會把默認的祖宗八代都顯示出來);而element.style只能獲取元素style屬性中的CSS樣式。因此對于一個光禿禿的元素
,getComputedStyle方法返回對象中l(wèi)ength屬性值(如果有)就是190+(據(jù)我測試FF:192, IE9:195, Chrome:253, 不同環(huán)境結(jié)果可能有差異), 而element.style就是0。
四、getComputedStyle與defaultView
如果我們查看jQuery源代碼,會發(fā)現(xiàn),其css()方法實現(xiàn)不是使用的window.getComputedStyle而是document.defaultView.getComputedStyle,唷?這是怎么一回事?

實際上,使用defaultView基本上是沒有必要的,getComputedStyle本身就存在window對象之中。根據(jù)DennisHall的說法,使用defaultView可能一是人們不太樂意在window上專門寫個東西,二是讓API在Java中也可用(這我不懂,忘指點~~)。
不過有個特殊情況,在FireFox3.6上不使用defaultView方法就搞不定的,就是訪問框架(frame)的樣式.
如果您看到下面的文字,可能是由于在其他網(wǎng)站或是RSS中閱讀本文,本文原地址:http://www.zhangxinxu.com/wordpress/?p=2378,本文作者:張鑫旭,來自張鑫旭-鑫空間-鑫生活,訪問原出處閱讀體驗更佳。
五、getComputedStyle兼容性
對于桌面設備:
?ChromeFirefox (Gecko)Internet ExplorerOperaSafari
上面打問號的表示沒有測試,是否兼容不知。如果您方便測試,歡迎將測試結(jié)果告知,這里將及時更新,并附上您的姓名,以謝您做的貢獻。
我們先把注意力放在桌面設備上,可以看到,getComputedStyle方法IE6~8是不支持的,得,背了半天的媳婦,發(fā)現(xiàn)是孫悟空變的——郁悶了。不急,IE自有自己的一套東西。
六、getComputedStyle與currentStyle
currentStyle是IE瀏覽器自娛自樂的一個屬性,其與element.style可以說是近親,至少在使用形式上類似,element.currentStyle,差別在于element.currentStyle返回的是元素當前應用的最終CSS屬性值(包括外鏈CSS文件,頁面中嵌入的屬性等)。
因此,從作用上將,getComputedStyle方法與currentStyle屬性走的很近,形式上則style與currentStyle走的近。不過,currentStyle屬性貌似不支持偽類樣式獲取,這是與getComputedStyle方法的差異,也是jQuerycss()方法無法體現(xiàn)的一點。
//zxx: 如果你只知jQuery css()方法,你是不會知道偽類樣式也是可以獲取的,雖然部分瀏覽器不支持。
例如,我們要獲取一個元素的高度,可以類似下面的代碼:
alert((element.currentStyle? element.currentStyle : window.getComputedStyle(element, null)).height);
您可以狠狠地點擊這里:使用getComputedStyle和currentStyle 獲取元素高度demo
結(jié)果FireFox下顯示24px(經(jīng)過計算了), 而IE瀏覽器下則是CSS中的2em屬性值:


getComputedStyle方法與currentStyle屬性其他具體差異還有很多,我以一個普通按鈕做元素,遍歷了其中靠譜的屬性名和屬性值,您可以狠狠地點擊這里:getComputedStyle和currentStyle屬性展示demo
仔細對比查看,我們可以看到不少差異,例如浮動屬性,F(xiàn)ireFox瀏覽器下是這個(cssFloat):

IE7瀏覽器下則是styleFloat:

而IE9瀏覽器下則是cssFloat和styleFloat都有。
等其他N多差異。
七、getPropertyValue方法
getPropertyValue方法可以獲取CSS樣式申明對象上的屬性值(直接屬性名稱),例如:
window.getComputedStyle(element, null).getPropertyValue("float");
如果我們不使用getPropertyValue方法,直接使用鍵值訪問,其實也是可以的。但是,比如這里的的float,如果使用鍵值訪問,則不能直接使用getComputedStyle(element, null).float,而應該是cssFloat與styleFloat,自然需要瀏覽器判斷了,比較折騰!
使用getPropertyValue方法不必可以駝峰書寫形式(不支持駝峰寫法),例如:style.getPropertyValue("border-top-left-radius");
兼容性
getPropertyValue方法IE9+以及其他現(xiàn)代瀏覽器都支持,見下表:
?ChromeFirefox (Gecko)Internet ExplorerOperaSafari
OK,一涉及到兼容性問題(IE6-8腫么辦),感覺頭開始微微作痛了~~,不急,IE自由一套自己的套路,就是getAttribute方法。
八、getPropertyValue和getAttribute
在老的IE瀏覽器(包括最新的),getAttribute方法提供了與getPropertyValue方法類似的功能,可以訪問CSS樣式對象的屬性。用法與getPropertyValue類似:
style.getAttribute("float");
注意到?jīng)],使用getAttribute方法也不需要cssFloat與styleFloat的怪異寫法與兼容性處理。不過,還是有一點差異的,就是屬性名需要駝峰寫法,如下:
style.getAttribute("backgroundColor");
如果不考慮IE6瀏覽器,貌似也是可以這么寫:
style.getAttribute("background-color");
實例才是王道,您可以狠狠地點擊這里:getPropertyValue和getAttribute獲取背景色demo
結(jié)果FireFox下一如既往的rgb顏色返回(Chrome也是返回rgb顏色):

對于IE9瀏覽器,雖然應用的是currentStyle, 但是從結(jié)果上來講,currentStyle返回的對象是完全支持getPropertyValue方法的。

九、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方法可以先不聞不問。