JS——getComputedStyle與currentStyle獲取樣式


轉載自:https://segmentfault.com/a/1190000007477785

 

CSS的樣式分為三類:

內嵌樣式:是寫在標簽里面的,內嵌樣式只對所在的標簽有效
內部樣式:是寫在HTML里面的,內部樣式只對所在的網頁有效
外部樣式表:如果很多網頁需要用到同樣的樣式,將樣式寫在一個以.css為后綴的CSS文件里,然后在每個需要用到這些樣式的網頁里引用這個CSS文件

getComputedStyle是一個可以獲取當前元素所有最終使用的CSS屬性值,返回的是一個CSS樣式聲明對象,只讀
currentStyle是IE瀏覽器的一個屬性

基礎知識

眾所周知,用document.getElementById('element').style.xxx可以獲取elementxxx樣式信息,可是它獲取的只能是DOM元素內嵌樣式style屬性里的樣式規則,對於使用外部樣式表內部樣式設置的元素,就獲取不到樣式信息了。 
DOM標准里有個全局方法getComputedStyle,可以獲取到當前對象樣式信息,如:getComputedStyle(obj,null).paddingLeft,就能獲取到對象的左內邊距。但是IE不支持此方法,IE中獲取樣式的方法是currentStyle,不同於全局方法getComputedStyle,它是作為DOM元素屬性存在的,如:obj.currentStyle.paddingLeft,在IE中就獲取到對象的左內邊距了,兼容性的寫法如下:

return obj.currentStyle?obj.currentStyle.paddingLeft:getComputedStyle(obj,null).paddingLeft;
在ie瀏覽器中,
obj.currentStyle是一個對象,而在非ie瀏覽器中則顯示的是undefined,所以可以用以上方法來處理兼容性的問題!!
(判斷obj.currentStyle為真時,執行ie的currentStyle方法;判斷obj.currentStyle為假時,執行getComputedStyle(obj,null)方法

getComputedStyle第二個參數表示的是:after:before之類的偽類,如果不用偽類的話設置為null即可。注意的是:Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1) 之前,第二個參數“偽類”是必需的(如果不是偽類,設置為null),不過現在嘛,不是必需參數了
這樣,就能在IE及FF中返回對象的當前樣式信息了。
特別注意一點:如果要獲取當前對象的顏色信息,IE返回的是16進制值,如:#ffffff,而其他瀏覽器返回的是rgb值,如:rgb(255,255,255)


下面是一個簡單的小示例:

 一般簡單使用:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <style>
    #div1{
      width: 100px;
      height: 100px;
      background: red;
    }
  </style>
  <script>
    window.onload=function(){
    var oDiv=document.getElementById('div1');
    var btn=document.getElementById('btn');

    btn.onclick=function(){
       //currentStyle和getComputedStyle 解釋為:獲取計算后的樣式(當前樣式/最終樣式)

      if(oDiv.currentStyle){
         //ie 在ie瀏覽器中,oDiv.currentStyle的值為對象,所以是“真”
        alert(oDiv.currentStyle.width);
      }
      else {
         //ff chrome... 在非ie瀏覽器中,oDiv.currentStyle的值為‘undefined’,所以為假
        alert(getComputedStyle(oDiv).width);
      }
    }
  }
  </script>
</head>
<body>
  <div id="div1"></div>
  <input id="btn" type="button" value="yangshi">
</body>
</html>
 

 ②封裝代碼使用:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <style>
    #div1{
      width: 100px;
      height: 100px;
      background: red;
    }
  </style>
  <script>
     //封裝到單獨的get函數中
    function get(obj,arr){
      if(obj.currentStyle){
        return obj.currentStyle[arr];
      }
      else{
        return getComputedStyle(obj)[arr];
      }
    }

    window.onload=function(){
      var oDiv=document.getElementById('div1');
      var btn=document.getElementById('btn');

      btn.onclick=function(){
         //調用get函數
        alert(get(oDiv,'width'));
      }
    }
  </script>
</head>
<body>
  <div id="div1"></div>
  <input id="btn" type="button" value="yangshi">
</body>
</html>
 
③結合實例使用:
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <style>
    #div1{
      width: 100px;
      height: 100px;
      background-color: red;
    }
  </style>
  <script>
    function get(obj,arr){   //傳入2個參數,用於獲取需要修改的元素(例如:div),和獲取需要修改的樣式
       //運用上個代碼②的封裝,get函數,用於獲取div的css樣式
      if(obj.currentStyle){
        return obj.currentStyle[arr];
      }
      else{
        return getComputedStyle(obj)[arr];
      }
    }
    function css(obj,arr,value){   //傳入3個參數,用於獲取需要修改的元素(例如:div),獲取需要修改的樣式,和需要修改的樣式的值
       //自定義css函數,用於處理div的css樣式變化
 
      if(arguments.length==2){
         //當css函數的參數為2個時,調用get函數,輸出div中的css樣式
        alert(get(obj,arr));
      }
      else if(arguments.length==3){
         //當css函數的參數為3個時,執行下面代碼,修改div中的css樣式
        obj.style[arr]=value;
      }
    }

    window.onload=function(){
      var oDiv=document.getElementById('div1');
      var btn=document.getElementById('btn');

      btn.onclick=function(){
         //調用css函數方法
        css(oDiv,'backgroundColor')
        css(oDiv,'backgroundColor','green')
      }
    }
  </script>
</head>
<body>
  <div id="div1"></div>
  <input id="btn" type="button" value="yangshi">
</body>
</html>

兼容性

getComputedStyle:FireFox、Opera、Safari、Chrome均支持
currentStyle:僅IE支持

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM