【每日一题】如何获取DOM元素的实际样式值
人生苦短,总需要一点仪式感。比如学前端~
实际的样式值
实际的样式值:可以理解为浏览器的最终计算样式
CSSStyleDeclaration对象
平时我们获取DOM元素的style
对象,它里边仅包含我们给元素设置的style属性的样式信息,但不包含从其他样式表层叠继承的、同样影响该元素的样式信息CSSStyleDeclaration对象(与从元素的 style (en-US) 属性返回的对象具有相同的类型)。
![](https://filescdn.proginn.com/be599d773009a92232a78cb3472f23c5/5d0cba36238a7c3d6ed09c671f5c31e5.webp)
但是我们往下翻CSSStyleDeclaration对象,可以看到样式表里设置的direction属性是拿不到值的。
getComputedStyle() 方法
DOM2
Style 在 document.defaultView
上增加了 getComputedStyle()方法。用于获取元素的所有CSS属性的值。
入参
这个方法接收两个参数:
1、要获取计算样式的DOM元素(必须是Element对象)
2、伪元素字符串(如":after"),如果不需要查询伪元素,则第二个参数可以传递null
let style = window.getComputedStyle(element, [pseudoElt]);
出参
getComputedStyle()方法返回一个 返回的style是一个实时的 CSSStyleDeclaration 对象,包含元素的计算样式。但是这些样式是只读的。
实时的概念是:当元素的样式更改时,它会自动更新本身。
![](https://filescdn.proginn.com/7fac75ae7dafe8e4ee542eaf401d2c8c/5813c334104abd7738c683c03d78b959.webp)
与伪元素使用
这恐怕是这个方法最强大的地方了,他可以让你从伪元素拉取样式信息 (比如, ::after, ::before, ::marker, ::line-marker)。
看个例子:下图这个元素的伪元素上,有好多样式表里设置的属性,我们来获取一下
使用注意
方法调用
在firefox3.6上访问子框架内的样式,必须要通过 document.defaultView
对象来调用。
其他情况用window访问即可
![](https://filescdn.proginn.com/60a418d36f01553920fd2d86baa56e3e/8008213b9223d4198177cbc092e5ff93.webp)
属性获取
上边background我们是直接获取的简写,但实际这个对象存储的各个属性名字有小驼峰也有中横线命名,两种方式都可以获取
beforeStyle['background-size']
// 或者
beforeStyle.backgroundSize
![](https://filescdn.proginn.com/4e9ba48a4973809e04385161f5088fde/08776e287c7d90b0c3ed0163ac91d999.webp)
![](https://filescdn.proginn.com/7fd426fb4d49d73a56c3ba02b3a520df/2b8855a926b4f65f82b90bc830eeb20a.webp)
兼容写法
function getStyleByAttr(obj, name) {
return window.getComputedStyle ?
window.getComputedStyle(obj, null)[name] :
obj.currentStyle[name];
}
兼容性
这么说吧,随便用
![](https://filescdn.proginn.com/43f84510823cc477aad33ee8cead870c/10d5b52a7872e702eb0f431ef0baa504.webp)
![](https://filescdn.proginn.com/73138ca93186f62f7129b4b99e7dfb52/06f54a7dd9afad36b4f98930df483391.webp)
让我们一起携手同走前端路!
关注公众号回复【加群】即可
![](https://filescdn.proginn.com/5831130d78607dc748fa6fb513cfa4e5/5566b8e8d5ddceddc8867c33a4768d0d.webp)
● 一张图带你搞懂Javascript原型链关系
● 一张图带你搞懂Node事件循环