使用Shadow Dom在Web組件中封裝
Shadow Dom是創建真正封裝的Web組件的關鍵部分。它允許您從頁面的其餘部分封裝組件的內部結構(HTML,CSS和JavaScript)。這樣可以防止樣式衝突和意外的副作用。您可以通過在元素上使用attachShadow()
方法創建陰影DOM。此方法將可選的ShadowRootInit
對像作為參數,它允許您指定陰影DOM的模式。這兩種模式是:
'open'
(默認):主文檔的樣式可能會影響陰影dom,反之亦然。這提供了更大的靈活性,但減少了封裝。'closed'
:主文檔的樣式不會影響陰影DOM,反之亦然。這提供了更強的封裝,防止風格出血和意外替代。這是用Shadow dom創建Web組件的示例:
<code class="javascript">class MyComponent extends HTMLElement { constructor() { super(); this.attachShadow({ mode: 'closed' }); // Use 'open' if needed // Create internal HTML const div = document.createElement('div'); div.innerHTML = ` <style> :host { display: block; border: 1px solid black; } p { color: blue; } </style> <p>This is my component!</p> `; this.shadowRoot.appendChild(div); } } customElements.define('my-component', MyComponent);</code>
此代碼定義了自定義元素my-component
。 attachShadow()
方法創建了陰影DOM,並且內部HTML(包括樣式)被添加到其中。 :host
偽選擇器允許您為自定義元素本身設計樣式。因為我們使用了mode: 'closed'
,所以主頁的樣式不會影響該組件的外觀。
陰影DOM比其他封裝技術的好處
與其他封裝技術相比,例如使用唯一的CSS類名稱或JavaScript名稱空間,Shadow dom提供了幾個關鍵優勢:
帶有陰影圓頂的造型組件有效
Shadow dom中的樣式組件很簡單,但需要了解:host
偽選擇器和CSS範圍範圍的工作。
<style></style>
標籤直接將樣式直接嵌入組件的陰影DOM中。這可以使樣式保持本地化並防止衝突。:host
偽selector:此偽選擇器針對自定義元素本身,從而使您可以從陰影DOM內部對主機元素進行樣式。使用內部樣式表和:host
:
<code class="html"><my-component style="--my-color: red;"></my-component> <style> my-component { /* styles applied to the outside of the shadow root */ } my-component::part(my-part) { /* styles applied to a specific part inside the shadow root */ } </style></code>
<code class="javascript">class MyComponent extends HTMLElement { constructor() { super(); this.attachShadow({ mode: 'open' }); // or 'closed' this.shadowRoot.innerHTML = ` <style> :host { display: block; border: 1px solid var(--my-color, black); /* Default to black if not specified */ } p { color: blue; } </style> <p>This is my component!</p> `; } }</code>
此示例演示瞭如何使用CSS變量( --my-color
)從外部自定義邊框顏色。默認顏色是黑色的。
從外部訪問和操縱陰影元素
通常不建議您直接訪問和操縱陰影DOM內的元素,因為它會破壞封裝並可能導致脆弱的代碼。但是,在某些情況下可能有必要。這裡有幾種方法:
querySelector
和querySelectorAll
:如果您知道陰影DOM中元素的選擇器,則可以使用這些方法訪問它。但是,這很脆弱,因為內部結構的變化可能會破壞您的代碼。需要在shadowRoot
屬性上調用querySelector
方法。shadowRoot
屬性:如果您有對自定義元素的引用,則可以訪問其shadowRoot
屬性以穿越陰影DOM。使用querySelector
訪問元素的示例:
<code class="javascript">const myComponent = document.querySelector('my-component'); const paragraph = myComponent.shadowRoot.querySelector('p'); paragraph.textContent = 'This text has been changed from the outside!';</code>
此示例直接訪問陰影DOM中的<p></p>
元素。但是,這通常是灰心的。最好在MyComponent
類中公開一種方法,該方法允許以受控且可維護的方式更新文本。例如:
<code class="javascript">class MyComponent extends HTMLElement { // ... (constructor as before) ... set textContent(newText) { this.shadowRoot.querySelector('p').textContent = newText; } }</code>
現在,您可以使用: myComponent.textContent = "New text";
這種方法保持封裝並使您的代碼更加穩健。
以上是如何使用Shadow dom封裝Web組件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!