【问题标题】:Accessibility - lost focus, should I force focus next focusable?可访问性 - 失去焦点,我应该强制焦点下一个焦点吗?
【发布时间】:2015-07-26 01:26:39
【问题描述】:

我正在创建大表单,并会在部分之间提供按钮导航以实现可访问性。

这意味着您可以通过按钮导航展开/折叠下一个或上一个部分。

但是,当您切换部分时,display CSS 属性会隐藏当前部分(并显示下一个部分),因此刚刚使用的按钮不再是焦点,因为它不可见。

查看 this JSFiddle 或下面的代码以了解问题。

HTML:

<a href="#">An anchor</a>

<article>
    <header>First box</header>
    <main>
        This is first box.
        <label><input type="radio" class="focusable" />This is input</label>
        <button class="next focusable">Next box</button>
    </main>
</article>

<article class="box-hidden">
    <header>Second box</header>
    <main>
        This is second box.
        <button class="focusable">Extra button</button>
        <label><input type="radio" class="focusable" />This is input</label>
        <button class="prev focusable">Previous box</button>
        <button class="next focusable">Next box</button>
    </main>
</article>

<article class="box-hidden">
    <header>Third box</header>
    <main>
        This is third box.
        <label><input type="radio" class="focusable" />This is input</label>
        <button class="prev focusable">Previous box</button>
    </main>
</article>

<a href="#">An anchor</a>

CSS:

.box-hidden main {
    display: none;
}

/* Only cosmetic below */

article { background: #ddd; margin: 10px 0; }
header { background: #ccc; }

button:focus { outline: 2px solid blue; }

jQuery:

$( 'body' ).on('click', '.next', function( event ) {
    event.preventDefault();

    var next = $( this ).closest( 'article' ).next( 'article' );

    $( 'article' ).addClass( 'box-hidden' );
    $( next ).removeClass( 'box-hidden' );
});

$( 'body' ).on('click', '.prev', function( event ) {
    event.preventDefault();

    var prev = $( this ).closest( 'article' ).prev( 'article' );

    $( 'article' ).addClass( 'box-hidden' );
    $( prev ).removeClass( 'box-hidden' );
});

当您使用下一个或上一个按钮时,焦点会丢失,您必须从页面开始重新开始。这不可能发生。


我的解决方案是在打开的部分找到最接近的可聚焦(这很糟糕,因为我使用类,因为第一个可聚焦的可以输入另一个按钮)并聚焦它:

JSFiddle或添加到JQuery:

$( next ).find( '.focusable' )[0].focus();

在这两个函数的末尾,类似地将第二个函数中的 $( next ) 替换为 $( prev )

所以它看起来像:

    //[...]
    $( next ).removeClass( 'box-hidden' );

    $( next ).find( '.focusable' )[0].focus();
});

但我不确定它是否正确,这不会让用户通过可聚焦元素导航感到困惑吗?
也许我应该换一种方式?

注意:按钮是 JS 附加的,所以非 JS 用户不要使用它们。

提前感谢您的建议!

【问题讨论】:

  • edit您的问题包括minimal reproducible example
  • @TinyGiant,是的,你是对的。那个代码是不可读的。我已经尽可能多地清理了这两个版本。
  • 你应该edit 这些例子进入你的问题,如果这些链接最终失效会发生什么?这个问题对未来的观众毫无意义
  • @TinyGiant,是的,目前看来大约 12 小时的编程时间太多了。是时候睡觉了。我没想到如果将来有人会发现这个问题有用,它不会给他任何东西,因为缺少代码。已经修好了。谢谢。

标签: javascript jquery focus accessibility


【解决方案1】:

我相信您发现了可用性问题,而不是可访问性问题。我会用这些部分的展开/折叠切换替换下一个和上一个按钮。这将立即解决您的可访问性问题(因为这些按钮将始终可见)并且它将是用户熟悉的 UI 模型并解决(我认为是)非标准且令人困惑的交互模型。

这是您为此实现更新的 JSfiddle(您可能会找到比我使用的更好的图标)http://jsfiddle.net/zwLLrg9d/7/

我也对此进行了更改,以便正确使用分段内容。绝对不推荐&lt;header&gt; 元素的多个实例。

【讨论】:

  • 我也有展开/折叠,但没有包含在代码中,因为它不关心它。是的,它可能很熟悉,但该网站主要针对可能对 Web 技术没有如此高级知识的老年人。此表格将帮助我的客户能够让客户填写完整的表格 - 然后检查价格,通过互联网订购或此表格将有助于手动完成订单。
  • 但是,由于我有 onclick(无焦点)切换,我会考虑您的建议,因为它使用 input 这可能是个好主意 - 没有空的锚链接或带有奇怪文本的按钮到文本阅读器。
  • 请注意,我简化为 &lt;header&gt; 的 Tiny Giant 请求,因为代码不可读。我在那里只使用 div,因为它不是一种内容,而是形式。
  • 希望对你有用:-)
最近更新 更多