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年也要加油!

相关文章
相关标签/搜索