คุณสร้าง div "tabbable" ได้อย่างไร


94

ฉันมีปุ่มที่เป็นองค์ประกอบ div และฉันต้องการสร้างมันขึ้นมาเพื่อให้ผู้ใช้กดปุ่มแท็บบนแป้นพิมพ์และเลื่อนไปมาระหว่างปุ่มเหล่านั้นได้ ฉันได้ลองตัดข้อความในแท็กจุดยึดแล้ว แต่ดูเหมือนจะไม่ได้ผล

ใครมีวิธีแก้ไหมครับ?


คุณต้องการแท็บระหว่างปุ่ม? หรือ Divs?
Dancrumb

2
หากจุดยึดมีhrefแอตทริบิวต์ควรใช้งานได้ อาจเป็นการใช้มาร์กอัปอย่างเหมาะสมหรือไม่ก็ได้เว้นแต่ว่ารายการที่เปิดใช้งานได้ทำอะไรบางอย่างจริงๆ
Tim Medora

มีการถามคำถาม stackoverflow.com/questions/3059203/tab-index-on-div
ntgCleaner

ขอบคุณโซลูชัน href ทำงานได้ดีที่สุด! ทิมถ้าคุณให้คำตอบฉันจะยอมรับมัน
TheBoss

คำตอบ:


128

เพิ่ม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>

1
หมายเหตุ: tabindex ไม่ใช่แอตทริบิวต์ที่ถูกต้องของ div ใน HTML <5 ข้อมูลอ้างอิง {แก้ไขแล้วหลังจาก Neps ชี้ให้เห็นข้อผิดพลาดของฉัน}
Dancrumb

4
@Dancrumb ใช่พวกเขาอยู่ใน HTML5
Neps

45
อาจจะดีกว่าที่จะใช้tabindex=0เพื่อไม่ให้ยุ่งกับลำดับการแท็บตามธรรมชาติ
steveax

7
btw สิ่งนี้ไม่อนุญาตให้คลิกด้วย Enter
Ciantic

5
หืม @Ciantic มีความคิดอย่างไรที่เราจะแก้ไขหรือจำลองการคลิกที่ enter ในขณะที่แท็บไปที่ div นั้น HMN
Jomar Sevillejo

7

สำหรับผู้ที่สนใจนอกเหนือจากคำตอบที่ยอมรับแล้วคุณสามารถเพิ่ม 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


1
ผมเชื่อว่ามันจะดีกว่าที่จะใช้เหตุการณ์ keydown แทนของเหตุการณ์ keyup เป็นแนะนำที่นี่: developer.mozilla.org/en-US/docs/Web/Accessibility/... ข้อได้เปรียบที่ชัดเจนของการคีย์ดาวน์คือถ้าคุณส่งคืนเท็จจากฟังก์ชันแฮนเดอร์ของคุณ (หลังจากการคลิก () เรียก) มันจะหยุดการแพร่กระจายของเหตุการณ์ที่อื่นบนเพจได้อย่างถูกต้องในขณะที่การกดคีย์จะไม่ได้ผล
M Katz

Space อาจเลื่อนหน้าด้วย คุณอาจต้องใช้ฟังก์ชัน PreventDefault ด้วย
b_laoshi

3

เพิ่มtabindex="0"แอตทริบิวต์ให้กับแต่ละ div ที่คุณต้องการ tabbable จากนั้นใช้ CSS pseudo class: hover and: 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>


1

สร้างแท็บองค์ประกอบและคลิกได้ด้วยการกดปุ่มโดยใช้ 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
            }
        });
});

คุณสามารถค้นหาตัวอย่างการทำงานที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.