灵活运用 Custom Elements 和 Shadow DOM 开发自定义组件

阅读时长 9 分钟读完

前端开发越来越注重组件化,开发人员需要不断地寻找新的方法和技术来实现更好的组件化思想。 Custom Elements 和 Shadow DOM 是两种用于开发自定义组件的新技术,本文将详细介绍这两种技术并提供示例代码,帮助读者更好地理解和运用。

Custom Elements

Custom Elements 是一种原生的 Web Components,它允许开发人员创建自定义的 HTML 标签,并为其定义自己的行为和样式。 Custom Elements 可以继承原有的 HTML 标签,也可以完全自定义一个全新的标签。

定义 Custom Elements

在定义 Custom Elements 之前,需要先了解以下属性:

  • tagName:Custom Element 要使用的 HTML 标签名。
  • extends:Custom Element 要继承的已有 HTML 标签名,如果不继承,则可省略该属性。
  • constructor():Custom Element 的构造函数,用于定义 Custom Element 的行为。
  • connectedCallback():当 Custom Element 被插入到文档中时自动调用,用于初始化。
  • disconnectedCallback():当 Custom Element 被移除时自动调用,用于清理。
  • attributeChangedCallback():当 Custom Element 中定义的自定义属性发生变化时自动调用。

下面是一个定义 Custom Element 的示例代码:

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

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

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

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

------------------------------------------ -----------------
展开代码

在上述代码中,我们通过 class 定义了一个 MyCustomElement 类,该类继承了 HTMLElement 类,然后在 constructor 中定义了 Custom Element 的行为和样式。在 connectedCallback 中进行了初始化操作,在 disconnectedCallback 中进行了清理操作,在 attributeChangedCallback 中定义了自定义属性变化后的操作。

最后使用 customElements.define() 定义了一个 my-custom-element 标签,这样就创建了一个 Custom Element。

使用 Custom Elements

在 HTML 文档中使用 Custom Element 的方式与使用其他标签相同,例如:

在代码中,Custom Element 的行为和样式将被应用到指定的标签上。

Shadow DOM

Custom Elements 允许我们创建自定义标签,但是标签内的样式和行为可能会与文档的其他元素产生冲突。这时就需要使用 Shadow DOM,它可以将我们定义的 Custom Element 包含在一个独立的 DOM 中,从而保证 Custom Element 的样式和行为不会对其他元素产生影响。

创建 Shadow DOM

创建 Shadow DOM 的步骤如下所示:

  1. 定义 Custom Element,代码如上文所述。

  2. 在 Custom Element 的构造函数中创建 Shadow DOM,代码如下所示:

    使用 attachShadow() 方法创建 Shadow DOM,可以指定 mode: 'open' 或者 mode: 'closed',前者允许外部的 JavaScript 访问 Shadow DOM 中的元素,后者则不允许。

  3. 在 Shadow DOM 中创建 DOM 元素,代码如下所示:

    在 Shadow DOM 中创建 DOM 元素的方式与在普通 DOM 中创建元素的方式相同。

最终效果如下所示:

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

------------------------------------------ -----------------
展开代码

插入到 HTML 文档中后,可以看到 my-custom-element 标签中显示的内容为 “我是 Shadow DOM 中的内容”。

样式控制

Shadow DOM 的强大之处在于样式控制。我们可以在 Shadow DOM 中定义样式,同时不影响到文档中的其他元素。

样式的定义方式如下所示:

-- -------------------- ---- -------
----- ----- - --------------------------------
----------------- - -
  --- - 
    ------ ---- 
    ---------- ----- 
    ------------ ----- 
  -
--
--------------------------
展开代码

在 Shadow DOM 中创建一个 style 标签,在 textContent 中定义样式,然后将 style 标签添加到 Shadow DOM 中即可。

下面是包含样式的 Shadow DOM 的示例代码:

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

------------------------------------------ -----------------
展开代码

插入到 HTML 文档中后,可以看到 my-custom-element 标签中显示的内容为 “我是 Shadow DOM 中的内容”,样式为 color: red; font-size: 20px; font-weight: bold;

小结

通过使用 Custom Elements 和 Shadow DOM,我们可以轻松地实现 Web Components 的开发。 Custom Elements 允许我们创建自定义标签,并为其定义行为和样式,Shadow DOM 则可以将我们定义的 Custom Element 包含在一个独立的 DOM 中,从而保证其样式和行为不会对其他元素产生影响。

示例代码

下面是包含 Custom Elements 和 Shadow DOM 的示例代码:

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

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

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

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

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

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

----- ------------- - --------------------------------------------
-------------------------------------
展开代码

插入到 HTML 文档中后,可以看到 container 标签中包含了一个 my-custom-element 标签,该标签中显示的内容为 “我是 Shadow DOM 中的内容”,同时样式为 color: red; font-size: 20px; font-weight: bold;。 在控制台中,也可以看到 Custom Element 的生命周期函数调用和属性变化的输出结果。

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

纠错
反馈

纠错反馈