|
| 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