我之前说过,作为一名刚开始使用 JavaScript 的前端开发人员,你可以学习的一项快速而强大的技巧是 更改类。
const button = document.querySelector(".my-button");
const element = document.querySelector(".content");
button.addEventListener("click", function() {
element.classList.toggle("sparkles");
});
我们可以用这项技能来构建一些标签,对吧?没错。
我们做到了。
假设我们现在在技能集中拥有更改类的能力,并且需要构建一个选项卡界面。如果我们只添加一些处理点击处理程序的代码,我们就可以构建一些简单的选项卡,就像这样
查看 CodePen 上
XQpqZV by Chris Coyier (@chriscoyier)
在 CodePen 上。
完全可用的选项卡。我可能要在这里稍微夸奖一下自己。看到我如何使用这些锚链接在链接和选项卡部分之间创建跳转链接了吗?这非常语义化,不是吗?选项卡可以通过键盘访问,具有焦点样式,并且可以通过 Return 键激活。
我们赢了吗?尘埃落定?完美的选项卡?
没有什么事是那么容易的,是吗?
这里的一个问题是我们没有对键盘处理做任何特殊处理,而选项卡界面可能需要键盘处理。 Heydon Pickering 谈到了这一点
与同一个页面上的链接不同,选项卡不会将用户移动到相关的内容部分/面板。它只是在视觉上显示内容。这对希望在不同部分之间快速切换而不必每次选择新部分时都返回页面的视力正常的用户(包括视力正常的屏幕阅读器用户)来说是有利的。
但这带来了一个不幸的副作用:如果用户希望通过键盘移动到某个部分并与其内部内容进行交互,他们必须逐步浏览当前选项卡右侧的任何选项卡,这些选项卡处于焦点顺序。
事实证明,选项卡界面可以并且应该执行许多其他行为检查清单。在 Heydon 的解释中,Tab 键实际上是作为一种方式,用于从选项卡本身跳转到与该选项卡相关的内容,实际上移动焦点。 Shift+Tab 将它们带回来。然后使用箭头键更改选项卡。所有这些都需要更多 JavaScript 甚至一些 HTML 来允许焦点状态……加上一些 aria-*
属性,我缺乏专业知识来解释它们为什么重要。
最后,就像这样
查看 CodePen 上
Tab Interface (PE) by Heydon (@heydon)
在 CodePen 上。
所以问题就变成了:我们的更改类技能实际上是 web 的弊端,因为它们没有考虑到这些问题吗?用我们拥有的任何基本工具做事对于 web 可访问性来说是净损失吗?我不知道。对我的小脑袋来说,这个问题太大了。但这是一个值得思考的问题。
部分原因在于肌肉记忆。
如果我们先学习像第一个演示那样编写标签,只要没有人因为这样做而咬我们的手指,我们就倾向于一遍又一遍地使用它。我用大约三分钟编写了那个演示,因为我已经做过很多次了。创建这些选项卡无疑是我肌肉记忆的一部分。
关于 JavaScript 框架是 web 上的祸害有很多说法,因为它们似乎正在 ushering in an era of worst-in-class accessibility. 但是,如果你的构建标签的肌肉记忆是使用预构建的选项卡 UI,它会带来所有正确的功能,并且大部分样式由你决定,会怎么样?
这就是 Reach UI 选项卡 所做的(假设我们在使用 React……)。
我不是要告诉你转而去把你的项目切换到 React,以便获得一些免费的选项卡,但 React 已经非常庞大了。如果像这样的良好模式成为默认选择,那么它可能会对可访问性产生积极影响。对我来说,这似乎是可能的。它可能只会阻止我第 359 次笨拙地手写选项卡界面。
我在查看选项卡时使用的试金石是,它如何处理溢出。99% 的选项卡库/模块都没有处理,所以它们最终会下降到下一行。
我发现,对于现代布局来说,这并不复杂。
如果你使用一个 fieldset 作为你的容器,并将你的选项卡布局为单选按钮、标签和内容,你可以使用布局排序和内容堆叠来创建完全可访问的选项卡。你只需要 JavaScript 来确保你的选项卡中重点突出显示的内容是可见的
网格示例
感谢您发布这篇有用的文章,不过有一个重要的问题。
从 SEO 的角度来看,使用选项卡会影响索引过程吗?我的意思是,使用选项卡时,整个内容是否仍会被索引?
React 和它将事物变成伪链接的“天才”想法……哦,是的。可访问性出了问题……非常严重。
每当我遇到一个没有使用任何链接的网站,只有一些花哨的 JS 魔法……我就离开。如果我心情很糟糕,我会对想出这个主意的人大骂一顿。
BTT:即使没有 JS 的魔法,也可以拥有花哨的 UX/AX 选项卡,对吗?:target 在这方面是一个很大的帮助。然后,在之后,我们只需在上面添加一些 JS 香料……曾经有一段时间,这个魔法技巧甚至有一个花哨的名称(我显然已经忘记了,因为 2010 年代的所有“响应式”和“应用程序”正在发生……)。
也许 RESPONSIBLE Javascript?会是一个花哨的新词 :)
cu, w0lf。
我想我又记起了那个可爱的词:UNOBTRUSIVE Javascript :)
这种可爱的标签文化在移动设备上会是什么样子?它会变成一个手风琴吗?那么,那仍然是可访问的吗?……
cu, w0lf。