什么是Web Component

Web Component是一套Web浏览器的技术和规范,能够让开发者定制自己的HTML元素

来自MDN的描述:

Web Component 是一套不同的技术,允许你创建可重用的定制元素(它们的功能封装在你的代码之外)并且在你的 web 应用中使用它们。

Web Component由三项技术组成:

  • Custom element(自定义元素):创建一个自定义元素,并自定义其行为。

  • Shadow DOM(影子 DOM):将若干元素封装成独立的DOM,并且与主文档DOM分开呈现,互不影响。

  • HTML template(HTML 模板):用于定义可重用的HTML,在HTML中使用类似于前端框架(如Vue)中的模板,一次定义可重用代码,涉及到两个HTML标签:<template> 和 <slot>

废话不多说,让我们以一个自定义一个GitHub标签快速入门

快速入门

声明式地创建HTML模板

和往常我们书写HTML类似,唯一不同点便是以<template>包裹:

<template id="template_github_icon">
<a href="https://github.com/martixjohn" style="display: block; width: 100%; height: 100%" target="_blank">
<svg style="width: 100%; height: 100%" aria-hidden="true" viewBox="0 0 24 24" version="1.1" width="32" height="32">
<path fill="currentColor"
d="M12.5.75C6.146.75 1 5.896 1 12.25c0 5.089 3.292 9.387 7.863 10.91.575.101.79-.244.79-.546 0-.273-.014-1.178-.014-2.142-2.889.532-3.636-.704-3.866-1.35-.13-.331-.69-1.352-1.18-1.625-.402-.216-.977-.748-.014-.762.906-.014 1.553.834 1.769 1.179 1.035 1.74 2.688 1.25 3.349.948.1-.747.402-1.25.733-1.538-2.559-.287-5.232-1.279-5.232-5.678 0-1.25.445-2.285 1.178-3.09-.115-.288-.517-1.467.115-3.048 0 0 .963-.302 3.163 1.179.92-.259 1.897-.388 2.875-.388.977 0 1.955.13 2.875.388 2.2-1.495 3.162-1.179 3.162-1.179.633 1.581.23 2.76.115 3.048.733.805 1.179 1.825 1.179 3.09 0 4.413-2.688 5.39-5.247 5.678.417.36.776 1.05.776 2.128 0 1.538-.014 2.774-.014 3.162 0 .302.216.662.79.547C20.709 21.637 24 17.324 24 12.25 24 5.896 18.854.75 12.5.75Z">
</path>
</svg>
</a>
<style>
a {
display: block;
}
a > svg {
color: #333;
transition: all .3s;
}
a:hover > svg{
color: #000;
filter: drop-shadow(5px 5px 10px rgba(0,0,0,0.2));
}
</style>
</template>

这里实质上是一个超链接包裹了一个SVG图形,图形是我们的GitHub图标。

你也许发现了:

  • template标签含有id,这是为了后续使用JavaScript去引用它并定义元素。

  • 这里创建了一个style标签并编写了CSS样式,甚至还没有为元素指定一个className或者id,有人会问这样会不会导致和页面冲突。

    答案是不会,这里的样式局限于这个模板内部,和外部DOM是隔离的。

使用JavaScript API定义和注册我们的元素

// customElements.define()
customElements.define(
// 元素名,必须是Kebab case命名
// 目的是在页面中以<github-icon />去引用
"github-icon",
// 定义类,需要继承自HTMLElement
class extends HTMLElement {
// 构造器
constructor() {
// 必须调用父级构造
super(); // 获取上一步定义的template模板
let template = document.getElementById("template_github_icon");
// 获取模板内容
let templateContent = template.content; // 获取本元素的影子DOM树根
const shadowRoot = this.attachShadow({ mode: "open" }); // 将template的内容克隆并附加到shadowRoot,
shadowRoot.appendChild(
// cloneNode参数true表示以后可以通过JavaScript直接外部访问根节点
templateContent.cloneNode(true)
);
}
}
);

实际上在第一步你可以不以HTML创建“模板”,而是在类的构造器中以JS自定义元素的创建过程

使用自定义元素

HTML页面上使用

和普通元素使用方式完全相同,你甚至还可以为其添加属性(attribute)

<github-icon style="width: 40px; height: 40px;"></github-icon>

JavaScript内创建

也和普通元素的创建方式相同

const element = document.createElement('github-icon');
// element.xxx=xxx

总结

以上演示了如何自定义元素,并在页面中使用他们。

Web Component的灵活和强大不止于此,你甚至还可以:

  • 使用类似于Vue中的插槽slot以替换部分不相同的代码

  • 以现有的元素为母版去扩展

  • 自定义生命周期函数

  • 响应属性变化

  • ...

如果你仔细发现的话,本博客页面使用的GitHub图标正是一个自定义元素。

参考

使用Web Component定义自己的专属网页组件的更多相关文章

  1. Web Component探索

    概述 各种网站往往需要一些相同的模块,比如日历.调色板等等,这种模块就被称为“组件”(component).Web Component就是网页组件式开发的技术规范. 采用组件进行网站开发,有很多优点. ...

  2. 使用纯粹的JS构建 Web Component

    原文链接:https://ayushgp.github.io/htm...译者:阿里云 - 也树 Web Component 出现有一阵子了. Google 费了很大力气去推动它更广泛的应用,但是除 ...

  3. 免费1年服务器,部署个ChatGPT专属网页版

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 白皮袄个免费1年服务器,部署个ChatGPT专属网页版! api.openai.com por ...

  4. Web Component 文章

    周末无意中了解了Web Component的概念. http://blog.amowu.com/2013/06/web-components.html http://www.v2ex.com/t/69 ...

  5. 示例可重用的web component方式组织angular应用模块

    在online web应用中,经常有这样的需求,能够让用户通过浏览器来输入代码,同时能够根据不同的代码来做语法高亮.大家已知有很多相应的javascript库来实现语法高亮的功能,比如codemirr ...

  6. Webservices-1.web服务定义简介

    一.WEB服务定义(摘自维基百科)详情:http://zh.wikipedia.org/wiki/Web%E6%9C%8D%E5%8A%A1 Web服务是一种服务导向架构的技术,通过标准的Web协议提 ...

  7. Web Component总结

    Web Component 一个Web组件通常由四个部分组成:模板.Shadow DOM.自定义元素与打包,其中Shadow DOM解决了组件在页面中的封装问题 Shadow DOM 有shadow ...

  8. Salesforce知识整理(一)之Lightning Web Component Tools

    目录 LWC知识整理(一) 工具 Salesforce CLI Visual Studio Code(VS Code) Developer Hub(Dev Hub) 开启Dev Hub 相关资料 茶余 ...

  9. Web Component

    前言 Web Component不是新东西,几年前的技术,但是受限于浏览器兼容性,一直没有大规模应用在项目里,直到现在(2018年年末),除IE仍不支持之外,其它主流浏览器都支持Web Compone ...

  10. angular custom Element 自定义web component

    angular 自定义web组件: 首先创建一个名为myCustom的组件. 引入app.module: ... import {customComponent} from ' ./myCustom. ...

随机推荐

  1. Python中的常见方法

    Python中有三种比较常见的方法类型,如类方法和静态方法,实例方法,他们是面向对象编程中重要的概念. 1.类方法 类方法是通过使用装饰器@classmethod来定义的,他的第一个参数是cls,指向 ...

  2. anaconda里虚拟环境安装jupyter notebook

    安装jupyter notebook 打开anaconda prompt,进入虚拟环境 conda activate Pytorch_learning 下载安装jupyter notebook con ...

  3. HTTP长连接、短连接、Linux网络优化

    无连接 含义:每次传输完数据后就断开连接. 因为早期互联网规模小,并且http具有瞬时性,突发性,服务器同时处理着多个请求.所以采用无连接的方式.以便于腾出资源处理其他请求. 无状态 顺便说一说无状态 ...

  4. CLR via C# 笔记 -- 计算限制的异步操作(27)

    1. 线程池基础. 创建和销毁线程是一个昂贵的操作,要耗费大量时间.太多的线程会浪费内存资源.由于操作系统必须调度可运行的线程并执行上下文切换,所以大多的线程还对性能不利.为了改善这个情况,CLR包含 ...

  5. 如何从零开始集成DTM Android SDK

    什么是动态标签管理? 动态标签管理(Dynamic Tag Manager,简称"DTM"),可让开发者快速配置更新测量代码及相关代码片段,可以基于Web界面轻松地进行分析.测量代 ...

  6. idea远程debug(物理机、docker、k8s)

    IDEA远程DEBUG 1:物理机部署的Springboot项目远程DEBUG 1.1:idea配置 点击"Edit Configurations",再点击+,选择Remote, ...

  7. 使用bootchart 对 高通Android 进行性能分析

    使用bootchart 对 高通Android 进行性能分析 Android版本:7.0 适用平台:高通和MTK 参考: https://blog.csdn.net/qq_19923217/artic ...

  8. Linux 错误码

    背景 Linux的错误码包含在/usr/include/asm-generic/errno-base.h和/usr/include/asm-generic/errno.h 这两个文件内. 可用于查询. ...

  9. 海思SDK 学习 :002-实例代码分析

    背景 需要了解 海思HI35xx平台软件开发快速入门之背景知识,为了方便测试,还需要了解 海思SDK 的安装 知识 由于海思的应用程序启动 MPP 业务前,必须完成 MPP 系统初始化工作.同理,应用 ...

  10. 【论文阅读】Trajectory-guided Control Prediction for End-to-end Autonomous Driving: A Simple yet Strong Baseline

    参考与前言 Summary: leaderboard 现存第一名 TCP,非常simple的设置 取得了很好的效果 论文链接:Trajectory-guided Control Prediction ...