Accessible W3C conform accordion written in ES6. Handorgel is the Swiss German name for accordion.
Features
- ARIA accessible
- Keyboard interaction
- Extensive API
- Animated collapsing
- Fully customizable via CSS
- No external dependencies
- Lightweight (~3kb minified and gziped)
Installation
Package manager
| Manager | Command |
|---|---|
| npm | npm install handorgel |
| yarn | yarn add handorgel |
CDN / Download
| File | CDN |
|---|---|
| CSS | handorgel.css |
| CSS (minified) | handorgel.min.css |
| JS | handorgel.js |
| JS (minified) | handorgel.min.js |
Usage
Markup
<div class="handorgel"> <h3 class="handorgel__header"> <button class="handorgel__header__button"> Title </button> </h3> <div class="handorgel__content" data-open> <div class="handorgel__content__inner"> Content openened by default </div> </div> <h3 class="handorgel__header"> <button class="handorgel__header__button"> Title 2 </button> </h3> <div class="handorgel__content"> <div class="handorgel__content__inner"> Content closed by default </div> </div> ... </div>
Note: Use the heading tags that fit into your content to output semantic markup.
CSS
Import the SASS file from your node_modules folder to make use of the variables:
// e.g. changing opening/closing transition times $handorgel__content--open-transition-height-time: .1s; $handorgel__content--open-transition-opacity-time: .2s; $handorgel__content-transition-height-time: .05s; $handorgel__content-transition-opacity-time: .05s; //... @import '~handorgel/src/scss/style';
Alternatively you can just include the built CSS file inside the /lib folder file or from the CDN.
Javascript
Initialization (with all options and their defaults):
var accordion = new handorgel(document.querySelector('.handorgel'), { // whether multiple folds can be opened at once multiSelectable: true, // whether the folds are collapsible collapsible: true, // whether ARIA attributes are enabled ariaEnabled: true, // whether W3C keyboard shortcuts are enabled keyboardInteraction: true, // whether to loop header focus (sets focus back to first/last header when end/start reached) carouselFocus: true, // attribute for the header or content to open folds at initialization initialOpenAttribute: 'data-open', // whether to use transition at initial open initialOpenTransition: true, // delay used to show initial transition initialOpenTransitionDelay: 200, // header/content element selectors or array of elements headerElements: '.handorgel__header', contentElements: '.handorgel__content', // header/content class if fold is open headerOpenClass: 'handorgel__header--open', contentOpenClass: 'handorgel__content--open', // header/content class if fold has been opened (transition finished) headerOpenedClass: 'handorgel__header--opened', contentOpenedClass: 'handorgel__content--opened', // header/content class if fold has been focused headerFocusClass: 'handorgel__header--focus', contentFocusClass: 'handorgel__content--focus', // header/content class if fold is disabled headerDisabledClass: 'handorgel__header--disabled', contentDisabledClass: 'handorgel__content--disabled', })
API
Events
| Event | Description | Parameters |
|---|---|---|
destroy |
Accordeon is about to be destroyed. | |
destroyed |
Accordeon has been destroyed. | |
fold:open |
Fold is about to be opened. | HandorgelFold: Fold instance |
fold:opened |
Fold has opened. | HandorgelFold: Fold instance |
fold:close |
Fold is about to be closed. | HandorgelFold: Fold instance |
fold:closed |
Fold has closed. | HandorgelFold: Fold instance |
fold:focus |
Fold button has been focused. | HandorgelFold: Fold instance |
fold:blur |
Fold button has lost focus. | HandorgelFold: Fold instance |
How to listen for events:
var accordion = new handorgel(document.querySelector('.handorgel')) // listen for event accordion.on('fold:open', (fold) => { // ... }) // listen for event once accordion.once('fold:open', (fold) => { // ... }) // remove event listener accordion.off('fold:open', fn)
Methods
Handorgel Class
| Method | Description | Parameters |
|---|---|---|
update |
Update fold instances (use if you dynamically append/remove DOM nodes). | |
focus |
Set focus to a new header button (you can also directly use the native focus() method on the button). |
target: New header button to focus (next, previous, last or first) |
destroy |
Destroy fold instances, remove event listeners and ARIA attributes. |
Example:
var accordion = new handorgel(document.querySelector('.handorgel')) // destroy accordion.destroy()
HandorgelFold Class
| Method | Description | Parameters |
|---|---|---|
open |
Open content. | transition: Whether transition should be active during opening (default: true). |
close |
Close content. | transition: Whether transition should be active during closing (default: true). |
toggle |
Toggle content. | transition: Whether transition should be active during toggling (default: true). |
disable |
Disable fold. | |
enable |
Enable fold. | |
focus |
Set focus to fold button. | |
blur |
Remove focus from fold button. | |
destroy |
Remove event listeners and ARIA attributes. |
Example:
var accordion = new handorgel(document.querySelector('.handorgel')) // close first fold accordion.folds[0].close()
Browser compatibility
- Newest two browser versions of Chrome, Firefox, Safari and Edge
Development
npm run build- Build production version of the feature.npm run demo- Build demo of the feature, run watchers and start browser-sync.npm run test- Test the feature.