è¿ç¯æç« éè¿°äºå¦ä½ä½¿ç¨ <template>
å <slot>
å
ç´ å建ä¸ä¸ªå¯ä»¥ç¨æ¥çµæ´»å¡«å
Web ç»ä»¶çå½±å DOM çæ¨¡æ¿ã
å½ä½ å¿
é¡»å¨ç½é¡µä¸å¤ç¨ç¸åçæ è®°ç»ææ¶ï¼ä½¿ç¨æç§æ¨¡æ¿è䏿¯ä¸éåä¸éå°éå¤ç¸åçç»ææ¯ææä¹çã以åä¹å¯ä»¥å®ç°è¿ä¸ç¹ï¼ä½ HTML <template>
å
ç´ ä½¿å¾è¿ä¸ªè¿ç¨æ´å ç®åãæ¤å
ç´ åå
¶å
容ä¸ä¼å¨ DOM 䏿¸²æï¼ä½ä»å¯ä½¿ç¨ JavaScript å¼ç¨å®ã
让æä»¬çä¸ä¸ªç®åç示ä¾ï¼
<template id="my-paragraph">
<p>æç段è½</p>
</template>
é¤éä½ ä½¿ç¨ JavaScript è·å对å®çå¼ç¨ï¼ç¶å使ç¨ç±»ä¼¼ä¸é¢ç代ç å°å ¶éå å° DOM ä¸ï¼å¦åå®ä¸ä¼åºç°å¨ä½ ç页é¢ä¸ï¼
let template = document.getElementById("my-paragraph");
let templateContent = template.content;
document.body.appendChild(templateContent);
è½ç¶æ¯ä¸ªç®åçä¾åï¼ä½ä½ å·²ç»å¯ä»¥å¼å§äºè§£å®æ¯å¤ä¹çæç¨äºã
å¨ Web Component ä¸ä½¿ç¨æ¨¡æ¿æ¨¡æ¿æ¬èº«å°±å¾æç¨ï¼ä½ä¸ web ç»ä»¶ä¸èµ·ä½¿ç¨æææ´å¥½ã让æä»¬å®ä¹ä¸ä¸ªå为 <my-paragraph>
ç web ç»ä»¶ï¼ä½¿ç¨æ¨¡æ¿ä½ä¸ºå
¶å½±å DOM çå
容ï¼
customElements.define(
"my-paragraph",
class extends HTMLElement {
constructor() {
super();
let template = document.getElementById("my-paragraph");
let templateContent = template.content;
const shadowRoot = this.attachShadow({ mode: "open" });
shadowRoot.appendChild(templateContent.cloneNode(true));
}
},
);
è¿éè¦æ³¨æçå
³é®ç¹æ¯ï¼æä»¬å°æ¨¡çå
容çå
éæ·»å å°éè¿ Node.cloneNode()
æ¹æ³å建çå½±åæ ¹ä¸
ç±äºæä»¬æ·»å äºæ¨¡æ¿çå
容å°å½±å DOMï¼æä»¬å¯ä»¥å¨æ¨¡æ¿ç <style>
å
ç´ ä¸å
å«ä¸äºæ ·å¼ä¿¡æ¯ï¼ç¶åå°å
¶å°è£
å¨èªå®ä¹å
ç´ ä¸ã妿åªå°å®æ·»å å°ä¸ä¸ªæ åç DOM 䏿¯ä¸èµ·ä½ç¨çã
æ¯å¦ï¼
<template id="my-paragraph">
<style>
p {
color: white;
background-color: #666;
padding: 5px;
}
</style>
<p>æç段è½</p>
</template>
ç°å¨æä»¬å°å®æ·»å å°èªå·±ç HTML ææ¡£ä¸è¯è¯çï¼
<my-paragraph></my-paragraph>
ä½¿ç¨ææ§½å¢å çµæ´»åº¦
尽管å°è¿ä¸æ¥å·²ç»æºå¥½äºï¼ä½æ¯å
ç´ ä»æ§ä¸æ¯å¾çµæ´»ãæä»¬åªè½å¨é颿¾ç¤ºä¸ç¹ææ¬ï¼çè³æ²¡ææ®éæ®µè½æ ç¾æç¨ï¼æä»¬å¯ä»¥ä½¿ç¨ <slot>
å
ç´ éè¿å£°æå¼çè¯æ³å¨æ¯ä¸ªå
ç´ å®ä¾ä¸æ¾ç¤ºä¸åçææ¬ã
ææ§½ç±å
¶ name
屿§æ è¯ï¼å¹¶ä¸å
è®¸ä½ å¨æ¨¡æ¿ä¸å®ä¹å ä½ç¬¦ï¼å½å¨æ è®°ä¸ä½¿ç¨è¯¥å
ç´ æ¶ï¼è¯¥å ä½ç¬¦å¯ä»¥å¡«å
æéçä»»ä½ HTML æ è®°çæ®µã
å æ¤ï¼å¦ææä»¬æ³æ·»å ä¸ä¸ªææ§½å°è¿ä¸ªç®åçä¾åä¸ï¼æä»¬ä¼å°æ¨¡æ¿ç段è½å ç´ æ¹æä¸é¢è¿æ ·ï¼
<p><slot name="my-text">æçé»è®¤ææ¬</slot></p>
妿卿 è®°ä¸å
å«å
ç´ æ¶æªå®ä¹ç¸å
³çææ§½å
å®¹ï¼æè
æµè§å¨ä¸æ¯æææ§½ï¼å <my-paragraph>
ä»
å
å«åå¤å
容 "æçé»è®¤ææ¬"ã
è¦å®ä¹ææ§½å
å®¹ï¼æä»¬å¨ <my-paragraph>
å
ç´ å
å
æ¬ä¸ä¸ª HTML ç»æï¼è¯¥ç»æå
·æ slot
屿§ï¼å
¶å¼çäºæä»¬è¦å¡«å
ç <slot>
ç name 屿§çå¼ãåä¹å䏿 ·ï¼å®å¯ä»¥æ¯ä½ 忬¢çä»»ä½ä¸è¥¿ï¼ä¾å¦ï¼
<my-paragraph>
<span slot="my-text">让æä»¬ä½¿ç¨ä¸äºä¸åçææ¬ï¼</span>
</my-paragraph>
æè
<my-paragraph>
<ul slot="my-text">
<li>让æä»¬ä½¿ç¨ä¸äºä¸åçææ¬ï¼</li>
<li>In a list!</li>
</ul>
</my-paragraph>
夿³¨ï¼ å¯ä»¥è¢«æå ¥å°æ§½ä¸çèç¹è¢«ç§°ä¸º Slotableï¼å·²ç»æå ¥å°æ§½ä¸çèç¹è¢«ç§°ä¸º slottedã
夿³¨ï¼ æªå½åç <slot>
å
ç´ å°å¡«å
èªå®ä¹å
ç´ ä¸ææä¸å« slot
屿§ç顶级åèç¹ãä¹å
æ¬ææ¬èç¹ã
è¿å°±æä»¬çç®åä¾åï¼å¦æä½ æ³ç»§ç»äºè§£ï¼ä½ å¯ä»¥å¨ GitHub 䏿¥çï¼å¦è§å¨çº¿è¿è¡ï¼ã
æ´æ·±å ¥ç示ä¾ä¸ºäºæ´å¥½çç»æè¿ç¯æç« ï¼æä»¬æ¥çä¸ä¸ªä¸é£ä¹å¯»å¸¸ç示ä¾ã
ä¸é¢çä¸ç»ä»£ç çæ®µå±ç¤ºäºæä»¬å¦ä½èåä½¿ç¨ <slot>
å <template>
以åä¸äº JavaScript æ¥å®ç°ï¼
<element-details>
å
ç´ ã<element-details>
å
ç´ è®¾è®¡æå¨ææ¡£ä¸ä½¿ç¨æ¶ï¼å®å°å
¶å½±åæ ¹ä¸çå
容å该å
ç´ å
é¨çå
容ç³
åå¨ä¸èµ·ââå³å
ç´ å
容ä¸ççæ®µè¢«å¡«å
å°å
ç´ å½±åæ ¹çå
·åææ§½ ä¸ã注æï¼ææ¯ä¸æ¥è®²è±ç¦» <template>
ä½¿ç¨ <slot>
乿¯å¯ä»¥çãä¾å¦ï¼<slot>
å¨ä¸ä¸ªå¸¸è§ç <div>
å
ç´ éï¼ä»ç¶æå ä½ç¬¦çç¹æ§ï¼å°±åå¨å½±å DOM ä¸ä¸æ ·ï¼è¿æ ·æä»¬è½é¿å
éè¦å
è·å模æ¿å¯¹è±¡ç content
屿§å使ç¨å®ç麻ç¦ãç¶èè¿ä¸ªç¹æ§å¨å <template>
å
ç´ ä¸æ·»å ææ§½æ¶æ´å å®ç¨ï¼å ä¸ºä½ ä¸å¤ªå¯è½åºäºä¸ä¸ªå·²æ¸²æçå
ç´ å®ä¹ä¸ä¸ªæ¨¡å¼ã
å¦å¤ï¼å°±ç®å®è¿æ²¡ææ¸²æï¼ä½¿ç¨ <template>
æ¶ï¼å®¹å¨ä½ä¸ºæ¨¡æ¿çç®çå¨è¯ä¹ä¸åºè¯¥æ¸
æ°ãèä¸ <template>
ä¸å¯ä»¥ç´æ¥æ·»å ä¸äºå¯¹è±¡ï¼å¦ <td>
ï¼å½æ·»å å° <div>
䏿¶ä¼éèã
夿³¨ï¼ ä½ å¯ä»¥å¨ element-details æ¥çè¿ä¸ªå®æ´çä¾åï¼å¦è§å¨çº¿è¿è¡ï¼ã
ä½¿ç¨ææ§½å建ä¸ä¸ªæ¨¡æ¿é¦å
ï¼æä»¬å¨ <template>
å
ç´ ä¸ä½¿ç¨ <slot>
å
ç´ æ¥å建ä¸ä¸ªæ°çâelement-details-templateâææ¡£ç段ï¼å
¶ä¸å
å«ä¸äºå
·åææ§½ï¼
<template id="element-details-template">
<style>
details {
font-family: "Open Sans Light", Helvetica, Arial;
}
.name {
font-weight: bold;
color: #217ac0;
font-size: 120%;
}
h4 {
margin: 10px 0 -8px 0;
}
h4 span {
background: #217ac0;
padding: 2px 6px 2px 6px;
}
h4 span {
border: 1px solid #cee9f9;
border-radius: 4px;
}
h4 span {
color: white;
}
.attributes {
margin-left: 22px;
font-size: 90%;
}
.attributes p {
margin-left: 16px;
font-style: italic;
}
</style>
<details>
<summary>
<span>
<code class="name"
><<slot name="element-name">NEED NAME</slot>></code
>
<i class="desc"><slot name="description">NEED DESCRIPTION</slot></i>
</span>
</summary>
<div class="attributes">
<h4><span>Attributes</span></h4>
<slot name="attributes"><p>None</p></slot>
</div>
</details>
<hr />
</template>
ä¸é¢è¿ä¸ª <template>
å
ç´ æå 个ç¹å¾ï¼
<template>
æä¸ä¸ª <style>
å
ç´ ï¼é颿ä¸äºåªè½å¨å½å <template>
ä¸åå»ºçææ¡£ç段èå´å
çæç CSS æ ·å¼
<template>
ä½¿ç¨ <slot>
åå
¶ name
屿§æ¥å建ä¸ä¸ªå
·åææ§½ï¼
<slot name="element-name">
<slot name="description">
<slot name="attributes">
<template>
å°å
·åææ§½å
è£¹å¨ <details>
å
ç´ ä¸ã
æ¥ä¸æ¥ï¼æä»¬å建ä¸ä¸ªå为 <element-details>
çæ°èªå®ä¹å
ç´ ï¼ç¶åç¨ Element.attachShadow
æ¥å°ä¸é¢éè¿ <template>
å
ç´ åå»ºçææ¡£ç段ä½ä¸ºå½±åæ ¹éå å°å®ä¸é¢ï¼è¿ä½¿ç¨äºä¸æä»¬å¨ä¹åçç®å示ä¾ä¸çå°çå®å
¨ç¸åçæ¨¡å¼ã
customElements.define(
"element-details",
class extends HTMLElement {
constructor() {
super();
var template = document.getElementById(
"element-details-template",
).content;
const shadowRoot = this.attachShadow({ mode: "open" }).appendChild(
template.cloneNode(true),
);
}
},
);
ç»åå
·åææ§½ä½¿ç¨èªå®ä¹å
ç´ <element-details>
ç°å¨è®©æä»¬æ£å¼å¨ææ¡£ä¸ä½¿ç¨ <element-details> å ç´ ï¼
<element-details>
<span slot="element-name">ææ§½</span>
<span slot="description"
>ç¨æ·å¯ä»¥ç¨èªå·±ç¼åçæ è®°å¡«å
è³ web ç»ä»¶ä¸çå ä½ç¬¦ï¼ä»èè¾¾å°ç»åä¸å DOM
æ çææã</span
>
<dl slot="attributes">
<dt>åç§°</dt>
<dd>ææ§½çåç§°</dd>
</dl>
</element-details>
<element-details>
<span slot="element-name">模æ¿</span>
<span slot="description"
>ä¸ç§ç¨äºä¿å客æ·ç«¯å
å®¹çæºå¶ï¼æ¤ç±»å
容ä¸ä¼å¨é¡µé¢å è½½æ¶åç°ï¼ä½éåå¯è½å¨è¿è¡æ¶ä½¿ç¨
JavaScript å®ä¾åã</span
>
</element-details>
å ³äºä»¥ä¸ä»£ç çæ®µï¼æ³¨æä»¥ä¸å ç¹ï¼
<element-details>
å
ç´ ï¼å®ä»¬é½ä½¿ç¨äº slot
屿§æ¥å¼ç¨å为 "element-name"
å "description"
ççå
·åææ§½ï¼å¹¶æå®ä»¬é½æ¾å¨å½±åæ ¹ä¸ã<element-details>
å
ç´ å¼ç¨äºå为 "attributes"
çå
·åææ§½ï¼è第äºä¸ª <element-details>
æ ç¾æ²¡æå¼ç¨å为 "attributes"
çå
·åææ§½ã<element-details>
å
ç´ ä¸ç <dl>
å
ç´ ä½¿ç¨å
å«åå
ç´ <dt>
å <dd>
ç <dl>
å
ç´ å¼ç¨äº "attributes"
å
·åææ§½ãå¨å®æä¹åï¼æä»¬å¨ææ¡£ä¸ç» <dl>
å <dt>
以å <dd>
å
ç´ å¢å ä¸äº CSS æ ·å¼ã
dl {
margin-left: 6px;
}
dt {
font-weight: bold;
color: #217ac0;
font-size: 110%;
}
dt {
font-family: Consolas, "Liberation Mono", Courier;
}
dd {
margin-left: 16px;
}
body {
margin-top: 47px;
}
ç»æ
æåï¼è®©æä»¬ææç代ç çæ®µç»åå¨ä¸èµ·ï¼ççæ¸²æçç»ææ¯ä»ä¹æ ·çã
å ³äºç»æè¯·æ³¨æä»¥ä¸å ç¹ï¼
<element-details>
å
ç´ å¹¶æ²¡æç´æ¥ä½¿ç¨ <details>
å
ç´ å
ç´ ï¼ä½æ¯å¨æ¸²æçæ¶å使ç¨äº <details>
å
ç´ ï¼æ¯å ä¸ºå½±åæ ¹ä½¿å¾å®ä»¬è¢«å¡«å
ã<details>
ç»æä¸ï¼<element-details>
å
ç´ å¡«å
äºå½±åæ ¹ä¸çå
·åææ§½ãæ¢è¨ä¹ï¼<element-details>
ç DOM æ åå½±åæ ¹çå
容ç»åå¨äºä¸èµ·ã<element-details>
å
ç´ ï¼Attributes æ é¢ä¼èªå¨ä»å½±åæ ¹ä¸æ·»å å°å为 "attribute"
çå
·åææ§½çåé¢ã<element-details>
å
ç´ ç <dl>
å
ç´ å°±æç¡®å¼ç¨äºå为 "attributes"
çå
·åææ§½ï¼æä»¥è¯¥ <dl>
å
ç´ çå
容å°ä¼æ¿æ¢è¯¥å
ç´ ä¸å为 "attributes"
çå
·åææ§½ã<element-details>
å
ç´ æ²¡ææ¾å¼å¼ç¨å
¶å½±åæ ¹ä¸å为 "attributes"
çå
·åææ§½ï¼æä»¥å
ç´ å
å为 "attributes"
çå
·åææ§½çå
容å°ä¼ä½¿ç¨æ¨¡æ¿ä¸é»è®¤çå
容ãRetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4