Shadow DOM in TypeScript
Dit artikel legt Shadow DOM in TypeScript uit.
We zullen alles zorgvuldig uitleggen, van de basis van Shadow DOM
tot het praktische gebruik ervan, en praktische voorbeeldcode aanbieden.
YouTube Video
typescript-html-shadow-dom.html
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <title>TypeScript & HTML</title>
6 <style>
7 * {
8 box-sizing: border-box;
9 }
10
11 body {
12 margin: 0;
13 padding: 1em;
14 padding-bottom: 10em;
15 font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
16 background-color: #f7f9fc;
17 color: #333;
18 line-height: 1.6;
19 }
20
21 .container {
22 max-width: 800px;
23 margin: 0 auto;
24 padding: 1em;
25 background-color: #ffffff;
26 border: 1px solid #ccc;
27 border-radius: 10px;
28 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
29 }
30
31 h1, h2 {
32 font-size: 1.2rem;
33 color: #007bff;
34 margin-top: 0.5em;
35 margin-bottom: 0.5em;
36 border-left: 5px solid #007bff;
37 padding-left: 0.6em;
38 background-color: #e9f2ff;
39 }
40
41 button {
42 display: block;
43 margin: 1em auto;
44 padding: 0.75em 1.5em;
45 font-size: 1rem;
46 background-color: #007bff;
47 color: white;
48 border: none;
49 border-radius: 6px;
50 cursor: pointer;
51 transition: background-color 0.3s ease;
52 }
53
54 button:hover {
55 background-color: #0056b3;
56 }
57
58 #output {
59 margin-top: 1em;
60 background-color: #1e1e1e;
61 color: #0f0;
62 padding: 1em;
63 border-radius: 8px;
64 min-height: 200px;
65 font-family: Consolas, monospace;
66 font-size: 0.95rem;
67 overflow-y: auto;
68 white-space: pre-wrap;
69 }
70
71 .highlight {
72 outline: 3px solid #ffc107; /* yellow border */
73 background-color: #fff8e1; /* soft yellow background */
74 transition: background-color 0.3s ease, outline 0.3s ease;
75 }
76
77 .active {
78 background-color: #28a745; /* green background */
79 color: #fff;
80 box-shadow: 0 0 10px rgba(40, 167, 69, 0.5);
81 transition: background-color 0.3s ease, box-shadow 0.3s ease;
82 }
83 </style>
84</head>
85<body>
86 <div class="container">
87 <h2>HTML Sample</h2>
88 <div id="content"></div>
89 </div>
90
91 <div class="container">
92 <h1>JavaScript Console</h1>
93 <button id="executeBtn">Execute</button>
94 <div id="output"></div>
95 </div>
96
97 <script>
98 // Override console.log to display messages in the #output element
99 (function () {
100 const originalLog = console.log;
101 console.log = function (...args) {
102 originalLog.apply(console, args);
103 const output = document.getElementById('output');
104 output.textContent += args.map(String).join(' ') + '\n';
105 };
106 })();
107
108 document.getElementById('executeBtn').addEventListener('click', () => {
109 // Prevent multiple loads
110 if (document.getElementById('externalScript')) return;
111
112 const script = document.createElement('script');
113 script.src = '/out/main.js';
114 script.id = 'externalScript';
115 //script.onload = () => console.log('typescript-html-shadow-dom.js loaded and executed.');
116 //script.onerror = () => console.log('Failed to load typescript-html-shadow-dom.js.');
117 document.body.appendChild(script);
118 });
119 </script>
120</body>
121</html>
Gedetailleerde uitleg en praktische stapsgewijze handleiding voor Shadow DOM
Shadow DOM
is een van de belangrijkste componenten van Web Components. Het creëert een ingekapselde DOM-boom die de stijl en structuur van de component scheidt van de buitenkant. Hier bieden we een gedetailleerde uitleg van de basisprincipes van Shadow DOM
tot de praktische toepassingen, samen met interactieve voorbeeldcode.
Wat is Shadow DOM
?
Shadow DOM
is een technologie volgens webstandaarden met de volgende kenmerken.
-
Inkapseling
Shadow DOM
scheidt de interne DOM-structuur van een component van de buitenkant. Andere stijlen en scripts interfereren niet, wat de herbruikbaarheid verbetert. -
Onafhankelijke stijlbereik
Stijlen binnen het
Shadow DOM
beïnvloeden geen externe CSS. Evenzo zijn externe stijlen niet van toepassing binnen hetShadow DOM
. -
Geïsoleerde DOM-boom
Shadow DOM
bestaat als een aparte boom van de reguliere DOM, met beperkte toegang vanaf de ouder-DOM.
Basisgebruik van Shadow DOM
De volgende code is het eerste voorbeeld waarin Shadow DOM
wordt gebruikt.
1class MyElement extends HTMLElement {
2 constructor() {
3 super();
4
5 // Attach Shadow DOM
6 const shadowRoot = this.attachShadow({ mode: 'open' });
7
8 // Add HTML and CSS inside Shadow DOM
9 shadowRoot.innerHTML = `
10 <style>
11 p {
12 color: blue;
13 font-size: 18px;
14 }
15 </style>
16 <p>This is inside Shadow DOM!</p>
17 `;
18 }
19}
20
21// Register the custom element
22customElements.define('my-element', MyElement);
23
24document.getElementById('content').innerHTML = `
25 <my-element></my-element>
26`;
- De browser zal de blauwe tekst weergeven: 'Dit staat in Shadow DOM!'. De stijl van deze tekst wordt niet beïnvloed door externe CSS.
Basisstappen van Shadow DOM
Om Shadow DOM
te gebruiken, zoals te zien is in deze code, gebruik je de attachShadow
-methode in JavaScript. Hieronder staan de basisstappen:.
-
Maken van aangepaste elementen Een aangepast element is een door de gebruiker gedefinieerde tag die je kunt maken naast de standaard HTML-tags. In deze stap maak je een klasse die
HTMLElement
uitbreidt, zoals de klasseMyElement
, waarmee je de browser voorbereidt om deze als een nieuw tag te herkennen. Door de gemaakte klasse te registreren metcustomElements.define()
, kun je deze als een aangepaste tag binnen HTML gebruiken. -
Verbinding maken met
Shadow DOM
Doorthis.attachShadow()
uit te voeren binnen een aangepast element, kun je eenShadow DOM
creëren. -
HTML en CSS toevoegen binnen het
Shadow DOM
Binnen deShadow DOM
kun je je eigen HTML-structuur en stijlen definiëren. Door bijvoorbeeld HTML en CSS toe te wijzen aaninnerHTML
, kun je het een onafhankelijk uiterlijk en gedrag geven zonder dat het wordt beïnvloed door externe CSS of HTML. Hiermee kun je ingekapselde componenten maken.
Modi van Shadow DOM
: open
en closed
Shadow DOM
heeft twee modi: open
en closed
.
- Open modus: De
shadowRoot
gekoppeld aan deShadow DOM
kan extern worden benaderd. - Gesloten modus: De
shadowRoot
gekoppeld aan deShadow DOM
kan niet extern worden benaderd.
Hieronder staat een codevoorbeeld dat de verschillen tussen de twee modi laat zien.
1class OpenElement extends HTMLElement {
2 constructor() {
3 super();
4 this.attachShadow({ mode: 'open' }).innerHTML = `
5 <p>Open Shadow DOM</p>
6 `;
7 }
8}
9
10class ClosedElement extends HTMLElement {
11 constructor() {
12 super();
13 this.attachShadow({ mode: 'closed' }).innerHTML = `
14 <p>Closed Shadow DOM</p>
15 `;
16 }
17}
18
19customElements.define('open-element', OpenElement);
20customElements.define('closed-element', ClosedElement);
21
22document.getElementById('content').innerHTML = `
23 <open-element></open-element>
24 <closed-element></closed-element>
25`;
26
27const openElement = document.querySelector('open-element') as OpenElement;
28console.log(openElement.shadowRoot); // ShadowRootが出力される
29
30const closedElement = document.querySelector('closed-element') as ClosedElement;
31console.log(closedElement.shadowRoot); // nullが出力される
- Kiezen voor de
closed
modus maakt deshadowRoot
eigenschap ontoegankelijk.
Stijl-encapsulatie met behulp van Shadow DOM
Met Shadow DOM
kun je stijlen volledig binnen je componenten kapselen.
Het volgende voorbeeld toont de scheiding tussen globale stijlen en stijlen binnen de Shadow DOM
.
1class StyledElement extends HTMLElement {
2 constructor() {
3 super();
4 const shadowRoot = this.attachShadow({ mode: 'open' });
5
6 shadowRoot.innerHTML = `
7 <style>
8 p {
9 background-color: lightblue;
10 padding: 10px;
11 border: 1px solid blue;
12 }
13 </style>
14 <p>Shadow DOM Styled Content</p>
15 `;
16 }
17}
18
19customElements.define('styled-element', StyledElement);
20
21document.getElementById('content').innerHTML = `
22 <style>
23 p {
24 color: red;
25 font-weight: bold;
26 }
27 </style>
28
29 <styled-element></styled-element>
30`;
p
-elementen binnen deShadow DOM
worden niet beïnvloed door globale stijlen en hebben hun eigen unieke stijlen toegepast.
Praktisch voorbeeld van Shadow DOM
: Aangepaste Tooltip
Vervolgens introduceren we een voorbeeld voor het maken van een aangepaste tooltip met behulp van Shadow DOM
.
1class Tooltip extends HTMLElement {
2 constructor() {
3 super();
4
5 const shadowRoot = this.attachShadow({ mode: 'open' });
6
7 shadowRoot.innerHTML = `
8 <style>
9 :host {
10 position: relative;
11 display: inline-block;
12 cursor: pointer;
13 }
14
15 .tooltip {
16 visibility: hidden;
17 background-color: black;
18 color: white;
19 text-align: center;
20 padding: 5px;
21 border-radius: 5px;
22 position: absolute;
23 bottom: 125%;
24 left: 50%;
25 transform: translateX(-50%);
26 white-space: nowrap;
27 }
28
29 :host(:hover) .tooltip {
30 visibility: visible;
31 }
32 </style>
33 <slot></slot>
34 <div class="tooltip">Tooltip text</div>
35 `;
36 }
37}
38
39customElements.define('custom-tooltip', Tooltip);
40
41document.getElementById('content').innerHTML = `
42 <custom-tooltip>
43 Hover over me
44 <span slot="tooltip">This is a custom tooltip!</span>
45 </custom-tooltip>
46`;
- Deze code maakt een aangepaste tooltip en toont een gestileerde tooltip bij hover.
Samenvatting
Shadow DOM
is een cruciale technologie voor Web Componenten en biedt een ingekapselde DOM- en stijlomgeving. Hier hebben we de basis van Shadow DOM
behandeld, inclusief het gebruik, de modale verschillen, stijl-encapsulatie, en praktische voorbeelden. Door hiervan gebruik te maken, kun je herbruikbare en robuuste componenten bouwen.
Je kunt het bovenstaande artikel volgen met Visual Studio Code op ons YouTube-kanaal. Bekijk ook het YouTube-kanaal.