gpt4 book ai didi

javascript - 使用 Javascript(和媒体查询)获取 CSS 样式表属性

转载 作者:行者123 更新时间:2023-11-30 10:30:59 25 4
gpt4 key购买 nike

通常,当我不使用 JQuery 时,我会使用以下实用函数从使用 Javascript 的样式表中获取属性。这可以很好地从 CSS 样式表中获取值:

<!DOCTYPE html>
<html>
<head>

<style>

.foo {
color: red;
}

</style>

<script type = "text/javascript">
function getcss(selector, property)
{
var len = document.styleSheets.length;

for (var idx = 0; idx < len; ++idx)
{
var sheet = document.styleSheets && document.styleSheets[idx];

if (sheet)
{
var r = sheet.rules ? sheet.rules : sheet.cssRules;
if (r)
{
var i = r.length;
while (i--)
{
if (r[i].selectorText && r[i].selectorText.toLowerCase() === selector.toLowerCase())
{
return (r[i].style[property]);
}
}
}
}
}

return null;
}

function exec()
{
alert(getcss(".foo", "color"));
}
</script>
</head>

<body onload = "exec()">
</body>
</html>


问题是它没有考虑媒体查询。如果我替换 <style>上面代码的一部分:

.foo {
color: red;
}

@media screen and (max-width: 600px) {
.foo {
color: green;
}
}

...它仍然输出 red如果我将窗口缩小到小于 600px .

这是正确的 WC3 行为吗?或者这是一个浏览器错误? (我正在 Ubuntu 上使用 Firefox 12 进行测试)。

有没有办法纠正这个问题,以便 Javascript 按照媒体查询的要求“看到”正确的样式表?

最佳答案

您的代码只是简单地查看样式表的规则,而且只是第一个规则列表。规则是样式表的对象表示——它们不会仅仅因为您调整了浏览器的大小而改变。

在您的代码中,您永远不会看到绿色规则,因为您只是迭代第一个 CSSRuleList 中的元素。这里的技巧是您需要递归循环任何附加规则,这些规则是 CSSMediaRule 并包含它们自己的 CSSRuleList。对于您来说,sheet.rules 包含一个 CSSyleRule(这是您的 .foo { color:red; })和一个 CSSMediaRule(这是您的媒体查询)。第二个规则然后是它自己的 CSSRuleList,您可以遍历它来找到您的绿色。

在这种情况下,这是您的数据所在的位置:

// Assuming sheet 0 is your stylesheet above    
var sheet = document.styleSheets[0];

// First rule is ".foo { color: red; }"
console.log(sheet.cssRules[0].cssText);

// Second Rule is your "@media" and its first rule is ".foo { color: green; }"
console.log(sheet.cssRules[1].cssRules[0].cssText);

关于javascript - 使用 Javascript(和媒体查询)获取 CSS 样式表属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16993196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com