新闻中心
J*aScript Shadow DOM封装
Shadow DOM 是 Web Components 的核心技术,通过 attachShadow() 方法将隔离的 DOM 树挂载到宿主元素上,实现样式和结构的封装,防止全局样式污染与 DOM 冲突。其支持 open 和 closed 两种模式,分别允许或限制外部访问影子根;内部样式默认不泄露,可通过 :host、::slotted 和 CSS 变量等方式与外界通信,结合 Custom Elements 和 HTML Templates 构建高内聚、可复用的 UI 组件。

Shadow DOM 是 Web Components 的核心技术之一,它提供了一种将封装的 DOM 树附加到页面元素上的方式,同时隔离其内部结构、样式和脚本。在使用 J*aScript 创建 Shadow DOM 时,可以实现真正的组件级封装,避免全局样式污染和 DOM 冲突。
什么是 Shadow DOM
Shadow DOM 允许开发者创建一个与主文档 DOM 隔离的“影子”DOM 树。这个影子树挂载在一个宿主元素(host)上,其内部的 HTML 和 CSS 不会受到外部样式影响,外部也无法直接访问其内部节点。
这种隔离性使得组件更加健壮和可复用,特别适合构建高内聚、低耦合的 UI 组件。
如何创建 Shadow DOM
通过 J*aScript 的 attachShadow() 方法可以为任意元素挂载 Shadow DOM。该方法接收一个配置对象,其中 mode 字段决定封闭性:
- open:允许通过 J*aScript 从外部访问 Shadow Root
- closed:完全封闭,无法从外部访问内部结构
// 创建一个自定义元素并挂载 Shadow DOM
class MyComponent extends HTMLElement {
constructor() {
super();
// 挂载 Shadow DOM
this.shadow = this.attachShadow({ mode: 'open' });
// 添加内部结构
this.shadow.innerHTML = `
<style>
p { color: blue; font-family: sans-serif; }
</style>
<p>这是 Shadow DOM 中的内容</p>
`;
}
}
// 注册自定义元素
customElements.define('my-component', MyComponent);
上面代码定义了一个名为 my-component 的自定义元素,其内容被封装在 Shadow DOM 中,样式不会泄漏到外部,也不会被外部样式覆盖。
样式与作用域隔离
Shadow DOM 最大的优势之一是样式隔离。在 Shadow Root 内部定义的 CSS 只作用于该组件内部,即使选择器是全局的(如 body、div),也仅限于当前影子树。
例如,在 Shadow DOM 中写 p { color: red },不会影响页面其他地方的 p 标签。
晴软校园订餐系统 2007版
校园订餐网2007版,其主要特点是功能简单实用。并且经过了一些大学的进行试点成功,已正式发布。整套程序由ASP+J*ASCRIPT完成的,没有DLL封装,源码完全开放便于用户做二次开发。主要针对客户群体是在校的大学生及在校傍边的餐饮店,因此功能针对性强,且价格低廉。初始管理员帐户为:admin密码:admin
0
查看详情
如果需要从外部影响 Shadow DOM 的样式,可以通过以下方式:
- 使用 CSS 自定义属性(CSS Variables)传递主题色等配置
- 在 Shadow Root 中预留插槽(slot)供外部传入内容
- 通过 :host、:host-context 等伪类控制宿主元素样式
this.shadow.innerHTML = `
<style>
:host {
display: block;
border: 1px solid #ccc;
padding: 8px;
}
:host([hidden]) {
display: none;
}
::slotted(span) {
font-weight: bold;
}
</style>
<slot></slot>
`;
上面示例中,:host 控制组件自身外观,::slotted() 定义投影内容的样式。
封闭模式(Closed Mode)与安全封装
设置 mode: 'closed' 可以让 Shadow Root 无法被外部访问:
this.shadow = this.attachShadow({ mode: 'closed' });
此时,element.shadowRoot 返回 null,外部 J*aScript 无法操作影子内部结构,增强了封装性和安全性。
但要注意:浏览器开发者工具仍可能查看结构,且这不是严格的安全沙箱,不应依赖它防止恶意操作。
基本上就这些。Shadow DOM 结合 Custom Elements 和 HTML Templates,构成了现代 Web 组件的基础,让前端开发更模块化、更可维护。合理使用 open 或 closed 模式,能有效控制组件的封装程度与灵活性。不复杂但容易忽略的是样式边界和 slot 的使用,掌握好这些细节才能写出真正独立的组件。
以上就是J*aScript Shadow DOM封装的详细内容,更多请关注其它相关文章!
# 选择器
# 小微企业推广营销
# 松原网站建设哪家便宜
# 职高网站建设与管理教材
# 网络营销推广问lccm61做下拉
# 土豆网站建设文案
# 化妆品网站推广目标市场
# 微信微课堂网站建设
# 网站加关键词优化
# 礼品网站推广合作协议书
# 大良网站优化行业
# 的是
# 复用
# 插槽
# 核心技术
# 创建一个
# css
# 在校
# 复选框
# 订餐
# 自定义
# red
# 封装性
# 作用域
# 前端开发
# 工具
# 浏览器
# 前端
# html
# java
# javascript
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换
J*a最大堆Heapify方法修复:索引计算与边界条件深度解析
J*aScript DOM操作:高效清空列表元素的策略与实践
c++中的std::launder有什么实际用途_c++对象生命周期与指针优化
腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程
邮政快递包裹最新位置 邮政快递实时追踪入口
Composer如何在生产环境安全地执行composer update
怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法
小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】
新手怎么开始学化妆 零基础化妆入门教程
Mac终端命令大全_Mac常用Terminal指令速查
2026年CSGO开箱网站推荐 CSGO开箱平台精选
html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】
夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案
拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧
yandex入口引擎手机版 yandex安卓版下载入口
想当下一个《2077》?《心之眼》Steam评价升至"多半好评"
css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间
使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性
Eclipse怎么运行工程_Eclipse工程运行配置说明
如何在 Excel Online 和 Google 表格中更改日期格式
红果短剧网页版官网入口 官方最新网址发布
sublime怎么预览Markdown渲染效果_Markdown Preview插件 for sublime教程
为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法
印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】
谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法
Pandas DataFrame 高效批量赋值:告别循环与笛卡尔积误区
深入理解J*a合成构造器:何时以及为何阻止其生成
J*aScript中如何高效提取对象指定属性
Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议
Win11怎么开启高性能模式_Windows 11电源计划优化设置
J*a递归快速排序中静态变量导致数据累积问题的解决方案
如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension
批改网学生版PC登录 批改网官网登录系统入口
2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享
单射、满射与双射的关系 一文理清所有逻辑
Spyder启动失败:字体文件权限拒绝错误解决方案
C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能
Go Martini框架:动态服务解码后的图片内容
windows10怎么查看本机ip_windows10命令提示符ipconfig使用
苹果手机如何防止被恶意App追踪
CSS图片焦点样式实现教程:理解与应用tabindex属性
哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法
Android Studio计算器C键功能异常排查与修复教程
Centos/Linux 系统下安装 composer 的完整步骤
sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统
如何有效阻止外部脚本意外修改内联样式的高度属性
虫虫漫画精品漫画官网_虫虫漫画精品漫画官网进入精品漫画
c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发
深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射


2025-10-15
浏览次数:次
返回列表
padding: 8px;
}
:host([hidden]) {
display: none;
}
::slotted(span) {
font-weight: bold;
}
</style>
<slot></slot>
`;