2

我需要在小型设备上的模态/全屏面板中显示某些内容,由按钮触发。在大型设备上,始终显示相同的内容,然后隐藏触发器。

您如何处理可访问性?

目前,我有这个设置

<button type="button" aria-expanded="false" aria-controls="filter-panel">Filter</button>

<div class="o-panel" id="filter-panel">Form</div>

最初,它o-panel通过 CSS 隐藏在小型设备上(在针对小型设备的媒体查询中)。当触发器被触发时,我设置aria-expanded为 true,active并向面板本身添加一个类,它o-panel通过 CSS 显示全屏。在大型设备上,我隐藏按钮并始终o-panel通过 CSS(在针对大型设备的媒体查询中)显示内容,内联,它位于 HTML 中。

这对可访问性有意义吗?我的面板没有说role="dialog",因为在大型设备上它只是内容,而不是对话框。我的按钮隐藏在这些大型设备上是否有问题?

我真的被困在我应该在这里做的事情上。如果我添加role="dialog"到我的 o-panel,我是否应该为大型设备删除这个属性,它实际上不是模态的?

o-panel或者我应该从我的 div 中复制/移动内容role="dialog",以防触发触发?我只是不想要相同内容的两个副本。

4

3 回答 3

2

在大型设备上,您需要做几件事。

正确隐藏按钮

首先确保按钮是display:none, notvisibility:hidden或其他任何东西,否则它仍会显示在可访问性树中。

主要 ( <main>) 问题

模态应该出现在你的<main>.

这样您就可以在模式处于活动状态时添加aria-hidden="true"<main>元素,以阻止人们在屏幕阅读器上导航到模式之外。(屏幕阅读器用户使用标题、链接等来导航页面,因此您不能只截取tab密钥。)

现在我来自移动优先理念,所以我会说你的标记应该是移动优先的。<main>如前所述,这意味着将模态置于您的外部。

这显然会在桌面上造成巨大的问题。您现在将内容放在不应该出现的地方。

因此,您在这里只有两个选择。

选项1

使用 JavaScript 在预定义的占位符中重新定位模态内容<div>

因此,您保持您的移动优先设计,然后使用 JavaScript 找到innerHTML您的模态并将其移动到您的持有人的正文中。然后删除模态本身只是为了确定。

当您使用它时,我也会删除该按钮,以防有人将屏幕大小调整为移动视图,我们不希望按钮无处可去。

或者不要删除第二个内容,然后人们可以调整浏览器的大小,只是意味着一些额外的 DOM 节点(只要你的模态内容不超过 100 个 DOM 元素,我会说这样做。)

如果您决定保留模式,请确保这也是 display: none出于与按钮相同的原因,我们不希望人们意外访问它。

选项 2

重复的内容。

我知道,我知道,重复的内容只是,呃。

但有时你只需要忍受它,如果它是最好的。

通过从一开始就将内容复制到 div 中,您确实可以获得一些优势。

优点

  1. 如果用户调整屏幕大小,您可以使用 CSS 在视图之间切换。
  2. 不需要 JavaScript,非常适合您的网站在没有 JS 的情况下运行或JavaScript 失败时。
  3. 虽然它增加了页面重量,但它可能会更好地提高整体性能,但第一个选项导致高累积布局移位的布局移位的可能性非常高(尽管可以避免)。由于 Google 非常重视Web Vitals,我现在就开始考虑它们。此外,如果您的模态框仅包含几个元素,您可能会发现您编写的 JavaScript 几乎与 HTML 一样多。

缺点

  1. 由于重复的 HTML,您将有额外的页面重量。
  2. 您可能需要调整脚本等以解决第二个重复项目(尽管这应该是次要的)。

这仍然是我的偏好,保持简单!这要健壮得多

选项 3(未来)

客户端提示是您可以解决此问题的一种方法,它将响应式设计转变为移动与桌面和响应式的混合体。

当客户端提示有足够的​​市场份额时,您可以简单地使用标头来决定从初始请求发送哪个版本的页面。

如果您愿意让 25% 的用户在桌面上查看您的信息的移动版本,那么您今天就可以实现这一点,这取决于信息的重要性。

其他注意事项

还有一些你没有提到的其他事情需要考虑,所以我想我会添加以供参考。

我已经提到aria-hidden在模态框处于活动状态时添加到模态框之外的所有元素。

为了将来证明您的应用程序inert在模态之外的项目上的使用。支持不是很好(不存在!),但每一点都有帮助,而且很可能会得到实施!

如果需要,您可以对其进行 polyfill,但我认为它尚未超出草案规范,因此我们只是按原样使用它。

还添加aria-modal="true"到您的模态中。

如果您想了解更多信息,我在此答案中更详细地介绍了这些要点。

于 2020-10-30T13:35:22.137 回答
0

确保包含<meta name="viewport" content="width=device-width, initial-scale=1.0">在您的<head>标签中。
然后按照你的风格,你可以玩

@media only screen and (max-width:620px) {
  /* For mobile phones: */
  
  }
您可以在此处了解有关该@media规则的更多信息:W3Schools 媒体规则
如果您还有任何问题,请务必提出!

于 2020-10-30T13:02:00.820 回答
0

可访问性属性只是 aria-expanded="false" aria-controls="filter-panel" 不要更改它。

您的类和 ID 名称对可访问性没有任何影响。

如果您只想在大型设备上默认显示内容,并显示仅在智能手机设备上显示的号召性用语,您可以使用 javascript 和媒体查询来实现。

于 2020-10-30T13:08:02.027 回答