利用HTML代码中的slot标签构建可复用页面插槽

星晨小哥_2284

星晨小哥_2284

2026-07-26

279人浏览

原创

标签仅在 web components 的 shadow dom 内生效,不能在普通 html 中独立使用;它必须配合自定义元素、attachshadow() 和 customelements.define() 才能实现内容投射。

利用html代码中的slot标签构建可复用页面插槽

slot 标签在普通 HTML 中根本不能直接用

浏览器原生不支持 <slot></slot> 作为独立 HTML 元素渲染——它只在 Web Components 的自定义元素内部、配合 Shadow DOM 才生效。如果你直接在 里写 <slot>默认内容</slot>,页面不会报错,但也不会显示任何插槽行为,它就当普通未定义标签处理,内容照常渲染,但无法被外部内容“注入”或“替换”。

常见错误现象:Uncaught TypeError: Failed to execute 'attachShadow' on 'Element': Shadow root cannot be created on a node already in the document —— 这往往是因为试图对已挂载的元素反复调用 attachShadow,而不是 slot 本身出错。

  • 必须用 customElements.define() 注册一个自定义元素(如 <my-card></my-card>
  • 在该元素的 connectedCallback 或构造函数中调用 this.attachShadow({ mode: 'open' })
  • <slot></slot> 只能出现在 shadow root 内部的模板结构里,不能放在 light DOM 中

如何正确声明具名 slot 并接收外部内容

具名 slot 是复用性提升的关键,但名字必须严格匹配,且大小写敏感。比如组件内写 <slot name="header"></slot>,外部就必须用 slot="header" 属性指定投射位置。

使用场景:卡片组件需要灵活替换标题、操作区、底部按钮,又不想为每种组合写多个组件。

示例(组件定义):

class MyCard extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
    this.shadowRoot.innerHTML = `
      <div class="card">
        <header><slot name="header">默认标题</slot></header><main><slot>默认正文</slot></main><footer><slot name="footer">默认底部</slot></footer>
</div>
    `;
  }
}
customElements.define('my-card', MyCard);

对应使用方式:

html-ppt-to-pdf
html-ppt-to-pdf

将使用 `

` 约定的 HTML 幻灯片转换为高保真、矢量文本 PDF(使用 Playwright + Chromium 原生 PDF 功能)。

下载
<my-card><h2 slot="header">用户资料</h2>
  <p>这里是自定义正文内容</p>
  <button slot="footer" onclick="save()">保存</button>
</my-card>
  • 不带 slot 属性的内容,默认投射到第一个匿名 <slot></slot>(即 <slot></slot>
  • 多个同名 slot="header" 会被合并投射到同一个具名 slot 中(按 DOM 顺序)
  • 如果外部写了 slot="xxx" 但组件内没有对应 name="xxx"<slot></slot>,内容会被丢弃(静默忽略)

slotchange 事件监听不到首次渲染内容

slotchange 事件只在 slot 的可投影内容发生**动态变更**时触发(例如 JS 插入/移除子节点),不包括初始渲染时的静态内容分配。这意味着你不能靠它来“等 slot 填满再初始化 UI”,首次内容加载是同步完成的。

性能影响:频繁触发 slotchange 可能导致布局抖动,尤其在 slot 内含大量节点时;建议用 requestIdleCallback 或节流处理。

  • 监听方式: shadowRoot.querySelector('slot').addEventListener('slotchange', handler)
  • 想获取当前投射内容?用 assignedNodes({ flatten: true }),注意 flatten: true 才会展开嵌套 slot
  • 若需响应式更新(如根据 slot 内容有无切换样式),应结合 MutationObserver 监听 light DOM 变化,而非只依赖 slotchange

与 Vue/React 的 slot 概念容易混淆

原生 <slot></slot> 是编译时静态分发机制,不支持作用域插槽(scoped slot)、动态 slot 名、或运行时 slot 切换逻辑。Vue 的 <slot name="xxx"></slot> 和 React 的 children + 渲染函数是框架层抽象,和底层 Web Components slot 不是一回事。

兼容性影响:Safari 对 slot 的支持从 v10.1 开始,旧版 iOS 需要 polyfill(如 @webcomponents/webcomponentsjs),但 polyfill 无法完全模拟所有行为,尤其是 assignedNodes() 返回值可能不一致。

  • 不要试图在 Vue 组件里直接写 <slot></slot> 并期望它被父级 Vue 模板解析——Vue 会把它当普通 HTML 处理
  • 如果封装 Web Component 给 Vue 项目用,对外暴露的是自定义元素接口,slot 由使用者按原生规则传入
  • React 中需用 dangerouslySetInnerHTML 或透传 props 实现类似效果,本质仍是 light DOM 投射,不是 React 的 children 语义

真正麻烦的地方不在语法,而在于 slot 分发发生在浏览器渲染管线早期,一旦 shadow root 挂载完成,light DOM 子节点就已确定归属。改错一次,后续调试得从 shadow root 结构和 light DOM 节点关系两头查。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

4895

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

2872

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

2530

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

2559

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

4539

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

2521

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

2289

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

2108

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

2068

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
GDB 17.2 官方文档集合
GDB 17.2 官方文档集合

共0课时 | 0人学习

Bootstrap 入门安装配置
Bootstrap 入门安装配置

共0课时 | 0人学习

38+ PhpStorm 提示和技巧
38+ PhpStorm 提示和技巧

共1课时 | 204人学习