成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

解析原生JS getComputedStyle

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

getComputedStyle 與getPropertyValue

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

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

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

用法也很簡單:

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

IE 下的 currentStyle與getAttribute

說完常規瀏覽器,再來談談老朋友 IE ,與getComputedStyle 對應,在 IE 中有自己特有的 currentStyle屬性,與 getPropertyValue 對應,IE 中使用getAttribute 。

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

// IE 下語法:// IE 下將 CSS 命名轉換為駝峰表示法// font-size --> fontSize// 利用正則處理一下就可以了function camelize(attr) {    // /\-(\w)/g 正則內的 (\w) 是一個捕獲,捕獲的內容對應后面 function 的 letter    // 意思是將 匹配到的 -x 結構的 x 轉換為大寫的 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樣式聲明對象,但是其與getComputedStyle方法還是有一些差異的。

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

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

1.內嵌樣式(inline Style) :是寫在 HTML 標簽里面的,內嵌樣式只對該標簽有效。

2.內部樣式(internal Style Sheet):是寫在 HTML 的 <style> 標簽里面的,內部樣式只對所在的網頁有效。

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

而element.style 只能獲取被這些樣式表定義了的樣式,而 getComputedStyle 能獲取到所有樣式的值(在不同瀏覽器結果不一樣,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 還有另一種寫法,就是 document.defaultView.getComputedStyle 。

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

也有特例,查看stackoverflow,上面提及到在Firefox 3.6 ,不使用document.defaultView.getComputedStyle 會出錯。不過畢竟 FF3.6 已經隨歷史遠去,現在可以放心的使用window.getComputedStyle。

用一張圖總結一下:

原生JS實現CSS樣式的get與set

說了這么多,接下來將用原生 JS 實現一個小組件,實現 CSS 的 get 與 set,兼容所有瀏覽器。

getStyle(elem, style)

對于 CSS 的 set ,對于支持window.getComputedStyle 的瀏覽器而言十分簡單,只需要直接調用。

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

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

opacity 透明度的設定

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

1.alpha(opacity=0.5)

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

因此在 IE 環境下,我們需要針對透明度做一些處理。先寫一個 IE 下獲取透明度的方法:

// IE 下獲取透明度   function getIEOpacity(elem) {    var filter = null;     // 早期的 IE 中要設置透明度有兩個方法:    // 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)) {    // 轉化為標準結果    return value ? value / 100 : 0;}    }    // 透明度的值默認返回 1    return 1;

float 樣式的獲取

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

所以在各瀏覽器中都會有代替的寫法,比如說在標準瀏覽器中為 cssFloat,而在 IE678 中為 styleFloat 。經測試,在標準瀏覽器中直接使用getPropertyValue("float") 也可以獲取到 float 的值。而 IE678 則不行,所以針對 float ,也需要一個 HACK。

width | height 樣式的獲取

然后是元素的高寬,對于一個沒有設定高寬的元素而言,在 IE678 下使用getPropertyValue("width|height") 得到的是 auto 。而標準瀏覽器會直接返回它的 px 值,當然我們希望在 IE 下也返回 px 值。

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

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

獲取樣式的駝峰表示法

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

OK,需要 HACK 的點已經提完了。那么在 IE 下,獲取樣式的寫法:

getStyle: function(elem, style) {    // 主流瀏覽器    if (win.getComputedStyle) {...    // 不支持 getComputedStyle    } else {// IE 下獲取透明度if (style == "opacity") {    getIEOpacity(elem);// IE687 下獲取浮動使用 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";}// 其他樣式,無需特殊處理return elem.currentStyle.getAttribute(camelize(style));    }}

setStyle(elem, style, value)

說完 get ,再說說 setStyle ,相較于getStyle ,setStyle 則便捷很多,因為不管是標準瀏覽器還是 IE ,都可以使用element.style.cssText 對元素進行樣式的設置。

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

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

// 設置樣式setStyle: function(elem, style, value) {    // 如果是設置 opacity ,需要特殊處理    if (style == "opacity") {//IE7 bug:filter 濾鏡要求 hasLayout=true 方可執行(否則沒有效果)if (!elem.currentStyle || !elem.currentStyle.hasLayout) {    // 設置 hasLayout=true 的一種方法    elem.style.zoom = 1;}// IE678 設置透明度叫 filter ,不是 opacitystyle = "filter"; // !!轉換為 boolean 類型進行判斷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 實現的 getStyle 與setStyle 就實現了。可以看到,一個簡單接口的背后,都是有涉及了很多方面東西。雖然瀏覽器兼容性是一個坑,但是爬坑的過程卻是我們沉淀自己的最好時機。

jQuery 這樣的框架可以幫助我們走的更快,但是毫無疑問,去弄清底層實現,掌握原生 JS 的寫法,可以讓我們走得更遠。

以上就是解析原生JS getComputedStyle的詳細內容,更多關于原生JS getComputedStyle的資料請關注其它相關文章!

標簽: CSS HTML
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
精品日产卡一卡二卡麻豆| 天堂精品中文字幕在线| 日韩一区二区高清| 久久先锋资源| 久久国产毛片| 欧美在线观看禁18| 在线影视一区二区三区| 在线视频综合导航| 色婷婷亚洲一区二区三区| 六月婷婷一区| 精品视频全国免费看| 欧美日韩综合在线免费观看| 欧美日韩中文一区| 欧美一二三区精品| 欧美精品一区二区精品网| 精品播放一区二区| 国产精品视频yy9299一区| 亚洲欧洲精品成人久久奇米网 | 久久精品久久99精品久久| 亚洲综合久久av| 亚洲开发第一视频在线播放| 亚洲黄色视屏| 久久精品二区| 91精品在线观看入口| 欧美xxxx老人做受| 国产精品久久夜| 一区二区高清在线| 麻豆精品在线视频| 丁香六月久久综合狠狠色| 91在线播放网址| 一区二区久久| 欧美日韩一级视频| 久久精品在线免费观看| 亚洲人成影院在线观看| 奇米一区二区三区av| av在线综合网| 一区二区三区四区国产| 欧美日韩亚洲综合| 日本一区二区三区在线不卡| 亚洲电影你懂得| 国产成人精品三级麻豆| 韩日午夜在线资源一区二区| 美女久久网站| 久久婷婷国产综合国色天香| 亚洲欧洲国产日韩| 久久电影国产免费久久电影| 色综合天天综合在线视频| 性xx色xx综合久久久xx| 日韩欧美一卡二卡| 亚洲综合在线视频| jlzzjlzz亚洲女人18| 国产日韩综合| 2023国产精华国产精品| 天堂蜜桃91精品| 欧美理论在线| 欧美日韩aaaaaa| 亚洲精品久久嫩草网站秘色| 国产成人免费xxxxxxxx| 亚洲美女91| 欧美精品一区男女天堂| 日韩精品国产欧美| 欧美精品观看| 欧美一区二区三区在线电影| 一区二区三区中文在线| 波多野结衣精品在线| 日本久久电影网| 日韩美女视频一区| 成人免费高清在线观看| 色偷偷一区二区三区| 18成人在线观看| 免费在线亚洲欧美| 国产精品嫩草久久久久| 粉嫩一区二区三区性色av| 美女被久久久| 亚洲精品欧美在线| 女人色偷偷aa久久天堂| 欧美日韩国产一级片| 亚洲电影一级片| 99精品国产福利在线观看免费| 精品日韩99亚洲| 国产精品综合av一区二区国产馆| 久久国产主播| 亚洲伊人伊色伊影伊综合网| 欧美大香线蕉线伊人久久国产精品| 欧美另类videos死尸| 日韩专区一卡二卡| 亚洲一区二区毛片| 亚洲男女毛片无遮挡| 国产一区欧美| 国产精品美女久久久久久| www.日韩av| 精品国产91乱码一区二区三区| 国产精品一区二区x88av| 色狠狠一区二区三区香蕉| 一区二区三区国产豹纹内裤在线| 影音先锋一区| 1024亚洲合集| 精品成人免费| 亚洲精品videosex极品| 黄色精品网站| 成人欧美一区二区三区白人 | 亚洲激情综合| 亚洲婷婷在线视频| 伊甸园精品99久久久久久| 中文字幕乱码亚洲精品一区| 91小视频在线观看| 欧美成人精品3d动漫h| 成人黄色在线视频| 久久精品免费观看| 7777精品伊人久久久大香线蕉超级流畅| 奇米色777欧美一区二区| 欧美调教femdomvk| 国产呦萝稀缺另类资源| 日韩视频永久免费| av高清不卡在线| 国产精品免费丝袜| 极品裸体白嫩激情啪啪国产精品| 亚洲视频一区在线| 免费毛片一区二区三区久久久| 日韩综合小视频| 正在播放亚洲一区| 91在线视频观看| 亚洲色图丝袜美腿| 老司机精品久久| 九九九精品视频| 久久久久久97三级| 亚洲黄色成人久久久| 首页国产欧美久久| 欧美久久一区二区| 欧美aⅴ99久久黑人专区| 亚洲人成伊人成综合网小说| 久久成人精品| 国产乱一区二区| 国产欧美日韩麻豆91| 亚洲一区二区毛片| 国产精品亚洲一区二区三区在线 | 丝袜诱惑亚洲看片| 9191成人精品久久| 亚洲午夜精品久久久久久app| 亚洲综合一区二区精品导航| 欧美亚洲禁片免费| 成年人网站91| 亚洲综合清纯丝袜自拍| 91麻豆精品国产自产在线观看一区 | 日本黄色一区二区| 99国产一区二区三精品乱码| 亚洲欧美偷拍另类a∨色屁股| 色av综合在线| 欧美激情无毛| 狠狠色2019综合网| 西西裸体人体做爰大胆久久久| 久久精品国产免费看久久精品| 久久色成人在线| 免费久久久一本精品久久区| 成人av一区二区三区| 亚洲电影一区二区| 久久精品一区蜜桃臀影院| 色婷婷综合中文久久一本| 亚洲欧美一区二区原创| 男人的天堂亚洲一区| 欧美韩国日本不卡| 欧美美女喷水视频| 国产视频欧美| 欧美在线视频二区| 激情深爱一区二区| 亚洲综合图片区| 国产视频911| 91精品午夜视频| 一本一道综合狠狠老| 精品白丝av| 91小视频免费观看| 看电影不卡的网站| 亚洲黄色av一区| 国产喷白浆一区二区三区| 欧美日韩成人综合在线一区二区| 亚洲茄子视频| 91丨porny丨蝌蚪视频| 精品一区二区三区免费毛片爱| 一二三区精品福利视频| 国产亚洲综合av| 91精品国产91久久综合桃花| 久久午夜视频| 香蕉久久国产| 制服诱惑一区二区| 精品不卡视频| 国产一区再线| 女生裸体视频一区二区三区| 福利一区在线观看| 麻豆91小视频| 青青青伊人色综合久久| 亚洲成va人在线观看| 亚洲精品乱码久久久久久久久| 中文字幕精品一区| 久久人人超碰精品| 精品国产伦一区二区三区观看体验| 欧美精品一二三四| 欧美在线free| 欧美性色aⅴ视频一区日韩精品| 一本大道久久a久久综合婷婷| 欧美一级网站|