An accordion menu is a great way to organize and present content in a compact format. It allows users to expand and collapse sections of content by clicking on headers, making it easier to navigate large amounts of information. In this blog post, we’ll walk through the process of creating a simple accordion menu using vanilla JavaScript, HTML, and CSS.
What is an Accordion Menu?
An accordion menu is a user interface component that consists of multiple sections. Each section has a header (or button), and clicking on the header toggles the visibility of the content panel associated with it. This allows users to view only the sections they are interested in, while keeping the rest of the content hidden.
Implementing the Accordion Menu
Here’s the JavaScript code to create an accordion menu:
document.addEventListener("DOMContentLoaded", function() {
const accordions = document.querySelectorAll(".accordion");
accordions.forEach(accordion => {
accordion.addEventListener("click", function() {
this.classList.toggle("active");
const panel = this.nextElementSibling;
if (panel.style.maxHeight) {
panel.style.maxHeight = null;
} else {
panel.style.maxHeight = panel.scrollHeight + "px";
}
});
});
});
Code Explanation
- Event Listener for DOMContentLoaded:
- The script starts by adding an event listener for the
DOMContentLoadedevent. This ensures that the script runs after the entire HTML document has been loaded and parsed, making all DOM elements available for manipulation.
- The script starts by adding an event listener for the
- Selecting Accordion Elements:
const accordions = document.querySelectorAll(".accordion");: This selects all elements with the classaccordionand stores them in a NodeList. Each of these elements will serve as a button to toggle the visibility of its associated panel.
- Adding Click Event Listeners:
accordions.forEach(accordion => { ... });: This loops through each accordion element and adds an event listener for theclickevent.- Inside the event listener:
this.classList.toggle("active");: When an accordion is clicked, theactiveclass is toggled on the clicked element. This class can be used to change the appearance of the active accordion (e.g., changing the background color).const panel = this.nextElementSibling;: This selects the next sibling element of the clicked accordion, which is the panel containing the content.if (panel.style.maxHeight) { ... } else { ... }: This condition checks if the panel’smaxHeightstyle is set. If it is, the panel is currently expanded, so settingmaxHeighttonullcollapses it. If it’s not set, the panel is expanded by settingmaxHeightto itsscrollHeight, which is the full height of the panel’s content.
HTML Structure
Here’s an example of the HTML structure that works with the JavaScript code:
<button class="accordion">Section 1</button>
<div class="panel">
<p>Section 1 content...</p>
</div>
<button class="accordion">Section 2</button>
<div class="panel">
<p>Section 2 content...</p>
</div>
- Accordion Buttons (
.accordion):- Each button with the
accordionclass acts as a trigger to expand or collapse the corresponding panel below it.
- Each button with the
- Panels (
.panel):- Each
divwith thepanelclass contains the content that is either shown or hidden when the corresponding accordion button is clicked.
- Each
CSS Styling
To style the accordion and panel, you can use the following CSS:
.accordion {
background-color: #eee;
cursor: pointer;
padding: 10px;
width: 100%;
border: none;
text-align: left;
outline: none;
transition: background-color 0.3s ease;
}
.accordion.active, .accordion:hover {
background-color: #ccc;
}
.panel {
padding: 0 10px;
background-color: white;
max-height: 0;
overflow: hidden;
transition: max-height 0.2s ease-out;
}
CSS Explanation
- Accordion Button Styles (
.accordion):- The accordion buttons are styled with a light background color (
#eee), padding, and a transition effect for the background color when hovered or activated. They have no border and are aligned to the left.
- The accordion buttons are styled with a light background color (
- Active and Hover States (
.accordion.active, .accordion:hover):- When an accordion button is active (clicked) or hovered over, its background color changes to a slightly darker shade (
#ccc). This provides a visual cue to the user.
- When an accordion button is active (clicked) or hovered over, its background color changes to a slightly darker shade (
- Panel Styles (
.panel):- The content panels are hidden by default with a
max-heightof0andoverflow: hidden. When expanded, themax-heightis dynamically set based on the content height, with a smooth transition effect (max-height 0.2s ease-out).
- The content panels are hidden by default with a
How It Works
- When the page loads, the accordion buttons and panels are ready for interaction.
- Clicking an accordion button toggles its
activeclass and adjusts themax-heightof the corresponding panel to either show or hide the content. - The smooth transition effect makes the accordion menu visually appealing and user-friendly.
Conclusion
Creating an accordion menu with vanilla JavaScript is a straightforward task that can greatly enhance the usability of your website. This implementation is lightweight, easy to customize, and perfect for organizing content in a compact and interactive way. You can use this accordion menu in a variety of contexts, such as FAQs, content navigation, or collapsible sections in a single-page application.
