亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

手寫的一個兼容各種瀏覽器的javascript getStyle函數(獲取元素的樣式)

2019-11-20 14:49:43
字體:
來源:轉載
供稿:網友

要想獲取HTML元素的計算樣式一直都存在很多的兼容問題,各瀏覽器都會存在一些差異,Firefox、webkit(Chrome,Safari)支持W3C標準的方法:getComputedStyle(),而IE6/7/8不支持標準的方法但是有私有的屬性來實現:currentStyle,IE9和Opera兩個都支持。有了這2個方法和屬性基本上可以滿足大多數要求了。

復制代碼 代碼如下:

var getStyle = function( elem, type ){
 return 'getComputedStyle' in window ? getComputedStyle(elem, null)[type] : elem.currentStyle[type];
};

但是對于自適應的寬度和高度使用currentStyle就沒法獲取到計算的值,只能返回auto,而getComputedStyle()就可以返回計算的值,解決這個問題有好幾種辦法。我之前想到的是用clientWidth/clientHeight減去padding的值,這樣就可以在不支持標準方法的瀏覽器中獲取到計算的寬度和高度。前幾天看到司徒正美采用了另一種辦法,使用getBoundingClientRect()方法獲取到元素在頁面中的位置,然后right減去left就是寬度,bottom減去top就是高度。我對他的代碼做了一些小小的修改,最終代碼如下:

復制代碼 代碼如下:

var getStyle = function( elem, style ){
 return 'getComputedStyle' in window ?
 getComputedStyle( elem, null )[style] :
 function(){
  style = style.replace( //-(/w)/g, function( $, $1 ){
   return $1.toUpperCase();
  });

  var val =  elem.currentStyle[style];

  if( val === 'auto' && (style === "width" || style === "height") ){
   var rect =  elem.getBoundingClientRect();
   if( style === "width" ){
    return rect.right - rect.left + 'px';
   }else{
    return rect.bottom - rect.top + 'px';
   }
  }
  return val;
 }();
};

// 調用該方法
var test = document.getElementById( 'test' ),
      // 獲取計算的寬度
    tWidth = getStyle( test, 'width' );

新的問題,如果元素的寬度或高度使用了em或%的單位,getComputedStyle()返回的值就會自動將em或%換成px的單位,currentStyle就不會,而如果是font-size使用em為單位,在Opera下返回的是0em,Opera真的很恐怖!

后來在使用發現中還有一些沒想到的兼容問題,今天我對原來的代碼進行了優化,并對一些常見的兼容問題進行了處理。


在javascript中“-”(中劃線或連字符)代表的是減號,而在CSS中,許多樣式屬性都有這個符號,如padding-left、font-size等,所以在javascript中如果出現如下的代碼就一個錯誤:

復制代碼 代碼如下:
elem.style.margin-left = "20px";

正確的寫法應該是:
復制代碼 代碼如下:
elem.style.marginLeft = "20px";

這里需要把CSS的中劃線去掉并把原來緊跟在中劃線后的字母大寫,俗稱“駝峰式”寫法,不管是使用javascript設置或是獲取元素的CSS樣式都應該是駝峰式的寫法。但是不少對CSS熟悉而又對javascript不太熟悉的新手朋友總是會犯這種低級錯誤,使用replace的高級用法可以很簡單的將CSS屬性中的中劃線替換成駝峰式的寫法。
復制代碼 代碼如下:
var newProp = prop.replace( //-(/w)/g, function( $, $1 ){
    return $1.toUpperCase();
});

對于float,在javascript中屬于保留字,在javascript中設置或獲取元素的float的值,都有其他的代替寫法,在標準瀏覽器中為cssFloat,而在IE6/7/8中為styleFloat。

如果top、right、bottom、left沒有一個顯式的值,在獲取這些值的時候部分瀏覽器會返回一個auto,雖然auto這個值是一個合法的CSS屬性值,但絕不是我們想要的結果,而應該是0px。

在IE6/7/8中要設置元素的透明度需要用到濾鏡、如:filter:alpha(opacity=60),對于標準瀏覽器直接設置opacity即可,IE9兩種寫法都支持,我對獲取元素的透明度也做了兼容處理,只要使用opacity就可以獲取到所有瀏覽器元素的透明度的值。

在IE6/7/8中獲取元素的寬度和高度已經在上篇文中介紹過了,這里就不再復述了。還有一個需要注意的地方就是,如果元素的樣式是使用style內聯的寫法,或者是已經使用javascript設置過樣式的屬性,可以使用下面的方法獲取到元素的計算樣式:

復制代碼 代碼如下:

var height = elem.style.height;

這個方法比讀取getComputedStyle或currentStyle中的屬性值都要快,應該優先使用,當然前提條件就是樣式是通過內聯的寫法設置的(使用javascript設置也是設置內聯樣式)。優化過的最終代碼如下:

復制代碼 代碼如下:

var getStyle = function( elem, p ){
 var rPos = /^(left|right|top|bottom)$/,
 ecma = "getComputedStyle" in window,
 // 將中劃線轉換成駝峰式 如:padding-left => paddingLeft
 p = p.replace( //-(/w)/g, function( $, $1 ){
 return $1.toUpperCase();
 });
 // 對float進行處理  
 p = p === "float" ? ( ecma ? "cssFloat" : "styleFloat" ) : p;

 return !!elem.style[p] ?
 elem.style[p] :
 ecma ?
 function(){
 var val = getComputedStyle( elem, null )[p];
 // 處理top、right、bottom、left為auto的情況
 if( rPos.test(p) && val === "auto" ){
 return "0px";
 }
 return val;
 }() :
 function(){
 var <a >wirelesscasinogames.com</a> val = elem.currentStyle[p];
 // 獲取元素在IE6/7/8中的寬度和高度
  if( (p === "width" || p === "height") && val === "auto" ){
  var rect = elem.getBoundingClientRect();    
  return ( p === "width" ? rect.right - rect.left : rect.bottom - rect.top ) "px";
  }
 // 獲取元素在IE6/7/8中的透明度
  if( p === "opacity" ){
  var filter = elem.currentStyle.filter;
  if( /opacity/.test(filter) ){
   val = filter.match( //d / )[0] / 100;
  return (val === 1 || val === 0) ? val.toFixed(0) : val.toFixed(1);
  }
  else if( val === undefined ){
  return "1";
  }
  }
  // 處理top、right、bottom、left為auto的情況
  if( rPos.test(p) && val === "auto" ){
  return "0px";
  }
  return val;
 }();
};

下面是調用示例:

復制代碼 代碼如下:

<style>
.box{
 width:500px;
 height:200px;
 background:#000;
 filter:alpha(opacity=60);
 opacity:0.6;
}
</style>

<div id="box"></div>

<script>
var box = document.getElementById( "box" );

alert( getStyle(box, "width") ); // "500px"
alert( getStyle(box, "background-color") ); // "rgb(0, 0, 0)" / "#000"
alert( getStyle(box, "opacity") ); // "0.6"
alert( getStyle(box, "float") ); // "none"
</script>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩电视剧免费观看网站| 国产成人一区二区三区电影| 亚洲精品国产精品国自产在线| 国产婷婷成人久久av免费高清| 亚洲精品免费一区二区三区| 亚洲福利视频网| 色婷婷综合久久久久| 日韩中文娱乐网| 91欧美日韩一区| 欧美xxxx做受欧美| 亚洲韩国日本中文字幕| 亚洲人成电影网站色| 亚洲性xxxx| 欧美成人精品在线| 国产在线观看不卡| 韩国欧美亚洲国产| 欧美老女人bb| 国产成人avxxxxx在线看| 欧美一区二粉嫩精品国产一线天| xxx成人少妇69| 国产有码在线一区二区视频| 91夜夜未满十八勿入爽爽影院| 日韩中文娱乐网| 国产精品久久久久久久久男| 亚洲亚裔videos黑人hd| 欧美日韩另类在线| 欧美日韩在线一区| 欧美一性一乱一交一视频| 九九久久综合网站| 欧美在线xxx| 久久久久久久久久av| 国产视频亚洲视频| 欧美二区在线播放| 欧美电影免费观看高清完整| 久久久精品在线观看| 久久琪琪电影院| 亚洲日韩欧美视频一区| 国产精品激情av在线播放| 91精品一区二区| 日韩视频亚洲视频| 欧美激情性做爰免费视频| 亚洲高清av在线| 亚洲第一福利在线观看| 久久精品国产亚洲7777| 国产精品男人的天堂| 欧美电影免费观看电视剧大全| 性欧美xxxx交| 日韩极品精品视频免费观看| 午夜欧美大片免费观看| 欧美中文在线字幕| 欧美精品免费在线观看| 欧美在线一区二区视频| 亚洲va欧美va国产综合剧情| 欧美日韩另类字幕中文| 精品久久久免费| 国产成人精品视频在线观看| 欧美日韩高清在线观看| 欧美乱妇高清无乱码| 亚洲精品v天堂中文字幕| 欧美亚洲另类制服自拍| 亚洲成人动漫在线播放| 久久久伊人欧美| 亚洲风情亚aⅴ在线发布| 精品女厕一区二区三区| 92裸体在线视频网站| 成人欧美一区二区三区在线| 欧美精品激情blacked18| www.欧美三级电影.com| 久久精品国产电影| 亚洲第一精品久久忘忧草社区| 日韩精品视频免费专区在线播放| 26uuu另类亚洲欧美日本一| 日韩av免费一区| 亚洲精品色婷婷福利天堂| 国产精欧美一区二区三区| 综合国产在线观看| 成人免费高清完整版在线观看| 精品综合久久久久久97| 日韩免费在线免费观看| 亚洲v日韩v综合v精品v| 日韩欧美亚洲国产一区| 国产aⅴ夜夜欢一区二区三区| 中文字幕免费国产精品| 国产亚洲精品久久久久动| 久久久在线视频| 日韩中文av在线| 成人福利视频在线观看| 黑人巨大精品欧美一区二区| 国产丝袜一区二区三区| 亚洲欧洲一区二区三区在线观看| 亚洲女人被黑人巨大进入al| 日韩成人激情在线| 欧美激情久久久| www.亚洲免费视频| 91精品国产高清久久久久久久久| 欧美色道久久88综合亚洲精品| 亚洲xxxxx电影| 欧美在线一区二区视频| 国产精品久久激情| 国产精品影院在线观看| 国产精品久久久久久久久久免费| 亚洲第一页中文字幕| 国模精品视频一区二区三区| 国产69精品久久久久久| 久久久久国产精品一区| 日韩在线播放视频| 国产一区香蕉久久| 午夜精品久久17c| 久久久久国产精品一区| 国产一区二区丝袜| 亚洲精品影视在线观看| 精品欧美一区二区三区| 日韩精品极品毛片系列视频| 亚洲精品综合久久中文字幕| 欧美精品在线看| 一色桃子一区二区| 国产精品免费小视频| 国产精品黄色av| 成人做爰www免费看视频网站| 欧美激情videoshd| 久久男人资源视频| 91免费在线视频| 亚洲图片欧洲图片av| 国产亚洲精品综合一区91| 亚洲欧美国产一区二区三区| 国产精品久久综合av爱欲tv| 欧美三级欧美成人高清www| 国产精品美乳在线观看| 亚洲国产天堂网精品网站| 日本亚洲欧美三级| 欧美日韩国产一中文字不卡| 成人免费观看a| 日本乱人伦a精品| 久久av在线播放| 欧美老女人性视频| 久久伊人精品视频| 日本道色综合久久影院| 欧美性一区二区三区| 成人中文字幕在线观看| 亚洲欧美日韩国产成人| 日本成人黄色片| 日本免费在线精品| 久久av红桃一区二区小说| 国内精品国产三级国产在线专| 亚洲精品电影在线| 北条麻妃一区二区三区中文字幕| 91精品国产综合久久香蕉922| 国自在线精品视频| 国产亚洲欧洲高清一区| 97在线免费视频| 青青草原成人在线视频| 亲爱的老师9免费观看全集电视剧| 正在播放亚洲1区| 亚洲精品999| 亚洲成色777777在线观看影院| 欧美日韩性视频在线| 欧美日韩一区二区免费视频| 久久久久日韩精品久久久男男| 在线观看精品自拍私拍| 日韩欧美综合在线视频| 国内伊人久久久久久网站视频| 岛国精品视频在线播放| 亚洲老头老太hd| 国产精品免费久久久|