繁体   English   中英

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

[英]Get CSS style sheet property using Javascript (and media query)

通常,当我不使用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;
    }
}

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

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

无论如何,有没有要纠正的方式,以便Javascript根据媒体查询的要求“看到”正确的样式表?

您的代码只是在浏览样式表的规则,并且仅浏览规则的第一列表。 规则是样式表的对象表示-它们不会仅仅因为您调整了浏览器的大小而改变。

在您的代码中,您永远不会看到绿色的Rul,因为您只需要遍历第一个CSSRuleList的项目。 这里的窍门是,您需要递归地遍历CSSMediaRule并包含其自己的CSSRuleList所有其他规则。 对于您来说, sheet.rules包含一个CSSSyleRule (这是您的.foo { color:red; } )和CSSMediaRule (这是您的媒体查询)。 第二条规则然后是它自己的CSSRuleList ,您可以遍历该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); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM