双向标签页切换需用JavaScript监听ArrowLeft/ArrowRight事件,通过role="tablist"和role="tab"配合tabindex、aria-selected及焦点管理实现,不能仅靠HTML/CSS或默认tabindex顺序。

双向标签页切换不是“左右滑动翻页”,而是指用户既能点标签切换内容,也能用键盘方向键(←→)或快捷键(如 Ctrl+Tab)在已激活的标签间跳转。它和分页(page=1/2/3)是两回事,别混用 window.history.pushState。
怎么让标签页支持左右方向键切换?
纯靠 HTML + CSS 做不到,必须用 JS 监听 keydown 事件,并手动管理焦点和激活状态。
- 外层容器加
role="tablist",每个标签按钮设role="tab"和tabindex="0"(当前激活项设tabindex="-1") - 监听
document或 tablist 的keydown,捕获ArrowLeft/ArrowRight - 按方向键时,先找出当前激活的
button,再用nextElementSibling或previousElementSibling找相邻项 - 找到后:移除旧
tabindex="0",给新项设tabindex="0"并.focus();同步更新aria-selected和视觉 class(如tab-active) - 边界处理:到第一个标签再按 ← 不做任何事;到末尾再按 → 也忽略,避免报错
为什么不能只靠 tabindex 顺序自动切换?
浏览器默认按 DOM 顺序遍历 tabindex="0" 元素,但标签页的“逻辑顺序”未必等于 DOM 顺序——比如你用 JS 动态插入新标签、或隐藏了某些标签,DOM 顺序就和用户感知的“可切换列表”脱节了。
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
- 显式控制能保证方向键始终在“可见且启用”的标签间循环,跳过
display: none或disabled的项 - 不处理的话,按 Tab 键可能跳进标签页内部的 input,而不是下一个 tab 按钮
- 必须配合
aria-controls和aria-labelledby,否则屏幕阅读器读不出“这是第几个标签”
如何让 Ctrl+Tab / Ctrl+Shift+Tab 切换标签?
这个行为浏览器不原生支持,得自己监听组合键。注意:Ctrl+Tab 在多数浏览器中已被占用(切换浏览器 tab),所以实际建议用 Alt+→ / Alt+← 或自定义快捷键。
- 监听
keydown,检查e.ctrlKey && e.key === "Tab"—— 但拦截后需e.preventDefault(),否则会触发浏览器默认行为 - 更稳妥的做法是绑定到特定容器(如
tab-container),只在它获得焦点时响应,避免全局冲突 - 切记:每次切换后要调用
targetButton.focus(),否则焦点停留在 body,下次按键无效 - 不要用
location.hash或 URL 参数模拟,这会导致历史栈污染,且无法和键盘导航对齐
最容易被忽略的是:方向键切换必须和鼠标点击共享同一套激活状态管理逻辑。如果点击标签时只改 class,而方向键切换只改 tabindex 和 aria-selected,两者就会不同步——用户按 ← 后看到样式没变,或者点了标签后方向键却跳到别处。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










