|
| 1 | +/** |
| 2 | + * Dropdown Example |
| 3 | + * |
| 4 | + * Optional: data-trigger-type="hover" (default is "click") |
| 5 | + * Optional: data-placement="right-start" (default is "bottom-start") |
| 6 | + * Valid Placement Options: |
| 7 | + * top, top-start, top-end, |
| 8 | + * right, right-start, right-end, |
| 9 | + * bottom, bottom-start, bottom-end, |
| 10 | + * left, left-start, left-end |
| 11 | + * |
| 12 | + * <div class="dropdown" data-trigger-type="hover" data-placement="bottom-start"> |
| 13 | + * <button id="dropdown-1" class="dropdown-trigger" aria-haspopup="true"> |
| 14 | + * Show or Hide Content |
| 15 | + * </button> |
| 16 | + * <ul class="dropdown-content" role="menu" aria-orientation="vertical" aria-labelledby="dropdown-1"> |
| 17 | + * <li role="menuitem"><a href="#">Dropdown Item 1</a></li> |
| 18 | + * <li role="menuitem"><a href="#">Dropdown Item 2</a></li> |
| 19 | + * </ul> |
| 20 | + * </div> |
| 21 | + */ |
| 22 | + |
1 | 23 | ;(function () {
|
2 | 24 | 'use strict'
|
3 | 25 |
|
|
11 | 33 | })
|
12 | 34 | }
|
13 | 35 |
|
14 |
| - const dropdownFn = (trigger, dropdown, triggerType = 'click') => { |
| 36 | + const dropdownFn = (trigger, dropdown, triggerType = 'click', placement) => { |
15 | 37 | const update = () => {
|
16 | 38 | computePosition(trigger, dropdown, {
|
17 | 39 | strategy: 'fixed',
|
18 | 40 | middleware: [
|
19 |
| - autoPlacement({ alignment: 'start', allowedPlacements: ['bottom', 'bottom-start', 'bottom-end'] }), |
| 41 | + autoPlacement( |
| 42 | + { |
| 43 | + alignment: 'start', |
| 44 | + allowedPlacements: placement ? [placement] : ['bottom', 'bottom-start', 'bottom-end'], |
| 45 | + } |
| 46 | + ), |
20 | 47 | shift(),
|
21 | 48 | ],
|
22 | 49 | }).then(({ x, y }) => {
|
|
68 | 95 | }
|
69 | 96 | }
|
70 | 97 |
|
| 98 | + trigger.ariaExpanded = false |
| 99 | + |
71 | 100 | if (triggerType === 'hover' && !isTouchDevice) {
|
72 | 101 | trigger.addEventListener('mouseenter', show)
|
73 | 102 | trigger.addEventListener('mouseenter', clearHideTimeout)
|
|
84 | 113 | // Init all dropdowns
|
85 | 114 | document.querySelectorAll('.dropdown').forEach((dropdown) => {
|
86 | 115 | const triggerType = dropdown.dataset.triggerType
|
| 116 | + const placement = dropdown.dataset.placement |
87 | 117 | const trigger = dropdown.querySelector('.dropdown-trigger')
|
88 | 118 | const content = dropdown.querySelector('.dropdown-content')
|
89 |
| - dropdownFn(trigger, content, triggerType) |
| 119 | + dropdownFn(trigger, content, triggerType, placement) |
90 | 120 | })
|
91 | 121 | })()
|
0 commit comments