RSS Amplifier

Christian Oliff · Apr 10, 2024

Building a Bootstrap Dropdown with the details HTML disclosure element

0
Sign in to vote or save

Christian Oliff · Christian Oliff

Posted on

Contents

Following on from building a Bootstrap accordion using the details HTML tag, I thought I’d try to build a Bootstrap dropdown using the same details HTML tag.

Open dropdown

HTML

<details class="dropdown mb-5">
  <summary class="btn btn-primary dropdown-toggle">
    Open dropdown
  </summary>
  <div>
    <ul class="dropdown-menu" style="display: revert;">
      <li><a class="dropdown-item" href="#">Action</a></li>
      <li><a class="dropdown-item" href="#">Another action</a></li>
      <li><a class="dropdown-item" href="#">Something else here</a></li>
    </ul>
  </div>
</details>

Overall it was easy and quick to get together but it unfortunately brings with it a few minor usability issues.

Unlike a standard Bootstrap downdown component, clicking outside of the dropdown won’t collapse the dropdown and the Esc key won’t collapse it either. Having said that, a standard details/summary element won’t do either of those anyway and the collapse dropdown can still be controlled with a keyboard using the Enter or Space key.

JavaScript (Optional)

You could add a tiny script to close the menu when the Esc key is pressed:

<script>
  document.addEventListener('keydown', function(event) {
  if (event.key === 'Escape') {
    let detailsElements = document.querySelectorAll('details[open]');
    detailsElements.forEach((details) => {
      details.removeAttribute('open');
    });
  }
});
</script>

Accessibility

The dropdown is fully accessible and can be controlled with a keyboard. The dropdown can be opened and closed with the Enter or Space key and the dropdown items can be navigated with the tab key. It is announced as a dropdown by screen readers and the dropdown items are announced as a list.

Summary

I thought this was an intertesting experiment and I hope you find it useful. It’s neat how much you can achieve with just HTML and CSS!

Read the original on christianoliff.com

Comments

Nothing yet. Say the first thing.

    Sign in to join the conversation.