按 Tab 开始遍历:第一个焦点会露出「跳到主内容」的隐藏链接——这是键盘用户的刚需,不是装饰。

一、键盘可达

一个链接
原生控件button、a[href]、input、select、textarea 天然可 Tab、可回车/空格触发,读屏也认。
div 冒充按钮要自己补 tabindex="0" + role="button" + keydown 处理 Enter 和空格 —— 三个都漏就废。能用 button 就用 button。
tabindex0 = 按 DOM 顺序入列;-1 = 不能 Tab 到但能被脚本聚焦;正数会打乱全局顺序,别用。

二、焦点可见

下面这三行的差别就是审计里最常见的失败项:不要为了「好看」写 *:focus { outline: none }。键盘用户点完按钮后看不到自己在哪,等于页面不可用。要美化就用 :focus-visible(只在键盘聚焦时显示),或至少换成自定义 outline 而不是取消。

/* 错误:抹掉全部焦点 */
button:focus { outline: none; }

/* 正确:保留焦点但改外观 */
:focus-visible { outline: 3px solid #0969da; outline-offset: 2px; }

三、aria 的正确用法

第一条铁律(「ARIA 第一定律」):能用原生语义标签就不要用 aria。<button> 天然就是按钮,写 role="button" 是多余且更易出错。

图标按钮必须有名字

前两个读屏播报「关闭 按钮」「搜索 按钮」;第三个只播报「按钮」或一段乱码,是典型的无名控件。

展开/折叠要播报状态

表单错误要关联到控件

<label for="mail">邮箱</label>
<input id="mail" name="email" type="email" aria-describedby="mail-err" aria-invalid="true">
<p id="mail-err" style="color:#cf222e">请填写有效的邮箱地址</p>

只靠红色描边表示出错,色盲用户和低亮度屏幕下就看不出来。aria-invalid + 文本错误信息 + aria-describedby 三者配套。

四、对比度

正文文字与背景的对比度至少要 4.5:1(大号字 3:1):

白字/深底 15.1:1 合格 白字/中灰底 5.9:1 合格 浅字/浅底 1.2:1 不合格

图片上的文字要加半透明遮罩或换到纯色区域;把「提示文字」统一设成 #aaa 是很多站点批量失分的原因。

五、其它常被漏掉的

这里是「跳到主内容」的目标

真实页面里这个 id 应该给 <main> 元素,跳过的是导航区块。