使用JavaScript操作CSS

时间:2013-07-03 15:58:30

标签: javascript css

我想用JavaScript来操纵我的CSS。首先,它被认为是一个不错的小脚本,可以为我的手风琴菜单尝试不同的颜色,以及来自输入字段的不同背景/标题 - /内容 - / ...背景颜色。

我理解如何使用js获取输入值。

我了解如何使用getElementById()getElementsByClassName()getElementsByTag()getElementsByName()来操纵CSS。

现在,问题是我的CSS看起来像这样:

.accordion li > a {
  /* some css here */
}
.sub-menu li a {
/* some css here */
}
.some-class hover:a {
/* css */
}
.some-other-class > li > a.active {
/* css */
}

如何使用JavaScript更改此类样式的属性?

3 个答案:

答案 0 :(得分:3)

没有办法直接用JavaScript操作一些CSS样式。相反,您可以更改stylesheet本身的规则,如下所示:

var changeRule = function(selector, property, value) {
        var styles = document.styleSheets,
            n, sheet, rules, m, done = false;
        selector = selector.toLowerCase();
        for(n = 0; n < styles.length; n++) {
            sheet = styles[n];      
            rules = sheet.cssRules || sheet.rules;
            for(m = 0; m < rules.length; m++) {
                if (rules[m].selectorText.toLowerCase() === selector) {
                    done = true;
                    rules[m].style[property] = value;
                    break;
                }
            }
            if (done) {
                break;
            }
        }
    };
changeRule('div:hover', 'background', '#0f0');

selector必须与现有选择器完全匹配,只会忽略选择器文本与{之间的空格。

您可以开发代码来查找和更改选择器名称的部分匹配,或者只检查特定样式表而不是所有样式表。事实上,当拥有数以千计的规则的样式表时,它也相当昂贵。

使用此代码段无法操纵伪元素。

jsFiddle的现场演示。

答案 1 :(得分:1)

所有DOM元素都有一个可以通过JavaScript更改的样式对象

https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.style?redirectlocale=en-US&redirectslug=Web%2FAPI%2Felement.style

或者如果你正在使用jQuery:

http://api.jquery.com/css/

您可以定位元素并操纵其属性,但不要改变规则

如果要更改大量样式属性,常用方法是更改​​元素的类名以更改其外观。这可以使用className property完成,或者如果您使用的是jQuery:addClassremoveClass

答案 2 :(得分:0)

我用下划线实现了Teemu的答案。 http://jsfiddle.net/6pj3g/4/

var rule = _.chain(document.styleSheets)
    .map(function(sheet){return _.flatten(sheet.cssRules)})
    .flatten()
    .unique()
    .find(function(rule){ return rule && rule.selectorText && (rule.selectorText.toLowerCase() === selector.toLowerCase())})
    .value()

if (rule){
    rule.style[property] = value;
} else {
    throw 'selector not found: ' + selector;
}