#标签页
标签页在同一页面位置切换同层级内容,每次只展示一个面板并保留明确的当前状态。
账户
修改账户信息,完成后保存更改。
密码
修改密码后,当前会话将退出登录。
npm install @a3s-lab/ui<div class="tabs w-full" id="demo-tabs-with-panels">
<nav role="tablist" aria-orientation="horizontal" class="w-full">
<button
type="button"
role="tab"
id="demo-tabs-with-panels-tab-1"
aria-controls="demo-tabs-with-panels-panel-1"
aria-selected="true"
tabindex="0"
>
账户
</button>
<button
type="button"
role="tab"
id="demo-tabs-with-panels-tab-2"
aria-controls="demo-tabs-with-panels-panel-2"
aria-selected="false"
tabindex="-1"
>
密码
</button>
</nav>
<div
role="tabpanel"
id="demo-tabs-with-panels-panel-1"
aria-labelledby="demo-tabs-with-panels-tab-1"
tabindex="-1"
aria-selected="true"
>
<div class="card">
<header>
<h2>账户</h2>
<p>修改账户信息,完成后保存更改。</p>
</header>
<section>
<form class="grid gap-4">
<div role="group" class="field">
<label for="demo-tabs-account-name">姓名</label>
<input type="text" id="demo-tabs-account-name" value="林安" />
</div>
<div role="group" class="field">
<label for="demo-tabs-account-username">用户名</label>
<input type="text" id="demo-tabs-account-username" value="@linan" />
</div>
</form>
</section>
<footer>
<button type="button" class="btn">保存更改</button>
</footer>
</div>
</div>
<div
role="tabpanel"
id="demo-tabs-with-panels-panel-2"
aria-labelledby="demo-tabs-with-panels-tab-2"
tabindex="-1"
aria-selected="false"
hidden
>
<div class="card">
<header>
<h2>密码</h2>
<p>修改密码后,当前会话将退出登录。</p>
</header>
<section>
<form class="grid gap-4">
<div role="group" class="field">
<label for="demo-tabs-password-current">当前密码</label>
<input type="password" id="demo-tabs-password-current" />
</div>
<div role="group" class="field">
<label for="demo-tabs-password-new">新密码</label>
<input type="password" id="demo-tabs-password-new" />
</div>
</form>
</section>
<footer>
<button type="button" class="btn">保存密码</button>
</footer>
</div>
</div>
</div>import "@a3s-lab/ui/a3s.css";
import "@a3s-lab/ui/all";#用法
引入 CSS
导入 Tailwind 和一个完整的 A3S UI 样式包。
@import "tailwindcss";
@import "@a3s-lab/ui/a3s.css";或者只导入基础 CSS、标签页组件 CSS 和一个样式包。
@import "tailwindcss";
@import "@a3s-lab/ui/base.css";
@import "@a3s-lab/ui/components/tabs.css";
@import "@a3s-lab/ui/styles/a3s.css";使用 CDN 或构建工具导入时,请参见安装页。
引入 JavaScript
复制或提供完整的 A3S UI JavaScript 包。
<script src="/assets/js/all.min.js" defer></script>或者复制或提供 A3S UI 运行时和选项卡脚本。
<script src="/assets/js/runtime.min.js" defer></script>
<script src="/assets/js/tabs.min.js" defer></script>使用 CDN 或构建工具导入时,请参见安装页。
添加标签页 HTML
<div class="tabs w-full" id="demo-tabs-with-panels">
<nav role="tablist" aria-orientation="horizontal" class="w-full">
<button
type="button"
role="tab"
id="demo-tabs-with-panels-tab-1"
aria-controls="demo-tabs-with-panels-panel-1"
aria-selected="true"
tabindex="0"
>
账户
</button>
<button
type="button"
role="tab"
id="demo-tabs-with-panels-tab-2"
aria-controls="demo-tabs-with-panels-panel-2"
aria-selected="false"
tabindex="-1"
>
密码
</button>
</nav>
<div
role="tabpanel"
id="demo-tabs-with-panels-panel-1"
aria-labelledby="demo-tabs-with-panels-tab-1"
tabindex="-1"
aria-selected="true"
>
<div class="card">
<header>
<h2>账户</h2>
<p>修改账户信息,完成后保存更改。</p>
</header>
<section>
<form class="grid gap-4">
<div role="group" class="field">
<label for="demo-tabs-account-name">姓名</label>
<input type="text" id="demo-tabs-account-name" value="林安" />
</div>
<div role="group" class="field">
<label for="demo-tabs-account-username">用户名</label>
<input type="text" id="demo-tabs-account-username" value="@linan" />
</div>
</form>
</section>
<footer>
<button type="button" class="btn">保存更改</button>
</footer>
</div>
</div>
<div
role="tabpanel"
id="demo-tabs-with-panels-panel-2"
aria-labelledby="demo-tabs-with-panels-tab-2"
tabindex="-1"
aria-selected="false"
hidden
>
<div class="card">
<header>
<h2>密码</h2>
<p>修改密码后,当前会话将退出登录。</p>
</header>
<section>
<form class="grid gap-4">
<div role="group" class="field">
<label for="demo-tabs-password-current">当前密码</label>
<input type="password" id="demo-tabs-password-current" />
</div>
<div role="group" class="field">
<label for="demo-tabs-password-new">新密码</label>
<input type="password" id="demo-tabs-password-new" />
</div>
</form>
</section>
<footer>
<button type="button" class="btn">保存密码</button>
</footer>
</div>
</div>
</div>#HTML 结构
<div class="tabs">标签页根容器。布局方向由子级标签列表的
aria-orientation决定。<nav role="tablist" aria-orientation="horizontal">包含标签按钮的列表。使用
aria-orientation="vertical"切换为垂直布局,使用data-variant="line"启用线型样式。<button role="tab" id="{ TAB_ID }" aria-controls="{ PANEL_ID }" aria-selected="true" tabindex="0">标签触发按钮。当前标签使用
aria-selected="true"和tabindex="0",其余标签使用tabindex="-1"。禁用标签使用disabled或aria-disabled="true"。
<div role="tabpanel" id="{ PANEL_ID }" aria-labelledby="{ TAB_ID }">- 由标签控制的内容面板,非当前面板保持隐藏。
#JavaScript API
| API | 类型 | 描述 |
|---|---|---|
tabs.select(tab) | 方法 | 选择选项卡列表中的选项卡按钮。 |
tabs.refresh() | 方法 | 在现有选项卡列表/面板结构内的子项发生更改后重新扫描选项卡和面板。 |
React 的 useTabs 与 Vue 的同名 composable 通过 call("select", tab, focus) 和 call("refresh") 暴露相同契约。
水平选项卡列表会将溢出限制在自身范围内,并自动滚动以显示当前选项卡。方向键遵循视觉顺序,在 RTL 中左右方向会反转;Home 和 End 分别选择第一个和最后一个可用选项卡。
#示例
#线
概览内容。
分析内容。
报告内容。
<div class="tabs" id="tabs-line">
<nav role="tablist" aria-orientation="horizontal" data-variant="line">
<button
type="button"
role="tab"
id="tabs-line-tab-overview"
aria-controls="tabs-line-panel-overview"
aria-selected="true"
tabindex="0"
>
概览
</button>
<button
type="button"
role="tab"
id="tabs-line-tab-analytics"
aria-controls="tabs-line-panel-analytics"
aria-selected="false"
tabindex="-1"
>
分析
</button>
<button
type="button"
role="tab"
id="tabs-line-tab-reports"
aria-controls="tabs-line-panel-reports"
aria-selected="false"
tabindex="-1"
>
报告
</button>
</nav>
<div
role="tabpanel"
id="tabs-line-panel-overview"
aria-labelledby="tabs-line-tab-overview"
tabindex="-1"
>
概览内容。
</div>
<div
role="tabpanel"
id="tabs-line-panel-analytics"
aria-labelledby="tabs-line-tab-analytics"
tabindex="-1"
hidden
>
分析内容。
</div>
<div
role="tabpanel"
id="tabs-line-panel-reports"
aria-labelledby="tabs-line-tab-reports"
tabindex="-1"
hidden
>
报告内容。
</div>
</div>#垂直
账户内容。
密码内容。
通知内容。
<div class="tabs" id="tabs-vertical">
<nav role="tablist" aria-orientation="vertical">
<button
type="button"
role="tab"
id="tabs-vertical-tab-account"
aria-controls="tabs-vertical-panel-account"
aria-selected="true"
tabindex="0"
>
账户
</button>
<button
type="button"
role="tab"
id="tabs-vertical-tab-password"
aria-controls="tabs-vertical-panel-password"
aria-selected="false"
tabindex="-1"
>
密码
</button>
<button
type="button"
role="tab"
id="tabs-vertical-tab-notifications"
aria-controls="tabs-vertical-panel-notifications"
aria-selected="false"
tabindex="-1"
>
通知
</button>
</nav>
<div
role="tabpanel"
id="tabs-vertical-panel-account"
aria-labelledby="tabs-vertical-tab-account"
tabindex="-1"
>
账户内容。
</div>
<div
role="tabpanel"
id="tabs-vertical-panel-password"
aria-labelledby="tabs-vertical-tab-password"
tabindex="-1"
hidden
>
密码内容。
</div>
<div
role="tabpanel"
id="tabs-vertical-panel-notifications"
aria-labelledby="tabs-vertical-tab-notifications"
tabindex="-1"
hidden
>
通知内容。
</div>
</div>#已禁用
首页内容。
设置内容。
<div class="tabs" id="tabs-disabled">
<nav role="tablist" aria-orientation="horizontal">
<button
type="button"
role="tab"
id="tabs-disabled-tab-home"
aria-controls="tabs-disabled-panel-home"
aria-selected="true"
tabindex="0"
>
首页
</button>
<button
type="button"
role="tab"
id="tabs-disabled-tab-settings"
aria-controls="tabs-disabled-panel-settings"
aria-selected="false"
tabindex="-1"
disabled
>
已禁用
</button>
</nav>
<div
role="tabpanel"
id="tabs-disabled-panel-home"
aria-labelledby="tabs-disabled-tab-home"
tabindex="-1"
>
首页内容。
</div>
<div
role="tabpanel"
id="tabs-disabled-panel-settings"
aria-labelledby="tabs-disabled-tab-settings"
tabindex="-1"
hidden
>
设置内容。
</div>
</div>#图标
预览内容。
代码内容。
<div class="tabs" id="tabs-with-icons">
<nav role="tablist" aria-orientation="horizontal">
<button
type="button"
role="tab"
id="tabs-with-icons-tab-preview"
aria-controls="tabs-with-icons-panel-preview"
aria-selected="true"
tabindex="0"
>
<svg
class="lucide lucide-app-window"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<rect x="2" y="4" width="20" height="16" rx="2" />
<path d="M10 4v4" />
<path d="M2 8h20" />
<path d="M6 4v4" />
</svg>{" "}
预览
</button>
<button
type="button"
role="tab"
id="tabs-with-icons-tab-code"
aria-controls="tabs-with-icons-panel-code"
aria-selected="false"
tabindex="-1"
>
<svg
class="lucide lucide-code"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="m16 18 6-6-6-6" />
<path d="m8 6-6 6 6 6" />
</svg>{" "}
代码
</button>
</nav>
<div
role="tabpanel"
id="tabs-with-icons-panel-preview"
aria-labelledby="tabs-with-icons-tab-preview"
tabindex="-1"
>
预览内容。
</div>
<div
role="tabpanel"
id="tabs-with-icons-panel-code"
aria-labelledby="tabs-with-icons-tab-code"
tabindex="-1"
hidden
>
代码内容。
</div>
</div>#RTL
要启用 RTL 支持,请在标签页根节点或父元素上设置 dir="rtl"。
نظرة عامة
عرض مقاييسك الرئيسية وأنشطة المشروع الأخيرة. تتبع التقدم عبر جميع مشاريعك النشطة.
لديك ١٢ مشروعًا نشطًا و٣ مهام معلقة.
التحليلات
تتبع مقاييس الأداء ومشاركة المستخدمين. راقب الاتجاهات وحدد فرص النمو.
زادت مشاهدات الصفحة بنسبة ٢٥٪ مقارنة بالشهر الماضي.
التقارير
إنشاء وتنزيل تقاريرك التفصيلية. تصدير البيانات بتنسيقات متعددة للتحليل.
لديك ٥ تقارير جاهزة ومتاحة للتصدير.
الإعدادات
إدارة تفضيلات حسابك وخياراته. تخصيص تجربتك لتناسب احتياجاتك.
تكوين الإشعارات والأمان والسمات.
<div class="tabs w-full max-w-sm" id="tabs-rtl" dir="rtl">
<nav role="tablist" aria-orientation="horizontal" dir="rtl">
<button
type="button"
role="tab"
id="tabs-rtl-tab-overview"
aria-controls="tabs-rtl-panel-overview"
aria-selected="true"
tabindex="0"
>
نظرة عامة
</button>
<button
type="button"
role="tab"
id="tabs-rtl-tab-analytics"
aria-controls="tabs-rtl-panel-analytics"
aria-selected="false"
tabindex="-1"
>
التحليلات
</button>
<button
type="button"
role="tab"
id="tabs-rtl-tab-reports"
aria-controls="tabs-rtl-panel-reports"
aria-selected="false"
tabindex="-1"
>
التقارير
</button>
<button
type="button"
role="tab"
id="tabs-rtl-tab-settings"
aria-controls="tabs-rtl-panel-settings"
aria-selected="false"
tabindex="-1"
>
الإعدادات
</button>
</nav>
<div
role="tabpanel"
id="tabs-rtl-panel-overview"
aria-labelledby="tabs-rtl-tab-overview"
tabindex="-1"
>
<div class="card">
<header>
<h2>نظرة عامة</h2>
<p>
عرض مقاييسك الرئيسية وأنشطة المشروع الأخيرة. تتبع التقدم عبر جميع
مشاريعك النشطة.
</p>
</header>
<section>
<p class="text-muted-foreground text-sm">
لديك ١٢ مشروعًا نشطًا و٣ مهام معلقة.
</p>
</section>
</div>
</div>
<div
role="tabpanel"
id="tabs-rtl-panel-analytics"
aria-labelledby="tabs-rtl-tab-analytics"
tabindex="-1"
hidden
>
<div class="card">
<header>
<h2>التحليلات</h2>
<p>
تتبع مقاييس الأداء ومشاركة المستخدمين. راقب الاتجاهات وحدد فرص
النمو.
</p>
</header>
<section>
<p class="text-muted-foreground text-sm">
زادت مشاهدات الصفحة بنسبة ٢٥٪ مقارنة بالشهر الماضي.
</p>
</section>
</div>
</div>
<div
role="tabpanel"
id="tabs-rtl-panel-reports"
aria-labelledby="tabs-rtl-tab-reports"
tabindex="-1"
hidden
>
<div class="card">
<header>
<h2>التقارير</h2>
<p>
إنشاء وتنزيل تقاريرك التفصيلية. تصدير البيانات بتنسيقات متعددة
للتحليل.
</p>
</header>
<section>
<p class="text-muted-foreground text-sm">
لديك ٥ تقارير جاهزة ومتاحة للتصدير.
</p>
</section>
</div>
</div>
<div
role="tabpanel"
id="tabs-rtl-panel-settings"
aria-labelledby="tabs-rtl-tab-settings"
tabindex="-1"
hidden
>
<div class="card">
<header>
<h2>الإعدادات</h2>
<p>إدارة تفضيلات حسابك وخياراته. تخصيص تجربتك لتناسب احتياجاتك.</p>
</header>
<section>
<p class="text-muted-foreground text-sm">
تكوين الإشعارات والأمان والسمات.
</p>
</section>
</div>
</div>
</div>