什么是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. 面试官:Java中缓冲流真的性能很好吗?我看未必

    一.写在开头 上一篇文章中,我们介绍了Java IO流中的4个基类:InputStream.OutputStream.Reader.Writer,那么这一篇中,我们将以四个基类所衍生出来,应对不同场景 ...

  2. 解决git 区分文件名大小写

    问题:两人协作开发同一分支时,由于一方将组件文件名小写开头,并且推送到远程分支,导致我每次拉取代码会将我本地文件名改成小写,并且我手动改成大写后推送到远端仓库,远端仓库文件名无变化,还是小写. 查证后 ...

  3. feildconfig

    <template> <div style="float:left;width: 100%"> <el-row> <el-col :spa ...

  4. python利用公私钥加解密

    小贴士 这里不再赘述公私钥的生成过程.可以利用OpenSSL进行生成. 加密代码 #!/usr/bin/python #加密 #conda install pycrypto #提前安装模块 impor ...

  5. detect.py - yolov5master nvidia jetson agx xavier for mask with UART

    import argparse import time from pathlib import Path import cv2 import torch import torch.backends.c ...

  6. 背包dp——01背包

    01背包是背包dp的基础的重点,重点的基础!!! 题意概要:有 n 个物品和一个容量为 W 的背包,每个物品有重量 w_{i} 和价值 v_{i} 两种属性,要求选若干物品放入背包使背包中物品的总价值 ...

  7. 国产自主架构!龙芯2K1000LA工业核心板正式发布!

    国产自主架构!龙芯2K1000LA工业核心板正式发布! 原创 Tronlong创龙科技 Tronlong创龙科技 2024-06-13 07:50 广东 Tronlong创龙科技 ,赞18 (点击视频 ...

  8. 【ClickHouse】5:clickhouse集群部署

    背景介绍: 有三台CentOS7服务器安装了ClickHouse HostName IP 安装程序 程序端口 centf8118.sharding1.db 192.168.81.18 clickhou ...

  9. SpringBoot快速插入Mysql 1000万条数据

    导读 有时候为了验证系统瓶颈,需要往数据库表中插入大量数据,可以写sheel脚本插入,前几天为了插入100万条数据,走的sheel脚本(点我直达),插入速度简直无法直视,花了3小时,才插入了10万条, ...

  10. window10设置开机自启动exe的三种方式(亲测有效)

    拷贝文件到自启动位置 路径地址:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 通过组策略设置脚本随服务器启动 开始-> ...