整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

冷门的HTML - tabindex 的作用

门的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 值的大小来进行处理。

局属性是任何元素都可以设置的属性,即便有一些元素使用了该属性不会引起什么变化。

元素特有的属性叫做局部属性,该属性是元素特有的。

accesskey

该属性设置键盘焦点快捷键,使用方式是 Alt + 属性值 。以下的例子使用 input 元素,设置键盘焦点快捷键 Alt + a 定位到姓名输入框,使用 Alt + p 定位到密码输入框。

<!DOCTYPE html>
<html>
    <head>
        <title>小白学HTML</title>
    </head>

    <body>
        <div>
            账号:<input type="text" accesskey="a"/>
        </div>
        <div>
            密码:<input type="password" accesskey="p"/>
        </div>
    </body>
</html>

使用时注意:如果和其他软件的快捷键冲突,可能会无效。

class

该属性设置元素类型名,可以设置多个,用空格分开。结合CSS使用,可以设置元素的外观样式。例如:

<div class="style1">
    账号:<input type="text" accesskey="a"/>
</div>

<div class="style1 style2 style3">
    密码:<input type="password" accesskey="p"/>
</div>

第一个div元素使用 style1 类型样式。第二个div元素同时使用 style1style2style3 类型样式。

contenteditable

设置元素是否可编辑,当属性值设置为 true 时,焦点到元素上时,可修改文本内容。

<p contenteditable='true'>这是一段可编辑的文字</p>

属性值使用的是单引号,以前的示例都是使用的双引号,在HTML中两种形式都可以。

对于值是 truefalse 的属性来说,将值设置成 true 还有一种简写形式,就是只有属性名,那么属性值就会被浏览器解析成 true。以下示例具有同样的效果:

<p contenteditable>这是一段可编辑的文字</p>

属性值设置的如果不是 truefalse ,而是其他不合法的值,有些浏览器会解析成 false 来对待,不允许编辑。

contextmenu

右键菜单属性,目前没有浏览器支持。大概率会和浏览器本身的右键菜单冲突吧。

dir

设置文字方向,有效值有 ltrrtl,分别表示从左到右和从右到左。

dragable 和 dragzone

两个是HTML5中所支持的拖拽属性。

hidden

隐藏元素属性,bool值。使用此属性的元素,一般来说不会在html文档中显示。另一个隐藏方式是在 style 属性中设置 display:none,在html文档中可以看到此元素,但是不会显示在浏览器中。

id

元素的唯一标识符。也常常用来和css结合使用,选择指定的外观样式。

id还可以用来定位文档中的位置(#号加id)。

lang

设置元素语言,例如 lang="en"

spellcheck

元素是否进行拼写检查,只有在可编辑的元素上才有意义。bool值。

style

直接在元素上设置CSS样式。

tabindex

设置 tab 键的选择顺序,整数值。

title

提供鼠标悬浮提示值。

TML 属性

HTML 标签可以拥有属性。属性提供了有关 HTML 元素的更多的信息。

属性总是以名称/值对的形式出现,比如:name="value"。

属性总是在 HTML 元素的开始标签中规定。

属性实例

HTML 链接由 <a> 标签定义。链接的地址在 href 属性中指定:

[demo]

<html>

<head>

<meta charset="UTF-8">

</head>

<body>

<a href="http://www.w3school.com.cn">

This is a link</a>

</body>

</html>

[/demo]

更多 HTML 属性实例

属性例子 1:

<h1> 定义标题的开始。

<h1 align="center"> 拥有关于对齐方式的附加信息。

[demo]

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta charset="UTF-8">

</head>

<body>

<h1 align="center">This is heading 1</h1>

<p>上面的标题在页面中进行了居中排列。上面的标题在页面中进行了居中排列。上面的标题在页面中进行了居中排列。</p>

</body>

</html>

[/demo]

属性例子 2:

<body> 定义 HTML 文档的主体。

<body bgcolor="yellow"> 拥有关于背景颜色的附加信息。

[demo]

<html>

<head>

<meta charset="UTF-8">

<meta http-equiv="Content-Type" content="text/html />

<meta http-equiv="Content-Language" content="zh-cn" />

</head>

<body bgcolor="yellow">

<h2>请看: 改变了颜色的背景。</h2>

</body>

</html>

[/demo]

属性例子 3:

<table> 定义 HTML 表格。(您将在稍后的章节学习到更多有关 HTML 表格的内容)

<table border="1"> 拥有关于表格边框的附加信息。

HTML 提示:使用小写属性

属性和属性值对大小写不敏感。

不过,万维网联盟在其 HTML 4 推荐标准中推荐小写的属性/属性值。

而新版本的 (X)HTML 要求使用小写属性。

始终为属性值加引号

属性值应该始终被包括在引号内。双引号是最常用的,不过使用单引号也没有问题。

在某些个别的情况下,比如属性值本身就含有双引号,那么您必须使用单引号,例如:

name='Bill "HelloWorld" Gates'

下面列出了适用于大多数 HTML 元素的属性:

属性 值 描述

class classname 规定元素的类名(classname)

id id 规定元素的唯一 id

style style_definition 规定元素的行内样式(inline style)

title text 规定元素的额外信息(可在工具提示中显示)

HTML 全局属性

HTML 属性赋予元素意义和语境。

下面的全局属性可用于任何 HTML 元素。

HTML 全局属性

属性 描述

accesskey 规定激活元素的快捷键。

class 规定元素的一个或多个类名(引用样式表中的类)。

contenteditable 规定元素内容是否可编辑。

contextmenu 规定元素的上下文菜单。上下文菜单在用户点击元素时显示。

data-* 用于存储页面或应用程序的私有定制数据。

dir 规定元素中内容的文本方向。

draggable 规定元素是否可拖动。

dropzone 规定在拖动被拖动数据时是否进行复制、移动或链接。

hidden 规定元素仍未或不再相关。

id 规定元素的唯一 id。

lang 规定元素内容的语言。

spellcheck 规定是否对元素进行拼写和语法检查。

style 规定元素的行内 CSS 样式。

tabindex 规定元素的 tab 键次序。

title 规定有关元素的额外信息。

translate 规定是否应该翻译元素内容。

HTML 事件属性

Window 事件属性

针对 window 对象触发的事件(应用到 <body> 标签):

属性 值 描述

onafterprint script 文档打印之后运行的脚本。

onbeforeprint script 文档打印之前运行的脚本。

onbeforeunload script 文档卸载之前运行的脚本。

onerror script 在错误发生时运行的脚本。

onhaschange script 当文档已改变时运行的脚本。

onload script 页面结束加载之后触发。

onmessage script 在消息被触发时运行的脚本。

onoffline script 当文档离线时运行的脚本。

ononline script 当文档上线时运行的脚本。

onpagehide script 当窗口隐藏时运行的脚本。

onpageshow script 当窗口成为可见时运行的脚本。

onpopstate script 当窗口历史记录改变时运行的脚本。

onredo script 当文档执行撤销(redo)时运行的脚本。

onresize script 当浏览器窗口被调整大小时触发。

onstorage script 在 Web Storage 区域更新后运行的脚本。

onundo script 在文档执行 undo 时运行的脚本。

onunload script 一旦页面已下载时触发(或者浏览器窗口已被关闭)。

Form 事件

由 HTML 表单内的动作触发的事件(应用到几乎所有 HTML 元素,但最常用在 form 元素中):

属性 值 描述

onblur script 元素失去焦点时运行的脚本。

onchange script 在元素值被改变时运行的脚本。

oncontextmenu script 当上下文菜单被触发时运行的脚本。

onfocus script 当元素失去焦点时运行的脚本。

onformchange script 在表单改变时运行的脚本。

onforminput script 当表单获得用户输入时运行的脚本。

oninput script 当元素获得用户输入时运行的脚本。

oninvalid script 当元素无效时运行的脚本。

onreset script 当表单中的重置按钮被点击时触发。HTML5 中不支持。

onselect script 在元素中文本被选中后触发。

onsubmit script 在提交表单时触发。

Keyboard 事件

属性 值 描述

onkeydown script 在用户按下按键时触发。

onkeypress script 在用户敲击按钮时触发。

onkeyup script 当用户释放按键时触发。

Mouse 事件

由鼠标或类似用户动作触发的事件:

属性 值 描述

onclick script 元素上发生鼠标点击时触发。

ondblclick script 元素上发生鼠标双击时触发。

ondrag script 元素被拖动时运行的脚本。

ondragend script 在拖动操作末端运行的脚本。

ondragenter script 当元素元素已被拖动到有效拖放区域时运行的脚本。

ondragleave script 当元素离开有效拖放目标时运行的脚本。

ondragover script 当元素在有效拖放目标上正在被拖动时运行的脚本。

ondragstart script 在拖动操作开端运行的脚本。

ondrop script 当被拖元素正在被拖放时运行的脚本。

onmousedown script 当元素上按下鼠标按钮时触发。

onmousemove script 当鼠标指针移动到元素上时触发。

onmouseout script 当鼠标指针移出元素时触发。

onmouseover script 当鼠标指针移动到元素上时触发。

onmouseup script 当在元素上释放鼠标按钮时触发。

onmousewheel script 当鼠标滚轮正在被滚动时运行的脚本。

onscroll script 当元素滚动条被滚动时运行的脚本。

Media 事件

由媒介(比如视频、图像和音频)触发的事件(适用于所有 HTML 元素,但常见于媒介元素中,比如 <audio>、<embed>、<img>、<object> 以及 <video>):

属性 值 描述

onabort script 在退出时运行的脚本。

oncanplay script 当文件就绪可以开始播放时运行的脚本(缓冲已足够开始时)。

oncanplaythrough script 当媒介能够无需因缓冲而停止即可播放至结尾时运行的脚本。

ondurationchange script 当媒介长度改变时运行的脚本。

onemptied script 当发生故障并且文件突然不可用时运行的脚本(比如连接意外断开时)。

onended script 当媒介已到达结尾时运行的脚本(可发送类似“感谢观看”之类的消息)。

onerror script 当在文件加载期间发生错误时运行的脚本。

onloadeddata script 当媒介数据已加载时运行的脚本。

onloadedmetadata script 当元数据(比如分辨率和时长)被加载时运行的脚本。

onloadstart script 在文件开始加载且未实际加载任何数据前运行的脚本。

onpause script 当媒介被用户或程序暂停时运行的脚本。

onplay script 当媒介已就绪可以开始播放时运行的脚本。

onplaying script 当媒介已开始播放时运行的脚本。

onprogress script 当浏览器正在获取媒介数据时运行的脚本。

onratechange script 每当回放速率改变时运行的脚本(比如当用户切换到慢动作或快进模式)。

onreadystatechange script 每当就绪状态改变时运行的脚本(就绪状态监测媒介数据的状态)。

onseeked script 当 seeking 属性设置为 false(指示定位已结束)时运行的脚本。

onseeking script 当 seeking 属性设置为 true(指示定位是活动的)时运行的脚本。

onstalled script 在浏览器不论何种原因未能取回媒介数据时运行的脚本。

onsuspend script 在媒介数据完全加载之前不论何种原因终止取回媒介数据时运行的脚本。

ontimeupdate script 当播放位置改变时(比如当用户快进到媒介中一个不同的位置时)运行的脚本。

onvolumechange script 每当音量改变时(包括将音量设置为静音)时运行的脚本。

onwaiting script 当媒介已停止播放但打算继续播放时(比如当媒介暂停已缓冲更多数据)运行脚本