<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"
}
  • Content:
    /**
     * 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;
      }
    }
    
  • URL: /components/raw/simple-accordion/simple-accordion.css
  • Filesystem Path: components/02_molecules/simple-accordion/simple-accordion.css
  • Size: 1.5 KB
  • Content:
    /**
     * 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);
      }
    })();
    
  • URL: /components/raw/simple-accordion/simple-accordion.js
  • Filesystem Path: components/02_molecules/simple-accordion/simple-accordion.js
  • Size: 2.7 KB

Simple accordion

A title that acts as a trigger button that expands hidden content below with an animation.