2020年
这种方法的一些优点:
- 不需要(但允许)指定样式表。
- 允许一次添加/修改多种样式
- 接受
!important
属性
- 匹配 CSS 选择器时忽略额外的空格
- 更改最后匹配的现有规则,或附加到最后匹配的样式表的末尾。(其他答案添加/更改可能会被否决的第一条规则。)
用法:
adjustCSSRules('#myDiv', 'width: 300px !important');
方法:
function adjustCSSRules(selector, props, sheets){
// get stylesheet(s)
if (!sheets) sheets = [...document.styleSheets];
else if (sheets.sup){ // sheets is a string
let absoluteURL = new URL(sheets, document.baseURI).href;
sheets = [...document.styleSheets].filter(i => i.href == absoluteURL);
}
else sheets = [sheets]; // sheets is a stylesheet
// CSS (& HTML) reduce spaces in selector to one.
selector = selector.replace(/\s+/g, ' ');
const findRule = s => [...s.cssRules].reverse().find(i => i.selectorText == selector)
let rule = sheets.map(findRule).filter(i=>i).pop()
const propsArr = props.sup
? props.split(/\s*;\s*/).map(i => i.split(/\s*:\s*/)) // from string
: Object.entries(props); // from Object
if (rule) for (let [prop, val] of propsArr){
// rule.style[prop] = val; is against the spec, and does not support !important.
rule.style.setProperty(prop, ...val.split(/ *!(?=important)/));
}
else {
sheet = sheets.pop();
if (!props.sup) props = propsArr.reduce((str, [k, v]) => `${str}; ${k}: ${v}`, '');
sheet.insertRule(`${selector} { ${props} }`, sheet.cssRules.length);
}
}
该方法接受三个参数:
- 选择器 [String] - CSS 选择器 - 例如:'#myDiv'
空格是自动减少的(.myClass #myDiv
将匹配.myClass #myDiv
)
- 规则 [CSS 字符串,对象] - 例如(两者都可以接受):
{ border: "solid 3px green", color: "white" }
'border: solid 3px green; color: white'
- 表(可选)[字符串,样式表]
- 如果为空,将检查所有样式表
- 'myStyles.css' 工作表的相对或绝对 URL
document.styleSheets[1]
- 对工作表的引用
其他例子:
adjustCSSRules('#myDiv', {width: '30px'}); // all stylesheets
adjustCSSRules('#myDiv', 'width: 30px', 'style.css'); // style.css only
adjustCSSRules('#myDiv .myClass', 'width: 30px', document.styleSheets[0]); // only first stylesheet