在CSSStyleDeclaration更新(chrome)上强制文档重新渲染

时间:2013-01-24 19:24:50

标签: javascript css google-chrome media-queries

(仅限CHROME)我正在尝试在运行时修改与媒体查询相关的CSSRule,但是,当我修改规则时,文档不会重新渲染。仅当媒体查询再次更改时,文档才会重新呈现。如果你看一下小提琴,你会注意到加载时,元素是深色的,当它应该立即变红。有没有办法要求文件使样式无效?

如果您将浏览器窗口移动得更小,则会看到样式已成功更改,而不是再次更大,这样会使媒体查询样式无效两次。

小提琴:http://jsfiddle.net/QNgxk/3/

编辑:有时小提琴有效???让人惊讶

代码:

HTML

<div id="test">I SHOULD BE RED</div>

CSS

#test {
    position: absolute;
    width:    100%;
    background-color: #333;
    height:   50px;
}

@media screen and (min-width: 481px) {
    #test {
        width: 50%;
    }
}

JS

var test = document.getElementById('test');   // get the element
var rules = window.getMatchedCSSRules(test);  // get matched rules
var regexp = new RegExp('^#test');            // test the CSS rule explicit id
var matchedRule;
for (var i = rules.length - 1; i >= 0; i--) { // loop through rules and find the explicit one
    var rule = rules[i];
    if (rule.cssText.match(regexp)) {
        matchedRule = rule;
        break;
    }
}

// now change the rule to have a background of red, and width 20%
if (matchedRule) {
    matchedRule.style.setProperty('background-color', '#f00');
    matchedRule.style.setProperty('width', '20%');
}

1 个答案:

答案 0 :(得分:1)

我有一个类似的问题,我只是在这里写这个,以防它可以帮助别人。 对我来说,符合规则的测试是不正确的。在FireFox中,它作为selectorText运行,因为它在样式表中编写,但Chrome将所有名称转换为小写。所以这个测试在Chrome中不匹配:

if(theRules[i].selectorText == ".myRule pre"){

会在FireFox中匹配,但Chrome会将选择器文本更改为小写,因此:

.myrule pre

所以将代码更改为:

if(theRules[i].selectorText.toLowerCase() == ".codemirror pre"){

修复了问题,因此它适用于两种浏览器。顺便说一句,setProperty在Chrome 30中为我工作。我使用它的原因是因为它允许指定重要因此:

theRules[i].style.setProperty("font-size", this.editorFontSize+"px", "important");

希望这有帮助。