新闻中心

J*aScript Shadow DOM封装

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

javascript shadow dom封装

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版

校园订餐网2007版,其主要特点是功能简单实用。并且经过了一些大学的进行试点成功,已正式发布。整套程序由ASP+J*ASCRIPT完成的,没有DLL封装,源码完全开放便于用户做二次开发。主要针对客户群体是在校的大学生及在校傍边的餐饮店,因此功能针对性强,且价格低廉。初始管理员帐户为:admin密码:admin

晴软校园订餐系统 2007版 0 查看详情 晴软校园订餐系统 2007版

如果需要从外部影响 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矩阵的映射 

搜索