新闻中心
J*aScriptWeb组件_CustomElements与ShadowDOM详解
Custom Elements 和 Shadow DOM 结合实现可复用、样式隔离的 Web 组件:通过定义类继承 HTMLElement 并注册自定义标签,结合 attachShadow 创建独立 DOM 子树,利用 slot 分发内容,实现结构与样式的完全封装,支持属性监听与动态渲染,构建原生 J*aScript 组件。

Custom Elements 和 Shadow DOM 是 Web Components 的两个核心部分,它们让开发者可以创建可复用、封装良好的自定义 HTML 元素。结合使用,能够构建真正独立、样式隔离、行为清晰的组件,直接在原生 J*aScript 中实现类似框架的功能。
Custom Elements:定义自己的 HTML 标签
Custom Elements 允许你创建新的 HTML 标签,并为其定义对应的行为。通过 customElements.define() 方法注册一个类,这个类继承自 HTMLElement 或其子类,就可以在页面中使用自定义标签。
基本步骤如下:
- 定义一个类,继承自 HTMLElement
- 在类中使用 constructor 初始化元素(必须调用 super())
- 通过 connectedCallback 在元素插入 DOM 时执行逻辑
- 可选地使用 attributeChangedCallback 监听属性变化
- 调用 customElements.define('my-element', MyElement) 注册组件
示例:
class MyCard extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
}
connectedCallback() {
const title = this.getAttribute('title') || '默认标题';
this.shadowRoot.innerHTML = `
<style>
.card { border: 1px solid #ddd; padding: 16px; margin: 8px; }
h3 { color: #333; }
</style>
<div class="card">
<h3>${title}</h3>
<slot></slot>
</div>
`;
}
}
customElements.define('my-card', MyCard);
使用方式:
<my-card title="欢迎卡片">这里是内容</my-card>
Shadow DOM:实现真正的样式和结构封装
Shadow DOM 提供了一个独立的 DOM 子树,它与主文档 DOM 隔离,包括样式和事件。这意味着你在 Shadow Root 中定义的 CSS 不会影响外部页面,外部样式也不会轻易“穿透”进来。
关键特性:
- 通过 this.attachShadow({ mode: 'open' }) 创建 Shadow Root
- mode 可为 'open'(可通过 JS 访问)或 'closed'(不可访问)
- 所有内部结构和样式都挂载到 shadowRoot 上
- 支持
实现内容分发,保留原有 HTML 内容的灵活性
Shadow DOM 的优势在于:
ChatCut
AI视频剪辑工具
1086
查看详情
- 样式隔离:组件内样式不会污染全局
- 结构隐藏:内部实现细节对外不可见
- 避免选择器冲突:即使使用 .title 这样的通用类名也不怕
示例说明 slot 用法:
this.shadowRoot.innerHTML = `
<div class="wrapper">
<header><slot name="header"></slot></header>
<main><slot>默认内容</slot></main>
</div>
`;
对应使用:
<my-component> <span slot="header">这是头部</span> <p>这是主体内容</p> </my-component>
结合使用:构建完整 Web 组件
Custom Elements 负责定义标签和行为,Shadow DOM 负责封装 UI 和样式,两者结合是 Web Components 的标准实践。
常见模式包括:
- 在 constructor 中 attachShadow 并初始化内部结构
- 在 connectedCallback 中渲染或绑定事件
- 监听 attributes 列表并通过 observedAttributes 静态属性指定需要监控的属性
- 使用 attributeChangedCallback 响应属性更新
增强示例:响应属性变化
class MyToggle extends HTMLElement {
static get observedAttributes() {
return ['on'];
}
constructor() {
super();
this.attachShadow({ mode: 'open' });
}
connectedCallback() {
this.render();
}
attributeChangedCallback(name, oldValue, newValue) {
if (name === 'on') {
this.render();
}
}
render() {
const isOn = this.getAttribute('on') === 'true';
this.shadowRoot.innerHTML = `
<button style="background:${isOn ? 'green' : 'gray'}; color:white">
${isOn ? '开启' : '关闭'}
</button>
`;
}
}
customElements.define('my-toggle', MyToggle);
使用:
<my-toggle on="true"></my-toggle>基本上就这些。掌握 Custom Elements 和 Shadow DOM,就能写出不依赖框架、原生支持、可跨项目复用的组件。虽然没有 React 或 Vue 那样丰富的生态,但在轻量级封装、微前端集成、设计系统建设中非常有价值。
以上就是J*aScriptWeb组件_CustomElements与ShadowDOM详解的详细内容,更多请关注其它相关文章!
# vue
# react
# javascript
# java
# html
# js
# 前端
# css
# 自己的
# 河南搜狗seo优化
# 根据api建设网站前端
# discuz插件seo
# 常州品牌网站建设供应
# 营销推广程序图片素材下载
# 全网seo快速推广
# 金溪seo百度优化
# 网站建设系统怎么收费
# 雄县关键词排名
# 五常网站排名优化
# 复选框
# 如何实现
# 选择器
# 弹出
# 复用
# 这是
# 子类
# 自定义
# 子树
# ai
# app
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧
J*aScript实现单选按钮与关联输入框的联动禁用教程
使用 Pandas 高效处理 .dat 文件:字符清理与数据计算
mcjs网页版流畅运行 mcjs低配电脑畅玩入口
夸克浏览器图书入口 夸克手机浏览器阅读入口
sublime怎么覆盖插件的默认快捷键_sublime快捷键优先级与设置
R星幕后开发视频泄露 包含《GTA6》等多款大作
淘宝网网页版登录入口 淘宝官方网页版快捷登录
使用J*aScript检测输入元素是否包含在特定类中
C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责
漫蛙2网页版漫画入口 漫蛙漫画在线官方登录
Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询
Pygame教程:解决用户输入与游戏状态更新不同步问题
包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接
cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法
CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题
AI泡沫首次被“刺破”:GPU十年都无法存活!
期待已久:小米17 Ultra、小米首款NAS本月登场
《刺客信条:影》PS5 Pro和Switch 2画面对比
sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南
Win11怎么开启省电模式_Win11电池节电模式自动开启
J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案
如何在 Excel Online 和 Google 表格中更改日期格式
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践
单射、满射与双射的关系 一文理清所有逻辑
Angular响应式表单:实现提交后表单及按钮的禁用与只读化
蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台
J*aScript类型检查_j*ascript代码规范
J*aScript异步迭代器_j*ascript异步遍历
在J*a中如何隐藏复杂性_使用门面模式组织对象交互
sublime怎么格式化代码_sublime代码美化与一键排版插件配置
冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法
美团外卖商家服务中心入口 美团商家版官网入口
Animex动漫社网入口地址 Animex动漫社网正版在线入口
C#中解析不规范的HTML为XML 常见的坑与解决办法
4399体育竞技小游戏_4399小游戏赛事入口
《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!
马斯克:Optimus 人形机器人复数形式为 Optimi
Fabric模组开发:自定义物品与物品组的现代管理方法
Mac怎么查看崩溃日志_Mac控制台错误报告分析
如何使用Go和Martini动态服务解码后的图片
python3时间如何用calendar输出?
mc.js游戏直达 mc.js网页免下载版本秒进地址
支付宝如何设置安全保护_支付宝安全设置的全面教程
漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口
qq音乐在线播放入口_qq音乐电脑版登录链接
J*aScript数据结构转换:将对象数组按类别分组
斑马英语APP如何开启夜间护眼阅读_斑马英语APP夜间模式与低蓝光设置教程
在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析
搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具


2025-11-18
浏览次数:次
返回列表
`;
}
}
customElements.define('my-card', MyCard);