在此範例中,我們定義了一個新的自訂元素 。在其建構函式中,我們使用 this.attachShadow({ mode: 'open' }) 附加一個影子根,然後向其附加一些內容。影子根中定義的樣式與文件的其餘部分隔離。

Shadow DOM 模式

在創建影子根時,可以指定其模式為開放或封閉。

封閉模式範例

const shadow = this.attachShadow({ mode: \\'closed\\' });

在此模式下,無法從元件外部存取影子,增加了額外的保護層。

Shadow DOM 樣式

您可以直接在 Shadow DOM 中定義樣式。這些樣式僅適用於影子樹中的內容。

const style = document.createElement(\\'style\\');style.textContent = `    div {        font-size: 20px;        color: red;    }`;shadow.appendChild(style);

透過將

」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 理解 Shadow DOM:封裝 Web 元件的關鍵

理解 Shadow DOM:封裝 Web 元件的關鍵

發佈於2024-11-07
瀏覽:919

Understanding Shadow DOM: The Key to Encapsulated Web Components

在現代 Web 開發中,創建可重複使用和可維護的元件至關重要。 Shadow DOM 是 Web 元件標準的一部分,在實現這一目標方面發揮著至關重要的作用。本文深入探討了 Shadow DOM 的概念、它的優點以及如何在您的專案中有效地使用它。

什麼是 Shadow DOM?

Shadow DOM 是一種可讓您將 DOM 和 CSS 的一部分封裝在 Web 元件內的技術,確保其與文件的其餘部分隔離。這種封裝可以防止樣式和腳本洩漏或洩漏,從而更容易建立模組化和可維護的組件。

Shadow DOM 的關鍵概念

  1. Shadow Tree:附加到 Web 元件的獨立、隱藏的 DOM 樹。
  2. Shadow Root:影子樹的根節點。
  3. Shadow Host:託管影子樹的常規 DOM 元素。
  4. Shadow Boundary:影子樹與常規 DOM 之間的邊界。

Shadow DOM 的優點

1. 封裝

Shadow DOM 在元件的內部結構和應用程式的其餘部分之間提供了清晰的分離。這種封裝有助於防止樣式和行為衝突,使您的元件更可預測且更易於維護。

2. 風格隔離

使用 Shadow DOM,您可以定義僅適用於影子樹內內容的樣式。這種隔離確保元件的樣式不會影響頁面的其餘部分,反之亦然。

3. 增強的可重複使用性

封裝組件更可重複使用,因為它們是獨立的。您可以在不同的專案中輕鬆共用和使用這些元件,而無需擔心整合問題。

建立 Shadow DOM

讓我們來看一個在 JavaScript 中建立 Shadow DOM 的簡單範例。



    Shadow DOM Example

在此範例中,我們定義了一個新的自訂元素 。在其建構函式中,我們使用 this.attachShadow({ mode: 'open' }) 附加一個影子根,然後向其附加一些內容。影子根中定義的樣式與文件的其餘部分隔離。

Shadow DOM 模式

在創建影子根時,可以指定其模式為開放或封閉。

  • 開放模式:可以使用JavaScript存取shadow root,允許互動和操作。
  • 封閉模式:影子根無法從JavaScript訪問,提供更高層級的封裝。

封閉模式範例

const shadow = this.attachShadow({ mode: 'closed' });

在此模式下,無法從元件外部存取影子,增加了額外的保護層。

Shadow DOM 樣式

您可以直接在 Shadow DOM 中定義樣式。這些樣式僅適用於影子樹中的內容。

const style = document.createElement('style');
style.textContent = `
    div {
        font-size: 20px;
        color: red;
    }
`;
shadow.appendChild(style);

透過將

結論

Shadow DOM 是一項強大的功能,它透過提供封裝和樣式隔離來增強我們建立 Web 元件的方式。透過利用 Shadow DOM,開發人員可以創建模組化、可重複使用且可維護的元件,這些元件可以無縫整合到任何 Web 應用程式中。對於任何現代 Web 開發人員來說,理解和利用 Shadow DOM 都是一項寶貴的技能。

版本聲明 本文轉載於:https://dev.to/mdhassanpatwary/understanding-shadow-dom-the-key-to-encapsulated-web-components-4bki?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • HTML5中如何將表格屬性遷移到CSS?
    HTML5中如何將表格屬性遷移到CSS?
    HTML5 表格屬性轉換Visual Studio 的HTML5 驗證功能將單元格填充、單元格間距、valign 和對齊屬性標識為對表格元素無效。為了解決這個問題,HTML5 引入了 CSS 替代方案來控製表格的外觀和間距。 單元格填充:將 cellpadding 替換為應用於表格單元格的 CSS ...
    程式設計 發佈於2024-11-07
  • 為什麼不能在 C++ 中使用非常量變數來定義數組大小?
    為什麼不能在 C++ 中使用非常量變數來定義數組大小?
    了解使用 Const Int 作為數組大小的限制在 C 中,使用 const int 作為數組大小受到以下限制某些限制。讓我們深入研究為什麼會有這些限制。 考慮以下場景:允許:const int size = 2; int array[size] = {0}; // Compilation succ...
    程式設計 發佈於2024-11-07
  • 如何在 MySQL WHERE 子句中指定不明確的「user_id」欄位?
    如何在 MySQL WHERE 子句中指定不明確的「user_id」欄位?
    解決MySQL 'user_id' WHERE 子句中的歧義當處理共享列名的多個表時,MySQL 在使用時可能會遇到歧義WHERE 子句中的該列。這在錯誤訊息“user_id”中很明顯,其中 where 子句不明確。 考慮範例查詢:SELECT user.*, user_info.*...
    程式設計 發佈於2024-11-07
  • 如何從 Pandas 中的函數有效率地建立多個新列?
    如何從 Pandas 中的函數有效率地建立多個新列?
    使用Pandas 從函數建立多個新列在Pandas 中,您可能會遇到需要根據應用於某個函數的自訂函數建立多個新列的情況現有專欄。該任務可能看起來很簡單,但由於函數的預期返回類型,可能會出現意想不到的挑戰。 原始方法:指派給索引範圍最初,您可能會嘗試指派使用df.ix[: ,10:16] = df.t...
    程式設計 發佈於2024-11-07
  • 如何在 Go 中迭代地從切片中刪除元素?
    如何在 Go 中迭代地從切片中刪除元素?
    迭代地從切片中刪除元素迭代切片時,由於移動而在循環中刪除元素可能會很棘手後續元素。常見的錯誤方法是使用追加來刪除元素,如下例所示:a := []string{"abc", "bbc", "aaa", "aoi", &qu...
    程式設計 發佈於2024-11-07
  • 如何有效防止 C++ 中的記憶體洩漏:綜合指南
    如何有效防止 C++ 中的記憶體洩漏:綜合指南
    避免C 中的內存洩漏:綜合指南C 內存管理可能是一項艱鉅的任務,潛在的內存洩漏潛伏在每個角落。為了減輕這些風險,必須遵循一組最佳實踐。 防止記憶體洩漏的一般技巧了解所有權: 確定誰負責釋放記憶體。實施適當的清理機制以及時釋放分配的資源。 使用智慧指針:考慮使用智慧指針,例如 std::unique_...
    程式設計 發佈於2024-11-07
  • 使用html css和js的動畫進行冒泡排序
    使用html css和js的動畫進行冒泡排序
    代碼 : <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=d...
    程式設計 發佈於2024-11-07
  • 理解 Go eBPF:深入探討高效的核心級編程
    理解 Go eBPF:深入探討高效的核心級編程
    扩展伯克利数据包过滤器 (eBPF) 彻底改变了 Linux 内核可观察性、性能监控和安全性。 eBPF 允许开发人员直接在内核中运行沙盒程序,而无需修改内核代码,从而释放有效监视、跟踪和操作数据的能力。与以其简单性、并发性和强大生态系统而闻名的 Go ebpf 编程语言相结合,eBPF 成为构建...
    程式設計 發佈於2024-11-07
  • 為什麼 `__init__` 方法對於 Python 類別至關重要?
    為什麼 `__init__` 方法對於 Python 類別至關重要?
    為什麼在 Python 類別中使用 init? 在 Python 中初始化類別是一個基本概念,它允許您建立具有特定屬性和行為的類別的實例。 init方法充當類別的建構函數,為新物件提供初始化和配置。 理解類別和物件這很重要區分類(物件的藍圖)和物件(這些類別的實例)。類別定義其物件將繼承的屬性和方法...
    程式設計 發佈於2024-11-07
  • NextJS 應用程式的 Docker 和 Docker-Compose 最佳實務。
    NextJS 應用程式的 Docker 和 Docker-Compose 最佳實務。
    Best Practices of Docker & Docker-Compose for NextJS application. To create an optimized Dockerfile for a Next.js 14 application that sup...
    程式設計 發佈於2024-11-07
  • 資料結構:建立自訂節點類
    資料結構:建立自訂節點類
    作为一名开发人员,掌握数据结构是一项至关重要的技能,可以释放您解决问题的潜力。虽然 Java 中的标准集合框架提供了坚实的基础,但有时您需要超越内置数据结构并创建自己的自定义解决方案。 在这篇文章中,我们将学习如何创建自定义节点类以及它们如何帮助您有效地解决各种问题。 DATA STRUCTURE...
    程式設計 發佈於2024-11-07
  • 透過專家免費課程掌握編程
    透過專家免費課程掌握編程
    歡迎來到我的 Udemy 個人資料!如果您對程式設計充滿熱情並渴望提高自己的技能,那麼您來對地方了。我設計了適合初學者和高級學習者的課程,確保每節課都充滿實踐知識和實踐經驗。 您可以期待什麼: 內容全面:從基本程式設計概念到進階演算法,我的課程涵蓋廣泛的主題,適合各個級別。 實踐項目:透過實際專...
    程式設計 發佈於2024-11-07
  • 瓦納卡aa eyyyy
    瓦納卡aa eyyyy
    `` 這是我網站的頂部欄或所謂的導覽列。 但事實就是如此。 我們會沒事的吧? Ul 檢查。 const paymentMethods = [ { supportedMethods: 'basic-card', data: { ...
    程式設計 發佈於2024-11-07
  • 如何使用 CSS 在單一元素上實現多個陰影?
    如何使用 CSS 在單一元素上實現多個陰影?
    使用CSS 在元素上實現多個陰影嘗試在CSS 中重新建立Photoshop 按鈕設計,您可能會在將多個框陰影套用到一個元素時遇到限制。單一元素。預設情況下,CSS 只允許一個活動的盒子陰影,無論是內部還是外部。 要克服這個限制,您可以利用 CSS3 提供的逗號分隔功能。這允許您在同一box-shad...
    程式設計 發佈於2024-11-07
  • Tailwind CSS 簡介 – 實用程式優先的框架
    Tailwind CSS 簡介 – 實用程式優先的框架
    Tailwind CSS 簡介 – 實用程式優先的框架 在本文中,我們將探索 Tailwind CSS,這是一個流行的實用程式優先 CSS 框架,可讓您快速建立現代網站,而無需編寫自訂 CSS。與傳統的 CSS 框架不同,Tailwind 不附帶預先設計的元件,而是提供實用程式類,...
    程式設計 發佈於2024-11-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3