新闻中心

J*aScriptWeb组件_CustomElements与ShadowDOM详解

2025-11-18
浏览次数:
返回列表
Custom Elements 和 Shadow DOM 结合实现可复用、样式隔离的 Web 组件:通过定义类继承 HTMLElement 并注册自定义标签,结合 attachShadow 创建独立 DOM 子树,利用 slot 分发内容,实现结构与样式的完全封装,支持属性监听与动态渲染,构建原生 J*aScript 组件。

javascriptweb组件_customelements与shadowdom详解

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) 注册组件
注意:自定义标签名必须包含短横线(-),例如 my-button、user-card,避免与标准 HTML 标签冲突。

示例:

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 ChatCut

AI视频剪辑工具

ChatCut 1086 查看详情 ChatCut
  • 样式隔离:组件内样式不会污染全局
  • 结构隐藏:内部实现细节对外不可见
  • 避免选择器冲突:即使使用 .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中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具 

搜索