ã¿ããã¡ãã¥ã¼ãã¤ã¡ã¼ã¸ã®ã£ã©ãªã¼ãªã©å¤ãã®ã³ã³ãã¼ãã³ãã¯ã¬ã³ããªã³ã°ããã®ã«ã³ã³ãã³ããå¿ è¦ã¨ãã¾ãã
çµã¿è¾¼ã¿ã®ãã©ã¦ã¶ã® <select> ã <option> é
ç®ãæå¾
ããããã«ãç¬èªã«ä½ã£ã <custom-tabs> ãå®éã®ã¿ãã³ã³ãã³ããæ¸¡ããããã¨ãæå¾
ãããã¨ãããã¾ãã
<custom-menu> ã使ç¨ããã³ã¼ãã¯æ¬¡ã®ããã«ãªãã¾ã:
<custom-menu>
<title>Candy menu</title>
<item>Lollipop</item>
<item>Fruit Toast</item>
<item>Cup Cake</item>
</custom-menu>
â¦ããã¦ããã®ã³ã³ãã¼ãã³ãã¯ã¿ã¤ãã«ã¨ã¢ã¤ãã ãæã¤ã¡ãã¥ã¼ã¨ãã¦è¡¨ç¤ºããããã¤ã¡ãã¥ã¼ã¤ãã³ããå¦çãããªã©é©åã«ã¬ã³ããªã³ã°ã§ããå¿ è¦ããããã¾ãã
ã©ããã£ã¦å®è£ ããã®ã§ãããï¼
è¦ç´ ã®å 容ãåæããDOM ãã¼ããåçã«ã³ãã¼/åé ç½®ãããã¨ãã§ãã¾ãããã ãå¯è½ã§ã¯ããã¾ããè¦ç´ ã shadow DOM ã«ç§»åãã¦ããå ´åãããã¥ã¡ã³ãã® CSS ã¹ã¿ã¤ã«ã¯é©ç¨ãããªãããè¦è¦çãªã¹ã¿ã¤ã«ã失ãããå¯è½æ§ãããã¾ããã¾ããããç¨åº¦ã³ã¼ãã£ã³ã°ãå¿ è¦ã«ãªãã¾ãã
幸ããªãã¨ã«ããã®ãããªãã¨ãããå¿
è¦ã¯ããã¾ãããShadow DOM 㯠<slot> è¦ç´ ããµãã¼ããã¦ãã¾ãããã㯠Light DOM ã®ã³ã³ãã³ããèªåçã«æ¿å
¥ãã¦ããã¾ãã
ååä»ãã¹ããã
ç°¡åãªä¾ã§ slot(ã¹ããã)ãã©ã®ããã«åãã確èªãã¾ãããã
ããã«ãã <user-card> Shadow DOM 㯠Light DOM ã§åãããã2ã¤ã®ã¹ããããæä¾ãã¾ãã:
<script>
customElements.define('user-card', class extends HTMLElement {
connectedCallback() {
this.attachShadow({mode: 'open'});
this.shadowRoot.innerHTML = `
<div>Name:
<slot name="username"></slot>
</div>
<div>Birthday:
<slot name="birthday"></slot>
</div>
`;
}
});
</script>
<user-card>
<span slot="username">John Smith</span>
<span slot="birthday">01.01.2001</span>
</user-card>
Shadow DOM ã§ã¯ã<slot name="X"> ã§ âæ¿å
¥ä½ç½®â (slot="X" ãæã¤è¦ç´ ãã¬ã³ããªã³ã°ãããå ´æ)ãå®ç¾©ãã¾ãã
次ã«ããã©ã¦ã¶ã¯ âã³ã³ãã¸ã·ã§ã³(composition)â ãå®è¡ãã¾ã: Light DOM ããè¦ç´ ãåå¾ããShadow DOM ã®å¯¾å¿ããã¹ãããã«ã¬ã³ããªã³ã°ãã¦ããã¾ããæå¾ã«ãã¼ã¿ãæ¿å ¥ãããã³ã³ãã¼ãã³ãã«ãªãã¾ãã
ããã¯ã¹ã¯ãªããå¾ã® DOM æ§é ã§ããã³ã³ãã¸ã·ã§ã³ã¯èæ ®ããã¦ãã¾ããã:
<user-card>
#shadow-root
<div>Name:
<slot name="username"></slot>
</div>
<div>Birthday:
<slot name="birthday"></slot>
</div>
<span slot="username">John Smith</span>
<span slot="birthday">01.01.2001</span>
</user-card>
Shadow DOM ã使ããã®ã§ã#shadow-root ã®ä¸ã«ãããããã¾ããä»ãè¦ç´ ã«ã¯ Light DOM 㨠Shadow DOM 両æ¹ãããã¾ãã
ã¬ã³ããªã³ã°ããããã«ãShadow DOM å
ã®å <slot name="..."> ã«å¯¾ãã¦ããã©ã¦ã¶ã¯ Light DOM ã«åãååãã㤠slot="..." ãæ¢ãã¾ãããããã®è¦ç´ ãã¹ãããå
ã§ã¬ã³ããªã³ã°ããã¾ãã:
çµæã¯ âflattenedâ DOM(ãã©ããåããã DOM ããªã¼)ã¨å¼ã°ãã¾ã:
<user-card>
#shadow-root
<div>Name:
<slot name="username">
<!-- ã¹ããã対象ã®è¦ç´ ã¯ã¹ãããå
ã«æ¿å
¥ããã¾ã -->
<span slot="username">John Smith</span>
</slot>
</div>
<div>Birthday:
<slot name="birthday">
<span slot="birthday">01.01.2001</span>
</slot>
</div>
</user-card>
â¦ã§ããããã©ããåããã DOM ã¯ã¬ã³ããªã³ã°ã¨ã¤ãã³ãå¦çã®ç®çã§ã®ã¿åå¨ãã¾ããããã¯ä¸ç¨®ã® âä»®æ³â ã§ãããã©ã®ããã«è¦ãããã示ãã¦ãã¾ãããããã¥ã¡ã³ãå ã®ãã¼ãã¯å®éã«ã¯ç§»åãã¦ãã¾ãã!
querySelector ãå®è¡ãããã¨ã§ç°¡åã«ç¢ºèªãã§ãã¾ã: ãã¼ãã¯ä¾ç¶ã¨ãã¦åãå ´æã«ããã¾ãã
// `<user-card>` ã®ä¸ã«ãã light DOM <span> ãã¼ãã¯ã¾ã åãå ´æã«ãã¾ã
alert( document.querySelector('user-card span').length ); // 2
ãããã£ã¦ããã©ããåããã DOM ã¯ã¹ããããæ¿å ¥ãããã¨ã§ Shadow DOM ããæ´¾çãã¦ãã¾ãããã©ã¦ã¶ã¯ãããã¬ã³ããªã³ã°ããã¹ã¿ã¤ã«ã®ç¶æ¿ãã¤ãã³ãã®ä¼æ¬(詳細ã¯å¾ã»ã©)ã«ä½¿ç¨ãã¾ããã§ãããJavaScript ã¯ä¾ç¶ã¨ãã¦ãã©ããåããåã®ããã¥ã¡ã³ã âãã®ã¾ã¾â ãè¦ã¦ãã¾ãã
slot="..." 屿§ã¯ã·ã£ãã¦ãã¹ã(ä¸ã®ä¾ã§è¨ã㨠<user-card> è¦ç´ )ã®ç´æ¥ã®åã«å¯¾ãã¦ã®ã¿æå¹ã§ãããã¹ããããè¦ç´ ã«å¯¾ãã¦ã¯ç¡è¦ããã¾ãã
ä¾ãã°ãããã§ã¯2ã¤ç®ã® <span> ã¯ç¡è¦ããã¾ã(<user-card> ã®æä¸ä½ã®åã§ã¯ãªããã):
<user-card>
<span slot="username">John Smith</span>
<div>
<!-- ç¡å¹ãªã¹ããã, user-card ã®ç´æ¥ã®åã§ããå¿
è¦ãããã¾ã -->
<span slot="birthday">01.01.2001</span>
</div>
</user-card>
Light DOM ã«åãã¹ãããåãæã¤è¤æ°ã®è¦ç´ ãããå ´åããããã¯é ã ã«ã¹ãããã«è¿½å ããã¾ãã
ä¾ãã°ãã®å ´å:
<user-card>
<span slot="username">John</span>
<span slot="username">Smith</span>
</user-card>
<slot name="username"> ã«2ã¤ã®è¦ç´ ãæã¤ãã©ããåããã DOM ã«ãªãã¾ã:
<user-card>
#shadow-root
<div>Name:
<slot name="username">
<span slot="username">John</span>
<span slot="username">Smith</span>
</slot>
</div>
<div>Birthday:
<slot name="birthday"></slot>
</div>
</user-card>
ã¹ããã ãã©ã¼ã«ããã¯ã³ã³ãã³ã
<slot> ã®ä¸ã«ä½ããç½®ãã¨ãããããã©ã¼ã«ããã¯ã¨ãªããâããã©ã«ãâ ã®ã³ã³ãã³ãã«ãªãã¾ãããã©ã¦ã¶ã¯ Light DOM ã«å¯¾å¿ãããã®ããªãå ´åããã表示ãã¾ãã
ä¾ãã°ããã® Shadow DOM ã§ã¯ãLight DOM ã« slot="username" ããªããã°ãAnonymous ãã¬ã³ããªã³ã°ãã¾ãã
<div>Name:
<slot name="username">Anonymous</slot>
</div>
ããã©ã«ãã¹ããã: æåã®ååã®ãªãã¹ããã
Shadow DOM å
ã®ãååãæããªãæåã® <slot> ã âããã©ã«ãâ ã¹ãããã§ããLight DOM ã§ã©ãã«ãã¹ãããããã¦ããªãã¹ã¦ã®ãã¼ããåå¾ãã¾ãã
ä¾ãã°ãã¦ã¼ã¶ã«é¢ãããã¹ã¦ã®ã¹ããããªãæ
å ±ã表示ããããã©ã«ãã¹ãããã <user-card> ã«è¿½å ãã¾ããã:
<script>
customElements.define('user-card', class extends HTMLElement {
connectedCallback() {
this.attachShadow({mode: 'open'});
this.shadowRoot.innerHTML = `
<div>Name:
<slot name="username"></slot>
</div>
<div>Birthday:
<slot name="birthday"></slot>
</div>
<fieldset>
<legend>Other information</legend>
<slot></slot>
</fieldset>
`;
}
});
</script>
<user-card>
<div>I like to swim.</div>
<span slot="username">John Smith</span>
<span slot="birthday">01.01.2001</span>
<div>...And play volleyball too!</div>
</user-card>
ãã¹ã¦ã®ã¹ããããªãã® Light DOM ã®ã³ã³ãã³ã㯠âOther informationâ ã®ãã£ã¼ã«ãã»ããã«å ¥ãã¾ãã
è¦ç´ ã¯ã¹ãããã«æ¬¡ã ã«è¿½å ãããã®ã§ãã¹ããããªãã®æ å ±ã¯ä¸¡æ¹ã¨ãããã©ã«ãã¹ãããã«ãªãã¾ãã
ãã©ããåããã DOM ã¯ãã®ããã«ãªãã¾ã:
<user-card>
#shadow-root
<div>Name:
<slot name="username">
<span slot="username">John Smith</span>
</slot>
</div>
<div>Birthday:
<slot name="birthday">
<span slot="birthday">01.01.2001</span>
</slot>
</div>
<fieldset>
<legend>About me</legend>
<slot>
<div>I like to swim.</div>
<div>...And play volleyball too!</div>
</slot>
</fieldset>
</user-card>
ã¡ãã¥ã¼ä¾
ã§ã¯ãã®ãã£ãã¿ã¼ã®åé ã§è¨åãã <custom-menu> ã«æ»ãã¾ãããã
è¦ç´ ãé ç½®ããã®ã«ã¹ãããã使ãã¾ãã
ãã㯠<custom-menu> ã®ãã¼ã¯ã¢ããã§ã:
<custom-menu>
<span slot="title">Candy menu</span>
<li slot="item">Lollipop</li>
<li slot="item">Fruit Toast</li>
<li slot="item">Cup Cake</li>
</custom-menu>
ããã¯é©åãªã¹ããããæã¤ Shadow DOM ãã³ãã¬ã¼ãã§ã:
<template id="tmpl">
<style> /* menu styles */ </style>
<div class="menu">
<slot name="title"></slot>
<ul><slot name="item"></slot></ul>
</div>
</template>
<span slot="title">ã¯<slot name="title">ã«å ¥ãã¾ãã- è¤æ°ã®
<li slot="item">ãããã¾ããããã³ãã¬ã¼ãã«ã¯<slot name="item">ã1ã¤ã ãã§ãããã®ããããã¹ã¦ã®<li slot="item">ã¯<slot name="item">ã«é ã«è¿½å ããããªã¹ããå½¢æãã¾ãã
ãã©ããåããã DOM ã¯æ¬¡ã®ããã«ãªãã¾ã:
<custom-menu>
#shadow-root
<style> /* menu styles */ </style>
<div class="menu">
<slot name="title">
<span slot="title">Candy menu</span>
</slot>
<ul>
<slot name="item">
<li slot="item">Lollipop</li>
<li slot="item">Fruit Toast</li>
<li slot="item">Cup Cake</li>
</slot>
</ul>
</div>
</custom-menu>
1ç¹ããæ°ã¥ãããããã¾ããããæå¹ãª DOM ã§ã¯ <li> 㯠<ul> ã®ç´æ¥ã®åã§ãªããã°ãªãã¾ãããã§ãããããã¯ãã©ããåããã DOM ã§ããã³ã³ãã¼ãã³ããã©ã®ããã«ã¬ã³ããªã³ã°ããããã説æãã¦ãã¾ããããã§ã¯ãã®ãããªãã¨ã¯èªç¶ã¨èµ·ããã¾ãã
ä¸è¦§ã®ãªã¼ãã³/ã¯ãã¼ãºã®ããã® click ãã³ãã©ã®è¿½å ãå¿
è¦ã§ããããã§ <custom-menu> ã¯æºåã§ãã¾ãã:
customElements.define('custom-menu', class extends HTMLElement {
connectedCallback() {
this.attachShadow({mode: 'open'});
// tmpl 㯠shadow DOM ãã³ãã¬ã¼ãã§ã (ä¸è¨)
this.shadowRoot.append( tmpl.content.cloneNode(true) );
// light DOM ãã¼ãã鏿ãããã¨ã¯ã§ããªãã®ã§ãã¹ãããä¸ã®ã¯ãªãã¯ãå¦çãã¾ããã
this.shadowRoot.querySelector('slot[name="title"]').onclick = () => {
// ã¡ãã¥ã¼ã®ãªã¼ãã³/ã¯ãã¼ãº
this.shadowRoot.querySelector('.menu').classList.toggle('closed');
};
}
});
ããã¯å®å ¨ãªãã¢ã§ã:
ãã¡ãããããããããã«æ©è½ã追å ãããã¨ãå¯è½ã§ã: ã¤ãã³ããã¡ã½ãããªã©ã
ã¹ãããã®æ´æ°
å¤é¨ã®ã³ã¼ããåçã«ã¡ãã¥ã¼é ç®ã追å /åé¤ãããå ´åã¯ã©ã®ããã«ãªãã§ããããï¼
ãã©ã¦ã¶ã¯ã¹ããããç£è¦ããã¹ãããè¦ç´ ã追å /åé¤ãããã¨ã¬ã³ããªã³ã°ãæ´æ°ãã¾ãã
ã¾ããlight DOM ãã¼ãã¯ã³ãã¼ã§ã¯ãªããåã«ã¹ãããã«ã¬ã³ããªã³ã°ãããã ããªã®ã§ããã®å é¨ã§ã®å¤æ´ã¯ããã«è¦ãã¾ãã
ãããã£ã¦ãã¬ã³ããªã³ã°ãæ´æ°ããããã«å¿
è¦ãªãã¨ã¯ããã¾ãããã§ãããã³ã³ãã¼ãã³ãã®ã³ã¼ããã¹ãããã®å¤æ´ãç¥ãããå ´åã«ã¯ slotchange ã¤ãã³ããå©ç¨ã§ãã¾ãã
ä¾ãã°ãããã§ã¯1ç§å¾ã¡ãã¥ã¼é ç®ãæ¿å ¥ããã2ç§å¾ã«ã¿ã¤ãã«ãå¤ããã¾ãã:
<custom-menu id="menu">
<span slot="title">Candy menu</span>
</custom-menu>
<script>
customElements.define('custom-menu', class extends HTMLElement {
connectedCallback() {
this.attachShadow({mode: 'open'});
this.shadowRoot.innerHTML = `<div class="menu">
<slot name="title"></slot>
<ul><slot name="item"></slot></ul>
</div>`;
// shadowRoot ã¯ã¤ãã³ããã³ãã©ãæããªããããæåã®åãå©ç¨ãã¾ã
this.shadowRoot.firstElementChild.addEventListener('slotchange',
e => alert("slotchange: " + e.target.name)
);
}
});
setTimeout(() => {
menu.insertAdjacentHTML('beforeEnd', '<li slot="item">Lollipop</li>')
}, 1000);
setTimeout(() => {
menu.querySelector('[slot="title"]').innerHTML = "New menu";
}, 2000);
</script>
ã¡ãã¥ã¼ã®ã¬ã³ããªã³ã°ã¯æã ã®ä»å ¥ãªãã§æ¯åæ´æ°ããã¾ãã
ããã§ã¯ 2ã¤ã® slotchange ã¤ãã³ããããã¾ã:
-
åæå:
light DOM ããã®
slot="title"ã対å¿ããã¹ãããã«å ¥ãã¨ãslotchange: titleãç´ã¡ã«ããªã¬ã¼ããã¾ãã -
ï¼ç§å¾:
<li slot="item">ã追å ãããã¨ãã«slotchange: itemãããªã¼ãããã¾ãã
注æãã¦ãã ãã: 2ç§å¾ã« slot="title" ã®ä¸èº«ã夿´ãããã¨ã slotchange ã¤ãã³ãã¯çºçãã¾ãããããã¯ã¹ãããã®å¤æ´ããªãããã§ããã¹ãããè¦ç´ å
ã®ã³ã³ãã³ãã夿´ãã¦ãã¾ãããããã°å¥ã®ãã¨ã§ãã
JavaScript ã§ light DOM ã®å é¨ã®å¤æ´ã追跡ãããå ´åã¯ãããä¸è¬çãªä»çµã¿ãå©ç¨ãããã¨ã§å¯è½ã§ã: MutationObserver.
Slot API
æå¾ã«ãã¹ãããã«é¢é£ãã JavaScript ã¡ã½ããã«è§¦ãã¾ãããã
以åè¦ãããã«ãJavaScript ã¯ãã©ããåãããã¨ãªã âå®éã® DOMâ ãè¦ã¾ããã§ãããshadow ããªã¼ã {mode: 'open'} ã®å ´åãã©ã®è¦ç´ ãã¹ãããã«å²ãå½ã¦ããã¦ããããã¾ãéã«ã©ã®ã¹ãããã«è¦ç´ ãå²ãå½ã¦ããã¦ããã®ããææ¡ãããã¨ãã§ãã¾ãã:
node.assignedSlotânodeãå²ãå½ã¦ããã¦ãã<slot>è¦ç´ ãè¿ãã¾ããslot.assignedNodes({flatten: true/false})â ã¹ãããã¸å²ãå½ã¦ããã¦ãã DOM ãã¼ããè¿ãã¾ããflattenãªãã·ã§ã³ã¯ããã©ã«ãã¯falseã§ããæç¤ºçã«trueã«è¨å®ããå ´åããã©ããåããã DOM ãããæ·±ã調ã¹ããã¹ããããã³ã³ãã¼ãã³ãã®å ´åã¯ãã¹ããããã¹ããããè¿ãããã¼ããå²ãå½ã¦ããã¦ããªãå ´åã«ã¯ãã©ã¼ã«ããã¯ã³ã³ãã³ããè¿ãã¾ããslot.assignedElements({flatten: true/false})â ã¹ãããã¸å²ãå½ã¦ããã¦ãã DOM è¦ç´ ãè¿ãã¾ãã(è¦ç´ ãã¼ãã«å¯¾ãã¦ä¸è¨ã¨åãåä½ããã¾ã)ã
ãããã®ã¡ã½ããã¯ãåã«ã¹ãããã³ã³ãã³ãã表示ããã ãã§ã¯ãªããJavaScript ã§ããã追跡ããå¿ è¦ãããã¨ãã«å½¹ç«ã¡ã¾ãã
ä¾ãã°ã<custom-menu> ã³ã³ãã¼ãã³ãã表示å
容ãç¥ãããå ´åãslotchange ã追跡ããããã§ slot.assignedElements ããããã¨ã§é
ç®ãåå¾ãããã¨ãã§ãã¾ã:
<custom-menu id="menu">
<span slot="title">Candy menu</span>
<li slot="item">Lollipop</li>
<li slot="item">Fruit Toast</li>
</custom-menu>
<script>
customElements.define('custom-menu', class extends HTMLElement {
items = []
connectedCallback() {
this.attachShadow({mode: 'open'});
this.shadowRoot.innerHTML = `<div class="menu">
<slot name="title"></slot>
<ul><slot name="item"></slot></ul>
</div>`;
// slottable is added/removed/replaced
this.shadowRoot.firstElementChild.addEventListener('slotchange', e => {
let slot = e.target;
if (slot.name == 'item') {
this.items = slot.assignedElements().map(elem => elem.textContent);
alert("Items: " + this.items);
}
});
}
});
// items ã1ç§å¾ã«æ´æ°ãã¾ã
setTimeout(() => {
menu.insertAdjacentHTML('beforeEnd', '<li slot="item">Cup Cake</li>')
}, 1000);
</script>
ãµããª
é常ãè¦ç´ ã« shadow DOM ãããå ´åããã® light DOM ã¯è¡¨ç¤ºããã¾ãããã¹ãããã使ç¨ãããã¨ã§ã shadow DOM ã®ç¹å®ã®ä½ç½®ã« light DOM ã®è¦ç´ ã表示ãããã¨ãã§ãã¾ãã
ï¼ç¨®é¡ã®ã¹ããããããã¾ã:
- ååä»ãã¹ããã:
<slot name="X">...</slot>ã¯slot="X"ãæã¤ light DOM ã®åãåå¾ãã¾ãã - ããã©ã«ãã¹ããã: ååãªãã®æåã®
<slot>(å¾ç¶ã®ååã®ãªãã¹ãããã¯ç¡è¦ããã¾ã)ã¯ã¹ãããã®ãªã light ã®åãåå¾ãã¾ãã - åãã¹ãããã«å¯¾ãã¦è¤æ°ã®è¦ç´ ãããå ´åããããã¯é ã«è¿½å ããã¾ãã
<slot>è¦ç´ ã®ã³ã³ãã³ãã¯ãã©ã¼ã«ããã¯ã¨ãã¦ä½¿ç¨ããã¾ãããã®ã¹ãããã«å¯¾å¿ãã light ã®åããªãå ´åã«è¡¨ç¤ºããã¾ãã
ã¹ãããå ã®ã¹ããããããè¦ç´ ãã¬ã³ããªã³ã°ããããã»ã¹ã¯ âã³ã³ãã¸ã·ã§ã³(composition)â ã¨å¼ã°ãã¾ããçµæã¯ãâãã©ããåããã DOM (flattened DOM)â ã¨å¼ã°ãã¾ãã
ã³ã³ãã¸ã·ã§ã³ã¯å®éã«ã¯ãã¼ãã¯ç§»åããã¦ããããJavaScript ããè¦ã㨠DOM ã¯ä¾ç¶ã¨ãã¦åãã¾ã¾ã§ãã
JavaScript ã¯æ¬¡ã®ã¡ã½ããã使ç¨ãã¦ã¹ãããã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ã:
slot.assignedNodes/Elements()âslotå ã®ãã¼ã/è¦ç´ ããè¿ãã¾ããnode.assignedSlotâ ä¸ã¨ã¯éã§ãã¼ãã«ããã¹ããããè¿ãã¾ãã
表示ããã¦ãããã®ãç¥ãããå ´åãæ¬¡ãå©ç¨ãã¦ã¹ãããã®ã³ã³ãã³ãã追跡ãããã¨ãã§ãã¾ã:
slotchangeã¤ãã³ã â ã¹ããããæåã«åããããã¨ããããã³ã¹ãããè¦ç´ ã«å¯¾ãã追å /åé¤/ç½®ææä½ã§ããªã¬ã¼ããã¾ãããããã®åã§ã¯ããã¾ããã ã¹ãããã¯event.targetã§ãã- MutationObserver ã¹ãããã®ã³ã³ãã³ããããæ·±ã調ã¹ã¦ããã®ä¸ã®å¤æ´ãç£è¦ãã¾ãã
ããã§ shadow DOM ã§ light DOM ã®è¦ç´ ã表示ããæ¹æ³ãããã£ãã®ã§ãããããé©åã«ã¹ã¿ã¤ã«ããæ¹æ³ãè¦ã¦ã¿ã¾ããããåºæ¬çãªã«ã¼ã«ã¯ãshadow è¦ç´ ã¯å å´ã§ãlight è¦ç´ 㯠â å¤å´ã§ã¹ã¿ã¤ã«ããã¾ãããä¾å¤ãããã¾ãã
詳細ã«ã¤ãã¦ã¯ã次ã®ãã£ãã¿ã¼ã§èª¬æãã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã