Tab 标签页组件:切换展示文字与组件

介绍 Tab 组件的设计——多标签页切换、命名插槽、居中布局,以及在文章中展示文字和组件交替切换的用法。

2026年6月19日
推荐阅读 3 分钟
606 字
浏览量
观众数

为什么需要 Tab

在技术文章中,经常需要对比不同的实现方式、展示同一功能的多种配置、或者让读者在”组件效果”和”源代码”之间切换。Tab 组件将这些内容收纳在一个紧凑的标签页中,点击即可切换,避免页面过长。

基本用法

最简单的两标签页:

一个简单的 Tab

是这样。

多标签页

支持任意数量的标签页,下面是一个三标签的例子:

当当当! 这是第一个标签页,适合放开场白。

嵌入其他组件

Tab 的插槽中可以放入任意 Astro 组件:

提醒
这是嵌入在 Tab 中的 Alert 组件,类型为 tip。
警告

卡片风格的警告也可以放在 Tab 中。

指定初始标签

通过 active 属性设置初始激活的标签页(从 1 开始):

这是第二项内容,因为 active={2} 所以默认展示。

居中布局

添加 center 属性可以让标签页居中显示:

center={true} 时,标签栏会居中对齐。

Props 一览

属性类型默认值说明
tabsstring[]标签页名称数组(必填)
activenumber1初始激活的标签(从 1 开始)
centerbooleanfalse标签栏是否居中

核心实现

插槽命名约定

每个标签页的内容通过命名插槽 tab1tab2tab3… 传入:

<Tab tabs={["标签A", "标签B"]}>
  <Fragment slot="tab1">标签A 的内容</Fragment>
  <Fragment slot="tab2">标签B 的内容</Fragment>
</Tab>

客户端切换逻辑

使用 is:inline 脚本实现无框架依赖的标签切换,并兼容 Astro View Transitions:

function initTabs(root) {
  const buttons = root.querySelectorAll("[role='tab']");
  const panels = root.querySelectorAll("[role='tabpanel']");

  buttons.forEach((btn) => {
    btn.addEventListener("click", () => {
      const index = Number(btn.dataset.tabIndex);
      // 切换 active 状态 + 显示/隐藏面板
    });
  });
}

// View Transitions 兼容
document.addEventListener("astro:page-load", () => {
  document.querySelectorAll("[data-tab-group]").forEach(initTabs);
});

无障碍支持

  • role="tablist" 标识标签栏
  • role="tab" 标识每个标签按钮
  • role="tabpanel" 标识每个面板
  • aria-selected 标识当前激活的标签

小结

Tab 组件是文章中最实用的交互组件之一。它用最小的空间承载最多的信息,让读者按需切换查看。结合命名插槽机制,可以在标签页中嵌入任意 Markdown 内容或其他组件。

打赏中心

感谢你赐予我前进的力量

微信 微信
支付宝 支付宝
赞赏者名单 因为你们的支持让我意识到写文章的价值

来过,就留下你的足迹吧!