The CSSStyleSheet.insertRule() method inserts a new CSS rule into the current style sheet, with some restrictions.
Note: Although insertRule() is exclusively a method of CSSStyleSheet, it actually inserts the rule into CSSStyleSheet.cssRules — its internal CSSRuleList.
Syntax
stylesheet.insertRule(rule [, index])
Parameters
rule- A
DOMStringcontaining the rule to be inserted. What the inserted rule must contain depends on its type:
indexOptional- A positive integer less than or equal to
stylesheet.cssRules.length, representing the newly inserted rule's position inCSSStyleSheet.cssRules. The default is0. (In older implementations, this was required. See Browser compatibility for details.)
Return value
The newly inserted rule's index within the stylesheet's rule-list.
Restrictions
CSS has some intuitive and not-so-intuitive restrictions affecting where rules can be inserted. Violating them will likely raise a DOMException.
- If
index>CSSRuleList.length, the method aborts with anIndexSizeError. - If
rulecannot be inserted atindex0due to some CSS constraint, the method aborts with aHierarchyRequestError. - If more than one rule is given in the
ruleparameter, the method aborts with aSyntaxError. - If trying to insert an
@importat-rule after a style rule, the method aborts with aHierarchyRequestError. - If
ruleis@namespaceand the rule-list has more than just@importat-rules and/or@namespaceat-rules, the method aborts with anInvalidStateError.
Examples
Inserting a new rule
This snippet pushes a new rule onto the top of my stylesheet.
myStyle.insertRule('#blanc { color: white }', 0);
Function to add a stylesheet rule
/**
* Add a stylesheet rule to the document (it may be better practice
* to dynamically change classes, so style information can be kept in
* genuine stylesheets and avoid adding extra elements to the DOM).
* Note that an array is needed for declarations and rules since ECMAScript does
* not guarantee a predictable object iteration order, and since CSS is
* order-dependent.
* @param {Array} rules Accepts an array of JSON-encoded declarations
* @example
addStylesheetRules([
['h2', // Also accepts a second argument as an array of arrays instead
['color', 'red'],
['background-color', 'green', true] // 'true' for !important rules
],
['.myClass',
['background-color', 'yellow']
]
]);
*/
function addStylesheetRules (rules) {
var styleEl = document.createElement('style');
// Append <style> element to <head>
document.head.appendChild(styleEl);
// Grab style element's sheet
var styleSheet = styleEl.sheet;
for (var i = 0; i < rules.length; i++) {
var j = 1,
rule = rules[i],
selector = rule[0],
propStr = '';
// If the second argument of a rule is an array of arrays, correct our variables.
if (Array.isArray(rule[1][0])) {
rule = rule[1];
j = 0;
}
for (var pl = rule.length; j < pl; j++) {
var prop = rule[j];
propStr += prop[0] + ': ' + prop[1] + (prop[2] ? ' !important' : '') + ';\n';
}
// Insert CSS Rule
styleSheet.insertRule(selector + '{' + propStr + '}', styleSheet.cssRules.length);
}
}
Polyfill
The below polyfill will correct the input of the arguments of insertRule() to standardize them in Internet Explorer 5–8. It supplements insertRule() with a function that separates the selector from the rules before sending the arguments to the default native insertRule().
(function(Sheet_proto){
var originalInsertRule = Sheet_proto.insertRule;
if (originalInsertRule.length === 2){ // 2 mandatory arguments: (selector, rules)
Sheet_proto.insertRule = function(selectorAndRule){
// First, separate the selector from the rule
a: for (var i=0, Len=selectorAndRule.length, isEscaped=0, newCharCode=0; i !== Len; ++i) {
newCharCode = selectorAndRule.charCodeAt(i);
if (!isEscaped && (newCharCode === 123)) { // 123 = "{".charCodeAt(0)
// Secondly, find the last closing bracket
var openBracketPos = i, closeBracketPos = -1;
for (; i !== Len; ++i) {
newCharCode = selectorAndRule.charCodeAt(i);
if (!isEscaped && (newCharCode === 125)) { // 125 = "}".charCodeAt(0)
closeBracketPos = i;
}
isEscaped ^= newCharCode===92?1:isEscaped; // 92 = "\\".charCodeAt(0)
}
if (closeBracketPos === -1) break a; // No closing bracket was found!
/*else*/ return originalInsertRule.call(
this, // the sheet to be changed
selectorAndRule.substring(0, openBracketPos), // The selector
selectorAndRule.substring(closeBracketPos), // The rule
arguments[3] // The insert index
);
}
// Works by if the char code is a backslash, then isEscaped
// gets flipped (XOR-ed by 1), and if it is not a backslash
// then isEscaped gets XORed by itself, zeroing it
isEscaped ^= newCharCode===92?1:isEscaped; // 92 = "\\".charCodeAt(0)
}
// Else, there is no unescaped bracket
return originalInsertRule.call(this, selectorAndRule, "", arguments[2]);
};
}
})(CSSStyleSheet.prototype);
Specifications
| Specification | Status | Comment |
| CSS Object Model (CSSOM)The definition of 'CSSStyleSheet.insertRule' in that specification. | Working Draft | No change from Document Object Model (DOM) Level 2 Style Specification. |
| Document Object Model (DOM) Level 2 Style SpecificationThe definition of 'CSSStyleSheet.insertRule' in that specification. | Obsolete | Initial definition |
Browser compatibility
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
Update compatibility data on GitHub
| Desktop | Mobile | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
insertRule()
|
Chrome
Full support Yes |
Edge
Full support 12 |
Firefox
Full support 1 |
IE
Full support 9 |
Opera
Full support Yes |
Safari
Full support Yes |
WebView Android
Full support Yes |
Chrome Android
Full support Yes |
Firefox Android
Full support 4 |
Opera Android
Full support Yes |
Safari iOS
Full support Yes |
Samsung Internet Android
Full support Yes |
index is optional
|
Chrome
Full support 60 |
Edge
Full support ≤79 |
Firefox
Full support 55 |
IE
No support No |
Opera
Full support 47 |
Safari
? |
WebView Android
Full support 60 |
Chrome Android
Full support 60 |
Firefox Android
? |
Opera Android
Full support 44 |
Safari iOS
? |
Samsung Internet Android
Full support 8.0 |
Legend
- Full support
- Full support
- No support
- No support
- Compatibility unknown
- Compatibility unknown
Legacy browser support
To support Internet Explorer 8 and below, use: addRule(selector, rule [, index]);. Example: addRule('pre', 'font: 14px verdana'); // add rule at end
Also note the non-standard removeRule() and .rules instead of deleteRule() and .cssRules, respectively.
See also
CSSStyleSheet.insertRule() by Mozilla Contributors is licensed under CC-BY-SA 2.5.