ShadowRoot: adoptedStyleSheets property
The adoptedStyleSheets
property of the ShadowRoot
interface sets an array of constructed stylesheets to be used by the shadow DOM subtree.
Note: A constructed stylesheet is a stylesheet created programmatically using the CSSStyleSheet()
constructor (as compared to one created by a user-agent when importing a stylesheet from a script, imported using <style>
and @import
, or linked to via <link>
).
The same constructed stylesheet can be adopted by multiple ShadowRoot
instances, and by the parent document (using the Document.adoptedStyleSheets
property).
Changing an adopted stylesheet will affect all the adopting objects.
Stylesheets in the adoptedStyleSheets
property are considered along with the shadow DOM's other stylesheets.
For the purpose of determining the final computed CSS of any element, they are considered to have been added after the other stylesheets in the shadow DOM (ShadowRoot.styleSheets
).
Only stylesheets created using the CSSStyleSheet()
constructor, and from within the same parent Document
as the shadow root, may be adopted.
Value
The value is an array of CSSStyleSheet()
instances that must have been created using the CSSStyleSheet()
constructor within the context of the shadow root's parent Document
.
If the array needs to be modified, then a new array must be assigned (in-place mutations like push()
will throw an exception).
Note, however, that the CSSStyleSheet()
instances themselves can be modified, and these changes will apply wherever the stylesheet is adopted.
Examples
Adopting a stylesheet
The code below first shows a stylesheet being constructed, and then CSSStyleSheet.replaceSync()
is called to add a rule to the sheet.
js
// Create an empty "constructed" stylesheet
const sheet = new CSSStyleSheet();
// Apply a rule to the sheet
sheet.replaceSync("a { color: red; }");
We then create a ShadowRoot
and pass the sheet object to adoptedStyleSheets
inside an array.
js
// Create an element in the document and then create a shadow root:
const node = document.createElement("div");
const shadow = node.attachShadow({ mode: "open" });
//Adopt the sheet into the shadow DOM
shadow.adoptedStyleSheets = [sheet];
We can still modify the stylesheets after they have been added to the array.
Below we append a new rule to the same sheet using CSSStyleSheet.insertRule()
.
js
sheet.insertRule("* { background-color: blue; }");
// The document will now have blue background.
Append a new stylesheet
To append a stylesheet to the adoptedStyleSheets
property we have to create and assign a new array that contains both the original stylesheets in the property and the new style sheet.
This is demonstrated for our shadow root object below using spread-syntax:
js
const extraSheet = new CSSStyleSheet();
extraSheet.replaceSync("p { color: green; }");
// Combine the existing sheets and new one
shadow.adoptedStyleSheets = [...document.adoptedStyleSheets, extraSheet];
Specifications
Specification |
---|
CSS Object Model (CSSOM) # dom-documentorshadowroot-adoptedstylesheets |
Browser compatibility
BCD tables only load in the browser