div를 "탭 가능"으로 만드는 방법은 무엇입니까?


92

div 요소 인 버튼이 있는데 사용자가 키보드의 탭 키를 누르고 그 사이를 이동할 수 있도록 만들고 싶습니다. 앵커 태그로 텍스트를 래핑하려고 시도했지만 작동하지 않는 것 같습니다.

누구에게 해결책이 있습니까?


버튼 사이를 탭 하시겠습니까? 아니면 사업부?
Dancrumb

2
앵커에 href속성이 있으면 작동합니다. 활성화 가능한 항목이 실제로 어떤 작업을 수행하지 않는 한 마크 업을 적절하게 사용하거나 사용하지 않을 수 있습니다.
Tim Medora 2012


감사합니다. href 솔루션이 가장 잘 작동합니다! 팀, 당신이 대답하면 나는 그것을 받아 들일 것입니다.
TheBoss 2011

답변:


127

요소에 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는 HTML <5에서 div의 유효한 속성이 아닙니다. 참조 {Neps가 내 오류를 지적한 후 수정 됨}
Dancrumb

4
@Dancrumb, 예, HTML5에 있습니다
Neps

45
tabindex=0자연스러운 탭 순서를 따르지 않도록 사용하는 것이 좋습니다 .
steveax

7
btw, 이것은 엔터로 클릭하는 것을 허용하지 않습니다.
Ciantic

5
흠, @Ciantic 어떻게 우리가 그 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
여기에서 권장하는 keyup 이벤트 대신 keydown 이벤트를 사용하는 것이 더 낫다고 생각합니다 : developer.mozilla.org/en-US/docs/Web/Accessibility/… . keydown의 명백한 이점은 hander 함수에서 false를 반환하면 (click () 호출 후) 페이지의 다른 곳에서 이벤트 전파를 올바르게 중지하지만 keyup에서는 작동하지 않는다는 것입니다.
M Katz

스페이스는 페이지를 스크롤 할 수도 있습니다. preventDefault 함수도 사용해야 할 수 있습니다.
b_laoshi

3

tabindex="0"탭으로 만들려는 각 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>


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.