Web Components 之 Shadow DOM | 实现组件隔离与封装

阅读时长 6 分钟读完

前言

网页开发已经走过了20多年,现如今的网页设计越来越互动、复杂,需要使用一定的编程技术来实现;而组件化开发已经成为前端开发的标配。

Web Components 的提出,意味着前端开发不再受限于框架、库的限制,优化了前端开发的体验与效率。其中,Shadow DOM 作为 Web Components 中的核心,提供了对组件内 DOM 的封装和隔离,使得开发者可以更加方便地管理网页各个组件的状态、样式等。

本文将详细介绍 Shadow DOM 在 Web Components 中的作用、优点以及实现方式,并通过示例代码探究其运行方式和使用方法。

Shadow DOM 的作用和优点

Shadow DOM 是一种浏览器的特性,它可以将 DOM 树封装起来,与其他 DOM 分离。这种隔离性,在 Web Components 组件化开发中起到了至关重要的作用。Shadow DOM 还可以隔离组件的样式、事件和命名空间,防止组件中的 JavaScript 和 CSS 代码干扰页面中的其他元素。

简单来说,Shadow DOM 可以帮助开发者更好地管理页面/组件中的元素,保证它们与其他元素之间的独立隔离。

Shadow DOM 的实现方式

Shadow DOM 的实现方式可以分为两种:

1. 基于 JavaScript 的创建模式

这种模式是通过 JavaScript 创建 DOM 中的 Shadow DOM 元素,在组件调用时进行创建。这种方式简单易用,适用于较小的组件。下面为一个示例:

-- -------------------- ---- -------
----- ----------- ------- ----------- -
  ------------- -
    --------
    ----- ------ - ------------------- ----- ------ ---
    ----- - - ----------------------------
    ----------- - ------ -------
    ----------------------
  --
--
------------------------------------- -------------

上述代码会在调用 customElements.define 方法时,注册新的 HTML 标签 <my-component>,在创建该标签时,会通过 shadow.createTreeWalker() 创建 shadow DOM 树,并添加一个 p 元素作为 Shadow DOM 的子元素。

2. 基于 HTML 的声明式创建模式

这种模式是通过 HTML 标签上的 slottemplate 属性,将 Shadow DOM 插槽渲染到 DOM 里。这种方式更加灵活,适用于较大型的组件。

下面为一个示例:

-- -------------------- ---- -------
----------------
  ------------
    -------
      ------ ---
    --------
    
    ---- -- ---- ------------- ---- ----------------
    ----- ----------------------
  --------- -- --- -------- -------------
-----------------

在 HTML 中, #shadow-root 标记来建立 Shadow DOM 树。随后,一个 slot 标签就会将传入组件的任何内容嵌入到 Shadow DOM 的预定义位置中。

Shadow DOM 的使用方法

使用 Shadow DOM 可以实现组件在外部的隔离,同时允许组件内部自由控制自己的状态和逻辑。下面为一个使用 Shadow DOM 的示例:

-- -------------------- ---- -------
--------------
  ----- ------------------------- --------------
---------------
--------
  ----- ----------- ------- ----------- -
    ------------- -
      --------
      ----- ------ - ------------------------ ---------
      ----- ------- - ------------------------------
      ---------------------------------
      ----- ---- - -------------------------------
      --------- - ----------
      --------------------------
      ----- ----- - --------------------------------
      ----------------- - -
        -------- -
          ------- --- ----- -----
          -------- -----
        -
      --
      --------------------------
      ----------------------------
    -
  -
  ------------------------------------- -------------
---------

上述代码将会在页面中创建自定义的 <my-component> 标签,该标签内部的内容通过 slot 属性插入到 Shadow DOM 当中。将插入的内容放在包含在一个 div 元素中,通过 style 元素为包裹元素添加了一些样式。

此时,通过开发者工具可以看到组件标签内部的 Shadow DOM 树,并且修改内部元素的样式不会影响到其他元素。Shadow DOM 中的样式只会影响组件内部元素,而不会影响到其他元素。

总结

Shadow DOM 可以协助 Web Components 实现封装、隔离、样式和事件隔离,同时保证在 DOM 中不会形成全局污染。在组件化开发中,它的存在使得开发者可以方便地将网页的各个组件进行管理,并提供优秀的可扩展性。

我们了解了 Shadow DOM 的基本作用、实现方式和使用方法,并给出了具体的示例来说明,希望对开发者们熟悉 Web Components 的应用程度有所提升,实践中能够更加游刃有余。

参考资料:

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64cc55a25ad90b6d0427599a

纠错
反馈