Popover 弹出层
TxPopover 基于 TxTooltip 封装触发语义,最终由 TxBaseAnchor 负责定位、碰撞处理与动效。
Popover 的面板容器使用 TxCard 渲染,可通过 panelVariant/panelBackground/panelShadow/panelRadius/panelPadding 控制面板的边框、背景与阴影,并可通过 keepAliveContent 控制内容状态是否保留。
<template>
<TxPopover v-model="open">
<template #reference>
<TxButton>Click</TxButton>
</template>
Popover content
</TxPopover>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const open = ref(false)
const background = ref<'blur' | 'glass' | 'mask'>('blur')
const fusion = ref(false)
const motion = ref<'fade' | 'split'>('split')
const placement = ref<'bottom-start' | 'bottom' | 'top' | 'right'>('bottom-start')
const showArrow = ref(true)
</script>
<template>
<div class="tx-demo tx-demo__col" style="gap: 12px; max-width: 860px;">
<TxCard variant="plain" background="mask" :padding="14" :radius="14">
<div class="tx-demo__row" style="gap: 10px; flex-wrap: wrap;">
<label class="tx-demo__row" style="gap: 8px;">
<span class="tx-demo__label">background</span>
<TuffSelect v-model="background" style="min-width: 160px;">
<TuffSelectItem value="blur" label="blur" />
<TuffSelectItem value="glass" label="glass" />
<TuffSelectItem value="mask" label="mask" />
</TuffSelect>
</label>
<label class="tx-demo__row" style="gap: 8px;">
<span class="tx-demo__label">motion</span>
<TuffSelect v-model="motion" style="min-width: 160px;">
<TuffSelectItem value="split" label="split" />
<TuffSelectItem value="fade" label="fade" />
</TuffSelect>
</label>
<label class="tx-demo__row" style="gap: 8px;">
<span class="tx-demo__label">placement</span>
<TuffSelect v-model="placement" style="min-width: 200px;">
<TuffSelectItem value="bottom-start" label="bottom-start" />
<TuffSelectItem value="bottom" label="bottom" />
<TuffSelectItem value="top" label="top" />
<TuffSelectItem value="right" label="right" />
</TuffSelect>
</label>
<label class="tx-demo__row" style="gap: 8px;">
<span class="tx-demo__label">arrow</span>
<TxSwitch v-model="showArrow" />
</label>
<label class="tx-demo__row" style="gap: 8px;">
<span class="tx-demo__label">fusion</span>
<TxSwitch v-model="fusion" />
</label>
<label class="tx-demo__row" style="gap: 8px;">
<span class="tx-demo__label">trigger</span>
<TxButton size="small" @click="open = !open">Toggle</TxButton>
</label>
</div>
</TxCard>
<div style="display: flex; justify-content: center; padding: 48px 0;">
<TxPopover
v-model="open"
:placement="placement"
:show-arrow="showArrow"
:motion="motion"
:fusion="fusion"
:panel-background="background"
panel-shadow="soft"
:panel-padding="12"
>
<template #reference>
<TxButton>Click me</TxButton>
</template>
<div style="width: 260px; display: grid; gap: 8px;">
<div style="font-weight: 600;">
Split out popover
</div>
<div style="color: var(--tx-text-color-secondary); font-size: 12px;">
Blur/Glass/Mask + Fusion + Arrow
</div>
<TxButton size="small">
Action
</TxButton>
</div>
</TxPopover>
</div>
</div>
</template>
| 属性名 | 类型 | 默认值 | 说明 |
|---|
modelValue | boolean | - | 是否打开(v-model) |
disabled | boolean | false | 禁用 |
placement | PopoverPlacement | 'bottom-start' | 浮层位置 |
offset | number | 自动计算 | 间距(有箭头时按 arrowSize 计算,无箭头为 2) |
width | number | 0 | 面板宽度(0 = 跟随 reference) |
minWidth | number | 0 | 最小宽度 |
maxWidth | number | 360 | 最大宽度 |
referenceFullWidth | boolean | false | reference 容器是否占满宽度 |
showArrow | boolean | true | 是否显示箭头 |
arrowSize | number | 12 | 箭头尺寸 |
trigger | 'click' | 'hover' | 'click' | 触发方式 |
openDelay | number | 120 | hover 模式打开延迟(ms) |
closeDelay | number | 100 | hover 模式关闭延迟(ms) |
keepAliveContent | boolean | true | 是否保留弹层内部状态 |
toggleOnReferenceClick | boolean | trigger === 'click' | 点击 reference 时是否切换开关 |
panelVariant | 'solid' | 'dashed' | 'plain' | 'solid' | 面板边框形态(TxCard variant) |
panelBackground | 'pure' | 'mask' | 'blur' | 'glass' | 'refraction' | 'refraction' | 面板背景(TxCard background) |
panelShadow | 'none' | 'soft' | 'medium' | 'soft' | 面板阴影(TxCard shadow) |
panelRadius | number | 18 | 面板圆角(TxCard radius) |
panelPadding | number | 10 | 面板 padding(TxCard padding) |
closeOnClickOutside | boolean | true | 点击外部关闭(仅 click 模式生效) |
closeOnEsc | boolean | true | ESC 关闭 |
| 事件名 | 参数 | 说明 |
|---|
open | - | 打开 |
close | - | 关闭 |
update:modelValue | boolean | v-model 更新 |