为可切换的下拉菜单定义不同的样式。
下拉菜单(Dropdown)组件具有方向感知能力。这意味着只要鼠标指针朝下拉菜单方向移动,它就会保持打开。额外的延时可以确保即使鼠标指针短暂移向其他方向,下拉菜单也不会立即关闭。如果悬停到另一个菜单项上,下拉菜单会立即关闭。
下拉菜单是 drop 的一个示例,它提供了自己的样式。任何内容(例如按钮)都可以切换下拉菜单。只需为紧跟在切换元素之后的块级元素添加 uk-dropdown 属性。
<button type="button"></button>
<div uk-dropdown></div>下拉菜单可以通过悬停和点击切换元素来打开。只需在属性中添加 mode: click 选项,即可强制只使用 click 模式。如果想把切换元素和下拉菜单组合在一起,只需把 Utility 组件的 .uk-inline 类添加到同时包裹两者的容器元素上。
<div class="uk-inline">
<button type="button"></button>
<div uk-dropdown="mode: click"></div>
</div><div class="uk-inline">
<button class="uk-button uk-button-default" type="button">Hover</button>
<div uk-dropdown>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</div>
</div>
<div class="uk-inline">
<button class="uk-button uk-button-default" type="button">Click</button>
<div uk-dropdown="mode: click">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</div>
</div>下拉菜单可以包含 Nav 组件的导航。只需为 <ul> 元素添加 .uk-nav 类和 .uk-dropdown-nav 修饰符。
<button type="button"></button>
<div uk-dropdown>
<ul class="uk-nav uk-dropdown-nav">…</ul>
</div><button class="uk-button uk-button-default" type="button">Hover</button>
<div uk-dropdown>
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>你可以在下拉菜单中放置 Grid 组件的网格。只需用 <div> 元素包裹内容并添加 uk-grid 属性。如果希望下拉菜单在容器放不下时网格能自动堆叠,只需添加 .uk-drop-grid 类。
<div class="uk-width-large" uk-dropdown>
<div class="uk-drop-grid uk-child-width-1-2@m" uk-grid>…</div>
</div>使用 Width 组件中的某个类来调整下拉菜单的宽度。
<button class="uk-button uk-button-default" type="button">Hover</button>
<div class="uk-width-large" uk-dropdown>
<div class="uk-drop-grid uk-child-width-1-2@m" uk-grid>
<div>
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
<div>
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
</div>
</div>添加 .uk-dropdown-large 类,可获得内边距更大的下拉菜单。
<div class="uk-dropdown-large" uk-dropdown></div><div class="uk-inline">
<button class="uk-button uk-button-default" type="button">Large</button>
<div class="uk-dropdown-large" uk-dropdown>
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
</div>默认情况下,下拉菜单定位在切换元素的下方。要改变它的位置,请为 uk-dropdown 属性设置 pos 选项。值的第一部分指明下拉菜单定位在哪一侧,第二部分定义它与切换元素的对齐方式。
| Position | 说明 |
|---|---|
top-left |
将下拉菜单定位在切换元素上方,并左对齐。 |
top-center |
将下拉菜单定位在切换元素上方,并居中对齐。 |
top-right |
将下拉菜单定位在切换元素上方,并右对齐。 |
bottom-left |
将下拉菜单定位在切换元素下方,并左对齐。 |
bottom-center |
将下拉菜单定位在切换元素下方,并居中对齐。 |
bottom-right |
将下拉菜单定位在切换元素下方,并右对齐。 |
left-top |
将下拉菜单定位在切换元素左侧,并顶部对齐。 |
left-center |
将下拉菜单定位在切换元素左侧,并居中对齐。 |
left-bottom |
将下拉菜单定位在切换元素左侧,并底部对齐。 |
right-top |
将下拉菜单定位在切换元素右侧,并顶部对齐。 |
right-center |
将下拉菜单定位在切换元素右侧,并居中对齐。 |
right-bottom |
将下拉菜单定位在切换元素右侧,并底部对齐。 |
<div uk-dropdown="pos: top-left"></div><div class="uk-inline">
<button class="uk-button uk-button-default" type="button">Top Right</button>
<div uk-dropdown="pos: top-right">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
</div>
<div class="uk-inline">
<button class="uk-button uk-button-default" type="button">Bottom Center</button>
<div uk-dropdown="pos: bottom-center">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
</div>
<div class="uk-inline">
<button class="uk-button uk-button-default" type="button">Right Top</button>
<div uk-dropdown="pos: right-top">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
</div>默认情况下,如果下拉菜单超出视口或任何其他可滚动的父级祖先元素,它会自动改变位置。它会翻转到另一侧以避免遮住切换元素,并偏移对齐方式以适应视口。要设置滚动祖先之外的其他边界,只需在 uk-dropdown 属性中添加 boundary: SELECTOR 选项,并用选择器指定边界。
<div class="my-class">
<button type="button"></button>
<div uk-dropdown="boundary: !.my-class"></div>
</div><div class="boundary uk-panel uk-placeholder uk-height-medium">
<button class="uk-button uk-button-default uk-float-left" type="button">Bottom Right</button>
<div uk-dropdown="pos: bottom-right; boundary: !.boundary">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
<button class="uk-button uk-button-default uk-float-right" type="button">Bottom Left</button>
<div uk-dropdown="pos: bottom-left; boundary: !.boundary">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
</div>要禁用自动偏移和翻转,请在 uk-dropdown 属性中添加 shift: false 或 flip: false 选项。
<div uk-dropdown="shift: false; flip: false"></div><div class="boundary uk-panel uk-placeholder uk-height-medium">
<button class="uk-button uk-button-default uk-float-left" type="button">Bottom Right</button>
<div uk-dropdown="pos: bottom-right; boundary: !.boundary; shift: false; flip: false">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
<button class="uk-button uk-button-default uk-float-right" type="button">Bottom Left</button>
<div uk-dropdown="pos: bottom-left; boundary: !.boundary; shift: false; flip: false">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
</div>默认情况下,滚动时下拉菜单会重新定位。要禁用动态定位,请在 uk-dropdown 属性中添加 auto-update: false 选项。这样下拉菜单只会在打开时定位一次。
<div uk-dropdown="auto-update: false"></div>默认情况下,下拉菜单与它的切换元素对齐。要把下拉菜单定位到另一个元素,只需在 uk-dropdown 属性中添加 target: SELECTOR 选项。如果只想改变下拉菜单所在的一侧,或只想改变与另一个元素的对齐方式,请使用 target-x: SELECTOR 或 target-y: SELECTOR。
<div class="my-class">
<button type="button"></button>
<div uk-dropdown="target: !.my-class"></div>
</div><div class="target uk-panel uk-placeholder uk-height-medium">
<button class="uk-button uk-button-default uk-float-left" type="button">Bottom Left</button>
<div uk-dropdown="pos: bottom-left; target: !.target">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
<button class="uk-button uk-button-default uk-float-right" type="button">Bottom Right</button>
<div uk-dropdown="pos: bottom-right; target: !.target">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
</div>默认情况下,下拉菜单定位在切换元素外部。要把位置改到内部,请在 uk-dropdown 属性中添加 inset: true 选项。只有同时设置了 target 选项时才应使用该选项,这样下拉菜单才不会遮住它的切换元素。
<div uk-dropdown="target: .my-class; inset: true"></div><div class="target uk-panel uk-placeholder uk-height-large">
<button class="uk-button uk-button-default uk-float-left" type="button">Bottom Left</button>
<div uk-dropdown="pos: bottom-left; target: !.target; inset: true">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
<button class="uk-button uk-button-default uk-float-right" type="button">Bottom Right</button>
<div uk-dropdown="pos: bottom-right; target: !.target; inset: true">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
</div>要让下拉菜单拉伸以填满最近的滚动祖先元素的尺寸,请在 uk-dropdown 属性中添加 stretch: true 选项。如果只想在某个轴上拉伸,请使用 stretch: x 或 stretch: y。如果设置了 boundary 选项,下拉菜单会拉伸到所定义的边界。
<div uk-dropdown="stretch: true"></div><nav class="uk-navbar-container" uk-navbar>
<div class="uk-navbar-left">
<ul class="uk-navbar-nav">
<li>
<a href>Hover</a>
<div class="uk-navbar-dropdown" uk-dropdown="boundary: !.uk-navbar; stretch: x; flip: false">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
</li>
</ul>
</div>
</nav>通过在 uk-dropdown 属性中添加 animation: uk-animation-* 选项,并使用 Animation 组件中的某个类,可以为下拉菜单应用一个或多个动画。你还可以决定动画的时长,只需添加以毫秒为单位的 duration 选项。把 animate-out: true 设为真值,还可以在关闭下拉菜单时也播放动画。
<div uk-dropdown="animation: uk-animation-slide-top-small; duration: 1000"></div><button class="uk-button uk-button-default" type="button">Hover</button>
<div uk-dropdown="animation: uk-animation-slide-top-small; animate-out: true">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>另外,Drop 组件还有两种 Animation 组件未涵盖的动画类型。slide-* 动画会按所选方向滑动下拉菜单及其内容,而 reveal-* 动画会让下拉菜单的内容保持静止,并按所选方向显现出来。
| Animation | 说明 |
|---|---|
slide-top |
从顶部滑入下拉菜单。 |
slide-bottom |
从底部滑入下拉菜单。 |
slide-left |
从左侧滑入下拉菜单。 |
slide-right |
从右侧滑入下拉菜单。 |
reveal-top |
从顶部显现下拉菜单。 |
reveal-bottom |
从底部显现下拉菜单。 |
reveal-left |
从左侧显现下拉菜单。 |
reveal-right |
从右侧显现下拉菜单。 |
<div uk-dropdown="animation: slide-top; animate-out: true"></div><div class="uk-margin" uk-margin>
<div class="uk-inline">
<button class="uk-button uk-button-default" type="button">Slide Top</button>
<div uk-dropdown="animation: slide-top; animate-out: true; duration: 700">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
</div>
<div class="uk-inline">
<button class="uk-button uk-button-default" type="button">Reveal Top</button>
<div uk-dropdown="animation: reveal-top; animate-out: true; duration: 700">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
</div>
<div class="uk-inline">
<button class="uk-button uk-button-default" type="button">Slide Left</button>
<div uk-dropdown="animation: slide-left; animate-out: true; duration: 700">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
</div>
<div class="uk-inline">
<button class="uk-button uk-button-default" type="button">Reveal Left</button>
<div uk-dropdown="animation: reveal-left; animate-out: true; duration: 700">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>
</div>
</div>要定义下拉菜单与其切换元素之间的自定义偏移,请添加以像素为单位的 offset 选项。
<div uk-dropdown="offset: 80"></div><button class="uk-button uk-button-default" type="button">Hover</button>
<div uk-dropdown="offset: 80">
<ul class="uk-nav uk-dropdown-nav">
<li class="uk-active"><a href="#">Active</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
<li class="uk-nav-divider"></li>
<li><a href="#">Item</a></li>
</ul>
</div>这些选项都可以应用到组件属性上。多个选项之间用分号分隔。了解更多
| 选项 | 值 | 默认值 | 说明 |
|---|---|---|---|
toggle |
CSS selector | - * |
用作切换元素的元素的 CSS 选择器。默认为前一个元素。 |
pos |
String | bottom-left |
下拉菜单的位置。 |
stretch |
Boolean, String | false |
在两个方向(true)或指定轴(x、y)上拉伸下拉菜单。 |
mode |
String | click, hover |
逗号分隔的下拉菜单触发行为模式列表(click、hover)。 |
delay-show |
Number | 0 |
悬停模式下显示下拉菜单之前的延迟时间,单位毫秒。 |
delay-hide |
Number | 800 |
悬停模式下隐藏下拉菜单之前的延迟时间,单位毫秒。 |
auto-update |
Boolean | true |
将该选项设为 false,可在滚动时禁用动态定位。 |
boundary |
CSS selector | false |
下拉菜单不可超出的区域,超出时会翻转和偏移。默认为最近的可滚动祖先元素。 |
boundary-x |
CSS selector | false |
下拉菜单在 x 轴上不可超出的区域,超出时会翻转和偏移。 |
boundary-y |
CSS selector | false |
下拉菜单在 y 轴上不可超出的区域,超出时会翻转和偏移。 |
target |
Boolean, CSS selector | false |
下拉菜单所定位到的元素(true 表示 window)。 |
target-x |
Boolean, CSS selector | false |
下拉菜单在 X 轴上所定位到的元素(true 表示 window)。 |
target-y |
Boolean, CSS selector | false |
下拉菜单在 Y 轴上所定位到的元素(true 表示 window)。 |
inset |
Boolean | false |
定位在目标的内部。 |
flip |
Boolean | true |
如果下拉菜单超出边界,则沿主轴翻转。 |
shift |
Boolean | true |
如果下拉菜单超出边界,则沿交叉轴偏移。 |
offset |
Number | 0 |
下拉菜单的偏移量。 |
animation |
String | uk-animation-fade |
以空格分隔的动画名称。退出动画用以逗号分隔。 |
animate-out |
Boolean | false |
关闭下拉菜单时使用动画。 |
bg-scroll |
Boolean | true |
下拉菜单打开时允许背景滚动。 |
close-on-scroll |
Boolean | false |
滚动父级滚动容器时关闭下拉菜单。 |
duration |
Number | 200 |
动画时长。 |
container |
Boolean | false |
通过选择器定义目标容器,以指定下拉菜单应追加到 DOM 中的位置。 |
pos 是 Primary 选项,如果它是属性值中唯一的选项,可以省略其键名。
<span uk-dropdown="top-left"></span>了解更多关于 JavaScript 组件的内容。
UIkit.dropdown(element, options);以下事件会在绑定了该组件的元素上触发:
| 名称 | 说明 |
|---|---|
toggle |
项目被切换之前触发。 |
beforeshow |
项目显示之前触发。可以通过在事件上调用 preventDefault() 来阻止显示。 |
show |
项目显示之后触发。 |
shown |
项目的显示动画完成之后触发。 |
beforehide |
项目隐藏之前触发。可以通过在事件上调用 preventDefault() 来阻止隐藏。 |
hide |
项目隐藏之前触发。 |
hidden |
项目隐藏之后触发。 |
stack |
当应用 drop-stack 类时触发。 |
该组件提供以下方法:
UIkit.dropdown(element).show();显示下拉菜单。
UIkit.dropdown(element).hide(delay);隐藏下拉菜单。
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
delay |
Boolean | true | 延迟隐藏下拉菜单。 |
Dropdown 组件遵循 Menu Button 的 WAI-ARIA 设计模式,并会自动设置恰当的 WAI-ARIA 角色、状态和属性。
button 角色、aria-expanded 状态和 aria-haspopup 属性。可以通过以下按键从键盘访问 Dropdown 组件。