מהו Shadow DOM?
מאמר זה מסביר מהו Shadow DOM.
YouTube Video
הבנת Shadow DOM
Shadow DOM
הוא תכונה חזקה של תקן רכיבי ווב שמאפשרת איקפסולציה של סגנונות ומבנה DOM בתוך רכיבים. תכונה זו מונעת התנגשות של סגנונות וסקריפטים בין רכיבים ובין מסמך ה-HTML הראשי.
מהו Shadow DOM
?
Shadow DOM
מספק דרך ליצור עץ DOM מוגדר ומקושר לאלמנט DOM רגיל. עץ הצל מבודד מהמסמך הכללי, כך שסגנונות וסקריפטים חיצוניים אינם משפיעים עליו, וסגנונות וסקריפטים פנימיים אינם דולפים החוצה.
לדוגמה, אם תיצור רכיב כפתור מותאם אישית באמצעות Shadow DOM
, הסגנונות שלו לא יפריעו לשאר האלמנטים בדף. באופן דומה, אלמנטים עם אותו שם מחלקה לא יתנגשו.
היתרונות של Shadow DOM
-
איקפסולציה:
Shadow DOM
מפריד בין סגנונות ופונקציונליות, ומונע קונפליקטים עם סגנונות וסקריפטים גלובליים. -
שימוש חוזר: רכיבים שנוצרו עם
Shadow DOM
יכולים לשמש בפרויקטים שונים ללא דאגה על קונפליקטים של סגנונות. -
תחזוקתיות: איקפסולציה מאפשרת לרכיבים להיות עצמאיים מבחינת לוגיקה וסגנונות, מה שמקל על ניפוי שגיאות ותחזוקה.
יצירת Shadow DOM
כדי להשתמש ב- Shadow DOM
, יש לצרף שורש צל לאלמנט HTML. הנה דוגמה פשוטה:.
1// Select the host element
2const hostElement = document.querySelector('#shadow-host');
3
4// Attach a shadow root
5const shadowRoot = hostElement.attachShadow({ mode: 'open' });
6
7// Add content to the shadow root
8shadowRoot.innerHTML = `
9 <style>
10 p {
11 color: blue;
12 font-weight: bold;
13 }
14 </style>
15 <p>This is inside the Shadow DOM!</p>
16`;
הסבר
-
אלמנט מארח: אלמנט DOM רגיל שאליו השורש הצל מצורף (במקרה זה
#shadow-host
). -
שורש הצל: שורש עץ הצל שנוצר באמצעות
attachShadow
. -
מצב: במצב
open
, JavaScript חיצוני יכול לגשת לשורש הצל דרךelement.shadowRoot
. מנגד, במצבclosed
לא מתאפשרת גישה.
עיצוב בתוך Shadow DOM
ל-Shadow DOM
יש תחום סגנון משלו. סגנונות שהוגדרו בתוך עץ ה-shadow חלים רק על האלמנטים שבתוך העץ הזה. הנה דוגמה:.
1shadowRoot.innerHTML = `
2 <style>
3 p {
4 color: green;
5 }
6 </style>
7 <p>Scoped style inside Shadow DOM.</p>
8`;
גם אם יש סגנונות מתנגשים במסמך הראשי, הפסקאות בתוך עץ ה-shadow נשארות ללא שינוי:
1<style>
2 p {
3 color: red;
4 }
5</style>
6<p>This is in the main DOM.</p>
7<div id="shadow-host"></div>
8<script>
9 // JavaScript code to create the shadow DOM
10</script>
פסקאות בתוך ה-Shadow DOM נשארות ירוקות, בעוד שפסקאות חיצוניות הן אדומות.
אירועים בתוך ה-Shadow DOM
אירועים בתוך ה-Shadow DOM
דומים לאירועים רגילים ב-DOM, אך יכולים להתנהג בצורה שונה מבחינת התפשטות עקב הקפסולציה. אירועים שמתרחשים בתוך עץ ה-shadow יכולים לעלות כלפי מעלה עד אלמנט ההוסט, אך אינם מתפשטים ישירות למסמך כולו.
הנה דוגמה:
1// Add an event listener inside Shadow DOM
2shadowRoot.innerHTML = `
3 <button id="shadow-button">Click Me</button>
4`;
5
6shadowRoot.querySelector('#shadow-button').addEventListener('click', (event) => {
7 console.log('Button clicked inside Shadow DOM');
8});
9
10// Add an event listener on the host
11hostElement.addEventListener('click', (event) => {
12 console.log('Event bubbled to the host element');
13});
כאשר לוחצים על הכפתור, שני המאזינים מופעלים, ומדגימים את ההתנהגות של התפשטות אירועים כלפי מעלה.
Slots: חלוקה של תוכן Light DOM
Slots מאפשרים להקרין תוכן מ-Light DOM אל תוך ה-Shadow DOM
. הנה דוגמה:.
1shadowRoot.innerHTML = `
2 <slot name="header"></slot>
3 <slot name="content"></slot>
4`;
במסמך הראשי, ניתן לעשות כך:
1<div id="shadow-host">
2 <h1 slot="header">Header Content</h1>
3 <p slot="content">Main Content</p>
4</div>
אלמנטי ה-slot
בתוך ה-Shadow DOM
מציגים תוכן Light DOM עם מאפיין slot
תואם.
סיום
Shadow DOM
הוא כלי חיוני לבניית רכיבים אינטרנטיים חזקים, ניתנים לשימוש חוזר וניתנים לתחזוקה. על ידי קפסולציה של סגנונות ופונקציונליות, הוא מפחית את האפשרות להתנגשויות ומפשט את ניהול בסיס הקוד.
תוכלו לעקוב אחר המאמר שלמעלה באמצעות Visual Studio Code בערוץ היוטיוב שלנו. נא לבדוק גם את ערוץ היוטיוב.