原生js獲取元素的樣式style屬性值

事情是這樣的,我今天在幫一個朋友實現(xiàn)原生手寫輪播圖销凑,然后我發(fā)現(xiàn)自己在獲取一個元素的樣式上出現(xiàn)了一點點小問題丛晌,就順帶去谷歌了一番了。

原生js獲取CSS樣式.png
一 原本的我??
問題:

是這樣的斗幼,一開始需要獲取某一個元素的left值澎蛛,我就用ele.style.left去獲取了(基礎(chǔ)不扎實還好意思來丟人),然后居然返回的是空蜕窿。
好吧谋逻,追本溯源,問題的根源以及區(qū)別就在這里了桐经。

ele.style 的使用

  • 只讀內(nèi)聯(lián)樣式屬性:使用該方法獲取的樣式值毁兆,是元素內(nèi)聯(lián)的樣式上才有的。舉個例子阴挣,如果你有一個元素<div style='color:red气堕,left:40px'></div>,那么你獲取這個元素的樣式,ele.style.color 就會返回left,如果使用ele.style.left就會返回40px;
    一個溫馨提示:如果真的是使用這種方式去獲取屬性值畔咧,那么需要轉(zhuǎn)換成整數(shù)而且去掉單位茎芭,那么就可以用parseInt(40px),就會返回40
  • 可讀可寫:該方法可以同時設(shè)置或者獲取某一個元素的樣式 (記住誓沸,只能讀取定義的style樣式里的屬性梅桩。)

所以县钥,我那樣是獲取不到某一個元素的一個其他方式設(shè)置的樣式屬性值的拒逮,所以我就打算谷歌一下別的方法了。

window.getComputedStyle() 與getPropertyValue

image.png

嗯,很不錯舷蟀,這個方法可以獲取一個元素的所有來自四面八方設(shè)置的樣式屬性池凄,本身的屬性都可以被我們讀取到贮尖。
?? 那么蹬蚁,問題來了,如果要讀取其中的一個值外臂,我們應(yīng)該怎么做呢坐儿?

getPropertyValue

// 基本語法
getComputedStyle(document.getElementById('caseroul'),null).getPropertyValue(‘left’)

特點:
- 只可讀,但是可以讀取所有的樣式屬性值宋光。但是不能通過該方法去設(shè)置樣式屬性值貌矿。

css中設(shè)置樣式屬性的一些方法:

elt.style.cssText = "color: blue"; // 設(shè)置多個樣式屬性 
elt.setAttribute("style", "color: blue"); // 設(shè)置多個樣式屬性 
elt.style.color = "blue"; // 直接設(shè)置樣式屬性
var st = elt.style; st.color = "blue"; // 間接設(shè)置樣式屬性

2 IE下的currentStyle 與 getAttribute

currentStyle獲取的是一個元素的所有的樣式屬性值,這一點功能是與getComputedStyle()一樣的罪佳,但是在獲取某一個具體的屬性的時候逛漫,可以結(jié)合getAttribute來實現(xiàn)。
和 getComputedStyle 方法不同的是赘艳,currentStyle 要獲得屬性名的話必須采用駝峰式的寫法酌毡。也就是如果我需要獲取 font-size 屬性,那么傳入的參數(shù)應(yīng)該是 fontSize蕾管。因此在IE 中要獲得單個屬性的值枷踏,就必須將屬性名轉(zhuǎn)為駝峰形式。(感謝這篇文章掰曾。)

// IE 下語法:
// IE 下將 CSS 命名轉(zhuǎn)換為駝峰表示法
// font-size --> fontSize
// 利用正則處理一下就可以了
function camelize(attr) {
    // /\-(\w)/g 正則內(nèi)的 (\w) 是一個捕獲旭蠕,捕獲的內(nèi)容對應(yīng)后面 function 的 letter
    // 意思是將 匹配到的 -x 結(jié)構(gòu)的 x 轉(zhuǎn)換為大寫的 X (x 這里代表任意字母)
    return attr.replace(/\-(\w)/g, function(all, letter) {
        return letter.toUpperCase();
    });
}
// 使用 currentStyle.getAttribute 獲取元素 element 的 style 屬性樣式
element.currentStyle.getAttribute(camelize(style));
關(guān)于返回值

關(guān)于getComputedStyle返回的值,具體查看這里旷坦。
不管你最初定義的樣式是什么掏熬,涉及到寬度高度之類的,返回的都是最后實際使用的寬度和高度秒梅。

image.png

image.png

關(guān)于ele.style的返回值旗芬,是和定義的樣式的值相等的,如果設(shè)置為auto番电,就直接返回auto岗屏。

const test = document.querySelector('.test');
console.log(test.offsetWidth, '獲取offsetWidth的寬度');    // 204,包括邊框的寬度
console.log(getComputedStyle(test, null).getPropertyValue('width'));   // 200px,實際的樣式寬度
console.log(test.getBoundingClientRect().right - test.getBoundingClientRect().left)   // 200
console.log(test.style.width);  //無返回值漱办。

然后是元素的高寬,對于一個沒有設(shè)定高寬的元素而言婉烟,在 IE678 下使用 getPropertyValue("width|height") 得到的是 auto 娩井。而標(biāo)準(zhǔn)瀏覽器會直接返回它的 px 值,當(dāng)然我們希望在 IE 下也返回 px 值似袁。

這里的 HACK 方法是使用 element.getBoundingClientRect() 方法洞辣。

element.getBoundingClientRect() -- 可以獲得元素四個點相對于文檔視圖左上角的值 top咐刨、left、bottom扬霜、right 定鸟,通過計算就可以容易地獲得準(zhǔn)確的元素大小。

參考鏈接 chokcoco的博客園

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末著瓶,一起剝皮案震驚了整個濱河市联予,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌材原,老刑警劉巖沸久,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異余蟹,居然都是意外死亡卷胯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門威酒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窑睁,“玉大人,你說我怎么就攤上這事葵孤÷盐浚” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵佛呻,是天一觀的道長裳朋。 經(jīng)常有香客問我,道長吓著,這世上最難降的妖魔是什么鲤嫡? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮绑莺,結(jié)果婚禮上暖眼,老公的妹妹穿的比我還像新娘。我一直安慰自己纺裁,他們只是感情好诫肠,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著欺缘,像睡著了一般栋豫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谚殊,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天丧鸯,我揣著相機與錄音,去河邊找鬼嫩絮。 笑死丛肢,一個胖子當(dāng)著我的面吹牛围肥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜂怎,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼穆刻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杠步?” 一聲冷哼從身側(cè)響起氢伟,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎篮愉,沒想到半個月后腐芍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡试躏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年猪勇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颠蕴。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡泣刹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出犀被,到底是詐尸還是另有隱情椅您,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布寡键,位于F島的核電站掀泳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏西轩。R本人自食惡果不足惜员舵,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望藕畔。 院中可真熱鬧马僻,春花似錦、人聲如沸注服。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溶弟。三九已至女淑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間可很,已是汗流浹背诗力。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留我抠,地道東北人苇本。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像菜拓,于是被迫代替她去往敵國和親瓣窄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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

  • 我們首先要明白纳鼎,我們給頁面添加效果用到的js到底是什么俺夕?js其實包含三部分:dom 文檔對象模型 bom 瀏覽...
    一直以來都很好閱讀 803評論 0 0
  • DOM總結(jié) 1:DOM - document object model 文檔對象模型 作用:給我們提供了一些方法...
    盒小飯stone閱讀 599評論 0 0
  • 在云筆記中發(fā)現(xiàn)了很久以前寫的總結(jié),看著總結(jié)還能想到當(dāng)初認認真真一個一個瀏覽器測試的樣子贱鄙。 【目錄】 1 jQuer...
    辣瓜瓜閱讀 506評論 0 0
  • 首發(fā):陸否(lofter) 今天開門的時候被門把手上帶的靜電打得手都縮了回去劝贸,然后突然有了一個腦洞…… 一篇關(guān)于千...
    欺杏閱讀 332評論 0 2
  • 杜小螢閱讀 172評論 2 3