新闻中心

Web组件开发规范_Custom Elements与Shadow DOM

2025-12-03
浏览次数:
返回列表
Custom Elements 与 Shadow DOM 是 Web 组件核心技术,前者用于定义自定义标签并控制行为,后者实现样式和结构隔离。1. Custom Elements 通过继承 HTMLElement 并调用 customElements.define() 注册,标签名需含短横线以避免冲突;2. Shadow DOM 通过 attachShadow() 挂载,提供独立 DOM 子树,防止样式互相影响,mode 可设为 open 或 closed 以控制访问权限;3. 结合使用时应采用语义化命名、利用 slot 内容分发、监听属性变化更新 UI,并将样式置于 Shadow DOM 内部以确保封装性,适用于现代浏览器,可构建不依赖框架的高复用性组件。

web组件开发规范_custom elements与shadow dom

在现代前端开发中,Web组件提供了一种构建可复用、封装性强且无需依赖框架的UI组件的方式。其中,Custom Elements 和 Shadow DOM 是 Web 组件的两大核心技术。它们让开发者可以创建自定义 HTML 标签,并为其添加独立的样式和行为,实现真正的组件化开发。

Custom Elements:定义自定义标签

Custom Elements 允许开发者定义自己的 HTML 元素,并通过 J*aScript 控制其行为。浏览器原生支持这类元素,无需引入额外库。

要创建一个 Custom Element,需继承 HTMLElement 并使用 customElements.define() 方法注册。

class MyButton extends HTMLElement {
  constructor() {
    super();
    // 初始化内容或属性
    this.textContent = this.getAttribute('label') || '默认按钮';
  }

  // 可监听属性变化
  static get observedAttributes() {
    return ['label'];
  }

  attributeChangedCallback(name, oldValue, newValue) {
    if (name === 'label') {
      this.textContent = newValue;
    }
  }
}

customElements.define('my-button', MyButton);

使用方式:

注意命名规则必须包含短横线(-),如 my-button,这是为了避免与标准 HTML 标签冲突。

Shadow DOM:实现样式与结构的隔离

Shadow DOM 提供了一个独立的 DOM 子树,与主文档 DOM 隔离。这意味着组件内部的样式不会影响外部页面,外部样式也不会污染组件内部。

Remover Remover

几秒钟去除图中不需要的元素

Remover 304 查看详情 Remover

在 Custom Element 构造函数中,可通过 attachShadow() 方法挂载 Shadow DOM。

class MyCard extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({ mode: 'open' });

    shadow.innerHTML = <br>       <style><br>         .card {<br>           border: 1px solid #ddd;<br>           padding: 16px;<br>           border-radius: 8px;<br>           background: #f9f9f9;<br>         }<br>       </style><br>       <div class="card"><br>         <slot></slot> <!-- 插槽,允许传入内容 --><br>       </div><br>     ;
  }
}

customElements.define('my-card', MyCard);

使用方式:


  这是一段卡片内容。

Shadow DOM 的 mode 可设为 openclosed。设为 open 时,J*aScript 可通过 element.shadowRoot 访问内部结构;closed 则不可访问,增强封装性。

结合使用建议与最佳实践

将 Custom Elements 与 Shadow DOM 结合,是构建高内聚、低耦合组件的标准方式。以下是一些实用建议:

  • 始终使用语义化的自定义标签名,例如 user-*atardata-table
  • 利用 实现内容分发,提升组件灵活性
  • 避免在构造函数中执行耗时操作,DOM 渲染可能受影响
  • 合理使用 observedAttributes 监听属性变化,更新 UI
  • 样式写在 Shadow DOM 内部,防止全局污染
  • 考虑兼容性:现代主流浏览器均支持,但旧版 IE 不行

基本上就这些。掌握 Custom Elements 与 Shadow DOM,能让你写出真正解耦、可复用的原生 Web 组件,不依赖 React 或 Vue 也能实现组件化开发。不复杂但容易忽略的是细节,比如标签命名和 Shadow DOM 模式选择。

以上就是Web组件开发规范_Custom Elements与Shadow DOM的详细内容,更多请关注其它相关文章!


# vue  # 如何使用  # 但不  # 可通过  # 复用  # 这是  # 设为  # 自定义  # 子树  # 组件开发  # 前端开发  # 浏览器  # 前端  # html  # java  # javascript  # react  # web组件  # 封装性  # 上海手机seo  # 网站建设不用域名可以么  # 电话营销如何推广  # 海外广告营销网站建设  # 高权重网站关键词排名  # 微营销推广培训价格  # 修文seo网站优化价格  # seo专业工作简历  # 深圳网站怎么建设  # 泉州网站建设技术公司  # 高阶  # 核心技术 


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


相关推荐: Go语言中Map值调用指针接收器方法的限制与应对  今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程  ExcelARRAYTOTEXT函数怎么自定义分隔符输出数组文本_ARRAYTOTEXT实现动态生成SQL语句  C#中解析不规范的HTML为XML 常见的坑与解决办法  Pygame教程:解决用户输入与游戏状态更新不同步问题  Spring Boot嵌入式服务器与J*a EE:功能支持深度解析  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】  漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  Angular中单选按钮的正确使用与常见陷阱解析  Golang如何使用new_Go new分配内存机制讲解  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法  Mac怎么查看崩溃日志_Mac控制台错误报告分析  KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程  windows10怎么查看本机ip_windows10命令提示符ipconfig使用  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  如何在Promise链中优雅地中断后续then执行  Win11怎么查看电脑配置_Win11硬件配置检测工具使用  在命令行怎么运行html项目_命令行运行html项目方法【教程】  微信网页版官方入口教程 微信网页版网页版快速登录步骤  J*a 递归快速排序中静态变量的状态管理与陷阱  抖音怎么赚钱_抖音创作者变现方法与途径指南  PPT平滑切换怎么做 PPT炫酷“平滑”切换动画制作教程【必学】  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  蛙漫安全无毒 官方认证的绿色入口  Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践  解决 MongoDB 聚合查询中对象数组 _id 匹配问题  PySpark中从现有列右侧提取可变长度字符创建新列的教程  一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法  黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】  sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置  AO3中文官网链接_AO3网页版稳定镜像站  腾讯视频怎么使用多账号家庭管理_腾讯视频家庭多账号统一管理与权限分配教程  c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学  解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常  使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法  在Runstone环境中高效处理TasteDive API的JSON数据  html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】  快手极速版在线观看 官方网页版登录地址  c++如何实现单例设计模式_c++线程安全的单例模式写法  不同用户不同价格! 索尼开启账户个性化定价测试  Pandas DataFrame 多条件优先级排序与排名  优化HTML表单样式:解决输入框焦点跳动与元素间距问题  如何在Promise链中有效终止错误处理后的执行 

搜索