Default horizontal tabs
data-ui-tab-initで初期タブを指定し、disabled triggerをスキップします。
Overview
初期化後、rootにはdata-ui-tab-currentが設定されます。
Features
active class、aria-selected、tabindex、hiddenがまとめて更新されます。
Disabled
disabled classを持つtriggerはクリックやキーボード移動の対象外です。
demo
ArrowLeftとArrowRightでタブを移動し、同時にパネルを切り替えます。
data-ui-tab-initで初期タブを指定し、disabled triggerをスキップします。
初期化後、rootにはdata-ui-tab-currentが設定されます。
active class、aria-selected、tabindex、hiddenがまとめて更新されます。
disabled classを持つtriggerはクリックやキーボード移動の対象外です。
Auto
<div data-ui-tab data-ui-tab-init="overview">
<div role="tablist" aria-label="Horizontal tabs">
<button type="button" data-ui-tab-trigger="overview">Overview</button>
<button type="button" data-ui-tab-trigger="features">Features</button>
<button type="button" data-ui-tab-trigger="disabled" class="--disabled">Disabled</button>
</div>
<section data-ui-tab-content="overview">...</section>
<section data-ui-tab-content="features">...</section>
<section data-ui-tab-content="disabled">...</section>
</div>
<script src="../dist/js-tab-ui.auto.global.js" defer></script>
Manual init
<div data-ui-tab data-ui-tab-init="overview">
<div role="tablist" aria-label="Horizontal tabs">
<button type="button" data-ui-tab-trigger="overview">Overview</button>
<button type="button" data-ui-tab-trigger="features">Features</button>
<button type="button" data-ui-tab-trigger="disabled" class="--disabled">Disabled</button>
</div>
<section data-ui-tab-content="overview">...</section>
<section data-ui-tab-content="features">...</section>
<section data-ui-tab-content="disabled">...</section>
</div>
<script src="../dist/js-tab-ui.umd.global.js"></script>
<script>
window.UiTab.init();
</script>
data-ui-tab-orientation="vertical"でArrowUpとArrowDownを使います。
custom active classとdisabled classもdata属性で指定しています。
tablistにはaria-orientation="vertical"が付与されます。
ArrowDownで次、ArrowUpで前の有効なタブへ移動します。
この例ではis-activeとis-disabledを使っています。
disabled triggerはフォーカス移動からも除外されます。
Auto
<div
data-ui-tab
data-ui-tab-init="account"
data-ui-tab-orientation="vertical"
data-ui-tab-active-class="is-active"
data-ui-tab-disabled-class="is-disabled"
>
<div role="tablist" aria-label="Vertical tabs">
<button type="button" data-ui-tab-trigger="account">Account</button>
<button type="button" data-ui-tab-trigger="billing">Billing</button>
<button type="button" data-ui-tab-trigger="security">Security</button>
<button type="button" data-ui-tab-trigger="archive" class="is-disabled">Archive</button>
</div>
<section data-ui-tab-content="account">...</section>
<section data-ui-tab-content="billing">...</section>
<section data-ui-tab-content="security">...</section>
<section data-ui-tab-content="archive">...</section>
</div>
<script src="../dist/js-tab-ui.auto.global.js" defer></script>
Manual init
<div data-ui-tab data-ui-tab-init="account">
<div role="tablist" aria-label="Vertical tabs">
<button type="button" data-ui-tab-trigger="account">Account</button>
<button type="button" data-ui-tab-trigger="billing">Billing</button>
<button type="button" data-ui-tab-trigger="security">Security</button>
<button type="button" data-ui-tab-trigger="archive" class="is-disabled">Archive</button>
</div>
<section data-ui-tab-content="account">...</section>
<section data-ui-tab-content="billing">...</section>
<section data-ui-tab-content="security">...</section>
<section data-ui-tab-content="archive">...</section>
</div>
<script src="../dist/js-tab-ui.umd.global.js"></script>
<script>
window.UiTab.init({
activeClass: 'is-active',
disabledClass: 'is-disabled',
orientation: 'vertical'
});
</script>
manualでは矢印キーはfocus移動のみ、EnterまたはSpaceで切り替えます。
useHiddenAttribute=falseの例として、表示はCSSで制御しています。
ArrowRightでfocusだけが移動します。選択中のパネルはまだ変わりません。
EnterまたはSpaceを押すと、focus中のタブがactivateされます。
パネルの描画コストが高い場合や、previewと確定を分けたい場合に便利です。
hidden属性を使わないため、非表示制御は.--activeを使ったCSSで行います。
Auto
<div
data-ui-tab
data-ui-tab-init="one"
data-ui-tab-activation="manual"
data-ui-tab-use-hidden-attribute="false"
>
<div role="tablist" aria-label="Manual activation tabs">
<button type="button" data-ui-tab-trigger="one">Step one</button>
<button type="button" data-ui-tab-trigger="two">Step two</button>
<button type="button" data-ui-tab-trigger="three">Step three</button>
</div>
<section data-ui-tab-content="one">...</section>
<section data-ui-tab-content="two">...</section>
<section data-ui-tab-content="three">...</section>
</div>
<script src="../dist/js-tab-ui.auto.global.js" defer></script>
Manual init
<div data-ui-tab data-ui-tab-init="one">
<div role="tablist" aria-label="Manual activation tabs">
<button type="button" data-ui-tab-trigger="one">Step one</button>
<button type="button" data-ui-tab-trigger="two">Step two</button>
<button type="button" data-ui-tab-trigger="three">Step three</button>
</div>
<section data-ui-tab-content="one">...</section>
<section data-ui-tab-content="two">...</section>
<section data-ui-tab-content="three">...</section>
</div>
<script src="../dist/js-tab-ui.umd.global.js"></script>
<script>
window.UiTab.init({
activation: 'manual',
useHiddenAttribute: false
});
</script>
auto bundleを使わず、selector、class、hidden属性、イベントをすべて明示して初期化します。
このデモはdata-custom-tabをrootにして、ui-tab:initとui-tab:changeをconsole.logします。
rootSelectorやtriggerSelectorを変更しても、ARIAとキーボード操作は同じように動作します。
タブを切り替えるとconsoleにui-tab:changeのdetailを出力します。
disabledClassに指定したis-unavailableがあるため、このタブは選択できません。
HTML
<div data-custom-tab data-ui-tab-init="alpha">
<div role="tablist" aria-label="Custom manual tabs">
<button type="button" data-custom-tab-trigger="alpha">Alpha</button>
<button type="button" data-custom-tab-trigger="beta">Beta</button>
<button type="button" data-custom-tab-trigger="gamma" class="is-unavailable">Gamma</button>
</div>
<section data-custom-tab-content="alpha">...</section>
<section data-custom-tab-content="beta">...</section>
<section data-custom-tab-content="gamma">...</section>
</div>
JavaScript
<script src="../dist/js-tab-ui.umd.global.js"></script>
<script>
const customRoot = document.querySelector('[data-custom-tab]');
customRoot.addEventListener('ui-tab:init', function (event) {
console.log('ui-tab:init', event.detail);
});
customRoot.addEventListener('ui-tab:change', function (event) {
console.log('ui-tab:change', event.detail);
});
window.UiTab.init({
rootSelector: '[data-custom-tab]',
triggerSelector: '[data-custom-tab-trigger]',
contentSelector: '[data-custom-tab-content]',
activeClass: 'is-selected',
disabledClass: 'is-unavailable',
hiddenAttribute: 'data-hidden',
useHiddenAttribute: true,
orientation: 'horizontal',
activation: 'auto',
on: {
init: function (detail) {
console.log('on.init', detail);
},
change: function (detail) {
console.log('on.change', detail);
}
}
});
</script>