Dropdown
#
JavaScript setuplet dropdown = () => ({ open: false,
dropdownToggle: { ["x-on:click"]() { this.open = ! this.open }, },
dropdownMenu: { ["x-transition:enter"]: "transition ease-out duration-100", ["x-transition:enter-start"]: "transform opacity-0 scale-95", ["x-transition:enter-end"]: "transform opacity-100 scale-100", ["x-transition:leave"]: "transition ease-in duration-75", ["x-transition:leave-start"]: "transform opacity-100 scale-100", ["x-transition:leave-end"]: "transform opacity-0 scale-95", ["x-on:click.outside"]() { this.open = false }, ["x-show"]() { return this.open }, }})
window.addEventListener("DOMContentLoaded", (event) => { Alpine.data("dropdown", dropdown)})
#
How it worksx-data="dropdown"
: Dropdown root element that stores the state.x-cloak
: Used to hide dropdown content before Alpine loads. https://alpinejs.dev/directives/cloakx-bind="dropdownToggle"
: Toggle dropdown.x-bind="dropdownMenu"
: Used to place dropdown content.
<div x-data="dropdown"> <button x-bind="dropdownToggle"></button>
<div x-bind="dropdownMenu" x-cloak></div></div>
#
Examples- Preview
- HTML
<div x-data="dropdown" class="relative inline-block text-left"> <div> <button x-bind="dropdownToggle" type="button" class="inline-flex justify-center w-full rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-sm font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-100 focus:ring-indigo-500" id="menu-button" aria-expanded="true" aria-haspopup="true"> Options <!-- Heroicon name: solid/chevron-down --> <svg class="-mr-1 ml-2 h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true"> <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd" /> </svg> </button> </div>
<div x-bind="dropdownMenu" x-cloak class="origin-top-right absolute right-0 mt-2 w-56 rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5 focus:outline-none" role="menu" aria-orientation="vertical" aria-labelledby="menu-button" tabindex="-1"> <div class="py-1" role="none"> <!-- Active: "bg-gray-100 text-gray-900", Not Active: "text-gray-700" --> <a href="javascript:void(0)" class="text-gray-700 block px-4 py-2 text-sm" role="menuitem" tabindex="-1" id="menu-item-0">Account settings</a> <a href="javascript:void(0)" class="text-gray-700 block px-4 py-2 text-sm" role="menuitem" tabindex="-1" id="menu-item-1">Support</a> <a href="javascript:void(0)" class="text-gray-700 block px-4 py-2 text-sm" role="menuitem" tabindex="-1" id="menu-item-2">License</a> <a href="javascript:void(0)" class="text-gray-700 block px-4 py-2 text-sm" role="menuitem" tabindex="-1" id="menu-item-2">Sign out</a> </div> </div></div>