当前位置: 首页 > news >正文

红宝书第五十一讲:Web Components:创造你自己的HTML标签


红宝书第五十一讲:Web Components:创造你自己的HTML标签

资料取自《JavaScript高级程序设计(第5版)》。
查看总目录:红宝书学习大纲


Web Components = 自定义元素 + Shadow DOM
就像搭积木一样,你可以创造可复用、独立功能的组件,自带样式与逻辑,不受外部干扰。


一、自定义元素(Custom Elements)

场景:想定义一个<my-button>,自带特效。
步骤

  1. 继承HTMLElement类:定义元素行为
  2. 注册元素:告诉浏览器新标签的规则

代码示例(结合资料3和资料4)1

// 1. 定义元素类
class MyButton extends HTMLElement {constructor() {super();this.innerHTML = '点击我!';  // 默认内容this.addEventListener('click', () => {alert('按钮生效!');});}
}// 2. 注册元素(名字必须带短横线)
customElements.define('my-button', MyButton);// 3. 在HTML中使用
<my-button></my-button> <!-- 渲染出自定义按钮 -->

二、Shadow DOM(影子DOM)

作用:将组件的内部结构隐藏起来,样式不泄露到外部,反之亦然2

如何创建(资料5中的attachShadow方法)3

class MyComponent extends HTMLElement {constructor() {super();// 创建Shadow DOM(mode:open表示可外部访问)const shadow = this.attachShadow({ mode: 'open' });shadow.innerHTML = `<style>/* 这里的样式只作用于Shadow DOM内部 */p { color: red; }</style><p>我是被包裹的内容!</p>`;}
}
customElements.define('my-component', MyComponent);

效果图


三、插槽(Slots):灵活内容插入

问题:如何在Shadow DOM中插入外部内容?
答案:使用<slot>标签占位(资料6的插槽机制)4

class MyCard extends HTMLElement {constructor() {super();const shadow = this.attachShadow({ mode: 'open' });shadow.innerHTML = `<div class="card"><slot name="title">默认标题</slot><slot name="content">默认内容</slot></div>`;}
}
customElements.define('my-card', MyCard);

使用示例

<my-card><h2 slot="title">自定义标题</h2><p slot="content">这是卡片的内容...</p>
</my-card>
  • slot="title"的内容会替换Shadow DOM中的<slot name="title">

关键点总结

技术作用代码片段参考
自定义元素创建全新HTML标签资料3中的class FooElement
Shadow DOM隔离组件样式与结构资料5中的attachShadow
插槽(Slots)允许外部内容嵌入组件内部资料6中的<slot>机制

目录:总目录
上篇文章:红宝书第五十讲:内容安全策略(CSP)详解:小白的守护者
下篇文章:红宝书第五十一讲:Web Components:创造你自己的HTML标签

脚注


  1. 《JavaScript高级程序设计(第5版)》演示了自定义元素的基本定义与模板结合 ↩︎

  2. 《JavaScript高级程序设计(第5版)》通过样式隔离例子说明Shadow DOM的独立性 ↩︎

  3. 《JavaScript高级程序设计(第5版)》详细说明了attachShadow方法及mode选项 ↩︎

  4. 《JavaScript高级程序设计(第5版)》解释了插槽在Shadow DOM中的应用场景 ↩︎

http://www.xdnf.cn/news/13609.html

相关文章:

  • 习题2.3 数列求和-加强版
  • PHP发送邮件
  • 【刷题Day19】HTTP的各个版本(浅)
  • 记录git stash误删除恢复方法
  • 探索 JavaScript 中的 Promise 高级用法与实战
  • 什么是MMOE?
  • 坐标上海,20~40K的面试强度
  • Android Studio 常见报错
  • 计算机网络——应用层
  • 济南通过首个备案生活服务大模型,打造行业新标杆
  • 【人工智能】Prompt攻击与防范策略总结
  • 2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(三级)答案 + 解析
  • ELF2开发板的ubuntu系统的ax200 wifi配网
  • Vue 3.0 Composition API 与 Vue 2.x Options API 的区别
  • 8.Rust+Axum 数据库集成实战:从 ORM 选型到用户管理系统开发
  • 2025MathorcupC题 音频文件的高质量读写与去噪优化 保姆级教程讲解|模型讲解
  • Docker中镜像、容器、仓库三者之间的关系
  • 第 8 期:条件生成 DDPM:让模型“听话”地画图!
  • Hadoop的三大结构及各自的作用?
  • TDengine Restful 接口API
  • excel解析图片pdf附件不怕
  • ESP8266简单介绍
  • 2025年山东燃气瓶装送气工考试真题练习
  • MCP协议量子加密实践:基于QKD的下一代安全通信(2025深度解析版)
  • 从数字化到智能化,百度 SRE 数智免疫系统的演进和实践
  • MCP(Model Context Protocol 模型上下文协议)科普
  • vue 中formatter
  • 2025-04-18 李沐深度学习3 —— 线性代数
  • yarn的三大组件及各自作用
  • easyexcel使用模板填充excel坑点总结