搜索
首页web前端css教程为不同上下文制作网络组件

Making Web Components for Different Contexts

本文并非讲解如何构建 Web 组件,Caleb Williams 最近已撰写了一份详尽的指南。让我们来讨论如何使用它们,构建时需要考虑哪些因素,以及如何在项目中有效利用它们。

如果您不熟悉 Web 组件,Caleb 的指南非常值得一读,但以下是一些能帮助您快速上手的资源:

  • Web 组件——“正确”的方法
  • Shadow DOM v1:自包含的 Web 组件
  • MDN 上的 Web 组件
  • Awesome Web 组件
  • 开放式 Web 组件推荐

由于 Web 组件现在得到了广泛支持(这要感谢幕后许多人的辛勤工作)——并且考虑到 Edge 将很快切换到 Chromium 平台——人们现在将 Web 组件视为构建可重用 UI 组件的“原生”和平台兼容的方式,以保持设计系统和 Web 项目之间的一致性,同时利用 Shadow DOM 的强大功能将样式和逻辑封装在组件本身中。

这既对也错。但首先,让我们了解一下抽象层三角形

抽象层三角形

从技术上讲,我们应该将 Web 组件视为我们最喜欢的标记语言 HTML 的扩展(是的!)。Web 组件 API 允许我们创建 HTML 中不存在的自定义 HTML 元素(例如 <foo-bar></foo-bar>)。

有人说 Web 组件基本上是新的 HTML 元素,因此我们应该将它们视为 HTML 规范的一部分,因此我们应该遵循其范例、核心概念和用法。如果我们假设所有这些要点,我们会发现我们的组件将存在于 Web 平台堆栈的最低层,与 HTML、CSS 和 JavaScript 并列。框架和库(如 React、Vue、Angular、SvelteJS)在其抽象层上工作,位于其他工具之上,这些工具处于某种“中土世界”,例如 StencilJs、Hybrids 和 Lit。在这些抽象层之下,我们可以找到我们的基本 Web 技术……以及原生 Web 组件。我们可以用ALTAbstraction Layer Triangle)图来表示这个概念:

为什么这很重要?它有助于我们可视化原生组件之上存在的各个层,并了解它们的使用环境,以便可以针对预期的环境构建它们。什么是环境?这就是我们的目标。

相同的技术,不同的环境

Shadow DOM 是 Web 组件 API 中的关键因素。它允许我们将 JavaScript 和 CSS 捆绑到自定义元素中,以防止外部干扰和样式操作,除非我们明确允许。开发人员确实可以遵循一些方法来允许外部 CSS 泄漏到 shadow root 和组件中,包括自定义属性以及 ::part 和 ::theme 伪元素,Monica Dinculescu 对此进行了很好的介绍。

还需要考虑另一件事:我们正在使用的环境。在我个人构建 Web 组件三年后,我可以确定两种环境:私有环境(如设计系统)和标准环境(如没有自定义样式的普通 HTML、CSS 和 JavaScript)。

在设计组件之前,我们需要了解它们将如何使用,因此确定环境类型是所有这一切的关键。最简单的方法是只针对一个环境,但通过一个小小的 CSS 技巧,我们可以为两者构建组件。

在我们深入了解之前,让我们看看这两种环境之间的区别。

私有环境

私有环境是一个封闭的生态系统,它为组件提供自己的样式,必须按原样使用。因此,如果我们正在构建一个来自特定样式指南或设计系统的组件库,则每个组件都将反映自定义样式,因此无需每次需要时都对其进行编码。

JavaScript 逻辑也是如此。例如,我们可以附加一个封闭的 shadow root,以防止其他人意外地用 querySelector 刺穿 shadow boundary。因此,我们可以简单地选择和使用任何组件,避免样式不一致和 CSS 冲突等问题。作为作者,您还可以定义一组 CSS 自定义属性(或 ::parts),这些属性可用于针对特定用例设置组件的样式,但这并不是设计系统的重点。

这是一个在私有环境中使用 Web 组件的示例。它所有的样式和逻辑都包含在其 shadow-root 中,可以简单地添加到任何页面中。

此示例和后续示例仅用于演示目的,并非旨在用于生产环境,因为它们没有考虑关键情况,例如可访问性和其他优化。

私有环境中的组件很少在该环境之外使用。例如,如果我们尝试从设计系统(具有其自身强制样式)中获取一个元素,我们无法简单地将其添加到项目中并期望对其进行自定义。您知道 Bootstrap 如何根据您的喜好进行主题设置和自定义吗?这与之完全相反。这些组件旨在在其环境中并且仅在其环境中运行。

标准环境

标准环境可能是最复杂的组件类型,不仅因为环境范围可以从成熟的框架(如 Vue 和 React)到普通的原生 HTML,而且因为每个人都应该能够像使用任何其他元素一样使用该组件。

例如,当公开添加组件(例如添加到 npm)时,使用它的人会期望能够对其进行自定义,至少在某种程度上。

您知道任何带有其自身演示样式的 HTML 元素吗?答案应该是“否”,因为元素必须使用 CSS 明确设置样式。对于在标准环境中制作的 Web 组件也是如此。单个 Web 组件应该可以通过添加类和属性或其他方法进行自定义。

这是我们在封闭环境示例中看到的相同 <todo-list></todo-list> 元素,但它是为标准环境设计的。它可以按原样工作,其 shadow root 中没有任何演示样式。事实上,它只包含必要的逻辑和基本 CSS 以确保其功能。否则,它完全可以像任何标准 HTML 元素(如 div)一样进行自定义。

我们为每个环境查看的两个示例都是使用相同的组件制作的。不同之处在于,标准环境中的组件可以使用外部 CSS 进行自定义和选择。

Web 组件和组合

好的,因此使用 Web 组件与使用普通 HTML 实际上是一样的,尽管正如我们所看到的,遵循给定内容的范例和原则非常重要。我们需要注意的是 Web 组件的组合

正如 Google Web Fundamentals 所解释的那样:

组合是 Shadow DOM 最不为人知的功能之一,但可以说是最重要的功能。

在我们的 Web 开发世界中,组合是我们如何使用 HTML 声明式地构建应用程序的方式。不同的构建块(<div>、<code><s></s><em></em><strong></strong>)组合在一起形成应用程序。其中一些标签甚至可以相互配合使用。组合就是为什么像 <select></select><details></details><summary></summary><video></video> 这样的原生元素如此灵活的原因。每个标签都接受某些 HTML 作为子元素,并对它们执行一些特殊操作。例如,<select></select> 知道如何将 <option></option><optgroup></optgroup> 呈现为下拉列表和多选小部件。<details></details> 元素将 <summary></summary> 呈现为可展开的箭头。甚至 <video></video> 也知道如何处理某些子元素:<track></track> 元素不会被渲染,但它们确实会影响视频的行为。多么神奇!组合是我们使用 HTML 时通常所做的工作。由于 Web 组件仅仅是具有 DOM 引用(而不是逻辑容器)的 HTML 元素,因此我们应该依靠组合来构建我们的组件和任何子组件。如果您考虑 <ul></ul><select></select>,您会注意到您声明式地组合这些元素以获得最终输出,并且您有特定属性可用于主组件(例如 [readonly])或子组件(例如 [selected])。对于 Web 组件也是如此,如果您正在构建自定义列表,请考虑构建主组件(<custom-list></custom-list>)和子组件(<custom-li></custom-li>)。使用 <slot></slot> 元素,您可以定义子元素将在何处放置,以及在没有传递子元素时将显示的占位符内容。

Web 组件和可访问性

另一件需要考虑的事情是我们称之为可访问性的“小”主题。由于我们正在创建全新的 HTML 元素,因此我们需要考虑元素的可访问性,以便提供基本语义角色、任何键盘导航以及用户的操作系统首选项,例如减少运动和高对比度设置。

我强烈建议以下资源作为构建可访问和包容性组件的参考,如何定义语义标记以及如何实现基本的键盘导航。

  • 包容性组件
  • web.dev 上的“对所有人都有效”
  • WAI-ARIA 创作实践
  • WebAIM WCAG 清单

结论

Web 组件是 Web 开发中的一项新兴技术,因此,就根据其预期用途或最大化用途构建它们而言,并没有任何明确定义的最佳实践来指导我们。当您发现自己正在使用它们时,您可能可以从这篇文章中获得的唯一一点是考虑它们是用于封闭环境还是标准环境,然后问问自己WHI

  • Who 将使用此组件?
  • How much flexibility 这个人应该拥有来对其进行自定义?
  • Is 此组件适用于所有人还是特定受众?

以上是为不同上下文制作网络组件的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
光标的下一个CSS样式光标的下一个CSS样式Apr 23, 2025 am 11:04 AM

具有CSS的自定义光标很棒,但是我们可以将JavaScript提升到一个新的水平。使用JavaScript,我们可以在光标状态之间过渡,将动态文本放置在光标中,应用复杂的动画并应用过滤器。

世界碰撞:使用样式查询的钥匙帧碰撞检测世界碰撞:使用样式查询的钥匙帧碰撞检测Apr 23, 2025 am 10:42 AM

互动CSS动画和元素相互启动的元素在2025年似乎更合理。虽然不需要在CSS中实施乒乓球,但CSS的灵活性和力量的增加,可以怀疑Lee&Aver Lee&Aver Lee有一天将是一场

使用CSS背景过滤器进行UI效果使用CSS背景过滤器进行UI效果Apr 23, 2025 am 10:20 AM

有关利用CSS背景滤波器属性来样式用户界面的提示和技巧。您将学习如何在多个元素之间进行背景过滤器,并将它们与其他CSS图形效果集成在一起以创建精心设计的设计。

微笑吗?微笑吗?Apr 23, 2025 am 09:57 AM

好吧,事实证明,SVG的内置动画功能从未按计划进行弃用。当然,CSS和JavaScript具有承载负载的能力,但是很高兴知道Smil并没有像以前那样死在水中

'漂亮”在情人眼中'漂亮”在情人眼中Apr 23, 2025 am 09:40 AM

是的,让#039;跳上文字包装:Safari Technology Preview In Pretty Landing!但是请注意,它与在铬浏览器中的工作方式不同。

CSS-tricks编年史XLIIICSS-tricks编年史XLIIIApr 23, 2025 am 09:35 AM

此CSS-tricks更新了,重点介绍了年鉴,最近的播客出现,新的CSS计数器指南以及增加了几位新作者,这些新作者贡献了有价值的内容。

tailwind的@Apply功能比听起来更好tailwind的@Apply功能比听起来更好Apr 23, 2025 am 09:23 AM

在大多数情况下,人们展示了@Apply的@Apply功能,其中包括Tailwind的单个property实用程序之一(会改变单个CSS声明)。当以这种方式展示时,@Apply听起来似乎很有希望。如此明显

感觉就像我没有释放:走向理智的旅程感觉就像我没有释放:走向理智的旅程Apr 23, 2025 am 09:19 AM

像白痴一样部署的部署归结为您部署的工具与降低复杂性与添加的复杂性之间的奖励之间的不匹配。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版