座右銘鎮樓:css
天下事,有所利有所貪者成其半,有所激有所逼者成其半
當時樓主就虎軀一震,what's this?html
本着程序員死磕到底的執着,樓主熟練的打開百度,輸入getComputedStyle!前端
我了個去,居然這麼多搜索結果,看來已是出來挺久的Api了,完蛋了,又落後了!程序員
好在樓主眼前一亮,發現居然有張鑫旭大大的博文也在將這個東西,果斷戳進去一睹芳容。面試
獲取元素css值之getComputedStyle方法熟悉,有須要的小夥伴能夠去張大大的博客裏瞅瞅,感謝大佬的指點迷津,本文也是在此基礎之上更細化了一些。chrome
僞裝有一條華麗的分割線:api
少逼逼,不囉嗦,show you the code:bash
dom結構以下:前端工程師
<div id="app" style="width: 200px;border: 1px solid blue;"></div>
複製代碼
css樣式以下:app
<style type="text/css">
#app {
height: 100px;
background: red;
padding: 20px;
float: left;
margin: 30px;
}
</style>
複製代碼
js嘛,慢慢來,樓主會帶着你們仔細瞅瞅這個無比給力的getComputedStyle的用法,讓你在js中獲取css屬性再也不是夢.....
// appDom: dom對象
var appDom = document.getElementById("app")
複製代碼
首先,我們先來擼你們開發中最經常使用的element.style.balabal
,爲何說它經常使用呢?由於它實在太原生,太大衆了,廢話少說,柿子先撿軟的捏:
console.log('appDom.style : ',appDom.style)
console.log('appDom.style.width: ', appDom.style.width)
console.log('appDom.style.height: ', appDom.style.height)
console.log('appDom.style.border: ', appDom.style.border)
console.log('appDom.style.length: ', appDom.style.length)
console.log('appDom.style.float: ', appDom.style.float)
在chrome的控制檯裏,咱們能夠看到以下:
發現什麼了嗎?沒錯。恭喜聰明的你答對了,
element.style.***複製代碼
這樣的語法,只能獲取到咱們在html中內聯的css樣式,而在style標籤中寫的樣式呢?它一個都拿不到。
OK,而後咱們針對element.style.balala這樣的語法,再來看看萬惡的IE表現如何呢?
/* IE7 - IE8 */
原諒IE這犢子,它連console.log都不能帶顏色,若是你想在chrome裏玩轉console的話,能夠看這邊文章。言歸正傳,能夠發現,在IE7和IE8中,是支持element.style.***這樣的語法的,只是各位看官是否發現?它的border.....娘希匹.....內心一萬頭*****呼嘯而過.......o(╯□╰)o....
/* >=IE9 */
在IE9+中,總算把那個反人類的border給修復了,並且各位看官請仔細與上圖對比,能夠發現length屬性也有值了,這說明IE9的支持度更好了。
有的同窗可能要說了,你這個low逼,這麼簡單的api,我tm三年前就會了...
好吧,樓主認可樓主的智商有待提升。那麼擼完最經常使用的element.style.balabala的各類狀況以後,咱們開始本文的主角,有請getComputedStyle閃亮登場。
「前排出售 啤酒飲料礦泉水 瓜子花生小板凳,維修各種航母,炮彈啦......」
先援引張鑫旭大大文章中的簡介:
getComputedStyle
是一個能夠獲取當前元素全部最終使用的CSS屬性值。返回的是一個CSS樣式聲明對象([object CSSStyleDeclaration]),只讀。
getComputedStyle()
gives the final used values of all the CSS properties of an element.
語法呢,在下面:
var style = window.getComputedStyle("元素", "僞類");複製代碼
樓主本身測試,以下幾種寫法都是能夠得,show you the code:
window.getComputedStyle(app, null)
window.getComputedStyle(app, )
window.getComputedStyle(app, '')
複製代碼
因此呢,若是沒有僞類的話,想怎麼寫,都隨便你咯。
那麼,chrome對它的支持如何呢?
上測試代碼:
if (window.getComputedStyle) {
// 兼容性判斷仍是要有的,萬一王炸了呢?
var appStyleDel = window.getComputedStyle(app, null)
console.groupEnd()
console.log('%c window.getComputedStyle(元素,僞類)調用', 'color: #fff; background: #40f;');
console.group()
console.log(appStyleDel)
console.log('appStyleDel.width: ', appStyleDel.width)
console.log('appStyleDel.height: ', appStyleDel.height)
console.log('appStyleDel.border: ', appStyleDel.border)
console.log('appStyleDel.length: ', appStyleDel.length)
console.log('appStyleDel.float: ', appStyleDel.float)
console.log('appStyleDel.borderTopleftRadius: ', appStyleDel.borderTopLeftRadius)
}複製代碼
chorme控制檯顯示的效果以下:
那麼在IE下又是如何的呢?
/* >=IE9 */
能夠看到,在IE下面,兼容性還並非很完美。只能說:」老闆,咱能不支持IE嗎?「
知道了getComputedStyle的用法,在張大大的博文中,還有介紹getPropertyValue這樣一個方法,我也同時進行了測試,代碼以下:
if (appStyleDel.getPropertyValue) {
console.groupEnd()
console.log('%c appStyleDel.getPropertyValue()調用', 'color: #fff; background: #89f;');
console.group()
console.log('appStyleDel.getPropertyValue(): ', appStyleDel.getPropertyValue)
console.log('appStyleDel.getPropertyValue("width"): ', appStyleDel.getPropertyValue('width'))
console.log('appStyleDel.getPropertyValue("height"): ', appStyleDel.getPropertyValue('height'))
console.log('appStyleDel.getPropertyValue("border"): ', appStyleDel.getPropertyValue('border'))
console.log('appStyleDel.getPropertyValue("length"): ', appStyleDel.getPropertyValue('length'))
console.log('appStyleDel.getPropertyValue("float"): ', appStyleDel.getPropertyValue('float'))
console.log('appStyleDel.getPropertyValue("border-top-left-radius")', appStyleDel.getPropertyValue('border-top-left-radius'))
}複製代碼
chrome中顯示以下:
而在IE中嘛。呵呵...
對比chrome中的效果,IE的表現只能說差強人意,畢竟border屬性仍是沒有顯示出來。
同時,在張大大的博文中,還有getAttribute方法,這個方法的語法是
element.getAttribute('')複製代碼
咱們能夠測試一下:
if (appDom.getAttribute) {
console.groupEnd()
console.log('%c appDom.getAttribute()調用', 'color: #fff; background: #700;');
console.group()
console.log('appDom.getAttribute: ', appDom.getAttribute)
console.log('appDom.getAttribute("style"): ', appDom.getAttribute('style'))
console.log(typeof appDom.getAttribute('style'))
}複製代碼
那麼在chrome中表現如何呢?
IE中呢:
/* IE7 */
/* IE8 */
/* IE9 */
能夠看到,IE各個版本中getAttribute的差異仍是比較大的,因此在實際使用的時候,仍是須要斟酌一番。
最後,咱們看看IE獨有的currentStyle屬性
if (appDom.currentStyle) {
console.log('appDom.currentStyle:' + appDom.currentStyle)
console.log('appDom.currentStyle.width:' + appDom.currentStyle.width)
console.log('appDom.currentStyle.height:' + appDom.currentStyle.height)
console.log('appDom.currentStyle.border:' + appDom.currentStyle.border)
console.log('appDom.currentStyle.length:' + appDom.currentStyle.length)
console.log('appDom.currentStyle.float:' + appDom.currentStyle.float)
console.log('appDom.currentStyle.borderTopleftRadius:' + appDom.currentStyle.borderTopleftRadius)
}複製代碼
效果以下:
看完了這麼多讓人眼花繚亂的API,你們是否是也和樓主同樣?
那麼在實際開發中,咱們究竟該使用哪一個方法來獲取呢?
若是是在chrome中使用的話,若是僅僅是獲取行內的樣式,那麼element.style.balabala的語法足夠使用了,固然,咱們一般把樣式寫在style中,因此推薦你們使用getComputedStyle的語法,並且呢,在getComputedStyle返回的CSSStyleDeclaration對象中,咱們不只可使用點語法來獲取相關的css屬性值,並且也可使用CSSStyleDeclaration.getPropertyValue()的方式來進行獲取,須要注意的是,點語法獲取使用的是駝峯法,而getPropertyValue()中使用的是短橫線法,這點也是須要注意的。
而在IE中,從IE9開始,根據咱們的測試,彷佛使用IE自家的currentStyle語法兼容性更好一些,對屬性的支持程序也更高,具體使用的時候,仍是要針對IE,作一些兼容的措施。
文章寫到這裏,今天的分享就算告一段落了。
下週會爲你們分享getComputedStyle中僞類的用法,以及getComputedStyle和大名鼎鼎的getboundingclientrect()以及相關的一些使人眼花繚亂的各類clientWidth,clientHeight....,保證讓你看完以後,啥呢?
END....