Tabulation partout, tabulation nulle part
yarn add @19h47/tabs
import Tabs from '@19h47/tabs';
const $element = document.querySelector('.js-tabs');
const tabs = new Tabs($element);
tabs.init();
The element that serves as a container for the set of tabs. The role="tablist"
attribute is required.
The aria-label=""
attribute provides a label that describes the purpose of the set of tabs.
<ul role="tablist" aria-label="navigation">
<li>
<button
type="button"
class="is-active"
role="tab"
aria-selected="true"
aria-controls="home-tab"
id="home"
>
Home
</button>
</li>
<li>
<button
type="button"
role="tab"
aria-selected="false"
aria-controls="project-tab"
id="project"
tabindex="-1"
>
Project
</button>
</li>
<li>
<button
type="button"
role="tab"
aria-selected="false"
aria-controls="contact-tab"
id="contact"
tabindex="-1"
data-deletable=""
>
Contact
</button>
</li>
</ul>
An element in the tab list that serves as a label for one of the tab panels and can be activated to display that panel.
<button
type="button"
role="tab"
aria-selected="false"
aria-controls="foo-tab"
id="foo"
tabindex="-1"
>
Project
</button>
The role="tab"
attribute is required.
The aria-controls="foo-tab"
refers to the id of the tabpanel element associated with the tab.
Since an HTML button element is used for the tab, it is not necessary to set tabindex="0"
on the selected (active) tab element.
Is the tabulation deletable ? You can set up this option by adding the data-deletable
attribute on button.
To active the button on first load, add a is-active
class to the button, remove the tabindex
attribute and switch to true
the aria-selected
attribute.
The element that contains the content associated with a tab.
<section tabindex="0" role="tabpanel" aria-labelledby="foo" id="foo-tab">
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nihil hic, vero. Fugiat voluptas
ex consequatur hic nemo officia iure placeat non, pariatur, dolore natus nobis, tempore
dolores dicta nisi inventore.
</p>
</section>
To active panel on first load, add a is-active
class to it.
Key | Function |
---|---|
Tab |
|
Enter Space |
When a tab has focus, activates the tab, causing its associated panel to be displayed. |
Right Arrow | When a tab has focus:
|
Left Arrow | When a tab has focus:
|
Homefn + left arrow |
When a tab has focus, moves focus to the first tab. |
Endfn + right arrow |
When a tab has focus, moves focus to the last tab. |
Delete | When focus is on the Contact tab, removes the tab from the tab list and places focus on the previous tab. |
Option | Type | Default | Description |
---|---|---|---|
delay | integer | 0 | Determine whether there should be a delay when user navigates with the arrow keys |
hash | boolean | true | |
callback | function | () => {} | A callback fired right before Tab.activate event. Useful for animation or to fetch data for instance. Don't use arrow function if you need to access this . |
import Tabs from '@19h47/tabs';
const $element = document.querySelector('.js-tabs');
const tabs = new Tabs($el, {
callback() {
return new Promise(resolve => {
// animate, fetch data, use this, do your stuff, etc.
resolve();
});
},
});
tabs.init();
Event | Arguments | Description |
---|---|---|
Tab.activate | event | Detail object containing current controls id, and current DOM element |
Tab.delete | event | Detail object containing current controls id, and current DOM element |
import Tabs from '@19h47/tabs';
const $element = document.querySelector('.js-tabs');
const tabs = new Tabs($element);
tabs.init();
tabs.tabs.forEach($tab => {
$tab.el.addEventListener('Tab.activate', ({ detail }) => {
const { controls, element } = detail;
console.log(controls, element);
});
$tab.el.addEventListener('Tab.delete', ({ detail }) => {
const { controls, element } = detail;
console.log(controls, element);
});
});
Method | |
---|---|
destroy() |
Destroy |
init() |
Create |
create() |
Create |
# install dependencies
$ yarn install
# serve with hot reload at localhost:3000
$ yarn start
# build for production
$ yarn prod