许多工具/ API提供了选择特定类或ID元素的方法 . 还可以检查浏览器加载的原始样式表 .
但是,对于浏览器呈现元素,它们将编译所有CSS规则(可能来自不同的样式表文件)并将其应用于元素 . 这就是您在Firebug或WebKit Inspector中看到的内容 - 一个元素的完整CSS继承树 .
如何在纯JavaScript中重现此功能而无需其他浏览器插件?
也许一个例子可以为我正在寻找的东西提供一些澄清:
<style type="text/css">
p { color :red; }
#description { font-size: 20px; }
</style>
<p id="description">Lorem ipsum</p>
这里p#描述元素应用了两个CSS规则:红色和20像素的字体大小 .
我想找到这些计算出来的CSS规则源自的来源(颜色来自p规则等) .
8 回答
由于这个问题目前没有轻量级(非库),跨浏览器兼容的答案,我将尝试提供一个:
JSFiddle:http://jsfiddle.net/HP326/6/
调用
css(document.getElementById('elementId'))
将返回一个数组,其中包含与传递的元素匹配的每个CSS规则的元素 . 如果要查找有关每个规则的更多具体信息,请查看CSSRule object文档 .编辑:这个答案现已弃用,no longer works in Chrome 64+ . 留下历史背景 . 事实上,错误报告链接回到这个问题,以寻找使用它的替代解决方案 .
似乎我在经过一个小时的研究后设法回答了我自己的问题 .
这很简单:
(适用于WebKit / Chrome,也可能适用于其他人)
看看这个库,它可以满足要求:http://www.brothercake.com/site/resources/scripts/cssutilities/
它适用于所有现代浏览器,可以回到IE6,可以为你提供像Firebug这样的规则和属性集合(实际上它比Firebug更准确),并且还可以计算任何规则的相对或绝对特异性 . 唯一需要注意的是,尽管它理解静态媒体类型,但它并不了解媒体查询 .
短版本2017年4月12日
挑战者出现了 .
Line
/* 1 */
构建了一个包含所有规则的平面数组 .行
/* 2 */
丢弃不匹配的规则 .基于@ S.B的function css(el) . 在同一页上 .
示例1
示例2
缺点
无媒体处理,没有
@import
,@media
.无法访问从跨域样式表加载的样式 .
没有按选择器“特异性”排序(重要性顺序) .
没有从父项继承的样式 .
可能无法与旧的或基本的浏览器一起使用 .
不确定它如何应对伪类和伪选择器,但似乎没有问题 .
也许有一天我会解决这些缺点 .
长版本2018年8月12日
这是一个更全面的实现,取自someone’s GitHub page(从original code分叉,通过Bugzilla) . 写给Gecko和IE,但据传也与Blink合作 .
4 May 2017: 特异性计算器已经遇到了我现在修复过的关键错误 . (我无法通知作者,因为我没有GitHub帐户 . )
12 August 2018: 最近的Chrome更新似乎已将对象范围(
this
)与分配给自变量的方法分离 . 因此调用matcher(selector)
已停止工作 . 用matcher.call(el, selector)
替换它解决了它 .修正了错误
= match
→+= match
return re ? re.length : 0;
→return matches ? matches.length : 0;
_matchesSelector(element, selector)
→matchesSelector(element, selector)
matcher(selector)
→matcher.call(el, selector)
这里's a version of S.B.'的答案也返回匹配媒体查询中的匹配规则 . 我删除了
*.rules || *.cssRules
合并和.matches
实现查找器;如果需要,可以添加一个polyfill或添加这些行 .此版本还返回
CSSStyleRule
对象而不是规则文本 . 我认为这更有用,因为规则的细节可以通过这种方式更容易地以编程方式进行探测 .咖啡:
JS:
确保IE9,我编写了一个函数来为所请求的元素及其子元素计算CSS,并且如果需要在下面的代码片段中提供将其保存到新的className的可能性 .
Usage
这是我的
getMatchedCSSRules
函数版本,它支持@media
查询 .