js 獲取css非行內樣式,你應該瞭解的getComputedStyle方法

 壹 ❀ 引css

咱們知道書寫css有三種作法,它們分別是行內樣式,內嵌樣式和外部引用。咱們來看個例子,下面這個div分別經過內部樣式添加了顏色,內嵌樣式添加了字體大小,外部引入樣式添加了寬度。字體

<!-- 行內樣式 -->
<div style="color: red;">聽風是風</div>
<!-- 內嵌樣式 -->
<style>
    div {
        font-size: 24px;
    }
</style>
<!-- 外部引入 -->
<link rel="stylesheet" href="style/demo.css">
/* demo.css */
div{
    width: 100px;
}

如今咱們來嘗試獲取這個div的樣式,使用JavaScript寫法:spa

let div = document.querySelector("div");
console.log(div.style.color);//red
console.log(div.style.fontSize);//
console.log(div.style.width);//

事實證實,經過style屬性只能訪問到行內樣式,內嵌以及外部引用都沒法讀取,怎麼辦呢?咱們能夠使用 getComputedStyle 方法。3d

 貳 ❀ 解決方案code

仍是上面的例子,咱們使用getComputedStyle方法,直接上代碼:對象

let div = document.querySelector("div");
let style = window.getComputedStyle(div, null);
console.log(style['color']); //rgb(255, 0, 0)
console.log(style['fontSize']); //24px
console.log(style['width']); //100px

看,無論以何種方式設置的樣式,getComputedStyle方法都能輕鬆幫你拿到,這個方法是個什麼意思呢?咱們來講說這個方法。blog

 叄 ❀ 關於getComputedStyle方法ip

一個完整的getComputedStyle方法實際上是這樣:element

let style = window.getComputedStyle(element, [pseudoElt]);

其中 element 是你須要獲取style 的元素;咱們知道元素能經過after與before設置僞元素(注意是僞元素不是僞類),pseudoElt就是用於獲取僞元素樣式,若是不須要請將此參數設置爲null。返回的style是一個屬性鍵值對的合集,是一個對象,咱們能夠經過屬性名直接訪問對應的值,或者經過 getPropertyValue 方法獲取,咱們來看一個帶有僞元素的例子:get

<input type="text" class="demo">
/* demo.css */
input {
    outline: none;
    border: 1px solid #ddd;
}

input::after {
    content: "";
    border: 2px solid #e4393c;
}
var input = document.querySelector(".demo");
var border = window.getComputedStyle(input, null)['border'];
console.log(border); //1px solid rgb(221, 221, 221)
//等同於
var border = window.getComputedStyle(input, null).getPropertyValue("border");
console.log(border); //1px solid rgb(221, 221, 221)

//獲取僞元素
var border = window.getComputedStyle(input, '::after')['border'];
console.log(border); //2px solid rgb(228, 57, 60)
//等同於
var border = window.getComputedStyle(input, '::after').getPropertyValue("border");
console.log(border); //2px solid rgb(228, 57, 60)

咱們來看看此方法的兼容性:

 兼容性很是優秀,IE都完美兼容到了9以上,可能有人就要問了,要是我低版本IE也要獲取非行內樣式怎麼辦?其實早版本的IE也有專門提供一個屬性 currentStyle,它的使用是這樣:

var style = element.currentStyle[prop];

此屬性的兼容性以下圖:

能夠看到從兼容性來講,這兩個屬性方法完美的互補了IE兼容狀況,注意,若是不考慮低版本IE,請直接使用 getComputedStyle 方法。

 肆 ❀ 一個通用樣式獲取/設置方法

直接上代碼:

/**
 * @desc 一個用於設置和獲取css樣式的方法
 * @param {*} ele element元素
 * @param {*} prop 樣式名
 * @param {*} val 樣式值
 */
function css(ele, prop, val) {
    if (val) {
        // 設置css屬性
        ele.style[prop] = val;
    } else {
        // 兼容低版本IE
        if (ele.currentStyle) {
            return ele.currentStyle[prop];
        } else {
            return window.getComputedStyle(ele, null)[prop];
        };
    };
};

那麼關於獲取非行內樣式就說到這裏了,還有一小時跨年,新年快樂。2020年也要加油!

相關文章
相關標籤/搜索