新闻中心

深入J*aScript_Shadow DOM API

2025-11-21
浏览次数:
返回列表
Shadow DOM 是 Web Components 的核心技术,提供独立的 DOM 树和样式隔离。通过 attachShadow() 方法绑定到宿主元素,支持 'open' 或 'closed' 模式,实现封装性。常与自定义元素结合使用,构建可复用组件。其内部样式不泄露、外部样式不侵入,确保模块化。利用 可实现内容分发,支持默认内容与命名插槽,提升灵活性。事件在 Shadow DOM 内触发会冒泡至外层,但 event.target 被重定向为宿主元素以维护封装,原始路径可通过 e.composedPath() 获取。仅当 composed 为 true 时,自定义事件才能跨越 Shadow Boundary。掌握 Shadow DOM 有助于减少样式冲突、提升组件复用性与项目可维护性,是跨框架开发的有力工具。

深入javascript_shadow dom api

Shadow DOM 是 Web Components 技术的核心之一,它为开发者提供了一种将封装的 DOM 树附加到元素上的方式,同时隔离样式和结构。在 J*aScript 中操作 Shadow DOM API 可以实现高度模块化、可复用的组件设计,尤其适用于构建复杂前端应用。

什么是 Shadow DOM

Shadow DOM 允许你在一个普通 DOM 元素内部创建一个独立的“影子”DOM 树。这个影子树与主文档的 DOM 隔离,拥有自己的样式作用域和节点结构,不会受到外部 CSS 的影响,也不会轻易被 J*aScript 干扰。

每个 shadow root 都绑定到一个宿主元素(host),通过 attachShadow() 方法创建:

let shadow = element.attachShadow({mode: 'open'});
// 或 {mode: 'closed'}

mode 为 'open' 时,可以通过 J*aScript 从外部访问 shadow root;'closed' 则不可访问,增强了封装性。

创建并使用 Shadow DOM

实际开发中,通常结合自定义元素(Custom Elements)一起使用 Shadow DOM。以下是一个简单示例:

class MyWidget extends HTMLElement {
  constructor() {
    super();
    // 创建 shadow root
    this.shadow = this.attachShadow({ mode: 'open' });

    // 添加内容
    const wrapper = document.createElement('div');
    wrapper.textContent = 'Hello from Shadow DOM!';

    const style = document.createElement('style');
    style.textContent = `
      div {
        color: blue;
        font-size: 16px;
      }`;

    this.shadow.appendChild(style);
    this.shadow.appendChild(wrapper);
  }
}

// 定义自定义元素
customElements.define('my-widget', MyWidget);

在 HTML 中使用:

页面上会显示蓝色文字,且其样式不会泄露到外部,外部样式也不会覆盖它。

样式隔离与插槽(Slots)机制

Shadow DOM 最大的优势是样式隔离。内部定义的 CSS 不会影响外部,外部也无法直接修改内部结构。但有时需要让外部传入内容并渲染在 shadow tree 内部,这就用到 元素。

例如支持模板插入:

Zend API:深入PHP内核 Zend API:深入PHP内核

Zend API:深入PHP内核

Zend API:深入PHP内核 341 查看详情 Zend API:深入PHP内核 this.shadow.innerHTML = `
  
  
    默认标题
    默认内容
  `;

然后在 HTML 中:


  我的标题
  

这是传入的内容


slot 机制实现了内容分发(content distribution),使组件更灵活,类似 React 的 children 概念,但在原生 DOM 层实现。

事件在 Shadow DOM 中的行为

事件可以从 Shadow DOM 内部触发并冒泡到外层,但其目标(event.target)会被重定向,以维持封装性。这种行为称为“事件重定向”。

比如在 shadow 内点击按钮:

button.addEventListener('click', (e) => {
  console.log(e.target); // 外部看到的是 host 元素,而非 button
});

若需访问原始事件目标,可用 e.composedPath() 获取事件路径:

const path = e.composedPath();
console.log(path); // 包含 shadow 内部的真实节点

注意:只有设置为 composed: true 的自定义事件才能穿越 Shadow DOM 边界向外传播。

基本上就这些。掌握 Shadow DOM API 能帮助你写出真正封装良好的组件,减少样式冲突,提升项目可维护性。虽然现代框架如 React、Vue 有自己的抽象模型,但在需要极致性能或跨框架复用时,原生 Shadow DOM 仍是强大工具。

以上就是深入J*aScript_Shadow DOM API的详细内容,更多请关注其它相关文章!


# 但在  # o2o营销推广途径  # 天津公司网站建设  # 优秀网站建设哪家快  # 网站建设方正  # 个人如何网站优化服务设计  # 广州外贸推广 营销招聘信息  # 推广网络营销公司a来咨61下拉  # 营销推广招标需求分析  # 网站推广手段怎么写  # 海南热点关键词排名  # 背景色  # 如何实现  # 绑定  # 弹出  # 重定向  # css  # 复用  # 插槽  # 自己的  # 自定义  # 封装性  # 前端应用  # 作用域  # 工具  # app  # 前端  # html  # java  # javascript  # react  # vue 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台  AO3最新入口2025公告_AO3中文官网合集  拼多多赚钱渠道_拼多多收益来源  2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  圆通快递查询实时追踪 圆通物流包裹状态快速查看  解决J*aScript中重复选择项的确认对话框显示问题  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  实现分段式页面滚动导航:CSS与J*aScript教程  动漫岛观看全网网 动漫岛在线正版动漫入口  CSS Box Model与弹性按钮:维持布局稳定的动画实践  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  AO3官方镜像站点汇总 AO3同人作品网页版直达链接  Yandex免登录网页版地址 Yandex搜索引擎官方访问入口  DLsite中文平台入口 DLsite官网内容在线查看  抓大鹅无需下载版 抓大鹅秒玩版入口  PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果  age动漫网站入口 age动漫官网直接访问入口  Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性  2306选座时如何选靠窗位置_12306选座靠窗座位查看方法解析  海棠电脑版入口_通过电脑访问海棠官网阅读  将HTML动态表格多行数据保存到Google Sheet的教程  微信群消息显示延迟如何解决 微信群消息刷新优化方法  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  淘宝支付提示失败如何解决 淘宝支付流程优化方法  Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接  手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析  Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】  处理动态列数据:J*a ArrayList的正确初始化与字符累加教程  Web Components中自定义开关组件状态同步的常见陷阱与解决方案  动漫花园资源网使用步骤_动漫花园资源网下载流程  蛙漫画网页版全站入口 蛙漫热门作品免费浏览  J*aScript中赋值与自增运算符的复杂交互与执行机制  使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南  Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略  Go语言中JSON数据解析与字段访问教程  虫虫漫画精品漫画官网_虫虫漫画精品漫画官网进入精品漫画  Win11怎么关闭快速启动_Win11彻底关机设置教程  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  Golang如何安装Swagger工具_GoSwagger文档生成环境  Shopware订单对象中获取产品自定义字段的正确方法  如何在 Windows 11 中启动游戏手柄设置  《GTA6》开发画面疑似泄露!这次可不是AI了  PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程  Pyrogram与g4f集成:异步编程实践与常见错误解决  Eclipse怎么运行工程_Eclipse工程运行配置说明  excel怎么制作工资条 excel快速生成工资条的方法  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问 

搜索