- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力让我们的 Accordion 可以使用 aria-expanded 等 aria 标签来访问。当单击 Accordion 触发器标题或按下键盘上的“返回”按钮时,我正确地更改了 aria-expanded 的值。由于某种原因,我用来测试的 ChromeVox 最初只会说“按钮折叠”,但一旦点击后值发生变化,就不会说“按钮展开”。
我查看了其他网站上的示例,例如 https://www.w3.org/TR/wai-aria-practices/examples/accordion/accordion.html ChromeVox 可以正确读取 aria-expanded 的两种状态,因此我认为是我的代码结构问题导致 ChromeVox 无法宣布“扩展”状态。
以下是一个 Accordion 部分的示例:
<div class="accordion-section">
<button tabIndex="0" id="rules_list" class="accordion" aria-expanded="false" aria-controls="sectRules">
<span class="title">Rules</span>
</button>
<div class="content" role="region" id="sectRules" aria-labledby="rules_list">
<h4>What rules must all visitors follow?</h4>
<ul class="list">
<li style="list-style-type:disc; border-top:0px; margin-bottom:0px; padding-bottom:0px; padding-top:10px; overflow:visible;">rule 1</li>
<li style="list-style-type:disc; border-top:0px; margin-bottom:0px; padding-bottom:0px; padding-top:10px; overflow:visible;">rule 2</li>
<li style="list-style-type:disc; border-top:0px; margin-bottom:0px; padding-bottom:0px; padding-top:10px; overflow:visible;">rule 3 etc..</li>
</ul>
</div>
</div>
相关js是:
/* Generic Accordion */
$('.accordion .title').click(function() {
$(this).parent().parent().children('.content').toggle();
$(this).toggleClass('open');
$(this).hasClass("open") ? $(this).parent().attr("aria-expanded", "true") : $(this).parent().attr("aria-expanded", "false");
});
/* Adding support for keyboard */
$('.accordion').on('keydown', function(e) {
if (/^(13|32)$/.test(e.which)) {
e.preventDefault();
$(this).find('.title').click();
}
});
相关的 CSS 是:
.accordion + .content {
display: none;
margin-top: 10px;
padding: 10px;
}
.accordion + .content.open {
display: block;
background-color: white;
}
我很茫然,任何帮助将不胜感激。
最佳答案
我第二个什么brennanyoung介绍了您使用 span
元素的方式以及它可能是您的代码无法按预期工作的原因。
在我看来,您确实应该考虑使用 button
元素来切换内容,因为这将避免一些额外的工作,例如:
span
覆盖整个按钮,以防止单击按钮而导致任何结果(大声说出来听起来很奇怪),跨度
,span
正确地充当按钮
(单击、按下和其他按钮
相关事件)。此外,以编程方式触发代码中的 click
事件也暗示可以做一些更简单的事情。
隐藏
+ aria-labelledby
我倾向于通过使用 hidden
attribute 来使其尽可能简单。要切换的内容,以及切换按钮上的 aria-expanded
。
Collapsible Sections of the "Inclusive components book" 如果您需要……嗯,可折叠部分,Heydon Pickering 的著作是一本非常好的读物。其实整本书都很棒,如果你还没有读的话,就不会浪费时间读它。
hidden
属性由屏幕阅读器正确处理,并将在视觉上和辅助功能树中隐藏该元素。您几乎可以在任何最新的 Web 浏览器 ( https://caniuse.com/#search=hidden ) 上使用它,这使其成为避免与类和 CSS display
属性发生冲突的良好候选者。
如果你想在内容上使用 aria-labelledby
(顺便说一句,有 2 个“L”,你的代码中缺少一个)(你应该这样做,因为你将其声明为一个区域),使用 button
文本作为标签效果很好。
但是,如果您打算使用描述操作的文本(例如“显示规则”或“隐藏规则”,具体取决于州),那么这不再相关,您将不得不使用另一个文本元素作为该地标的标签。代码中的 h4
元素似乎可以完成这项工作,并且为其指定一个 id
可以让屏幕阅读器更轻松地识别该区域。
我冒昧地重写了您提供的示例,仅使用纯 JS,并进行了我提到的小调整。可测试here .
<div class="accordion-section" id="accordion-1">
<button id="rules-list" class="rules-toggle" aria-expanded="true" aria-controls="sect-rules">
<span>Rules</span>
</button>
<section role="region" class="content" id="sect-rules" aria-labelledby="rules-list-title">
<h4 id="rules-list-title">What rules must all visitors follow?</h4>
<ul class="list">
<li>rule 1</li>
<li>rule 2</li>
<li>rule 3</li>
</ul>
</section>
</div>
const myButton = document.querySelector('#accordion-1 .rules-toggle');
myButton.addEventListener('click', toggleRules);
function toggleRules(evt) {
const button = evt.currentTarget;
const accordionSection = button.parentElement;
const content = accordionSection.querySelector('.content');
if ('hidden' in content.attributes) {
content.removeAttribute('hidden');
button.setAttribute('aria-expanded', true);
} else {
content.setAttribute('hidden', true);
button.setAttribute('aria-expanded', false);
}
}
.rules-toggle + .content {
margin-top: 10px;
padding: 10px;
background-color: white;
}
.list li {
list-style-type: disc;
border-top: 0;
margin-bottom: 0;
padding-bottom: 0;
padding-top: 10px;
overflow: visible;
}
关于jquery - 当 aria-expanded 为 true 时,如何让屏幕阅读器正确说出 'button expanded',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56399002/
我有一个简单的 Card 组件,是从material-ui 的网站复制的。 我正在尝试在我的代码中实现它。当我单击 CardHeader 时,它不会展开。 这是我的组件: import React,
我已经使用延迟加载实现了一棵树。第一级节点是在树创建时创建的,其中只有当用户展开任何特定节点时才会创建子节点。 数据来自数据库,我们向数据库发出查询以填充子节点。实现了 TreeExpansionLi
假设我有 3 个向量(仅作为示例)。现在我想获取这 3 个所有可能组合的随机样本。通常,我会这样做: x <- 1:3 y <- 10:12 z <- 15:18 N <- length(x) * l
如果我使用 dabbrev-expand为了扩展,Emacs 搜索当前缓冲区,然后搜索其他具有相同模式的缓冲区。这是由 dabbrev-friend-buffer-function 处理的默认设置为
我想像这样切片主窗口 我的布局代码如下: QGridLayout *gLayout = new QGridLayout (); viewWidget->setStyleSheet("backgroun
我在 Android Studio Canary 1 上尝试 Jetpack Compose 并添加了 Column可组合到 ui。 Column有一个名为 modifier 的属性我们可以在其中传递
我正在努力让我们的 Accordion 可以使用 aria-expanded 等 aria 标签来访问。当单击 Accordion 触发器标题或按下键盘上的“返回”按钮时,我正确地更改了 aria-e
根据 http://doc.qt.io/qt-5/qsizepolicy.html#Policy-enum ,设置小部件的大小策略具有以下效果: The sizeHint() is a sensibl
我将使用Live Actitions显示实时数据,并在一个应用程序中添加对Dynamic Island的支持,该应用程序具有现有的小部件扩展。然而,我也不能把它造出来。当我收到错误信息时。和。即使我提
我有一个设置,如下所示: //With dynamic content here. 我正在运行一个脚本,该脚本将 #nav 的大小调整为浏览器窗口的高度大小。但有时我的
我正在使用jquery checkboxtree plugin它效果很好,并且上面的链接中有很好的文档和示例。我现在遇到一种情况,我想以编程方式检查节点。使用以下语法支持此操作: $('#tabs-
我正在尝试以下实验: 我有两个QpushButtons,比如PushA 和PushB。现在 PushA 在 QHBoxLayout 中,PushB 也在它自己的 QHBoxLayout 中。这两个水平
我目前有一个 OData V4 服务,它具有以下模型。 “类别”——“代码” 对于每个类别,可以有许多代码。 我需要 $expand the Codes, $filter where Active =
我的目的是创建一个带有 QVBoxLayout 的可滚动控件,上面有各种控件(比如按钮)。该控件放在 *.ui 窗体上。在该控件的构造函数中,我编写了以下代码: MyScrollArea::M
你们如何解决以下 Flutter 布局? 我有一个屏幕,我必须在其中显示,如图所示:一个 Logo + 3 个 TextFormFields + 2 个按钮 + 一个容器。 问题: 我需要将所有小部件
我使用最新版本的 mvvm light 工具包,但是我不清楚如何将 EventToCommand 用于事件 TreeViewItem.Expanded。 这很有效......我做错了什么?
我是 LINQ 的新手。 我有以下查询,我不知道它代表什么。 var query = (from p in data.First
这里有一个小问题。我有一个表,当我想单击运行时,该表应该展开,而且同一行中有一个展开按钮,它也应该展开一个 div。 问题:当我单击该行时,一切正常,div 将滑入。当我单击按钮(位于表行中)时,会产
图片:
我的应用程序中有 Expander 设置 FlowDirection 正常工作,但标题文本显示在水平方向。我想显示标题文本垂直绘制。 最佳答案 使用 sl 工具包中的 LayoutTransforme
我是一名优秀的程序员,十分优秀!