UNPKG

@lawrence-ruscia/dropdown-controller

Version:

A reusable dropdown controller for managing dropdowns in JavaScript.

57 lines (47 loc) 1.4 kB
export default class DropdownController { constructor({ dropdownBtn, dropdownMenu, arrowIcon }) { this.dropdownBtn = document.querySelector(dropdownBtn); this.dropdownMenu = document.querySelector(dropdownMenu); this.arrowIcon = document.querySelector(arrowIcon); if (!this.dropdownBtn || !this.dropdownMenu || !this.arrowIcon) { throw new Error('DropdownController: Invalid selectors provided.'); } this.#init(); } #init() { const rootElement = document.documentElement; // Toggle when button is clicked this.dropdownBtn.addEventListener('click', (e) => { e.stopPropagation(); this.toggle(); }); // Close when clicked outside of dropdown rootElement.addEventListener('click', (e) => { const { target } = e; if ( !this.dropdownMenu.contains(target) && !this.dropdownBtn.contains(target) ) { this.close(); } }); } toggle() { const isOpen = this.dropdownMenu.classList.contains( 'dropdown-menu--active' ); if (isOpen) { this.close(); } else { this.open(); } } open() { this.dropdownMenu.classList.add('dropdown-menu--active'); this.arrowIcon.classList.add('arrow--active'); } close() { this.dropdownMenu.classList.remove('dropdown-menu--active'); this.arrowIcon.classList.remove('arrow--active'); } }