使用 Custom Elements 和 Shadow DOM 创建有意义的 Web 组件

Web 组件是构成 Web 应用程序的基本单元之一,它们使得开发者能够编写可重复使用、高度可组合的代码片段。在本文中,我们将介绍如何使用 Custom Elements 和 Shadow DOM 创建 Web 组件。

Custom Elements

Custom Elements 是一项 Web 标准,它使我们能够在 Web 中定义自定义元素。这些自定义元素可以像使用内置元素一样使用,并具有类似的语义。使用自定义元素可以让我们创建组件,而不是将代码分散在整个应用程序中。

要创建自定义元素,我们需要使用 customElements.define() 方法。该方法接受两个参数:元素名称和一个类。该类必须继承自 HTMLElement,并实现自定义元素的行为。例如,下面的代码创建了一个自定义元素 x-counter,该元素可以对应一个计数器:

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

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

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

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

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

在上面的代码中,我们创建了一个名为 XCounter 的类,并在其中实现了自定义元素的行为。在 constructor() 方法中,我们初始化了一个计数器变量 count。在 connectedCallback() 方法中,我们调用了 render() 方法,以在元素被插入到文档中时渲染元素。在 render() 方法中,我们使用 innerHTML 属性设置了元素的内容,然后侦听了两个按钮的 click 事件,并且根据这些按钮的操作更新了计数器,并重新渲染元素。

现在,我们就可以像使用内置元素一样使用 x-counter 了:

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

Shadow DOM

Shadow DOM 使我们能够创建私有 DOM 树,它与主文档的 DOM 分离,从而使得我们的组件可以更好地封装。通常,我们将域(host)元素称为包含(shadow)根(shadow)节点的“容器”,我们可以通过将 shadow DOM 附加到元素容器中,来创建自定义元素的 Shadow DOM。这提供了安全性和可靠性,因为开发者可以更好地控制组件的样式和行为。

要创建 Shadow DOM,我们可以使用 attachShadow() 方法。该方法接受一个对象作为参数,其中 mode 属性用于设置 Shadow DOM 的模式。通常,我们使用 'open' 模式来让开发者可以访问 Shadow DOM。

下面是一个示例代码片段:

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

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

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

在上面的代码中,我们创建了一个名为 XButton 的自定义元素,它包含了一个 Shadow DOM 树。在 constructor() 方法中,我们使用 attachShadow() 方法创建了一个 Shadow DOM。在 connectedCallback() 方法中,我们使用 innerHTML 属性设置了 Shadow DOM 的内容,并为按钮应用了一些样式。

创建有意义的 Web 组件

现在我们已经知道了如何使用 Custom Elements 和 Shadow DOM 创建自定义元素和 Shadow DOM,下面让我们考虑如何创建有意义的 Web 组件。在创建 Web 组件时,我们应该遵循以下几个原则:

  • 尽量设计组件的系统性和可扩展性,组件应该是可重用的,且可以自由组合,便于我们进行快速开发。
  • 良好的可读性和可维护性,这使得组件开发的过程更具生产力,降低开发难度和时间成本。
  • 高效的性能和卓越的用户体验,这是实际应用中最为关键的部分。

下面是一些建议:

  • 基本功能。为了让组件真正的实用,我们需要尽可能实现最基本的功能,从文字的简单展示、到图片的展示和放大缩小等等都可以从基础出发。
  • 自定义属性。需要根据业务,添加特定的功能和属性,而同样的一些全局控件可能有一些个性化的部分,如 x-carousel 组件的循环和自动滚动开关、x-pagination 组件的静态样式和滚动效果、x-modal 组件的自定义蒙层样式等。
  • 响应式。考虑不同尺寸屏幕的适配,根据不同的设备屏幕自适应调整界面布局和样式。
  • 国际化。为了让组件在国际化的环境下具有良好的体验,增加多语言支持,同时添加右到左(RTL)支持等功能。
  • 动画效果。对于一些需要指引用户的界面或提示用户的交互体验,提升或弱化一些元素的可见程度或互动提示性都可以考虑到。

下面是一个图片放大缩小的示例:

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

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

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

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

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

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

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

在上述示例中,我们使用了观察者模式,当 x-imagesrc 属性改变时调用 attributeChangedCallback() 方法来更新页面上的图片。我们在组件的 Shadow DOM 中定义了一个名为 .overlay 的元素,使其在放大时具有半透明的遮罩,可以通过点击遮罩来隐藏图片。此外,我们在放大后,使用了一个 <img> 元素来展示图片,并将其置于页面的中心。

总结

在本文中,我们介绍了如何使用 Custom Elements 和 Shadow DOM 创建 Web 组件。同时,我们介绍了一些关于如何创建有意义,高效,具有卓越用户体验的 Web 组件的建议。我们希望通过本文的介绍,可以让读者掌握这项技术,并能够创建出更有质量和价值的 Web 组件。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6479ad45968c7c53b05a79e7


猜你喜欢

  • 如何在 Cypress 中实现数据驱动测试

    数据驱动测试是一种测试方法,其中测试用例是从数据集中生成的,而不是手动编写一系列固定的测试用例。这种测试方法可以节省时间和精力,同时增加测试用例的覆盖率。在前端测试中,我们可以使用 Cypress 来...

    1 年前
  • Docker 搭建个人博客系统

    作为一个前端开发者,拥有一个自己的博客系统是非常必要的。然而,传统的博客搭建方式有很多问题,比如繁琐的安装、配置、升级,以及难以迁移等。这时候,Docker 就可以派上用场了。

    1 年前
  • 响应式设计中的滚动加载实现指南

    在现代的网站设计中,滚动加载已经成为了一种十分常见的方式。通过滚动加载,网站可以动态地加载内容,提高用户体验并减少页面加载时间,从而提升网站性能。在响应式设计中,滚动加载也具有重要的作用,可以更好地适...

    1 年前
  • ES7 新增 Object.observe() API

    自 ECMAScript 6 (ES6) 发布以来,JavaScript 语言一直在迅速地发展。作为前端开发者,学习新技术和 API 是我们必须不断努力的事情。ES7 的新增 API - Object...

    1 年前
  • Sequelize 的使用方式之实例对象操作

    Sequelize 是 Node.js 中一个流行的 ORM 框架,它能够简化数据库操作,并提供了简单易用的 API 接口。在使用 Sequelize 进行数据库操作时,我们需要创建一个 Sequel...

    1 年前
  • 利用 SSE 实现 Web 即时通信系统的开发流程

    引言 Web 即时通信系统是一项非常实用的技术,在现代网络应用中有着广泛的应用。如在线客服、聊天工具等,而 SSE 是一种实现 Web 即时通信的技术之一,这种技术的优势在于不需要引入新的技术栈,利用...

    1 年前
  • Koa 框架中 csrf 攻击的解决方案

    在 Web 应用程序开发中,跨站请求伪造(CSRF)攻击已成为一种广泛的攻击方式。这种攻击可以使攻击者伪造网络请求,从而危害用户的账号、密码、财产等。 而使用 Koa 框架进行开发的 Web 应用程序...

    1 年前
  • 使用 Fastify 框架构建 WebSocket 服务

    Fastify 是一个快速、简单、灵活的 Node.js 框架,非常适合构建高性能的 Web 应用程序。在本篇文章中,我们将介绍如何使用 Fastify 框架构建 WebSocket 服务。

    1 年前
  • 基于 Azure Functions 的 Serverless 应用入门教程

    Azure Functions 是微软推出的一项 Serverless 技术,可以让开发者不需要担心服务器的管理和维护,快速搭建轻量级应用。本篇文章将详细介绍如何使用 Azure Functions ...

    1 年前
  • AngularJs+UI-Router 路由实现多页面嵌套 SPA 应用

    随着前端技术的不断发展和前端应用的不断演变,单页面应用(SPA)已经成为了一个非常流行的开发模式,UI-Router 是 AngularJs 的一个第三方路由组件。

    1 年前
  • Angular 中 RxJS 的使用和常见问题解决方案

    在现代前端开发中,数据流和状态管理是非常重要的一个部分。RxJS 是一个流式编程库,可用于处理异步数据流操作。在 Angular 中,RxJS 成为了其主要的异步处理技术。

    1 年前
  • 使用 Jest 测试 React 或 Vue 应用的最佳实践

    前言 在开发前端应用的过程中,我们不可避免地需要面临各种各样的问题,而其中一个重要的问题就是如何测试我们的应用。特别是在大型项目和团队中,测试的重要性不言而喻。Jest 是一种流行的 JavaScri...

    1 年前
  • 如何在 Enzyme 中测试 React 组件与 Redux 的结合使用

    React 是一种流行的前端框架,它被广泛使用于 Web 应用程序的开发中。随着应用程序越来越复杂,使用 Redux 管理应用程序的状态已经成为标准做法。在进行 React 和 Redux 开发的过程...

    1 年前
  • 详解 Sass 编译后源码问题

    在前端开发过程中,CSS 是必不可少的一部分。但是 CSS 的书写方式相对繁琐,难以维护。为了解决这个问题,Sass(Syntactic Awesome StyleSheets)应运而生。

    1 年前
  • ES9 Async 迭代器和生成器详解

    前言 ES9 在异步方面的改进中,最主要的特性就是引入了 Async 迭代器和生成器。 对于每一个 JavaScript 程序员来说,理解迭代器和生成器是非常重要的,因为它们是使用 JavaScrip...

    1 年前
  • Node.js 中如何使用 WebSocket 进行实时通讯

    WebSocket 是一种在网页浏览器和服务器之间进行实时通讯的技术。与传统的 HTTP 请求不同,WebSocket 允许服务器向客户端发送任意数据,而不需要客户端发送请求。

    1 年前
  • Mongoose 中如何使用 $set 和 $addToSet 修改数组

    Mongoose 是一个 Node.js 的 MongoDB 驱动程序和对象模型工具,它为开发者们提供了一些非常便利的 API,可以轻松地对 MongoDB 操作进行抽象和接口封装。

    1 年前
  • 利用 Socket.io 和 Node.js 实现前端实时应用程序

    前言 随着互联网的不断发展,人们对于实时交互的需求也越来越高,对于前端工程师来说需要处理的问题也不再局限于渲染页面和获取数据,而是需要实现更加复杂的实时应用程序。本文将介绍如何利用 Socket.io...

    1 年前
  • 解决 Tailwind CSS 使用步骤中的一些问题

    什么是 Tailwind CSS Tailwind CSS 是一种用于构建现代化网页界面的低级 CSS 框架。它提供了一组命名用法,可以大大缩减开发人员编写 CSS 的时间和工作量。

    1 年前
  • 在 Node.js 和 Express.js 中使用 EJS 模板引擎

    EJS 是一种简单的 JavaScript 模板引擎,用于将数据呈现为 HTML 页面。它易于使用、可扩展,并且与 Node.js 和 Express.js 兼容。

    1 年前

相关推荐

    暂无文章