html5使用shadow DOM封装组件 html5使用Web Components的基础

Shadow DOM是Web Components的核心技术,用于实现DOM和样式隔离。通过attachShadow()方法将独立的DOM树挂载到元素上,确保内部样式不泄漏、外部样式不干扰,结合Custom Elements和HTML Template可创建高内聚的自定义组件。示例中构建了支持属性监听与事件绑定的计数器组件,利用observedAttributes和attributeChangedCallback实现响应式更新,并通过模板提升结构可维护性。尽管具备良好封装能力,使用时仍需注意事件冒泡跨越shadow boundary的行为及兼容性权衡。

html5使用shadow dom封装组件 html5使用web components的基础

在现代前端开发中,组件化是构建可维护、可复用应用的关键。HTML5 提供了 Web Components 技术套件,让开发者可以用原生 JavaScript 创建封装良好的自定义元素。其中,Shadow DOM 是实现样式和结构隔离的核心部分。

什么是 Shadow DOM

Shadow DOM 是 Web Components 的一个重要组成部分,它允许你将一个隐藏的、独立的 DOM 树附加到某个元素上,这个树与主文档 DOM 隔离,拥有自己的样式作用域

使用 Shadow DOM 可以避免样式冲突,实现真正的封装。比如你在组件内部写了一个 h1 { color: red; },不会影响页面其他地方的 h1 元素。

创建 Shadow DOM 很简单,调用元素的 attachShadow() 方法即可:

立即学习“前端免费学习笔记(深入)”;

const shadow = element.attachShadow({mode: ‘open’});mode: ‘open’:可以从外部通过 JavaScript 访问 shadow root mode: ‘closed’:无法从外部访问,较为封闭(但实际仍可能被绕过)

创建一个基础的自定义组件

Web Components 由三部分组成:Custom Elements、Shadow DOM 和 HTML Templates。结合它们可以创建完全封装的组件。

步骤如下:

使用 customElements.define() 定义一个新标签名 在类中通过 constructor 创建 shadow root 将模板内容或动态生成的结构插入 shadow DOM

示例:创建一个简单的计数器组件

class MyCounter extends HTMLElement { constructor() { super(); this.attachShadow({ mode: ‘open’ }); this.count = 0; this.shadowRoot.innerHTML = `

当前计数: ${this.count}

button { background: #007bff; color: white; border: none; } span { margin: 0 8px; } `; } connectedCallback() { this.shadowRoot.getElementById(‘inc’) .addEventListener(‘click’, () => { this.count++; this.shadowRoot.getElementById(‘count’).textContent = this.count; }); }}customElements.define(‘my-counter’, MyCounter);

之后就可以在 HTML 中使用:

使用 HTML Template 提升可维护性

直接在 JS 中拼接 HTML 字符串不利于维护。推荐使用 标签预定义结构。

示例:

当前计数: 0

button { background: #007bff; color: white; border: none; } span { margin: 0 8px; }

在类中引用模板:

const template = document.getElementById(‘counter-template’);this.shadowRoot.appendChild(template.content.cloneNode(true));

生命周期回调提升控制力

Custom Element 提供多个生命周期钩子,帮助你更好地管理组件状态:

connectedCallback:元素插入页面时触发,适合绑定事件、初始化数据 disconnectedCallback:元素从 DOM 移除时调用,可用于清理事件监听 attributeChangedCallback:监控属性变化,实现响应式更新 需要配合 observedAttributes 静态方法指定要监听的属性

例如支持传入初始值:

static get observedAttributes() { return [‘start’]; }attributeChangedCallback(name, oldVal, newVal) { if (name === ‘start’) { this.count = parseInt(newVal); if (this.shadowRoot) { this.shadowRoot.getElementById(‘count’).textContent = this.count; } }}

基本上就这些。Shadow DOM 加上 Custom Elements 构成了 Web Components 的核心能力,无需框架也能实现高度封装、可复用的 UI 组件。虽然浏览器兼容性已较好,但在复杂项目中仍需权衡是否引入额外抽象层。不复杂但容易忽略的是样式隔离和事件冒泡行为——事件能穿过 shadow boundary,但目标可能是 shadow 内部元素,需要注意处理。

以上就是html5使用shadow DOM封装组件 html5使用Web Components的基础的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1587569.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月23日 03:32:19
下一篇 2025年12月23日 03:32:28

相关推荐

  • 聊聊CSS 与 JS 是如何阻塞 DOM 解析和渲染的

    本篇文章给大家介绍一下css和js阻塞 dom 解析和渲染的原理。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 hello~各位亲爱的看官老爷们大家好。估计大家都听过,尽量将CSS放头部,JS放底部,这样可以提高页面的性能。然而,为什么呢?大家有考虑过么?很长一段时间,我都是知其…

    2025年12月24日
    000
  • 详解纯CSS实现多彩、智能阴影的方法

    本篇文章给大家详细介绍一下纯css实现多彩、智能阴影的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 有没有想过如何创建从前景元素中继承某些颜色的阴影效果?阅读本文并找出如何实现方法吧! 前几天我经过家得宝(Home Depot,美国家得宝公司,全球领先的家居建材用品零售商)…

    2025年12月24日 好文分享
    000
  • js如何修改css样式

    js修改css样式的方法:1、使用【obj.className】来修改样式表的类名;2、使用【obj.style.cssTest】来修改嵌入式的css;3、使用【obj.className】来修改样式表的类名;4、使用更改外联的css。 本教程操作环境:windows7系统、css3版,DELL G…

    2025年12月24日
    000
  • 如何使用纯CSS、JS实现图片轮播效果

    本篇文章给大家详细介绍一下使用纯css、js实现图片轮播效果的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 .carousel {width: 648px;height: 400px;margin: 0 auto;text-align: center;position: a…

    2025年12月24日
    000
  • js如何修改css

    js修改css的方法:1、使用【obj.style.cssTest】来修改嵌入式的css;2、使用【bj.className】来修改样式表的类名;3、使用更改外联的css文件,从而改变元素的css。 本教程操作环境:windows7系统、css3版,DELL G3电脑。 js修改css的方法: 方法…

    2025年12月24日
    000
  • js如何改变css样式

    js改变css样式的方法:1、使用cssText方法;2、使用【setProperty()】方法;3、使用css属性对应的style属性。 本教程操作环境:windows7系统、css3版,DELL G3电脑。 js改变css样式的方法: 第一种:用cssText div.style.cssText…

    2025年12月24日
    000
  • css如何去掉li前面的点

    在css中,可以使用list-style属性来清除li前面的点,只需要给li标签设置“list-style:none”样式即可。list-style属性是用来控制li列表项目标记的。当值为none时可以清除li前面的项目标记。 本教程操作环境:windows7系统、CSS3&&HTM…

    2025年12月24日
    000
  • cs如何实现翻转效果

    css实现翻转效果的方法:1、将外层元素设置perspective;2、将第二包裹层翻转180度,同时设置过渡速度;3、设置“backface-visibility”;4、设置“z-index”属性;5、让“back”最开始就翻转180度。 本文操作环境:windows7系统、HTML5&&…

    2025年12月24日
    000
  • 如何使用css去掉a标签的下划线?(代码详解)

    写html超链接的时候,超链接总是自带下划线,如果不需要下划线,我们需要将其去掉,下面我们就来说一下怎么去掉下划线。 我们在使用超链接的时候,下划线总是伴随着出现,从视觉上来说有着下划线的a标签总是感觉很奇怪,而且在某些需求中,也不需要下划线的出现,所以就会问了,有没有什么方法让下划线不出现呢?答案…

    2025年12月24日
    000
  • 详解CSS3+SVG滤镜实现不规则边框的方法

    本篇文章将介绍一种配合 svg 滤镜实现各种不规则图形添加边框的小技巧。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 需求背景,给不规则图形添加边框 在我们日常开发中,时长会遇到一些非矩形、非圆形的图案。类似下面这些: 使用纯 CSS,搭配一些技巧,是可以制作出上面的图形的,当然…

    2025年12月24日 好文分享
    000
  • 15 个优秀的响应式 Web 设计 HTML 和 CSS 框架

    【推荐教程:CSS视频教程 】 响应式 Web 设计旨在为各种设备(从台式机显示器到手机)提供最佳的浏览体验。本文汇总了一些优秀的响应式 Web 设计 HTML 和 CSS 框架。这些框架都是开源的并免费的。 对响应式 Web 框架进行比较并不那么容易。有的框架适合设计更快、更精简网站的某些功能,而…

    2025年12月24日 好文分享
    000
  • 文字居中的css代码是什么

    文字居中的css代码是“text-align:center;”或“line-height:值;”。text-align属性规定元素文本的水平对齐方式,当值为center时,即可实现水平居中;而设置line-height可实现文字垂直居中。 本教程操作环境:windows7系统、CSS3&&a…

    2025年12月24日
    000
  • 推荐一个Chrome DevTools实用小插件:CSS Overview Panel

    本篇文章给大家推荐一个实用chrome devtools小插件:css overview panel(css概览面板),使用它重构和改善样式表。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 CSS概览面板(CSS Overview Panel)提供了关于你的CSS的有趣信息。你可…

    2025年12月24日
    000
  • html如何用css美化表格

    html用css美化表格的方法:首先创建一个HTML示例文件;然后在body中创建table表格;最后通过style标签给表格添加css样式即可。 本文操作环境:Windows7系统、HTML5&&CSS3、Dell G3电脑。 html如何用css美化表格? 下面通过示例来看看。 …

    2025年12月24日
    000
  • 聊聊你可能不了解的CSS属性函数 attr()

    本篇文章带大家了解一下css属性函数 attr()。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 属性函数 attr() 用于获取HTML元素里面的属性值,并用于样式中,但目前暂时只能应用于CSS元素中的伪元素。 例子 实现一个Tooltip 立即学习“前端免费学习笔记(深入)”…

    2025年12月24日 好文分享
    000
  • 为什么css放上面js放下面

    css放上面js放下面的原因:1、在加载html生成DOM tree的时候,可以同时对DOM tree进行渲染,这样可以防止闪跳,白屏或者布局混乱;2、javascript加载后会立即执行,同时会阻塞后面的资源加载。 本文操作环境:Windows7系统、HTML5&&CSS3版,DE…

    2025年12月24日
    000
  • 5个有用的css函数(分享)

    CSS 包含了许多函数,而且它能够完成许多早期需要用 JavaScript才能完成的事情。每年都有新的特性被添加进来,这让我们的开发更加轻松,也减少了对JavaScript的依赖。CSS 函数是它所具有的最强大的特性之一,在本文中,我将介绍一些我认为有用的函数。 (学习视频分享:css视频教程) a…

    2025年12月24日 好文分享
    000
  • CSS实现居中的几种方案(总结)

    本篇文章给大家介绍一下多个css居中方案。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 (学习视频分享:css视频教程) 水平居中 内联元素 要使内联元素(如链接,span 或img)居中,使用 text-align: center 足够了。 .desk { text-align…

    2025年12月24日 好文分享
    000
  • 优化滚动的小技巧:使用CSS Scroll Snap!!

    (学习视频分享:css视频教程) 你是否经常希望有一个CSS特性可以轻松创建一个可滚动的容器? CSS scroll snap 可以做到这一点。在早期的前端开发中,我依靠 JS 插件来创建滑块组件。有时,我们需要一种简单的方法来快速将元素制作成可滚动的容器。现在,多亏了 CSSS scroll sn…

    2025年12月24日 好文分享
    000
  • css怎么设置文本框的宽和高

    css中可以使用width和height属性来设置文本框的宽和高,只需要给文本框元素(input或textarea)添加“width:值;”和“height:值;”样式即可。width属性可设置元素的宽度,height属性以设置元素的高度。 本教程操作环境:Windows7系统、css1&&…

    2025年12月24日 好文分享
    000

发表回复

登录后才能评论
关注微信