【问题标题】:How do you make a div "tabbable"?你如何让一个 div “tabable”?
【发布时间】:2012-11-18 04:50:45
【问题描述】:

我有按钮是 div 元素,我想制作它们,以便用户可以按键盘上的 tab 键并在它们之间移动。我已经尝试将他们的文本包装在锚标签中,但它似乎不起作用。

有人有解决办法吗?

【问题讨论】:

  • 您想在按钮之间切换吗?还是 div?
  • 如果锚点有href 属性,它应该可以工作。除非可激活项确实做了某事,否则它可能是也可能不是对标记的适当使用。
  • 谢谢,href 解决方案效果最好!蒂姆,如果你提供答案,我会接受。

标签: html css xhtml


【解决方案1】:

tabindex 属性添加到您的div 元素。

例子:

<div tabindex="1">First</div>
<div tabindex="2">Second</div>

根据 steveax 的评论,如果您不希望选项卡顺序偏离页面中元素的位置,请将 tabindex 设置为 0

<div tabindex="0">First</div>
<div tabindex="0">Second</div>

【讨论】:

  • 注意:tabindex 不是 HTML Reference {Neps 指出我的错误后更正}
  • @Dancrumb,是的,它们在 HTML5 中
  • 使用tabindex=0 可能会更好,以免破坏自然的跳转顺序。
  • 顺便说一句,这不允许一个人用回车键点击它。
  • 嗯,@Ciantic 知道我们如何解决或模拟点击进入该 div 的选项卡吗?嗯
【解决方案2】:

对于那些感兴趣的人,除了接受的答案之外,您还可以添加以下 jquery 以在您选项卡时更改 div 样式,并处理 Enter 和 Space 以触发点击(然后您的点击处理程序将执行休息)

$(document).on('focus', '.button',function(){
    $(this).css('border','1px dotted black')
});
$(document).on('keyup', '.button',function(e){
    if(e.which==13 || e.which==32)
        $(this).click()
});

我确定有人把它做成了 jq 插件 $().makeTabStop

【讨论】:

  • 我相信最好使用 keydown 事件而不是这里推荐的 keyup 事件:developer.mozilla.org/en-US/docs/Web/Accessibility/…。 keydown 的一个明显优势是,如果您从处理程序函数返回 false(在 click() 调用之后),它将正确停止页面上其他地方的事件传播,而使用 keyup 这不起作用。
  • 空间也可以滚动页面。您可能还需要使用 preventDefault 函数。
【解决方案3】:

tabindex="0"attribute 添加到您想要标签的每个div。然后使用 CSS 伪类 :hover 和 :focus,例如向应用程序用户表明 div 处于焦点和可点击状态。使用 JavaScript 处理点击。

var doc = document;
var providers = doc.getElementsByClassName("provider");

for (var i = 0; i < providers.length; i++) {
    providers[i].onclick = function() {
      console.log(this.innerHTML);
    };
}
.provider {
    flex: 0 1 auto;
    align-self: auto;
    width: 256px;
    height: 48px;
    margin-top: 12px;
    margin-right: 12px;
    text-align: center;
    line-height: 48px;
    
    text-transform: uppercase;
    background-size: contain;
    background-repeat: no-repeat;
    background-position: 10%;
    background-color: gray;
}

.provider:hover{
  cursor: pointer;
}

.provider:focus{
    -webkit-box-shadow: 0px 2px 8px 2px rgba(0,0,0,0.4);
    -moz-box-shadow: 0px 2px 8px 2px rgba(0,0,0,0.4);
    box-shadow: 0px 2px 8px 2px rgba(0,0,0,0.4);
}
<h4>Click in this area first then press tab</h4>
<div id="email" class="provider" tabindex="0">email</div>
<div id="facebook" class="provider" tabindex="0">facebook</div>
<div id="github" class="provider" tabindex="0">github</div>
<div id="google" class="provider" tabindex="0">google</div>
<div id="twitter" class="provider" tabindex="0">twitter</div>

【讨论】:

    【解决方案4】:

    使用 jquery 使元素可以通过按键进行选项卡和点击

    假设

    • 所有属于不可选项卡、不可点击类型且应可点击的元素都具有 onclick 属性(可以更改为类或其他属性)
    • 所有元素都属于同一类型;我将使用 div。
    • 您正在使用 jquery

    示例 html:

    ...
    
    <div onclick="clicked(this)">Button 1</div>
    <div onclick="clicked(this)">Button 2</div>
    <div onclick="clicked(this)">Button 3</div>
    
    ...
    

    jQuery 代码: 这是页面加载后将运行的代码。它需要在您的 HTML 页面上运行。

    $(()=>{
        // make divs with an onclick attribute tabbable/clickable
        $('div[onclick]')
            .attr('tabindex', '0')                     // Add tab indexes
            .keypress((evt)=>{
                var key = evt.key;
                evt.preventDefault();                  // Ensure all default keypress
                                                       // actions are not used
                if (key === ' ' || key === 'Enter') {  // Only send click events for Space
                                                       // or Enter keys
                    evt.currentTarget.click();         // Run the click event for element
                }
            });
    });
    

    您可以找到一个工作示例here

    【讨论】:

      【解决方案5】:

      对于出于相反意图而出现在此页面上的任何人,例如使 div 标签不可标签:https://github.com/WICG/inert 是一个好方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多