日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

解析原生JS getComputedStyle

瀏覽:753日期:2022-06-02 15:56:55
目錄
  • getComputedStyle 與getPropertyValue
  • IE 下的 currentStyle與getAttribute
  • style 與getComputedStyle
  • getComputedStyle 與defaultView
  • 原生JS實(shí)現(xiàn)CSS樣式的get與set
    • getStyle(elem, style)
    • opacity 透明度的設(shè)定
    • float 樣式的獲取
    • width | height 樣式的獲取
    • 獲取樣式的駝峰表示法
    • setStyle(elem, style, value)

getComputedStyle 與getPropertyValue

getComputedStyle 為何物呢,DOM 中 getComputedStyle 方法可用來(lái)獲取元素中所有可用的css屬性列表,以數(shù)組形式返回,并且是只讀的。IE678 中則用 currentStyle 代替 。

假設(shè)我們頁(yè)面上存在一個(gè) id 為 id 的元素,那么使用getComputedStyle 獲取元素樣式就如下圖所示:

嘗試一下之后可以看到,window.getComputedStyle 獲取的是所有的樣式,如果我們只是要獲取單一樣式,該怎么做呢。這個(gè)時(shí)候就要介紹另一個(gè)方法 --getPropertyValue。

用法也很簡(jiǎn)單:

// 語(yǔ)法:// 使用 getPropertyValue 來(lái)指定獲取的屬性window.getComputedStyle("元素", "偽類").getPropertyValue(style);

IE 下的 currentStyle與getAttribute

說(shuō)完常規(guī)瀏覽器,再來(lái)談?wù)劺吓笥?IE ,與getComputedStyle 對(duì)應(yīng),在 IE 中有自己特有的 currentStyle屬性,與 getPropertyValue 對(duì)應(yīng),IE 中使用getAttribute 。

和 getComputedStyle 方法不同的是,currentStyle 要獲得屬性名的話必須采用駝峰式的寫(xiě)法。也就是如果我需要獲取 font-size 屬性,那么傳入的參數(shù)應(yīng)該是 fontSize。因此在IE 中要獲得單個(gè)屬性的值,就必須將屬性名轉(zhuǎn)為駝峰形式。

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

style 與getComputedStyle

必須要提出的是,我們使用element.style 也可以獲取元素的CSS樣式聲明對(duì)象,但是其與getComputedStyle方法還是有一些差異的。

首先,element.style 是可讀可寫(xiě)的,而getComputedStyle 為只讀。

其次,element.style 只可以獲取 style 樣式上的屬性值,而無(wú)法得到所有的 CSS 樣式值,什么意思呢?回顧一下 CSS 基礎(chǔ),CSS 樣式表的表現(xiàn)有三種方式,

1.內(nèi)嵌樣式(inline Style) :是寫(xiě)在 HTML 標(biāo)簽里面的,內(nèi)嵌樣式只對(duì)該標(biāo)簽有效。

2.內(nèi)部樣式(internal Style Sheet):是寫(xiě)在 HTML 的 <style> 標(biāo)簽里面的,內(nèi)部樣式只對(duì)所在的網(wǎng)頁(yè)有效。

3.外部樣式表(External Style Sheet):如果很多網(wǎng)頁(yè)需要用到同樣的樣式(Styles),將樣式(Styles)寫(xiě)在一個(gè)以 .CSS為后綴的 CSS 文件里,然后在每個(gè)需要用到這些樣式(Styles)的網(wǎng)頁(yè)里引用這個(gè) CSS 文件。

而element.style 只能獲取被這些樣式表定義了的樣式,而 getComputedStyle 能獲取到所有樣式的值(在不同瀏覽器結(jié)果不一樣,chrome 中是 264,在 Firefox 中是238),不管是否定義在樣式表中,譬如:

<style>#id{    width : 100px;    float:left;}</style> var elem = document.getElementById("id"); elem.style.length // 2window.getComputedStyle(elem, null).length // 264

getComputedStyle 與defaultView

window.getComputedStyle 還有另一種寫(xiě)法,就是 document.defaultView.getComputedStyle 。

兩者的用法完全一樣,在 jQuery v1.10.2 中,使用的就是window.getComputedStyle 。如下

也有特例,查看stackoverflow,上面提及到在Firefox 3.6 ,不使用document.defaultView.getComputedStyle 會(huì)出錯(cuò)。不過(guò)畢竟 FF3.6 已經(jīng)隨歷史遠(yuǎn)去,現(xiàn)在可以放心的使用window.getComputedStyle。

用一張圖總結(jié)一下:

原生JS實(shí)現(xiàn)CSS樣式的get與set

說(shuō)了這么多,接下來(lái)將用原生 JS 實(shí)現(xiàn)一個(gè)小組件,實(shí)現(xiàn) CSS 的 get 與 set,兼容所有瀏覽器。

getStyle(elem, style)

對(duì)于 CSS 的 set ,對(duì)于支持window.getComputedStyle 的瀏覽器而言十分簡(jiǎn)單,只需要直接調(diào)用。

getStyle: function(elem, style) {    // 主流瀏覽器    if (win.getComputedStyle) {return win.getComputedStyle(elem, null).getPropertyValue(style);    }}

反之,如果是 IE 瀏覽器,則有一些坑。

opacity 透明度的設(shè)定

在早期的 IE 中要設(shè)置透明度的話,有兩個(gè)方法:

1.alpha(opacity=0.5)

2.filter:progid:DXImageTransform.Microsoft.gradient( GradientType= 0 , startColorstr = ‘#ccccc",endColorstr = ‘#ddddd" );

因此在 IE 環(huán)境下,我們需要針對(duì)透明度做一些處理。先寫(xiě)一個(gè) IE 下獲取透明度的方法:

// IE 下獲取透明度   function getIEOpacity(elem) {    var filter = null;     // 早期的 IE 中要設(shè)置透明度有兩個(gè)方法:    // 1、alpha(opacity=0)    // 2、filter:progid:DXImageTransform.Microsoft.gradient( GradientType= 0 , startColorstr = ‘#ccccc", endColorstr = ‘#ddddd" );    // 利用正則匹配    filter = elem.style.filter.match(/progid:DXImageTransform.Microsoft.Alpha\(.?opacity=(.*).?\)/i) || elem.style.filter.match(/alpha\(opacity=(.*)\)/i);     if (filter) {var value = parseFloat(filter);if (!isNaN(value)) {    // 轉(zhuǎn)化為標(biāo)準(zhǔn)結(jié)果    return value ? value / 100 : 0;}    }    // 透明度的值默認(rèn)返回 1    return 1;

float 樣式的獲取

float 屬性是比較重要的一個(gè)屬性,但是由于 float 是ECMAScript的一個(gè)保留字。

所以在各瀏覽器中都會(huì)有代替的寫(xiě)法,比如說(shuō)在標(biāo)準(zhǔn)瀏覽器中為 cssFloat,而在 IE678 中為 styleFloat 。經(jīng)測(cè)試,在標(biāo)準(zhǔn)瀏覽器中直接使用getPropertyValue("float") 也可以獲取到 float 的值。而 IE678 則不行,所以針對(duì) float ,也需要一個(gè) HACK。

width | height 樣式的獲取

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

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

element.getBoundingClientRect() --可以獲得元素四個(gè)點(diǎn)相對(duì)于文檔視圖左上角的值 top、left、bottom、right ,通過(guò)計(jì)算就可以容易地獲得準(zhǔn)確的元素大小。

獲取樣式的駝峰表示法

上文已經(jīng)提及了,在IE下使用currentStyle 要獲得屬性名的話必須采用駝峰式的寫(xiě)法。

OK,需要 HACK 的點(diǎn)已經(jīng)提完了。那么在 IE 下,獲取樣式的寫(xiě)法:

getStyle: function(elem, style) {    // 主流瀏覽器    if (win.getComputedStyle) {...    // 不支持 getComputedStyle    } else {// IE 下獲取透明度if (style == "opacity") {    getIEOpacity(elem);// IE687 下獲取浮動(dòng)使用 styleFloat} else if (style == "float") {    return elem.currentStyle.getAttribute("styleFloat");// 取高寬使用 getBoundingClientRect} else if ((style == "width" || style == "height") && (elem.currentStyle[style] == "auto")) {    var clientRect = elem.getBoundingClientRect();     return (style == "width" ? clientRect.right - clientRect.left : clientRect.bottom - clientRect.top) + "px";}// 其他樣式,無(wú)需特殊處理return elem.currentStyle.getAttribute(camelize(style));    }}

setStyle(elem, style, value)

說(shuō)完 get ,再說(shuō)說(shuō) setStyle ,相較于getStyle ,setStyle 則便捷很多,因?yàn)椴还苁菢?biāo)準(zhǔn)瀏覽器還是 IE ,都可以使用element.style.cssText 對(duì)元素進(jìn)行樣式的設(shè)置。

cssText -- 一種設(shè)置 CSS 樣式的方法,但是它是一個(gè)銷毀原樣式并重建的過(guò)程,這種銷毀和重建,會(huì)增加瀏覽器的開(kāi)銷。而且在 IE 中,如果cssText(假如不為空),最后一個(gè)分號(hào)會(huì)被刪掉,所以我們需要在其中添加的屬性前加上一個(gè) ”;” 。

只是在 IE 下的 opacity 需要額外的進(jìn)行處理。明了易懂,直接貼代碼:

// 設(shè)置樣式setStyle: function(elem, style, value) {    // 如果是設(shè)置 opacity ,需要特殊處理    if (style == "opacity") {//IE7 bug:filter 濾鏡要求 hasLayout=true 方可執(zhí)行(否則沒(méi)有效果)if (!elem.currentStyle || !elem.currentStyle.hasLayout) {    // 設(shè)置 hasLayout=true 的一種方法    elem.style.zoom = 1;}// IE678 設(shè)置透明度叫 filter ,不是 opacitystyle = "filter"; // !!轉(zhuǎn)換為 boolean 類型進(jìn)行判斷if (!!window.XDomainRequest) {    value = "progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=" + value * 100 + ")";} else {    value = "alpha(opacity=" + value * 100 + ")"}    }    // 通用方法    elem.style.cssText += ";" + (style + ":" + value);}

到這里,原生 JS 實(shí)現(xiàn)的 getStyle 與setStyle 就實(shí)現(xiàn)了。可以看到,一個(gè)簡(jiǎn)單接口的背后,都是有涉及了很多方面東西。雖然瀏覽器兼容性是一個(gè)坑,但是爬坑的過(guò)程卻是我們沉淀自己的最好時(shí)機(jī)。

jQuery 這樣的框架可以幫助我們走的更快,但是毫無(wú)疑問(wèn),去弄清底層實(shí)現(xiàn),掌握原生 JS 的寫(xiě)法,可以讓我們走得更遠(yuǎn)。

以上就是解析原生JS getComputedStyle的詳細(xì)內(nèi)容,更多關(guān)于原生JS getComputedStyle的資料請(qǐng)關(guān)注其它相關(guān)文章!

標(biāo)簽: CSS HTML
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美肉体xxxx裸体137大胆| 国产欧洲在线| 最新亚洲激情| 久久免费高清| 99热精品久久| 亚洲婷婷免费| 在线亚洲精品| 亚洲一区观看| 在线精品国产亚洲| 综合激情一区| 欧美日韩精品一区二区三区在线观看| 蜜桃视频一区二区三区在线观看| 午夜在线视频观看日韩17c| 六月丁香综合| 亚洲bt欧美bt精品777| 亚洲久久视频| 欧美日韩在线精品一区二区三区激情综合 | 日韩三区在线| 激情综合网址| 日韩制服丝袜先锋影音| 亚洲aa在线| 欧美精品成人| 亚洲播播91| 一区三区视频| 视频国产精品| 欧美国产日本| 国产99久久| 91久久午夜| 日日夜夜免费精品视频| 国产精品视频一区二区三区 | 国产精品久久久久久久久久齐齐| 欧美经典一区| 丝袜av一区| 亚洲婷婷丁香| 久久香蕉精品香蕉| 精品一区在线| 欧美日韩夜夜| 久久精品av| 亚洲狼人精品一区二区三区| 国产精品igao视频网网址不卡日韩| 麻豆视频在线看| 国产视频久久| 午夜精品影视国产一区在线麻豆| 精品伊人久久久| 欧美精品一卡| 国产精品白丝久久av网站 | 精品一区二区三区中文字幕视频| 99久久亚洲精品| 亚洲精品一二| 色爱综合网欧美| 石原莉奈在线亚洲三区| 国产精品一卡| 99成人在线视频| 中文一区一区三区免费在线观 | 青青久久av| 亚洲精品无吗| аⅴ资源天堂资源库在线| 日韩一区精品字幕| 日韩.com| 亚洲制服欧美另类| 电影亚洲精品噜噜在线观看| 日韩午夜视频在线| 欧美一区久久久| 日韩福利视频一区| 亚洲婷婷免费| 国产精品巨作av| 欧美日韩国产欧| 久久久久亚洲精品中文字幕| 亚洲婷婷在线| 精品一区二区三区亚洲| 免费久久精品视频| 国产精品国产一区| 亚洲v天堂v手机在线| 欧美日韩视频免费观看| 91成人小视频| 国产一区成人| 日韩欧美字幕| 国产精品4hu.www| 日韩中文字幕麻豆| 久久中文字幕av一区二区不卡| 91欧美极品| 偷拍欧美精品| 快播电影网址老女人久久| 国产视频一区二| 日韩中文欧美在线| 婷婷综合亚洲| 成人久久一区| 成人精品国产亚洲| 国产精品自拍区| 婷婷视频一区二区三区| 久久亚洲欧美| 午夜久久免费观看| 日韩欧美精品一区| 久久久久久久久成人| 日韩毛片网站| 野花国产精品入口| 色吊丝一区二区| 欧美男人天堂| 精品国产精品国产偷麻豆 | 国产不卡人人| 美腿丝袜在线亚洲一区| 日韩国产欧美一区二区三区| 狠狠爱成人网| 欧美日韩一二三四| 天堂а√在线最新版中文在线| 欧美1区2区3| 国产精品日本一区二区不卡视频| 久久av在线| 亚洲国产日韩欧美在线| 日韩在线一二三区| 亚洲一卡久久| 女人天堂亚洲aⅴ在线观看| 日韩一区二区三区免费播放| 国产一区福利| 精品成av人一区二区三区| 国产精品亚洲人成在99www| 日本欧美韩国一区三区| 日韩精品久久理论片| 亚洲永久av| 啪啪国产精品| 激情欧美亚洲| 亚洲女同一区| 国产一区亚洲| 91成人网在线观看| 黄色成人91| 亚洲深夜影院| 免费在线观看日韩欧美| 蜜桃视频免费观看一区| 亚洲精品黄色| 亚洲18在线| 日本午夜免费一区二区| 欧美专区一区| 国产精成人品2018| 给我免费播放日韩视频| 麻豆精品蜜桃| 99在线|亚洲一区二区| 美女精品网站| 亚洲精品一级二级三级| 日韩国产91| 麻豆高清免费国产一区| 成人一二三区| 亚洲国产专区| 蜜臀精品久久久久久蜜臀| 日本一不卡视频| 美女尤物国产一区| 九色porny丨国产首页在线| 99精品美女| 亚洲一区二区毛片| 欧美亚洲三级| 国产一区二区三区精品在线观看| 日韩成人综合| 欧美成人午夜| 蜜桃视频在线观看一区二区| 欧美在线观看天堂一区二区三区| 久久成人av| 日韩欧美二区| 免费观看在线综合色| 国产免费av一区二区三区| 粉嫩av一区二区三区四区五区 | 国产日韩精品视频一区二区三区| 麻豆免费精品视频| 91精品蜜臀一区二区三区在线 | 欧美成人精品午夜一区二区| 91视频一区| 精品91久久久久| 国产亚洲精aa在线看| 国产精品毛片一区二区在线看| 国模 一区 二区 三区| 无码日韩精品一区二区免费| 久久永久免费| 亚洲一区二区网站| 国产欧美一区二区三区米奇| 一区二区三区四区日本视频| 在线一区免费观看| 精品视频在线你懂得| 久久五月天小说| 日本不卡一二三区黄网| 国产精品二区不卡| 中文字幕一区二区三区四区久久| 久久精品国产在热久久| 女人天堂亚洲aⅴ在线观看| 日韩av不卡一区二区| 日韩精品永久网址| 亚洲婷婷丁香| 日韩成人三级| 亚洲毛片视频| 91看片一区| 日韩黄色av| 亚洲网站视频| 国产精品视频一区二区三区 | 国产一区二区亚洲| 亚洲乱码一区| 电影亚洲精品噜噜在线观看| 日韩精品久久理论片| 91精品一区二区三区综合在线爱 | 99久久视频| 久久狠狠亚洲综合| 欧美日韩国产在线观看网站| 欧美成人精品午夜一区二区| 免费日韩视频|