<div class="simple-accordion">
<div class="simple-accordion-item">
<p class="simple-accordion-title">
<span>Simple accordion title</span>
<svg class="icon " height="20" width="20" aria-hidden="true">
<use xlink:href="../../sprite.svg#angle" />
</svg>
</p>
<div class="collapsible-content">
<div class="simple-accordion-inner-content">
Ipsum earum eum praesentium delectus deserunt obcaecati Sit ex optio sit dolor ipsam, repellendus delectus inventore ipsam praesentium atque minima voluptas Architecto ab et nobis laboriosam amet Quod libero expedita
</div>
</div>
</div>
</div>
<div class="simple-accordion">
<div class="simple-accordion-item">
<p class="simple-accordion-title">
<span>{{title}}</span>
{{> @svg icon="angle"}}
</p>
<div class="collapsible-content">
<div class="simple-accordion-inner-content">
{{#> @partial-block}}
{{content}}
{{/ @partial-block}}
</div>
</div>
</div>
</div>
{
"title": "Simple accordion title",
"content": "Ipsum earum eum praesentium delectus deserunt obcaecati Sit ex optio sit dolor ipsam, repellendus delectus inventore ipsam praesentium atque minima voluptas Architecto ab et nobis laboriosam amet Quod libero expedita"
}
/**
* Simple accordion
*
* Collapsible accordion component
*/
@media screen {
.simple-accordion + .simple-accordion {
margin-top: 0.75rem;
}
/**
* Accordion item
*/
.simple-accordion-item {
margin-top: 0;
border-bottom: 1px solid var(--mid-light-grey);
}
.simple-accordion-item > * {
margin-top: 0;
}
.simple-accordion-title {
font-weight: 600;
margin: 0;
}
.simple-accordion-title button {
background-color: var(--accordion-title);
border: 0;
border-radius: 0;
box-shadow: none;
color: var(--body-text);
padding: 0.2rem 0;
font: inherit;
width: 100%;
outline: 0;
}
.simple-accordion-title button > span {
justify-content: space-between;
}
.simple-accordion-title .icon {
transform: scaleY(-1);
margin: 0;
height: 1.5em;
width: 1.5em;
}
.simple-accordion-title [aria-expanded="true"] .icon {
transform: scaleY(1);
}
.simple-accordion .collapsible-content {
overflow: hidden;
}
.simple-accordion .collapsible-content[aria-hidden="true"] {
max-height: 0;
transition: max-height 250ms ease-out;
}
.simple-accordion .collapsible-content[aria-hidden="false"] {
max-height: 210rem;
transition: max-height 350ms ease-in;
}
/* Unset overflow when content is opened */
.simple-accordion .collapsible-content[aria-hidden="false"].is-open {
overflow: unset;
}
.simple-accordion-inner-content {
margin-bottom: 1rem;
padding: 1rem 0.5rem;
}
}
/**
* Simple accordion
*/
/* global getSiblings */
'use strict';
(function () {
var accordionItems = document.querySelectorAll('.simple-accordion-item');
if (!accordionItems.length) return;
var idCounter = 0;
function expandA11yAccordion(e) {
// Collapse siblings
var accordionItemSiblings = getSiblings(this.parentNode);
for (let i = 0; i < accordionItemSiblings.length; i++) {
accordionItemSiblings[i].classList.remove('selected');
accordionItemSiblings[i]
.querySelector('.simple-accordion-title')
.setAttribute('aria-expanded', 'false');
accordionItemSiblings[i]
.querySelector('.collapsible-content')
.setAttribute('aria-hidden', 'true');
}
// Event delegation
if (e.target && e.target.matches('button, button *')) {
// Set selected class on accordion item
this.parentNode.classList.toggle('selected');
// Toggle aria-expanded for <button>
this.children[0].setAttribute(
'aria-expanded',
this.children[0].getAttribute('aria-expanded') === 'false'
? 'true'
: 'false'
);
// Toggle aria-hidden for collapsibleContent
this.nextElementSibling.setAttribute(
'aria-hidden',
this.nextElementSibling.getAttribute('aria-hidden') === 'false'
? 'true'
: 'false'
);
}
}
for (let i = 0; i < accordionItems.length; i++) {
// Cache elements
var itemHeader = accordionItems[i].querySelector('.simple-accordion-title');
var collapsibleContent = accordionItems[i].querySelector('.collapsible-content');
// Unique ID attributes
var id = 'collapsible-' + idCounter++;
// Wrap accordion-title content in <button> with unique ID
var itemHeaderText = itemHeader.innerHTML;
var itemHeaderButton =
'<button type="button" aria-controls="' +
id +
'"><span>' +
itemHeaderText +
'</span></button>';
itemHeader.innerHTML = itemHeaderButton;
// Add unique ID to collapsibleContent element
collapsibleContent.setAttribute('id', id);
// Add an animation event listener to collapsibleContent
collapsibleContent.addEventListener('transitionend', function () {
if (!this.classList.contains('is-open')) {
this.classList.add('is-open');
} else {
this.classList.remove('is-open');
}
});
// Set aria attributes for accordion
itemHeader.children[0].setAttribute('aria-expanded', 'false');
itemHeader.nextElementSibling.setAttribute('aria-hidden', 'true');
// Add event listener for itemHeader
itemHeader.addEventListener('click', expandA11yAccordion, false);
}
})();
A title that acts as a trigger button that expands hidden content below with an animation.