Accessible Accordion With jQuery And Bootstrap 4
File Size: | 10.8 KB |
---|---|
Views Total: | 2015 |
Last Update: | |
Publish Date: | |
Official Website: | Go to website |
License: | MIT |

An accessible, user-friendly accordion component for Bootstrap 4 that makes it simple to navigate between accordion panels and accordion content using the keyboard.
How to use it:
1. Load the necessary jQuery library and Bootstrap framework in the document.
<link rel="stylesheet" href="/path/to/cdn/bootstrap.min.css" /> <script src="/path/to/cdn/jquery.min.js"></script> <script src="/path/to/cdn/bootstrap.min.js"></script>
2. The markup structure for the accessible accordion.
<div class="comp-information"> <div class="information__accordion js-information" id="informationAccordion"> <div class="card"> <div class="card-header"> <h5 class="mb-0"> <!-- NOTE: For change the arrow position toggle class .collapsed ( for collapsed add class .collapsed | for expanded remove class .collapsed ) --> <button type="button" class="btn" data-toggle="collapse" data-target="#collapse-details" aria-expanded="true" aria-controls="collapse-details" title="Accordion 1"> <span class="js-information_tooltip" data-toggle="tooltip" data-placement="bottom">Accordion 1</span> </button> </h5> </div> <!-- NOTE: For show the collapses content add class .show --> <div class="collapse" id="collapse-details" data-parent=""> <div class="card-body"> Accordion Content Here </div> </div> </div> <div class="card"> <div class="card-header"> <h5 class="mb-0"> <!-- NOTE: For change the arrow position toggle class .collapsed ( for collapsed add class .collapsed | for expanded remove class .collapsed ) --> <button type="button" class="btn js-information_tooltip collapsed" data-toggle="collapse" data-target="#accessRights-collapse" aria-expanded="false" aria-controls="accessRights-collapse" title="Accordion 2"> <span class="js-information_tooltip" data-toggle="tooltip" data-placement="bottom">Accordion 2</span> </button> </h5> </div> <!-- NOTE: For show the collapses content add class .show --> <div class="collapse" id="accessRights-collapse" data-parent=""> <div class="card-body"> Accordion Content Here </div> </div> </div> </div> </div>
3. The example CSS rules for the accessible accordion.
.comp-information { width: 100%; } .comp-information a { color: #007fad; text-decoration: underline; } .comp-information a:hover, .comp-information a:focus { color: #006589; } .comp-information .information__accordion .card { border-radius: 4px; margin-bottom: 20px; } .comp-information .information__accordion .card p { margin-bottom: 0; } .comp-information .information__accordion .card p + p { margin-top: 1rem; } .comp-information .information__accordion .card-header { padding: 0; border-radius: 0; } .comp-information .information__accordion .card-header .btn { position: relative; width: 100%; text-align: inherit; -webkit-box-pack: start; justify-content: flex-start; font-size: 22px; padding-top: 9px; padding-bottom: 9px; padding-right: 55px; background-color: #f3f3f3; border: none; } .comp-information .information__accordion .card-header .btn::after { position: absolute; content: ""; top: 0; right: 16px; width: 22px; height: 100%; background-image: url('data:image/svg+xml, <svg xmlns="http://www.w3.org/2000/svg" width="24" height="15"> <path fill="rgb(0, 127, 173)" fill-rule="evenodd" d="M12-.001l12 11.797-3.259 3.203L12 6.406l-8.741 8.593L0 11.796 12-.001z"/> </svg>'); background-position: center; background-repeat: no-repeat; background-size: 100% auto; -webkit-transition: -webkit-transform 0.3s ease; transition: -webkit-transform 0.3s ease; transition: transform 0.3s ease; transition: transform 0.3s ease, -webkit-transform 0.3s ease; height: 26px; top: 27%; } .comp-information .information__accordion .card-header .btn.collapsed:after { -webkit-transform: rotate(180deg); transform: rotate(180deg); } @media (max-width: 767.98px) { .comp-information .information__accordion .card-header .btn, .comp-information .information__accordion .card-body { padding-left: 15px; padding-right: 15px; } } @media (min-width: 768px) { .comp-information .information__accordion .card-header .btn, .comp-information .information__accordion .card-body { padding-left: 30px; padding-right: 30px; } } @media (min-width: 992px) { .comp-information .information__accordion .card-header .btn, .comp-information .information__accordion .card-body { padding-left: 25px; padding-right: 25px; } } .comp-information .information__accordion .card-body { padding-top: 20px; padding-bottom: 20px; background-color: #fbfbfb; } @media (max-width: 767.98px) { .comp-information .information__accordion .card-body { padding-left: 15px; padding-right: 15px; } } @media (min-width: 768px) { .comp-information .information__accordion .card-body { padding-left: 30px; padding-right: 30px; } } @media (min-width: 992px) { .comp-information .information__accordion .card-body { padding-left: 25px; padding-right: 25px; } }
4. Add keyboard interactions to the accessible accordion.
// Accessible - Define values for keycodes function keyCodes() { this.tab = 9; this.untab = 16; this.enter = 13; this.escape = 27; this.space = 32; this.end = 35; this.home = 36; this.left = 37; this.up = 38; this.right = 39; this.down = 40; } // Accessible - bootstrap accordion function accessible_bootstrap_accordion() { var keys = new keyCodes(); // Tabs nav links $(document).on('keydown', '.comp-information [data-toggle="collapse"]', function (e) { var currentBtn = $(this), currentCardWrapper = currentBtn.parents('.card'); function next() { $(currentCardWrapper.next().find('[data-toggle="collapse"]').focus().attr('data-target')).collapse('show'); } function prev() { $(currentCardWrapper.prev().find('[data-toggle="collapse"]').focus().attr('data-target')).collapse('show'); } if (e.which === keys.down) { e.preventDefault(); // Disable arrow key scrolling $(currentBtn.attr('data-target')).collapse('hide'); if (currentCardWrapper.next('.card').length) { next(); } else { prev(); } } else if (e.which === keys.up) { e.preventDefault(); // Disable arrow key scrolling $(currentBtn.attr('data-target')).collapse('hide'); if (currentCardWrapper.prev('.card').length) { prev(); } else { next(); } } }); } // document.ready jQuery(document).ready(function ($) { accessible_bootstrap_accordion(); });
This awesome jQuery plugin is developed by Bizo_dam. For more Advanced Usages, please check the demo page or visit the official website.