I am dealing with this situation...
<template>
<slot name="thing"></slot>
<slot name="other"></slot>
</template>
and an implementation like
<custom-element>
<div slot="thing"> Thing 1 </div>
<div slot="thing"> Thing 2 </div>
<div slot="other"> Thing 3 </div>
</custom-element>
How do I use a CSS query to affect both Thing 1 & Thing 2 but excludes Thing 3?
The ::slotted() CSS pseudo-element represents any element that has been placed into a slot inside an HTML template (see Using templates and slots for more information). This only works when used inside CSS placed within a shadow DOM.
Advanced selectors refer to CSS selectors that do something more complex than selecting a tag, class, or ID. This includes selecting a type of tag within another tag, or selecting an element with a certain ID or class, but only when the mouse is hovering over it.
A compound selector is a sequence of simple selectors that are not separated by a combinator, and represents a set of simultaneous conditions on a single element. Simple selectors are all the little bits – a class, a tag, an ID, etc. Those can be combined in various ways.
<slot>: The Web Component Slot element The <slot> HTML element—part of the Web Components technology suite—is a placeholder inside a web component that you can fill with your own markup, which lets you create separate DOM trees and present them together.
In the Shadow DOM <style>
tag, you can apply CSS styles directly to the <slot>
element as @admcfajn suggeded in its second comment:
slot[name="thing"] { .. }
But if you want to target an element from the light DOM when it's inserted in the Shadow DOM through a <slot>
element, you should use the ::slotted(
) pseudo-element function.
::slotted( div[slot="thing"] ) { color: green }
will color in red the text inside the <div>
with the attribute slot="name"
.
Important: the second solution is preferred, because the CSS from the light DOM has priority. Thereforce style inherited from the light DOM will override style from the slot element. See the example with background-color
below:
customElements.define( 'custom-element', class extends HTMLElement {
constructor() {
super()
this.attachShadow( { mode: 'open' } ).innerHTML = tpl.innerHTML
}
} )
body { background-color: lightblue }
<template id=tpl>
<style>
::slotted( [slot=thing] ) { background-color: green }
slot[name="other"] { background-color: red }
</style>
<slot name="thing"></slot>
<slot name="other"></slot>
</template>
<custom-element>
<div slot="thing"> <div>Thing 1 </div></div>
<div slot="thing"> Thing 2 </div>
<div slot="other"> Thing 3 </div>
</custom-element>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With