【发布时间】:2015-12-15 20:14:06
【问题描述】:
仅列出呈现的样式,而不是未应用的任意样式
我已经尝试了很多方法来将样式应用于元素,但都出现了空白。
请不要引用getComputedStyle 作为解决方案,除非您可以解决垃圾退货问题。
主要问题是window.getComputedStyle(document.querySelector('ANY ELEMENT')).fill 将返回"rgb(0, 0, 0)",这在几乎所有情况下不是正确的样式,并且没有明显的方法来确定它是否实际被应用。
上面的例子不是唯一的问题案例; getComputedStyle 返回的大量规则是错误的,如果应用它们将彻底改变页面的外观。
静态解析不是一个选项,因为在某些情况下 .css 文件位于另一个没有跨域标头的服务器上;它还隐藏了document.styleSheets 中常见的样式。
有没有什么方法可以获取应用样式的列表,仅此而已?
根据要求,此代码将演示问题(在 Chrome 上):
var all = document.getElementsByTagName('*');
for(var i in all)
if (all[i].style) all[i].style.cssText = window.getComputedStyle(all[i]).cssText;
编辑:我的答案包含适用于所有浏览器的代码。我保留在上面以保留评论线程。
【问题讨论】:
-
要确定是否呈现了 特定 样式很复杂,更不用说所有样式了。谷歌“如何判断一个 html 元素是否可见”,以了解需要多少代码才能做到这一点。每个广泛的样式类别都可能都有奇怪的边缘情况。可能有一个解决方案,但我怀疑它是否实用。如果有人证明我错了,我会很兴奋。
-
@JaredSmith 我已经编写了代码来进行可见性检查,以及通过模拟如何呈现某些内容以及可能覆盖哪些元素来进行遮挡检查。当信息可用时它并不复杂,在这种情况下我不相信它。浏览器清楚地呈现页面上的所有内容,因此它确切知道它应用了哪些样式来生成它正在显示的页面,但似乎没有提供此信息的 API(原因不明)。
-
复杂?不,我说错了。乏味?是的。
getBoundingClientRect、position和z-index用于每个元素。根据 z-index(如果相关)计算重叠和遮挡。不要忘记父母的溢出!将所有这些乘以所有可能的显示、颜色、字体、大小等 css 属性。如果它适合任何合理大小的 js,我会感到惊讶,如果它具有可接受的性能特征,我会更惊讶。 -
@JaredSmith 有什么意义?检查是否应用了样式应该很简单,它与检查元素是否可见并不相似。可靠地检查可见性是相当多的代码,但这完全不相关
-
这似乎是关于父子关系的问题或循环问题。如果你一个一个地尝试而不是循环所有元素,它可以正常工作。
标签: javascript html css