Shadow DOM may include both <style>
and <link href='…'>
tags. In the latter case, stylesheets are HTTP-cached, so they are not redownloaded for multiple components that use same template.
Lightning Link Casino. Hi Lightning Link Community! We are very sorry about the issues you have been experiencing with the game today. When you feel in the mood for a game themed on light, with appealing music to inspire you, it is time for the Lights Slot by NetEnt, with plenty of light effects around symbols. They will shine in different colors. The Wild symbols is especially light spreading, and it even has light spots circling around it. You will see lanterns on the screen.
As a general rule, local styles work only inside the shadow tree, and document styles work outside of it. But there are few exceptions.
The :host
selector allows to select the shadow host (the element containing the shadow tree).
For instance, we’re making <custom-dialog>
element that should be centered. For that we need to style the <custom-dialog>
element itself.
That’s exactly what :host
does:
The shadow host (<custom-dialog>
itself) resides in the light DOM, so it’s affected by document CSS rules.
If there’s a property styled both in :host
locally, and in the document, then the document style takes precedence.
For instance, if in the document we had:
…Then the <custom-dialog>
would be without padding.
It’s very convenient, as we can setup “default” component styles in its :host
rule, and then easily override them in the document.
The exception is when a local property is labelled !important
, for such properties, local styles take precedence.
Same as :host
, but applied only if the shadow host matches the selector
.
For example, we’d like to center the <custom-dialog>
only if it has centered
attribute:
Now the additional centering styles are only applied to the first dialog: <custom-dialog centered>
.
Same as :host
, but applied only if the shadow host or any of its ancestors in the outer document matches the selector
.
E.g. :host-context(.dark-theme)
matches only if there’s dark-theme
class on <custom-dialog>
on anywhere above it:
To summarize, we can use :host
-family of selectors to style the main element of the component, depending on the context. These styles (unless !important
) can be overridden by the document.
Now let’s consider the situation with slots.
Slotted elements come from light DOM, so they use document styles. Local styles do not affect slotted content.
In the example below, slotted <span>
is bold, as per document style, but does not take background
from the local style:
The result is bold, but not red.
If we’d like to style slotted elements in our component, there are two choices.
First, we can style the <slot>
itself and rely on CSS inheritance:
Here <p>John Smith</p>
becomes bold, because CSS inheritance is in effect between the <slot>
and its contents. But in CSS itself not all properties are inherited.
Another option is to use ::slotted(selector)
pseudo-class. It matches elements based on two conditions:
selector
.In our example, ::slotted(div)
selects exactly <div slot='username'>
, but not its children:
Please note, ::slotted
selector can’t descend any further into the slot. These selectors are invalid:
Also, ::slotted
can only be used in CSS. We can’t use it in querySelector
.
How do we style internal elements of a component from the main document?
Selectors like :host
apply rules to <custom-dialog>
element or <user-card>
, but how to style shadow DOM elements inside them?
There’s no selector that can directly affect shadow DOM styles from the document. But just as we expose methods to interact with our component, we can expose CSS variables (custom CSS properties) to style it.
Custom CSS properties exist on all levels, both in light and shadow.
For example, in shadow DOM we can use --user-card-field-color
CSS variable to style fields, and the outer document can set its value:
Then, we can declare this property in the outer document for <user-card>
:
Custom CSS properties pierce through shadow DOM, they are visible everywhere, so the inner .field
rule will make use of it.
Here’s the full example:
Shadow DOM can include styles, such as <style>
or <link>
.
Local styles can affect:
:host
-family pseudoclasses,::slotted(selector)
allows to select slotted elements themselves, but not their children.Document styles can affect:
When CSS properties conflict, normally document styles have precedence, unless the property is labelled as !important
. Then local styles have precedence.
CSS custom properties pierce through shadow DOM. They are used as “hooks” to style the component:
var(--component-name-title, <default value>)
.--component-name-title
CSS property for the shadow host or above.