獲取元素CSS值之getComputedStyle方法熟悉

1、碎碎念~前言

     咱們都用過jQuery的CSS()方法,其底層運做就應用了getComputedStyle以及getPropertyValue方法。
    對於那些只想混口飯吃的人來說,曉得CSS()如何使用就足夠了。對於但願在JS道路上越走越遠的來人說,簡單瞭解一些JS庫底層實現對本身的學習頗有幫助。可能談不上信手拈來的使用,至少對創造一些創意新穎的新技術拓寬了思路。

jQuery爲什麼受歡迎,其中緣由之一就是方法名稱比較短。比如打架同樣,塊頭大的潛意識認爲厲害,就不禁得心生畏懼,遠而避之;小個子(或村婦,小孩)嘛,天然覺得是軟豆腐,願意接受做爲對手。 php

 功夫劇照 周星馳被村婦K 張鑫旭-鑫空間-鑫生活 功夫劇照 周星馳找小孩單挑 結果…… 張鑫旭-鑫空間-鑫生活

    所以,當看到相似getComputedStyle這麼長的方法名的時候,咱們身體裏那個懶惰小人忽然就醒了:哎喲喲,這東西,就跟放心食品同樣,幾年才見一回。看上去又蠻複雜,想到晚上還要跟妹子聊天。這東西,就讓它從旁邊過吧,反正不會掉塊肉的。
    網上不是有這麼個段子嘛:可怕的是,比你聰明的人比你更勤奮。那麼,這裏的「勤奮」的差別體如今什麼地方呢?就拿這個getComputedStyle舉例:懶惰青年是看一下,立馬像看見鳳姐同樣視線離開;普通青年是看一下,發現本身不瞭解,百一下或谷一下,熟悉瞭解之;勤奮青年是不只瞭解,還抽出時間實踐之(如作個簡單demo測試),熟悉方法的特異性,驗證一些觀點正確性。
    您能夠按照你如今的心理狀態看看你是哪類青年:若是此時,您已經對本文的內容沒有興趣了(固然,您的工做與JS關係親密),您是……(你懂的);若是您看完本文內容,發現,仍是有很多收穫,心中回味下,而後ctrl+w去其餘地方覓食,再也不回來,那您是普通青年;若是您看完本文,而後對所說的一些內容做了額外的測試,例如IE9瀏覽器是否支持測試等,並經過評論形式指出可能的錯誤,不得不說您是勤奮青年,假以時日,必有一番技術做爲。從我文章的些評論來看,有很多同行就是這樣的勤奮人兒。
    の, 很久沒寫文章,話又多了,打住,進入正題。
css


2、getComputedStyle是?

     getComputedStyle 是一個能夠獲取當前元素全部最終使用的CSS屬性值。返回的是一個CSS樣式聲明對象([object CSSStyleDeclaration]),只讀。
getComputedStyle() gives the final used values of all the CSS properties of an element.

    語法以下: html

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),不過如今嘛,不是必需參數了。


3、getComputedStyle與style的區別

    咱們使用element.style也能夠獲取元素的CSS樣式聲明對象,可是其與getComputedStyle方法還有有一些差別的。
jquery

  1. 只讀與可寫
    正如上面提到的getComputedStyle方法是隻讀的,只能獲取樣式,不能設置;而element.style能讀能寫,能屈能伸。
  2. 獲取的對象範圍
    getComputedStyle方法獲取的是最終應用在元素上的全部CSS屬性對象(即便沒有CSS代碼,也會把默認的祖宗八代都顯示出來);而element.style只能獲取元素style屬性中的CSS樣式。所以對於一個光禿禿的元素<p>,getComputedStyle方法返回對象中length屬性值(若是有)就是190+(據我測試FF:192, IE9:195, Chrome:253, 不一樣環境結果可能有差別), 而element.style就是0。


4、getComputedStyle與defaultView

    若是咱們查看jQuery源代碼,會發現,其css()方法實現不是使用的window.getComputedStyle而是document.defaultView.getComputedStyle,唷?這是怎麼一回事?

    jQuery源碼使用document.defaultView.getComputedStyle截圖證實
git

    實際上,使用defaultView基本上是沒有必要的,getComputedStyle自己就存在window對象之中。根據DennisHall的說法,使用defaultView可能一是人們不太樂意在window上專門寫個東西,二是讓API在Java中也可用(這我不懂,忘指點~~)。
不過有個特殊狀況,在FireFox3.6上不使用defaultView方法就搞不定的,就是訪問框架(frame)的樣式.


github

5、getComputedStyle兼容性

    對於桌面設備:

  Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本支持 支持 支持 9 支持 支持
僞類元素支持 支持 支持 不支持 不支持 支持

    

    對於手機設備: 瀏覽器

  Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本支持 支持 支持 WP7 Mango 支持 支持
僞元素支持 ? ? 不支持 ? ?

  
     上面打問號的表示沒有測試,是否兼容不知。若是您方便測試,歡迎將測試結果告知,這裏將及時更新,並附上您的姓名,以謝您作的貢獻。
咱們先把注意力放在桌面設備上,能夠看到,getComputedStyle方法IE6~8是不支持的,得,背了半天的媳婦,發現是孫悟空變的——鬱悶了。不急,IE自有本身的一套東西。



6、getComputedStyle與currentStyle

    currentStyle是IE瀏覽器自娛自樂的一個屬性,其與element.style能夠說是近親,至少在使用形式上相似,element.currentStyle,差異在於element.currentStyle返回的是元素當前應用的最終CSS屬性值(包括外鏈CSS文件,頁面中嵌入的<style>屬性等)。
    所以,從做用上將,getComputedStyle方法與currentStyle屬性走的很近,形式上則style與currentStyle走的近。不過,currentStyle屬性貌似不支持僞類樣式獲取,這是與getComputedStyle方法的差別,也是jQuery css()方法沒法體現的一點。
//zxx: 若是你只知jQuery css()方法,你是不會知道僞類樣式也是能夠獲取的,雖然部分瀏覽器不支持。
例如,咱們要獲取一個元素的高度,能夠相似下面的代碼:
alert((element.currentStyle? element.currentStyle : window.getComputedStyle(element, null)).height);
    您能夠狠狠地點擊這裏:使用getComputedStyle和currentStyle 獲取元素高度demo

   結果FireFox下顯示24px(通過計算了), 而IE瀏覽器下則是CSS中的2em屬性值: 框架

Firefox下顯示的計算後的24px值 張鑫旭-鑫空間-鑫生活 IE9下顯示的CSS中的2em值 張鑫旭-鑫空間-鑫生活

    getComputedStyle方法與currentStyle屬性其餘具體差別還有不少,我以一個普通按鈕作元素,遍歷了其中靠譜的屬性名和屬性值,您能夠狠狠地點擊這裏:getComputedStyle和currentStyle屬性展現demo

    仔細對比查看,咱們能夠看到很多差別,例如浮動屬性,FireFox瀏覽器下是這個(cssFloat): dom

    FireFox下的浮動屬性名

    IE7瀏覽器下則是styleFloat : 學習

    IE7瀏覽器下的styleFloat屬性 張鑫旭-鑫空間-鑫生活

    而IE9瀏覽器下則是cssFloat和styleFloat都有。

    等其餘N多差別。


7、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+以及其餘現代瀏覽器都支持,見下表:
  Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本支持 支持 支持 9 支持 支持

    OK,一涉及到兼容性問題(IE6-8腫麼辦),感受頭開始微微做痛了~~,不急,IE自由一套本身的套路,就是getAttribute方法。


8、getPropertyValue和getAttribute

      在老的IE瀏覽器(包括最新的),getAttribute方法提供了與getPropertyValue方法相似的功能,能夠訪問CSS樣式對象的屬性。用法與getPropertyValue相似:
style.getAttribute("float");
     注意到沒,使用getAttribute方法也不須要cssFloat與styleFloat的怪異寫法與兼容性處理。不過,仍是有一點差別的,就是屬性名須要駝峯寫法,以下:


style.getAttribute("backgroundColor");
    若是不考慮IE6瀏覽器,貌似也是能夠這麼寫:


style.getAttribute("background-color");
    實例纔是王道,您能夠狠狠地點擊這裏: getPropertyValue和getAttribute獲取背景色demo
    結果FireFox下一如既往的rgb顏色返回(Chrome也是返回rgb顏色):
     FireFox瀏覽器下一如既往的RGB顏色返回 張鑫旭-鑫空間-鑫生活


    對於IE9瀏覽器,雖然應用的是currentStyle, 可是從結果上來說,currentStyle返回的對象是徹底支持getPropertyValue方法的。

    



9、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方法能夠先漠不關心。




10、補充~結語

    有了jQuery等優秀庫,咱們有熟悉底層的getComputedStyle方法的必要嗎?
    實際上,本文一直沒有深刻展開getComputedStyle方法一個很重要的,相似css()方法沒有的功能——獲取僞類元素樣式。但從這一點上將,熟悉getComputedStyle方法有必要。
    下一篇文章,我就將介紹如何實現getComputedStyle方法在僞類元素上的特異功能,實現CSS3 media queries下一些JS交互,及實際應用。
    well, 開篇已經囉哩吧嗦很多內容了,這裏就再也不講廢話了。行文匆忙,文中不免有表述不許確之處,歡迎指正。歡迎補充,感謝閱讀,但願本文的內容可以對您的學習有所幫助。

    原創文章,轉載請註明來自張鑫旭-鑫空間-鑫生活[ http://www.zhangxinxu.com]    (本篇完)
相關文章
相關標籤/搜索