Shadow DOM คืออะไร?
บทความนี้จะอธิบายว่า Shadow DOM คืออะไร
YouTube Video
การทำความเข้าใจกับ Shadow DOM
Shadow DOM
เป็นฟีเจอร์สำคัญของมาตรฐาน Web Components ที่ช่วยให้สามารถแคปซูลสไตล์และโครงสร้าง DOM ภายในคอมโพเนนต์ได้ ฟีเจอร์นี้ช่วยป้องกันการรบกวนระหว่างสไตล์และสคริปต์ของคอมโพเนนต์และเอกสารหลัก
Shadow DOM
คืออะไร?
Shadow DOM
ช่วยสร้างโดมที่มีขอบเขตเฉพาะ ซึ่งเชื่อมโยงกับองค์ประกอบ DOM ปกติ Shadow tree นี้ถูกแยกออกจากเอกสารโดยรวม ซึ่งสไตล์และสคริปต์ภายนอกจะไม่ส่งผลต่อมัน และสไตล์และสคริปต์ภายในก็จะไม่รั่วไหลออกไปเช่นกัน
ตัวอย่างเช่น หากคุณสร้างคอมโพเนนต์ปุ่มที่กำหนดเองโดยใช้ Shadow DOM
สไตล์ของมันจะไม่รบกวนกับองค์ประกอบอื่นบนหน้าเว็บ ในทำนองเดียวกัน องค์ประกอบที่มีชื่อคลาสเดียวกันก็จะไม่เกิดความขัดแย้งกัน
ข้อดีของ Shadow DOM
-
การแคปซูล:
Shadow DOM
แยกสไตล์และฟังก์ชันออกจากกัน ป้องกันความขัดแย้งกับสไตล์และสคริปต์แบบโกลบอล -
การใช้ซ้ำ: คอมโพเนนต์ที่สร้างด้วย
Shadow DOM
สามารถนำไปใช้ซ้ำในโปรเจกต์ต่างๆ ได้โดยไม่ต้องกังวลเรื่องความขัดแย้งของสไตล์ -
ความง่ายต่อการดูแล: การแคปซูลช่วยให้คอมโพเนนต์ถูกแยกเป็นอิสระทั้งในแง่ของตรรกะและสไตล์ ทำให้การดีบักและการดูแลง่ายขึ้น
การสร้าง Shadow DOM
ในการใช้ Shadow DOM
คุณจำเป็นต้องแนบ shadow root เข้ากับองค์ประกอบ 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 root ไว้ (ในกรณีนี้คือ
#shadow-host
) -
Shadow Root: รากของ shadow tree ที่สร้างขึ้นโดยใช้
attachShadow
-
โหมด: ในโหมด
open
JavaScript ภายนอกสามารถเข้าถึง shadow root ผ่านทางelement.shadowRoot
ในทางกลับกัน โหมดclosed
ไม่อนุญาตให้มีการเข้าถึง
การจัดสไตล์ภายใน Shadow DOM
Shadow DOM มีขอบเขตสไตล์ของตัวเอง สไตล์ที่กำหนดใน shadow tree มีผลเฉพาะกับองค์ประกอบภายใน tree นั้น นี่คือตัวอย่าง:
1shadowRoot.innerHTML = `
2 <style>
3 p {
4 color: green;
5 }
6 </style>
7 <p>Scoped style inside Shadow DOM.</p>
8`;
แม้ว่าจะมีสไตล์ที่ขัดแย้งในเอกสารหลัก แต่ย่อหน้าภายใน shadow tree จะไม่ได้รับผลกระทบ:
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 tree สามารถแพร่กระจายขึ้นไปยังโฮสต์ขององค์ประกอบได้ แต่จะไม่แพร่กระจายไปยังเอกสารทั้งหมดโดยตรง
นี่คือตัวอย่าง:
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});
เมื่อคลิกปุ่ม ตัวดักจับเหตุการณ์ทั้งสองตัวจะถูกเรียกใช้งาน แสดงการทำงานของการแพร่กระจายเหตุการณ์
สล็อต: การกระจายเนื้อหา Light DOM
สล็อตช่วยให้คุณโยงเนื้อหาจาก 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 บนช่อง YouTube ของเรา กรุณาตรวจสอบช่อง YouTube ด้วย