JS如何获取元素样式?
2017-09-03 本文已影响56人
前端王睿
上篇文章讲到如何设置元素样式,本文将继续给大家分享如何获取元素样式。
一、style,只获取标签上定义的行内样式
在这里讲的style用法包括三个:style、style.cssText和style.getPropertyValue(),直接看个例子吧:
/*CSS*/
#box{ width: 200px; height: 200px; background-color: #0f0;}
<!--HTML-->
<div id="box" style="width: 100px; background-color: #f00;"></div>
//JavaScript
var box = document.getElementById("box");
console.log(box.style.cssText); // "width: 100px; background-color: rgb(255, 0, 0);"
console.log(box.style.width); // "100px"
console.log(box.style.height); // ""
console.log(box.style.getPropertyValue('background-color')); // "rgb(255, 0, 0)"
通过上面例子我们可以看出,通过这种方式只能获取行内样式,并不能获取到CSS样式表中的样式。
二、cssRules,只获取CSS样式表中定义的样式
接着上面的例子:
//JavaScript
var sheet = document.styleSheets[0]; // 获取页面中第一个样式表
var rules = sheet.cssRules; // 获取页面中第一个样式表中定义的所有规则,rules[0]即代表第一条规则
console.log(rules[0].style.cssText); // "width: 200px; height: 200px; background-color: rgb(0, 255, 0);"
console.log(rules[0].style.width); // "200px"
console.log(rules[0].style.height); // "200px"
console.log(rules[0].style.getPropertyValue('background-color')); // "rgb(0, 255, 0)"
可以看出,用法其实与上面类似,只不过是主体变为rules[0]而不是box,所以只能获取到样式表中的样式,而并不能获取到行内样式。
三、getComputedStyle(),获取当前元素的计算样式
以上两种方式,都具有太强的针对性,不够灵活,因为获取到的样式可能并不是当前元素最终表现出来的样式。因此,如果想要获取所有样式表层叠而来的当前元素的样式,我们就要用到getComputedStyle()方法。
依然继续前面的例子:
console.log(getComputedStyle(box).cssText); // 注意不仅仅只打印现有样式简单的叠加覆盖结果,而是还会有很多其他样式
console.log(getComputedStyle(box).width); // "100px"
console.log(getComputedStyle(box).height); // "200px"
console.log(getComputedStyle(box).getPropertyValue('background-color')); // "rgb(255, 0, 0)"
很明显,用法还是和style类似,但是通常情况下使用这种方式获取到的样式才是我们真正所需要的。
兼容性:在IE8下,getPropertyValue()、cssRules和getComputedStyle()统统都不兼容,可以分别使用style.[属性名]、rules和currentStyle的方式替代,具体用法本文将不再说明,在此也希望其他开发者放弃兼容IE8及更早版本,如今2017都快接近尾声,微软自己都早已放弃,我们何必继续再惯着那部分少量用户而折磨自己呢?