::slotted()
åºçº¿
广æ³å¯ç¨
èª 2020å¹´1æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
:slotted() CSS 伪å
ç´ ç¨äºéå®é£äºè¢«æ¾å¨ HTML 模æ¿ä¸çå
ç´ ï¼æ´å¤è¯·æ¥çä½¿ç¨æ¨¡æ¿åææ§½ï¼ã
è¿ä¸ªä¼ªå ç´ éæ©å¨ä» ä» éç¨äºå½±å DOMï¼shadow DOMï¼ã请注æå®åªä¼éæ©å®é çå ç´ èç¹ï¼èä¸å æ¬ææ¬èç¹ã
å°è¯ä¸ä¸
/* This CSS is being applied inside the shadow DOM. */
::slotted(.content) {
background-color: aqua;
}
h2 ::slotted(span) {
background: silver;
}
<template id="card-template">
<div>
<h2><slot name="caption">title goes here</slot></h2>
<slot name="content">content goes here</slot>
</div>
</template>
<my-card>
<span slot="caption">Error</span>
<p class="content" slot="content">Build failed!</p>
</my-card>
customElements.define(
"my-card",
class extends HTMLElement {
constructor() {
super();
const template = document.getElementById("card-template");
const shadow = this.attachShadow({ mode: "open" });
shadow.appendChild(template.content.cloneNode(true));
const elementStyle = document.createElement("style");
elementStyle.textContent = `
div {
width: 200px;
border: 2px dotted red;
border-radius: 4px;
}`;
shadow.appendChild(elementStyle);
const cssTab = document.querySelector("#css-output");
const editorStyle = document.createElement("style");
editorStyle.textContent = cssTab.textContent;
shadow.appendChild(editorStyle);
cssTab.addEventListener("change", () => {
editorStyle.textContent = cssTab.textContent;
});
}
},
);
/* éæ©ææ§½å
容任æå
ç´ */
::slotted(*) {
font-weight: bold;
}
/* éæ©ææ§½å
çä»»æ <span> å
ç´ */
::slotted(span) {
font-weight: bold;
}
è¯æ³
::slotted(<compound-selector>) {
/* ... */
}
示ä¾
>é«äº®ææ§½å ç´
å¨ä¸é¢çä¾åä¸ï¼æä»¬ä½¿ç¨ä¸ä¸ªå¸¦æ 3 ä¸ªææ§½ç模æ¿ï¼
<template id="person-template">
<div>
<h2>Personal ID Card</h2>
<slot name="person-name">NAME MISSING</slot>
<ul>
<li><slot name="person-age">AGE MISSING</slot></li>
<li><slot name="person-occupation">OCCUPATION MISSING</slot></li>
</ul>
</div>
</template>
æä»¬å®ä¹ <person-details> èªå®ä¹å
ç´ ï¼å¨è¿ä¸ªç¤ºä¾ä¸ï¼æä»¬ä½¿ç¨ Javascript æ·»å æ ·å¼ï¼å°½ç®¡æä»¬å°å®ä»¬æ·»å å° <template> ä¸ç <style> åå¯è¾¾å°åæ ·çææã
customElements.define(
"person-details",
class extends HTMLElement {
constructor() {
super();
let template = document.getElementById("person-template");
let templateContent = template.content;
const shadowRoot = this.attachShadow({ mode: "open" });
let style = document.createElement("style");
style.textContent =
"div { padding: 10px; border: 1px solid gray; width: 200px; margin: 10px; }" +
"h2 { margin: 0 0 10px; }" +
"ul { margin: 0; }" +
"p { margin: 10px 0; }" +
"::slotted(*) { color: gray; font-family: sans-serif; } " +
"::slotted(span) {text-decoration: underline;} ";
shadowRoot.appendChild(style);
shadowRoot.appendChild(templateContent.cloneNode(true));
}
},
);
å½å¡«å
style å
ç´ çææ¶ï¼ä½ ä¼çå°æä»¬éæ©äºææææ§½å
ç´ ï¼::slotted(*)ï¼ï¼å¹¶ç»å®ä»¬ä¸åçåä½åé¢è²ãè¿å°å®ä»¬ä¸å°æªå¡«å
çææ§½åºå弿¥ãæä»¬å¯¹ææææ§½ <span>ï¼::slotted(span)ï¼è®¾ç½®æ ·å¼ï¼ä»èåºå <span>å
ç´ å <p> å
ç´ ã
æ è®°ä¸ä¸ªèªå®ä¹å
ç´ ï¼å
¶ä¸å
å«ä¸ä¸ªå
·ææ ææ§½åçèªå®ä¹å
ç´ ï¼è¯¥èªå®ä¹å
ç´ ä¸ <template> ä¸åï¼
<person-details>
<p slot="person-name">Wonder Woman</p>
<span slot="person-age">Immortal</span>
<span slot="person-occupation">Superhero</span>
</person-details>
<person-details>
<p slot="person-name">Malala Yousafzai</p>
<span slot="person-age">17</span>
<span slot="person-occupation">Activist</span>
</person-details>
<person-details>
<span slot="person-age">44</span>
<span slot="not-a-slot-name">Time traveller</span>
<p slot="person-name">Dr. Who</p>
</person-details>
ç»æ
è§è
| è§è |
|---|
| CSS Shadow Module Level 1> # slotted-pseudo> |
æµè§å¨å ¼å®¹æ§
åè§
:host:host():host-context()- CSS 忍¡å
- HTML
slot屿§ - HTML
<slot>å ç´ - HTML
<template>å ç´ - Web ç»ä»¶