新闻中心
Web组件ShadowDOM与JS结合生成HTML实践
Shadow DOM 是 Web 组件的核心技术,它通过创建隔离的 DOM 树实现样式和结构的封装,防止外部 CSS 影响内部元素且内部样式不泄露。1. 使用 attachShadow({ mode: 'open' }) 在自定义元素中挂载 Shadow DOM;2. 通过 shadowRoot.innerHTML 动态插入 HTML 和样式;3. 利用 customElements.define() 注册组件标签;4. 可动态更新内容并处理事件,通过 composed: true 使事件跨越 Shadow 边界。该机制适合构建可复用、高内聚的 UI 组件,提升模块化与维护性。

在现代前端开发中,Web组件提供了一种构建可复用、独立封装UI组件的方式。其中,Shadow DOM 是 Web 组件的核心技术之一,它允许将一个隔离的 DOM 树附加到元素上,从而实现样式和结构的封装。结合 J*aScript 动态生成 HTML 内容,可以创建高度模块化、不被外部样式干扰的组件。
什么是 Shadow DOM?
Shadow DOM 创建了一个与主文档 DOM 隔离的“影子”树。这个树中的元素不会受到页面其他 CSS 的影响,同时其内部样式也不会泄露出去。这种封装性非常适合构建可复用的 UI 组件。
通过 J*aScript 可以轻松创建并管理 Shadow DOM,并在其内部动态插入 HTML 结构。
创建带 Shadow DOM 的自定义元素
使用 customElements.define() 方法注册一个自定义标签,并在其构造函数中挂载 Shadow DOM。
示例:创建一个显示欢迎消息的组件
class WelcomeCard extends HTMLElement {
constructor() {
super();
// 创建 Shadow DOM
this.attachShadow({ mode: 'open' });
// 获取属性值
const name = this.getAttribute('name') || 'Guest';
// 构建内部 HTML
this.shadowRoot.innerHTML = `
<style>
.card {
border: 1px solid #ddd;
border-radius: 8px;
padding: 16px;
font-family: Arial, sans-serif;
background-color: #f9f9f9;
}
h2 {
color: #333;
}
</style>
<div class="card">
<h2>Welcome, ${name}!</h2>
<p>This content is inside Shadow DOM.</p>
</div>
`;
}
}
// 注册自定义元素
customElements.define('welcome-card', WelcomeCard);
之后可在 HTML 中直接使用:
<welcome-card name="Alice"></welcome-card>
青泥AI
青泥学术AI写作辅助平台
360
查看详情
动态更新 Shadow DOM 内容
除了初始化渲染,还可以通过 JS 监听属性变化或响应用户操作来更新 Shadow DOM 中的内容。
例如,添加一个方法用于更新名字:
// 在 WelcomeCard 类中添加方法
updateName(newName) {
const h2 = this.shadowRoot.querySelector('h2');
if (h2) {
h2.textContent = `Welcome, ${newName}!`;
}
}
然后在外部调用:
const card = document.querySelector('welcome-card');
card.updateName('Bob');
事件处理与通信
由于 Shadow DOM 是隔离的,事件默认会冒泡到主 DOM,但可以通过 Event.composed 控制是否跨越 Shadow 边界。
比如为按钮添加点击事件:
this.shadowRoot.innerHTML = `
<button id="clickMe">Click me</button>
`;
this.shadowRoot.getElementById('clickMe')
.addEventListener('click', () => {
this.dispatchEvent(new CustomEvent('greet', {
bubbles: true,
composed: true,
detail: { message: 'Hello from Shadow DOM!' }
}));
});
在父页面监听:
document.addEventListener('greet', (e) => {
console.log(e.det
ail.message);
});
基本上就这些。利用 J*aScript 操作 Shadow DOM,既能保证组件的独立性,又能实现丰富的交互逻辑。这种方式特别适合构建设计系统、表单控件或嵌入式小工具,避免样式冲突的同时提升代码可维护性。不复杂但容易忽略的是细节控制,比如 mode 设置为 closed 虽更封闭但调试困难,一般推荐 open 模式。
以上就是Web组件ShadowDOM与JS结合生成HTML实践的详细内容,更多请关注其它相关文章!
# css
# 趁人网站建设方案
# 百度网站推广怎么制作
# 还可以
# 加载
# 的是
# 单选
# 输入框
# 核心技术
# 并在
# 复用
# 拖放
# 封装性
# web组件
# javascript
# java
# html
# js
# 前端
# 工具
# 前端开发
# ai
# 点击事件
# 自定义
# 涉县网站优化电话
# 夜游经济营销推广方案
# 网络营销推广公司嘉兴
# 四川网络网站建设
# 兴仁街道seo网站推广
# 绍兴建设个人网站
# 烟台什么是seo
# 许昌优惠网站优化电话
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
在React函数组件中利用原生HTML5进行邮箱地址验证
向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程
Pandas DataFrame:高效添加条件计算列
抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩
QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录
qq游戏网页版直接玩_qq游戏免下载快速入口
台积电1.4nm工艺A14瞄准2028:10年来性能提升80%
谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作
微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法
如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧
单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分
Win11怎么开启高性能模式_Windows 11电源计划优化设置
TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法
qq音乐在线播放入口_qq音乐电脑版登录链接
C++如何实现线程池_C++11手动实现一个简单的固定大小线程池
AO3镜像入口大全 AO3网页版内容访问全集
Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略
不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|
千牛数据看板网页版_千牛数据看板网页版访问方法
Python自定义类排序:解决lambda键值访问TypeError的实践指南
蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址
在命令行怎么运行html项目_命令行运行html项目方法【教程】
MongoDB聚合管道:正确匹配对象数组中_id的方法
PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果
QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录
b站怎么看视频的弹幕数量_b站弹幕数量查看方法
mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析
Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】
Go RPC HTTP服务正确实现与常见陷阱解析
CSS实现侧边栏导航项全宽圆角悬停背景效果
Node.js中HTML按钮与J*aScript函数交互的正确姿势
腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法
KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法
《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情
火锅吃太多会怎样 火锅吃太多会上火吗
Golang如何优化CPU绑定任务分配策略_Golang CPU任务分配优化实践
1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】
PHP URL参数传递与500错误调试指南
AngularJS $http POST请求数据传递与Go后端接收实践
windows10怎么查看硬盘序列号_windows10硬盘id查询命令
如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践
谷歌google账号怎么注册账号 谷歌账号注册官方流程
期待已久:小米17 Ultra、小米首款NAS本月登场
Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁
win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】
ArrayList与LinkedList操作复杂度详解:遍历与修改
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
必由学官方登录入口 必由学教师学生账号快速访问
汽水音乐在线解析 汽水音乐在线解析入口
NetBeans Ant项目:自动化将资源文件复制到dist目录的教程


2025-10-07
浏览次数:次
返回列表
ail.message);
});