<input type="checkbox">
)<input type=... disabled required readonly>
)... checked="true" disabled="false">
)<!-- tablist 영역 -->
<ul role="tablist">
<li id="tabBtn1" role="tab">TAB 1</li>
<li id="tabBtn2" role="tab">TAB 2</li>
</ul>
<!-- panel1 -->
<div id="panel1" role="tabpanel">
<h3>PANEL 1</h3>
</div>
<!-- panel2 -->
<div id="panel2" role="tabpanel">
<h3>PANEL 2</h3>
</div>
<ul>
은 Unordered List
(순번이 없는 리스트)로 설명되기때문에 정확한 역할 설명이 아니다.role="tablist"
라고 역할 부여해 정확한 역할 설명을 해준다. <li>
도 마찬가지로, 리스트가 아니라 role="tab"
탭 역할을 하는 Element 라고 역할을 변경해준다.<div>
는 아무 역할이 없는 Element 이며, role="tabpnel"
로 역할을 부여한다.role
attribute의 값은 지정되어있고, 하위 구조 역시 역할에 따라 제한이 있다. 임의로 쓰게 되면 밸리데이션 에러가 난다.<!-- tablist -->
<ul class="tablist" role="tablist">
<li id="tab1" role="tab" aria-controls="panel1">TAB 1</li>
<li id="tab2" role="tab" aria-controls="panel2">TAB 2</li>
</ul>
<!-- panel1 -->
<div id="panel1" role="tabpanel" aria-labelledby="tab1" >
<h3>PANEL 1</h3>
</div>
<!-- panel2 -->
<div id="panel2" role="tabpanel" aria-labelledby="tab2" >
<h3>PANEL 2</h3>
</div>
aria-controls
(property)
ID
값으로 참조aria-labelledby
(property)
Element간의 연관성
id="tab1"
Element에 이벤트 발생시 id="panel1"
Element의 가시성을 변경한다.id="tab1"
Element는 id="panel1"
을 컨트롤하는 element이다.id="tab1"
에 aria-controls="panel1"
라고 연관 지어 줄수있다.id="panel1"
Element는, id="tab1"
이 참조 하고있다.id="pannel1"
에 aria-labelledby="tab1"
라고 연관 지어 줄수있다.<!-- tablist -->
<ul role="tablist">
<li id="tab1" role="tab" class="active" aria-controls="panel1" aria-selected="true">TAB 1</li>
<li id="tab2" role="tab" aria-controls="panel2" aria-selected="false">TAB 2</li>
</ul>
<!-- panel1 -->
<div id="panel1" role="tabpanel" class="active" aria-labelledby="tab1" aria-hidden="false">
<h3>PANEL 1</h3>
</div>
<!-- panel2 -->
<div id="panel2" role="tabpanel" aria-labelledby="tab2" aria-hidden="true">
<h3>PANEL 2</h3>
</div>
aria-selected
라는 속성을 추가하고, 선택되어 있는 탭이면, true
, 아닌 탭이면 false
로 지정한다. (javascript에서 속성값을 가져오면 string
이다 boolean
노노)[role="tabpanel"]
은 모두 숨기고, 보여줄 [role="tabpanel"]
만 보여주면 된다.[role="tabpanel"]
에 aria-hidden
이라는 속성을 추가해, 숨길 시 true
, 아닐 시 false
로 지정한다.[aria-hidden="true"], [aria-hidden="false"]
이 셀렉터들은 IE9 이하 버전 브라우저 들에서 안 먹힌다..active
클래스를 추가해서, CSS로 .active
클래스가 붙었을 때만 보여지게 해준다.aria-*
속성도 IE7 에서 안 먹으니, 탭도 .active
클래스로 스타일을 추가해준다/* tab */
[role='tab'] {
background: #fff;
color: black;
}
[role='tab'].active {
/* 활성화 스타일 */
background: gray;
color: #fff;
}
/* panel */
[role='panel'] {
display: none;
}
[role='panel'].active {
/* 활성화 스타일 */
display: block;
}
이제 스크립트로 상태변경을 해주면 된다.
TODOS
Tab
aria-selected
의 STATE
는 true
로 변경하여 선택 표시를 하고,active
클래스를 붙여, 활성화된 스타일로 변경해주고,STATE
는 false
로 변경하여, 선택해제를 함,active
클래스를 제거해서, 스타일 초기화를 해준다.Panel -
panel
을 찾고aria-hidden
의 STATE
를 false
로 변경하여 보여지게 하고,active
클래스를 붙여, 활성화된 스타일로 변경해주고,aria-hidden
의 STATE
를 true
로 변경하여 숨김.active
클래스를 제거해 , 스타일 초기화를 해준다,
// 이벤트 핸들러 - 이벤트 발생시 동작할 함수
function eventHandler(e) {
var $eTarget = $(e.currentTarget);
var $targetPanel = $('[aria-labelledby="' + $eTarget.attr('id') + '"]');
$eTarget
.attr('aria-selected', true)
.addClass('active') // 구버전 IE
.siblings('[role="tab"]')
.attr('aria-selected', false)
.removeClass('active'); // 구버전 IE
$targetPanel
.attr('aria-hidden', false)
.addClass('active') // 구버전 IE
.siblings('[role="tabpanel"]')
.attr('aria-hidden', true)
.removeClass('active'); // 구버전 IE
}
// 이벤트 바인딩 - 이벤트와, 실행될 함수를 연결해줌
$('[role="tab"]').on('click', eventHandler);
<!-- tablist -->
<ul role="tablist">
<li id="tab1" role="tab" class="active" aria-controls="panel1" aria-selected="true" tabindex="0">TAB 1</li>
<li id="tab2" role="tab" aria-controls="panel2" aria-selected="false" tabindex="0">TAB 2</li>
</ul>
<!-- panel1 -->
<div id="panel1" role="tabpanel" class="active" aria-labelledby="tab1" aria-hidden="false">
<h3>PANEL 1</h3>
</div>
<!-- panel2 -->
<div id="panel2" role="tabpanel" aria-labelledby="tab2" aria-hidden="true">
<h3>PANEL 2</h3>
</div>
<li ... role="tab">
탭 Element에 tabindex="0"
추가.
탭 포커스가 가능하게 해주는 속성이다.
function eventHandler(e) {
var $eTarget = $(e.currentTarget);
var $targetPanel = $('[aria-labelledby="' + $eTarget.attr('id') + '"]');
// 조건문으로 이벤트 구분
if (e.type === 'click') { // 클릭 시 동작
$eTarget
.attr('aria-selected', true)
.addClass('active')
.siblings('[role="tab"]')
.attr('aria-selected', false)
.removeClass('active');
$targetPanel
.attr('aria-hidden', false)
.addClass('active')
.siblings('[role="tabpanel"]')
.attr('aria-hidden', true)
.removeClass('active');
} else if (e.type === 'keydown' && e.which === 13) { // 키가 눌렸을 때 && 키가 엔터일 때
// e.which 는 keycode 값을 판별하는데 13 이 엔터 키에 해당되는 keycode
$(this).click(); // 현재 Element에 클릭이벤트 발생시킴
}
}
// 바인딩에 keydown 이벤트 추가 - 쉼표 없음
$('[role="tab"]').on('click keydown', eventHandler);