冷门的HTML - tabindex 的作用

本文介绍了HTML的tabindex属性,它可用于控制元素聚焦顺序和是否聚焦。tabindex理论上可用于几乎所有元素,有0、-N(通常是-1)、N(正值)三个值。还阐述了如何利用该属性针对自定义标签优化交互、禁止特定节点聚焦以及控制复杂列表聚焦顺序,以创造更好的用户体验。

冷门的HTML - tabindex 的作用

HTML 的 tabindex 属性开发过程中一般不会使用到,最近开发中有个需求兼顾富交互,便总结了一下。本篇文章同时收录在我的【前端知识点】中,Github链接直达,欢迎 Star

按照惯例,放上官方定义

兼容性:Safari不支持!

阅读本文您将收获

  • tabindex的作用
  • tabindex的使用
  • 如何利用 tabindex 创造更好的用户体验

前言

  • 在我们日常使用网页的过程中,可以通过键盘控制一些元素的聚焦,从而达到便捷访问的目的

  • element 分为 focusable非focusable ,如果使用了tabindex就可以改变相关的行为

  • 在HTML中有6个元素默认支持聚焦:

    • href 属性的 <a> 标签
    • href 属性的 <link> 标签
    • <button></button> 标签
    • <input /> 标签 (排除带有 type="hidden" 属性的)
    • <select></select> 标签
    • <textarea></textarea> 标签
  • 以上的元素默认都可以使用 Tab 键,以及 JS focus() 方法聚焦

document.querySelector("a").focus();
  • 使用 tab键 进行聚焦元素时,聚焦的顺序等于元素在代码中的出现先后顺序,当我们进行富交互优化时,就需要用到 tabindex 这个属性来帮助我们进行更好用户体验的优化了

tabindex的作用

  • ①元素是否能聚焦:通过键盘这类输入设备,或者通过 JS focus() 方法

  • ②元素什么时候能聚焦:在用户通过键盘与页面交互时

  • 通俗来说:就是当用户使用键盘时,tabindex用来定位html元素,即使用tab键时焦点的顺序。

tabindex的范围

tabindex理论上可以使用在几乎所有元素上
  • tabindex 理论上可以用在几乎所有元素上,不管这个元素默认是当否支持聚焦
tabindex 有三个值:0,-N(通常是-1),N(正值)
  • tabindex=0,该元素可以用tab键获取焦点

    • 且访问的顺序是按照元素在文档中的顺序来focus,即使采用了浮动改变了页面中显示的顺序,依然是按照html文档中的顺序来定位
  • tabindex<=-1,该元素用tab键获取不到焦点,但是可以通过js获取

    • 这样就便于我们通过js设置上下左右键的响应事件来focus
    • 取值 -1~-999 之间没有区别,但为了可读性和一致性考虑,推荐使用 -1
  • tabindex>=1,该元素可以用tab键获取焦点,而且优先级大于tabindex=0

    • 不过在tabindex>=1时,数字越小,越先定位到;
    • 如果多个元素拥有相同的 tabindex ,他们的相对顺序按照他们在当前DOM中的先后顺序决定

tabindex的使用

tabindex 决定聚焦顺序
  • 可聚焦元素中,正整数数值越大,顺序越往后,正整数数值的节点顺序比0值的节点靠前
  • 代码:
// HTML
<button type="button" tabindex="1">tabindex === 1</button>
<button type="button" tabindex="999">tabindex === 999</button>
<button type="button" tabindex="0">tabindex === 0</button>
  • 效果:

在这里插入图片描述

  • 可聚焦元素中,相同 tabindex 数值的节点,根据 DOM节点 先后顺序决定聚焦顺序
  • 代码:
// HTML
<button type="button" tabindex="0">tabindex === 0</button>
<button type="button" tabindex="1">tabindex === 1</button>
<button type="button" tabindex="999">tabindex === 999</button>
<button type="button" tabindex="0">tabindex === 0</button>
  • 效果:

在这里插入图片描述

tabindex 决定是否聚焦
  • 节点的 tabindex 设置为 -1 时,当前节点使用 tab键 不能聚焦
  • 代码:
// HTML
<button type="button">未设置tabindex</button>
<button type="button" tabindex="-1">tabindex === -1</button>
<button type="button" tabindex="0">tabindex === 0</button>
<button type="button" tabindex="1">tabindex === 1</button>
  • 效果:

在这里插入图片描述

tabindex 与JS编程聚焦
  • 通过 tabindex 结合JS可以让默认不支持聚焦的节点进行聚焦,tabindex 为不超出范围的任何整数值都可以
  • 代码:
// HTML
<button type="button" @click="clickBtn()">点击让DIV聚焦</button>
<div id="FocusDiv" ref="FocusDiv" tabindex="-1">这是一个div</div>

// JS
clickBtn: function() {
    document.getElementById('FocusDiv').focus();
}
  • 效果:
    在这里插入图片描述

如何利用 tabindex 创造更好的用户体验

针对自定义标签进行富交互优化
  • 我们在创建一个自定义的标签时,如果默认行为中不包含聚焦事件,我们可以使用 tabindex 为它增加聚焦功能,从而可以像很多可聚焦节点一样进行顺次焦点聚焦了
针对特定节点禁止聚焦操作
  • 某些浮层及上层节点,如 toast组件、模态框、侧边弹出信息等,我们不希望节点被用户聚焦捕获,可以将节点的 tabindex 设置为 -1,就能避免这一问题
复杂列表控制聚焦顺序
  • 一些复杂的树形结构或者列式结构,如果需要用户操作顺序按照我们预想的书序进行聚焦,可以利用tabindex 值的大小来进行处理。

往期好文

    [万字长文]百度和好未来面试经含答案

    [前端面试]前端缓存问题看这篇,让面试官爱上你

    记一次惨痛的Vue-cli + VueX + SSR经历

    [三分钟小文]前端性能优化-HTML、CSS、JS部分

    [三分钟小文]前端性能优化-页面加载速度优化

    [三分钟小文]前端性能优化-网络传输层优化

    关注微信公众号【全栈道路】,获取更多全栈好文,还有免费电子书籍赠送哦!

    <think>好的,我现在需要帮助用户了解HTMLtabindex属性的用法及其可访问性相关的问题。首先,我得回忆一下tabindex的基本功能和常见应用场景。 tabindex属性主要用于控制元素能否通过键盘(如Tab键)获得焦点,以及调整焦点顺序。它的值可以是整数,包括负数、0和正数。不同的值有不同的效果,比如负数通常让元素无法通过Tab键访问,但可以通过JavaScript聚焦。0表示元素可被Tab键访问,但顺序由文档流决定。正数则会改变Tab键的顺序,数值越小优先级越高。 接下来,我需要考虑可访问性方面的问题。根据引用中的内容,错误使用标记会影响可访问性,比如用表格布局或用标题改变字体大小,这些做法会让使用辅助技术的用户难以理解页面结构。同样,滥用tabindex也可能导致类似的问题。例如,如果给非交互元素(如div或span)添加tabindex,可能会让屏幕阅读器用户困惑,因为这些元素通常不应获得焦点。 另外,引用提到HTML5中某些属性不再被弃用,比如li的value、ol的start和type属性,这些可能与tabindex无关,但说明规范的变化需要关注。不过用户的问题集中在tabindex,所以这部分可能不需要深入。 用户可能想知道如何正确使用tabindex,尤其是在增强可访问性时。比如,在自定义控件中,使用tabindex="0"可以让元素按自然顺序获得焦点,而tabindex="-1"则允许通过JavaScript编程聚焦,这在处理模态框或动态内容时很有用。 需要注意的是,过度使用正值的tabindex会导致维护困难,因为需要手动管理所有元素的顺序,容易出错。因此,最佳实践是尽量避免使用正数,优先依赖DOM顺序。 此外,非交互元素添加tabindex可能导致可访问性树中的角色混乱,比如静态文本获得焦点会使用户困惑。应确保只有交互式元素(按钮、链接、表单控件)可被聚焦。 最后,结合引用中的建议,正确的标记使用对于可访问性至关重要,tabindex的使用也应符合其设计初衷,确保页面结构清晰,便于辅助技术解析。</think>### Tabindex属性详解及可访问性实践 #### 一、基础功能 1. **焦点控制** - `tabindex="-1"`:元素不可通过键盘Tab键访问,但可通过JavaScript调用`focus()`方法获得焦点 - `tabindex="0"`:元素按DOM自然顺序进入Tab键遍历序列 - `tabindex="1+"`:数值越大优先级越低(实际应避免使用正数值) 2. **应用场景** - 为自定义控件添加键盘访问能力 - 调整复杂布局的焦点顺序 - 动态内容焦点管理(如模态框弹出) $$ \text{Tab键顺序} = \begin{cases} \text{正数值元素}(升序排列) \\ \text{零值元素}(DOM顺序) \\ \text{负数值元素}(排除) \end{cases} $$ #### 二、可访问性规范 1. **强制准则** - 禁止为非交互元素(如`<div>`、`<span>`)添加默认焦点,这会破坏屏幕阅读器的可预测性[^2] - 保持自然DOM顺序优先原则,正数值仅用于特殊场景 2. **兼容性处理** ```html <!-- 正确示例:可聚焦的自定义按钮 --> <div role="button" tabindex="0" aria-label="确认操作">✔</div> <!-- 错误示例:非交互元素获得焦点 --> <p tabindex="0">普通段落文本</p> ``` #### 三、典型问题解决方案 1. **模态框陷阱** 使用`tabindex="-1"`限制焦点在弹出层内: ```html <div class="modal" tabindex="-1" role="dialog" aria-modal="true"> <button tabindex="0">确认</button> <button tabindex="0">取消</button> </div> ``` 2. **动态内容更新** 通过JavaScript管理焦点状态: ```javascript // 新内容加载后自动聚焦 const newContent = document.createElement('div'); newContent.tabIndex = -1; container.appendChild(newContent); newContent.focus(); ``` #### 四、最佳实践 1. **优先级排序** - 原生表单控件 > 自定义控件 - 主要操作 > 次要操作 2. **测试验证** - 使用Chrome DevTools的Accessibility面板检查焦点树 - 完全使用键盘完成所有功能操作测试 相关问题
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
    红包 添加红包
    表情包 插入表情
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值