CSS标签生成器

下一个

标签页无处不在,设置面板、文档网站、产品图库中皆可见其踪迹。原生 HTML 并未提供专用的标签元素,因此开发者需自行实现。这个生成器会用 HTML + CSS 构建一个简单的标签栏:为活动标签提供强调色、为按钮提供圆角,并带有悬停状态。把标记代码粘贴到项目中,再用你自己的 JavaScript 实现标签切换。

如何创建标签页

  1. 1

    选择强调色

    活动标签的背景色和文字颜色。请选择与品牌匹配的颜色。

  2. 2

    设置圆角

    让标签按钮的顶部边角变圆。数值越大,外观越柔和。

  3. 3

    编辑标签名称

    输出包含三个按钮:“Overview”“Details”“Settings”。请按你的内容重命名。

  4. 4

    复制代码

    标签标记自带 <style> 样式块。将两者一起粘贴到你的页面中。

  5. 5

    添加标签切换

    生成器只生成视觉部分。要显示和隐藏面板,请将按钮接入你自己的 JavaScript 或 UI 库。

正确的可访问标记

<div class="tabs">
  <div role="tablist" aria-label="Product info">
    <button role="tab" id="tab-1" aria-selected="true"  aria-controls="panel-1" tabindex="0">Overview</button>
    <button role="tab" id="tab-2" aria-selected="false" aria-controls="panel-2" tabindex="-1">Specs</button>
    <button role="tab" id="tab-3" aria-selected="false" aria-controls="panel-3" tabindex="-1">Reviews</button>
  </div>
  <section role="tabpanel" id="panel-1" aria-labelledby="tab-1">...</section>
  <section role="tabpanel" id="panel-2" aria-labelledby="tab-2" hidden>...</section>
  <section role="tabpanel" id="panel-3" aria-labelledby="tab-3" hidden>...</section>
</div>

关键属性:

  • role="tablist" 包裹这些按钮。
  • 每个按钮上标有 role="tab",并带有 aria-selectedaria-controls
  • tabindex 采用游动 tabindex 模式:仅当前活动标签为 0,其余均为 -1;方向键可在这些标签之间移动焦点。
  • 每个面板上标有 role="tabpanel",其 aria-labelledby 指向对应的标签。
  • 非活动面板加上 hidden(不能只用 display: none,辅助技术依据的正是该属性)。

键盘操作规则

按键 操作
Tab 进入 / 退出标签列表
ArrowLeft 上一个标签(循环到最后一个)
ArrowRight 下一个标签(循环到第一个)
Home 第一个标签
End 最后一个标签
Enter / Space 激活当前聚焦的标签(手动激活时)

自动激活(焦点移动时标签页切换)与手动激活(焦点移动时按Enter键触发标签页切换),WAI-ARIA同时支持这两种方式。自动模式对视力正常的用户更为便捷;当标签页内容需大量渲染时,手动模式更为合适。

下划线样式

[role="tablist"] {
  display: flex;
  border-bottom: 1px solid #e5e7eb;
}
[role="tab"] {
  padding: 0.75rem 1rem;
  background: transparent;
  border: 0;
  color: #6b7280;
  position: relative;
  cursor: pointer;
}
[role="tab"][aria-selected="true"] {
  color: #111827;
}
[role="tab"][aria-selected="true"]::after {
  content: "";
  position: absolute;
  left: 1rem; right: 1rem; bottom: -1px;
  height: 2px;
  background: #2563eb;
}

胶囊样式

[role="tab"] {
  padding: 0.5rem 0.9rem;
  border-radius: 9999px;
  border: 0;
  background: transparent;
}
[role="tab"][aria-selected="true"] {
  background: #2563eb;
  color: #fff;
}

焦点可见

当通过键盘进行聚焦时,务必始终绘制对焦环:

[role="tab"]:focus-visible {
  outline: 2px solid #60a5fa;
  outline-offset: 2px;
}

JavaScript

大致如下:

const tabs = document.querySelectorAll('[role="tab"]');
tabs.forEach(tab => {
  tab.addEventListener('click', () => activate(tab));
  tab.addEventListener('keydown', e => {
    const i = [...tabs].indexOf(tab);
    if (e.key === 'ArrowRight') tabs[(i + 1) % tabs.length].focus();
    if (e.key === 'ArrowLeft')  tabs[(i - 1 + tabs.length) % tabs.length].focus();
    if (e.key === 'Home') tabs[0].focus();
    if (e.key === 'End')  tabs[tabs.length - 1].focus();
  });
});

function activate(tab) {
  tabs.forEach(t => {
    const panel = document.getElementById(t.getAttribute('aria-controls'));
    const active = t === tab;
    t.setAttribute('aria-selected', active);
    t.setAttribute('tabindex', active ? '0' : '-1');
    panel.hidden = !active;
  });
  tab.focus();
}

总计三十行,无依赖项。

标签页与手风琴

在窄屏设备上,标签行会显得拥挤。常见情况是:桌面端显示为标签页布局,移动端则呈现手风琴式排列。可使用容器查询或媒体查询来切换视觉呈现方式,而无需更改ARIA角色设置。

常见问题

对于可访问标签页,答案是肯定的。若缺少 role="tablist"role="tab",屏幕阅读器会将这些按钮视为普通按钮,用户将无法遵循标准导航规则。另一种方案是采用简单的 <details> / <summary> 手风琴,它自带内置语义。

当每个标签页的内容渲染成本较低时,自动激活功能(焦点移动时标签页即被激活)即可满足需求;而当切换标签页需要执行大量操作(如获取或渲染大型表单)时,手动激活功能(焦点移动时按Enter键激活)更为合适。

对于包含内容的标签页(如文档页、产品页),建议使用哈希值(例如 #specs)或查询参数,以便链接能够指向特定标签页,并且活动标签页在页面重新加载时仍保持不变;而对于用户界面标签页(如设置面板),URL为可选参数。

仅适用于缺乏方向键导航和ARIA状态的复选框/单选按钮方案。若追求真正的无障碍体验,这段简短的JS代码完全值得投入。如需服务器端渲染的备用方案,请将每个标签页链接至独立URL,并在服务器端渲染对应的面板界面。

相关工具

此工具还提供其他语言版本