Skip to content

Dropdown 下拉菜单 ​

点击触发器展开菜单,浮层定位到触发元素旁。

基础用法 ​

点击触发

操作

触发方式 ​

trigger 控制触发方式:click(默认)/ hover / focus,可空格分隔多选(如 "click hover")。hover 触发时 hover-delay / hover-hide-delay 控制开合防抖延时(默认 150 / 100ms,无延时 hover 会闪开闪关);悬停区域为触发器 + 浮层面板(跨间隙移动不闪关)。

悬停触发

悬停打开

聚焦触发

聚焦打开(Tab 或点击聚焦)

多触发(click + hover)

点击或悬停

自定义开合延时

hover-delay=400hover-hide-delay=400

触屏降级(coarse pointer 自动生效) ​

触屏设备(pointer: coarse,如手机 / 平板)没有稳定的 hover 语义:点按会同时合成 hover 与 click,若沿用桌面行为会出现「刚展开即收起」。当 trigger 含 hover 时,触屏下 hover 通道自动停用、降级为点按切换——点按触发器展开、再点按收起、点按菜单外部关闭(外点关闭替代 hover-out);fine pointer(桌面鼠标)行为完全不变,与受控 open 兼容。

触屏点按切换(触屏设备自动生效)

触屏点我

放置方向 ​

四个方向

上下左右

12 向放置 ​

placement 支持 12 向:四基向 top / bottom / left / right 各配 -start / -end 交叉轴对齐(bottom-start 面板左缘对齐触发器左缘,是最常见形态)。空间不足沿主轴翻转时对齐后缀保留(bottom-start → top-start),对齐后仍做视口夹取。

12 向放置

bottom-startbottom-endright-starttop-end

多级子菜单 ​

items 项支持 children 数组级联子菜单(任意层级),hover / 点击展开,选中叶子项后自动收回并关闭;浮层菜单复用了 oas-menu 渲染,多级子菜单贴近视口边缘时自动向左 / 向上翻转保证完整可见。

多级子菜单

更多操作

禁用项 ​

禁用项

操作

整体禁用 ​

disabled 禁用整个下拉:点击 / 悬停 / 聚焦均不响应,拆分箭头按钮置灰,宿主降饱和(opacity .6)并同步 aria-disabled。

整体禁用

禁用(click)禁用(split)

箭头 ​

菜单面板带指向触发元素的箭头。arrow 属性控制显隐(默认显示,arrow="false" 隐藏);arrow-point-at-center 让箭头固定指向面板中心(默认按触发元素投影定位,面板被视口避让偏移时箭头仍指向触发元素);auto-adjust-overflow 控制视口空间不足时是否自动翻转(默认开启)。

带箭头

带箭头

箭头显隐

默认(箭头)arrow="false"

箭头指向中心与关闭翻转

arrow-point-at-centerauto-adjust-overflow="false"

选择事件 ​

选择事件

选择操作尚未选择

选中不关闭 ​

hide-on-click 控制选中菜单项后是否关闭(默认 true 选中即关;"false" 时保持打开,适合多选 / 勾选场景)。

选中不关闭

选中不关闭尚未选择

受控显示 ​

open 属性受控:外部按钮设置 / 移除 open 控制菜单显隐(点击外部 / Esc / 选择后仍会关闭)。

受控显示(open 属性)

打开关闭open: false触发元素

开合事件反馈 ​

组件自己开关(点击 / 悬停 / 聚焦 / Esc / 外部点击 / 选中)都会派发 oas-open-change(detail: { open }),受控模式下宿主据此同步状态(与 tooltip / popover 语义一致,外部写 open 同样触发)。

oas-open-change 事件

点击或悬停试试open: false

偏移与滚动 ​

offset 调整浮层与触发器的间距(默认 8px)。页面滚动时浮层默认跟随触发器重算位置(fixed 定位与页面脱节修复);close-on-scroll 改为滚动即关闭。

偏移(offset)

默认(8px)offset=16

滚动关闭(close-on-scroll)

打开后滚动页面试试

受控选中项 ​

value 属性受控:外部设置 value 指定选中项(下拉菜单无勾选标识,用标签实时回显当前值);选择菜单项同样会更新 value 并派发 oas-select。

受控选中(value 属性)

选中「编辑」选中「复制」清除value: -选择操作

拆分下拉按钮 ​

split 属性开启下拉按钮模式:主按钮 + 拆分箭头按钮。点箭头展开菜单,点主按钮派发 oas-action(绑定执行主操作,如保存);菜单选择仍走 oas-select。

拆分下拉按钮

保存并提交

主按钮动作事件

更多操作尚未点击

加载中菜单项 ​

菜单项配置 loading: true 即进入加载态:该项显示旋转 spinner、禁点(点击 / 键盘 / hover 均拦截),异步完成后更新 items 移除 loading 即恢复。下面的异步演示:选择「保存」后该项转圈禁点约 1.5 秒,随后恢复。

loading 菜单项

操作

异步操作演示

选择操作尚未选择

子元素声明式通道 ​

除 items JSON 外,可用 <oas-dropdown-item> / <oas-dropdown-group> / <oas-dropdown-divider> 子元素声明式书写菜单(items 属性显式设置时优先,未设置时解析子元素收敛到同一渲染路径)。默认插槽文本为 label,属性对齐 items 字段:value / disabled / loading / icon / kind / danger / href / target / rel;<oas-dropdown-item> 内直接嵌套子元素即递归为子菜单,<oas-dropdown-group> 的 label 属性为组标题(value 可作 radio 组 id),组内子元素平铺同层。子元素增删、属性与文本变化会自动重渲染(MutationObserver)。

子元素声明式(分组 / 分隔线 / 嵌套 / checkbox / danger / href)

操作首页组件文档编辑 复制剪切显示网格线删除尚未选择

动态增删(MutationObserver 自动刷新)

追加一项动态菜单首页设置

前置媒体(slot="leading") ​

菜单项支持前置媒体插槽:在 <oas-dropdown-item>(与 <oas-menu-item> 通用)内放 <template slot="leading"> 或带 slot="leading" 的直接子元素,内容渲染在 label 前、优先于 icon 图标(同时给时 icon 不渲染);loading 加载态时 spinner 替换前置媒体位。适合头像、色块等任意富前置内容(items JSON 通道不支持——仅子元素声明式通道可用)。

头像前置媒体(avatar 例)

切换账号林晓雨陈以宁赵启铭退出登录

触发器尺寸与类型 ​

size(xs / small / medium / large / xl 五档,sm/md/lg 别名等价)与 type(对齐 oas-button 类型词汇)透传到触发器 oas-button(直系子级):未设置的维度以触发器按钮自身属性为准;触发器不是 oas-button 时透传静默失效。非法 size 归一化回落 medium 并告警一次。

size 五档透传

xssmallmediumlargexl

type 透传(对齐 button type)

primary 触发器danger 触发器

面板限高滚动 ​

max-height 限制菜单面板最大高度(数字按 px,转发内层 oas-menu 同名通道),超出部分面板内部滚动,适合长菜单。

max-height=120(面板内部滚动)

长菜单(限高 120px)

触发器预留最宽选项(reserve-width) ​

reserve-width:切值不抖(点开下拉切换选中项对比两颗按钮)

对齐方式对照(无预留)

reserve-width(opt-in)量测全部菜单项 label 的最大文本宽,写入触发器 min-width:切换选中值时触发器尺寸不抖动(工具栏/筛选器高频切值场景)。items 属性与子元素声明式通道都参与量测,内容变化自动重测;移除属性恢复触发器原宽度。量测为近似值(触发器余量经 CSS 变量 --oas-dropdown-reserve-pad 调整,默认 40px)。上方第一颗按钮已开预留(三条选项中最宽者撑起),第二颗为对照;点开菜单切换选中项即可对比。

API ​

oas-dropdown ​

属性 ​

属性说明类型默认值
arrow是否显示指向触发元素的箭头(arrow="false" 隐藏,骨架保留)stringtrue
arrow-point-at-center箭头固定指向面板中心(默认按触发元素投影定位,面板被视口避让偏移时箭头仍指向触发元素)boolean—
auto-adjust-overflow视口空间不足时自动翻转/避让(auto-adjust-overflow="false" 关闭,面板可越出视口)stringtrue
close-on-scroll页面滚动时关闭浮层(默认重定位跟随;true 时滚动即关)boolean—
disabled整体禁用:不响应任何触发boolean—
hide-on-click选中项后是否关闭(默认 true;false 时选中不关闭,多选/勾选场景)stringtrue
hover-delayhover 触发时展开延迟毫秒数(默认 150)——
hover-hide-delayhover 触发时收起延迟毫秒数(默认 100)——
items菜单项 JSONstring[]
max-height菜单面板限高滚动(数字补 px)string—
offset浮层与触发器的间距像素(默认 8)——
open受控显示(布尔属性,存在即展开)boolean—
placement浮层位置stringbottom
reserve-width触发器预留最宽选项宽(opt-in):量测全部菜单项 label 的最大文本宽写入触发器 min-width,切换选中值时触发器尺寸不抖动;items/子元素变化自动重测;移除属性恢复触发器原宽度boolean—
size透传触发器 oas-button 尺寸五档(别名归一,非法回落 medium)string—
split拆分下拉按钮(布尔属性):主按钮 + 箭头按钮,点箭头开菜单、主按钮派发 oas-actionboolean—
trigger触发方式:click(默认)/ hover / focus,空格分隔可多选(如 "click hover")。含 hover 时触屏(coarse pointer)自动降级为点按切换:点按展开、再点按/外点关闭,桌面 hover 行为不变stringclick
type透传触发器 oas-button 类型词汇string—
value当前选中值string—

事件 ​

事件说明
oas-action拆分模式下点击主按钮,detail: { originalEvent }
oas-open-change浮层开合变化,detail: { open: boolean }(含外部 setAttribute 触发,受控闭环)
oas-select选择某项,detail: { value }

插槽 ​

名称说明
默认下拉菜单内容(菜单项 / 分组)

CSS 变量 ​

CSS 变量默认值
--oas-dropdown-arrow-height12px
--oas-dropdown-arrow-radius0
--oas-dropdown-arrow-width12px
--oas-glass-blurnone
--oas-glass-ringtransparent
--oas-origin-xcenter
--oas-origin-ycenter

oas-dropdown-item ​

属性 ​

属性说明类型默认值
danger破坏性项:红色语义(删除/退出等危险操作)——
disabled禁用该项——
href链接地址:有 href 时渲染为原生 <a>(真实跳转 + 照常派发 oas-select)——
icon前置图标(@oas-ui/icons 内置图标名)——
icon-color图标颜色:样式固定为该色(覆盖选中/禁用态默认色),缺省 currentColor 跟随文字色(仅 items JSON 通道生效;子元素通道不解析该属性)——
kind叶子项语义:radio(默认,可勾选)/ action(动作项,无勾选态、不写回 value)/ checkbox(多选勾选,value 数组勾选集)——
loading加载中:渲染 spinner、禁点,由数据驱动恢复——
rel链接 rel(配合 href)——
shortcut最右侧快捷键注释(kbd 视觉,与 menubar/menu shortcut 契约一致)(仅 items JSON 通道生效;子元素通道不解析该属性)——
target链接 target(配合 href)——
value选中值(子元素声明式通道的数据载体字段)——

插槽 ​

名称说明
默认下拉菜单项 label 内容(默认插槽文本);直接子元素 <oas-dropdown-item> 递归为子菜单 children
template[slot="leading"]前置媒体模板(或直接子元素加 slot="leading"):头像/色块等任意前置内容,渲染在 label 前、优先于 icon 图标;loading 态由 spinner 替换;仅子元素声明式通道可用(items JSON 不支持)

oas-dropdown-group ​

属性 ​

属性说明类型默认值
label分组标题(组标题小字、次要色、不可点)——
valueradio 组 id(组内点选只更新该组选中值)——

插槽 ​

名称说明
默认组内菜单项:子元素 <oas-dropdown-item> 平铺同层

oas-dropdown-divider ​

插槽 ​

名称说明
默认分隔线数据载体(无属性,宿主解析为 type: "divider")

点击触发器切换显隐,点击外部 / 按 Esc / 选择后关闭;浮层为内层 oas-menu(role="menu",叶子项 menuitemradio、带子菜单项 menuitem),支持多级级联子菜单与键盘导航。

基于 MIT OR Apache-2.0 双许可发布