使用Web Component定义自己的专属网页组件
什么是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定义自己的专属网页组件的更多相关文章
- Web Component探索
概述 各种网站往往需要一些相同的模块,比如日历.调色板等等,这种模块就被称为“组件”(component).Web Component就是网页组件式开发的技术规范. 采用组件进行网站开发,有很多优点. ...
- 使用纯粹的JS构建 Web Component
原文链接:https://ayushgp.github.io/htm...译者:阿里云 - 也树 Web Component 出现有一阵子了. Google 费了很大力气去推动它更广泛的应用,但是除 ...
- 免费1年服务器,部署个ChatGPT专属网页版
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 白皮袄个免费1年服务器,部署个ChatGPT专属网页版! api.openai.com por ...
- Web Component 文章
周末无意中了解了Web Component的概念. http://blog.amowu.com/2013/06/web-components.html http://www.v2ex.com/t/69 ...
- 示例可重用的web component方式组织angular应用模块
在online web应用中,经常有这样的需求,能够让用户通过浏览器来输入代码,同时能够根据不同的代码来做语法高亮.大家已知有很多相应的javascript库来实现语法高亮的功能,比如codemirr ...
- Webservices-1.web服务定义简介
一.WEB服务定义(摘自维基百科)详情:http://zh.wikipedia.org/wiki/Web%E6%9C%8D%E5%8A%A1 Web服务是一种服务导向架构的技术,通过标准的Web协议提 ...
- Web Component总结
Web Component 一个Web组件通常由四个部分组成:模板.Shadow DOM.自定义元素与打包,其中Shadow DOM解决了组件在页面中的封装问题 Shadow DOM 有shadow ...
- Salesforce知识整理(一)之Lightning Web Component Tools
目录 LWC知识整理(一) 工具 Salesforce CLI Visual Studio Code(VS Code) Developer Hub(Dev Hub) 开启Dev Hub 相关资料 茶余 ...
- Web Component
前言 Web Component不是新东西,几年前的技术,但是受限于浏览器兼容性,一直没有大规模应用在项目里,直到现在(2018年年末),除IE仍不支持之外,其它主流浏览器都支持Web Compone ...
- angular custom Element 自定义web component
angular 自定义web组件: 首先创建一个名为myCustom的组件. 引入app.module: ... import {customComponent} from ' ./myCustom. ...
随机推荐
- Python中的常见方法
Python中有三种比较常见的方法类型,如类方法和静态方法,实例方法,他们是面向对象编程中重要的概念. 1.类方法 类方法是通过使用装饰器@classmethod来定义的,他的第一个参数是cls,指向 ...
- anaconda里虚拟环境安装jupyter notebook
安装jupyter notebook 打开anaconda prompt,进入虚拟环境 conda activate Pytorch_learning 下载安装jupyter notebook con ...
- HTTP长连接、短连接、Linux网络优化
无连接 含义:每次传输完数据后就断开连接. 因为早期互联网规模小,并且http具有瞬时性,突发性,服务器同时处理着多个请求.所以采用无连接的方式.以便于腾出资源处理其他请求. 无状态 顺便说一说无状态 ...
- CLR via C# 笔记 -- 计算限制的异步操作(27)
1. 线程池基础. 创建和销毁线程是一个昂贵的操作,要耗费大量时间.太多的线程会浪费内存资源.由于操作系统必须调度可运行的线程并执行上下文切换,所以大多的线程还对性能不利.为了改善这个情况,CLR包含 ...
- 如何从零开始集成DTM Android SDK
什么是动态标签管理? 动态标签管理(Dynamic Tag Manager,简称"DTM"),可让开发者快速配置更新测量代码及相关代码片段,可以基于Web界面轻松地进行分析.测量代 ...
- idea远程debug(物理机、docker、k8s)
IDEA远程DEBUG 1:物理机部署的Springboot项目远程DEBUG 1.1:idea配置 点击"Edit Configurations",再点击+,选择Remote, ...
- 使用bootchart 对 高通Android 进行性能分析
使用bootchart 对 高通Android 进行性能分析 Android版本:7.0 适用平台:高通和MTK 参考: https://blog.csdn.net/qq_19923217/artic ...
- Linux 错误码
背景 Linux的错误码包含在/usr/include/asm-generic/errno-base.h和/usr/include/asm-generic/errno.h 这两个文件内. 可用于查询. ...
- 海思SDK 学习 :002-实例代码分析
背景 需要了解 海思HI35xx平台软件开发快速入门之背景知识,为了方便测试,还需要了解 海思SDK 的安装 知识 由于海思的应用程序启动 MPP 业务前,必须完成 MPP 系统初始化工作.同理,应用 ...
- 【论文阅读】Trajectory-guided Control Prediction for End-to-end Autonomous Driving: A Simple yet Strong Baseline
参考与前言 Summary: leaderboard 现存第一名 TCP,非常simple的设置 取得了很好的效果 论文链接:Trajectory-guided Control Prediction ...