getComputedStyle()

本文引自張鑫旭的博客差购,但是因為太嘮叨了铡羡,所以算是節(jié)選吧轻纪。

getComputedStyle()

getComputedStyle是一個可以獲取當(dāng)前元素所有最終使用的CSS屬性值壶辜。返回的是一個CSS樣式聲明對象([object CSSStyleDeclaration])逞泄,只讀橡羞。
語法:

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ù)“偽類”是必需的(如果不是偽類,設(shè)置為null)签夭,不過現(xiàn)在嘛齐邦,不是必需參數(shù)了。

getComputedStyle與style的區(qū)別

我們使用element.style也可以獲取元素的CSS樣式聲明對象第租,但是其與getComputedStyle方法還有有一些差異的措拇。
只讀與可寫
正如上面提到的getComputedStyle方法是只讀的,只能獲取樣式慎宾,不能設(shè)置丐吓;而element.style能讀能寫,能屈能伸趟据。
獲取的對象范圍
getComputedStyle方法獲取的是最終應(yīng)用在元素上的所有CSS屬性對象(即使沒有CSS代碼券犁,也會把默認(rèn)的祖宗八代都顯示出來);而element.style只能獲取元素style屬性中的CSS樣式之宿。因此對于一個光禿禿的元素<p>族操,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。在FireFox3.6上不使用defaultView方法就搞不定的等缀。

getComputedStyle與currentStyle

currentStyle是IE瀏覽器自娛自樂的一個屬性枷莉,其與element.style可以說是近親,至少在使用形式上類似尺迂,element.currentStyle笤妙,差別在于element.currentStyle返回的是元素當(dāng)前應(yīng)用的最終CSS屬性值(包括外鏈CSS文件,頁面中嵌入的<style>屬性等)噪裕。

因此蹲盘,從作用上將,getComputedStyle方法與currentStyle屬性走的很近膳音,形式上則stylecurrentStyle走的近召衔。不過,currentStyle屬性貌似不支持偽類樣式獲取祭陷,這是與getComputedStyle方法的差異苍凛,也是jQuery css()方法無法體現(xiàn)的一點。

//張鑫旭: 如果你只知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;
    };
}
image.png

getPropertyValue方法

getPropertyValue方法可以獲取CSS樣式申明對象上的屬性值(直接屬性名稱),例如:

window.getComputedStyle(element, null).getPropertyValue("float");

如果我們不使用getPropertyValue方法俘枫,直接使用鍵值訪問腥沽,其實也是可以的。但是鸠蚪,比如這里的的float今阳,如果使用鍵值訪問,則不能直接使用getComputedStyle(element, null).float茅信,而應(yīng)該是cssFloatstyleFloat盾舌,自然需要瀏覽器判斷了,比較折騰蘸鲸!

float浮動屬性妖谴,F(xiàn)ireFox瀏覽器下是這個(cssFloat):

FireFox下的浮動屬性名

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

而IE9瀏覽器下則是cssFloatstyleFloat都有。
等其他N多差異。

使用getPropertyValue方法不必可以駝峰書寫形式(不支持駝峰寫法)膝舅,例如:style.getPropertyValue("border-top-left-radius");

getPropertyValue方法IE9+以及其他現(xiàn)代瀏覽器都支持

getPropertyValue和getAttribute

getAttribute是ie自有的一套與getPropertyVlaue類似功能的寫法用來兼容ie6-8嗡载。

在老的IE瀏覽器(包括最新的),getAttribute方法提供了與getPropertyValue方法類似的功能仍稀,可以訪問CSS樣式對象的屬性洼滚。用法與getPropertyValue類似:

style.getAttribute("backgroundColor");

注意到?jīng)],使用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

從長相上看getPropertyCSSValuegetPropertyValue是近親值桩,但實際上摆霉,getPropertyCSSValue要頑劣的多。

getPropertyCSSValue方法返回一個CSS最初值(CSSPrimitiveValue)對象(width, height, left, …)或CSS值列表(CSSValueList)對象(backgroundColor, fontSize, …)颠毙,這取決于style屬性值的類型斯入。在某些特別的style屬性下,其返回的是自定義對象蛀蜜。該自定義對象繼承于CSSValue對象(就是上面所說的getComputedStyle以及currentStyle返回對象)刻两。

getPropertyCSSValue方法兼容性不好,IE9瀏覽器不支持滴某,Opera瀏覽器也不支持(實際支持磅摹,只是老是拋出異常)。而且霎奢,雖然FireFox中户誓,style對象支持getPropertyCSSValue方法,但總是返回null. 因此幕侠,目前來講帝美,getPropertyCSSValue方法可以先不聞不問。

這里節(jié)選了張鑫旭的文章內(nèi)容晤硕,點擊這里查看原版

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悼潭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子舞箍,更是在濱河造成了極大的恐慌舰褪,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疏橄,死亡現(xiàn)場離奇詭異占拍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門晃酒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來表牢,“玉大人,你說我怎么就攤上這事掖疮〕醪瑁” “怎么了颗祝?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵浊闪,是天一觀的道長。 經(jīng)常有香客問我螺戳,道長搁宾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任倔幼,我火速辦了婚禮盖腿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘损同。我一直安慰自己翩腐,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布膏燃。 她就那樣靜靜地躺著茂卦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪组哩。 梳的紋絲不亂的頭發(fā)上等龙,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音伶贰,去河邊找鬼蛛砰。 笑死,一個胖子當(dāng)著我的面吹牛黍衙,可吹牛的內(nèi)容都是我干的泥畅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼琅翻,長吁一口氣:“原來是場噩夢啊……” “哼位仁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起望迎,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤障癌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辩尊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涛浙,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了轿亮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疮薇。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖我注,靈堂內(nèi)的尸體忽然破棺而出按咒,到底是詐尸還是另有隱情,我是刑警寧澤但骨,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布励七,位于F島的核電站,受9級特大地震影響奔缠,放射性物質(zhì)發(fā)生泄漏掠抬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一校哎、第九天 我趴在偏房一處隱蔽的房頂上張望两波。 院中可真熱鬧,春花似錦闷哆、人聲如沸腰奋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劣坊。三九已至,卻和暖如春野蝇,著一層夾襖步出監(jiān)牢的瞬間讼稚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工绕沈, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留锐想,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓乍狐,卻偏偏與公主長得像赠摇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子浅蚪,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案藕帜? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,737評論 1 92
  • ??DOM 1 級主要定義的是 HTML 和 XML 文檔的底層結(jié)構(gòu)洽故。 ??DOM2 和 DOM3 級則在這個結(jié)構(gòu)...
    霜天曉閱讀 1,427評論 1 3
  • 那是兒時記憶里 一條腳印慢慢變大的夏天 我摸爬在這里玩遍了各種蚯蚓螞蟻 你就在山下石板靜靜坐著 有次,我讓山蜂蟄了...
    楚小蛋閱讀 54評論 0 1
  • 轉(zhuǎn)載自:http://blog.csdn.net/fanzitao/article/details/8040201...
    舞刃閱讀 1,292評論 0 0
  • 這周的學(xué)習(xí)分享會杜總特邀了中興精密的王總來給我們分享心得盗誊。王總的分享中我印象最為深刻的是一個“孝”字时甚。王總提及孝養(yǎng)...
    牛媽牛媽閱讀 311評論 0 0