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);
}
}
このメソッドは3つの引数を取ります。
- セレクター[文字列]-CSSセレクター-例:'#myDiv'
空白は自動縮小され.myClass #myDiv
ます(一致し.myClass #myDiv
ます)
- ルール[CSS文字列、オブジェクト]-例(どちらでもかまいません):
{ border: "solid 3px green", color: "white" }
'border: solid 3px green; color: white'
- シート(オプション)[文字列、スタイルシート]
- 空の場合、すべてのスタイルシートがチェックされます
- 'myStyles.css'シートへの相対URLまたは絶対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