组件/Popover 弹出层
自 1.0.0BETA

Popover 弹出层

基于 Tooltip 与 Anchor 链路的语义弹出层。

该页面由 AI 迁移生成,请谨慎使用

内容已迁移完成,但仍建议结合源码和人工评审结果使用。

Popover 弹出层

TxPopover 基于 TxTooltip 封装触发语义,最终由 TxBaseAnchor 负责定位、碰撞处理与动效。

Popover 的面板容器使用 TxCard 渲染,可通过 panelVariant/panelBackground/panelShadow/panelRadius/panelPadding 控制面板的边框、背景与阴影,并可通过 keepAliveContent 控制内容状态是否保留。

基础用法

Popover

示例即将加载...
<template>
  <TxPopover v-model="open">
    <template #reference>
      <TxButton>Click</TxButton>
    </template>

    Popover content
  </TxPopover>
</template>

视觉效果(split / fusion / mask)

Popover (visual effects)

示例即将加载...
<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>

API

TxPopover Props

属性名类型默认值说明
modelValueboolean-是否打开(v-model)
disabledbooleanfalse禁用
placementPopoverPlacement'bottom-start'浮层位置
offsetnumber自动计算间距(有箭头时按 arrowSize 计算,无箭头为 2
widthnumber0面板宽度(0 = 跟随 reference)
minWidthnumber0最小宽度
maxWidthnumber360最大宽度
referenceFullWidthbooleanfalsereference 容器是否占满宽度
showArrowbooleantrue是否显示箭头
arrowSizenumber12箭头尺寸
trigger'click' | 'hover''click'触发方式
openDelaynumber120hover 模式打开延迟(ms)
closeDelaynumber100hover 模式关闭延迟(ms)
keepAliveContentbooleantrue是否保留弹层内部状态
toggleOnReferenceClickbooleantrigger === '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)
panelRadiusnumber18面板圆角(TxCard radius)
panelPaddingnumber10面板 padding(TxCard padding)
closeOnClickOutsidebooleantrue点击外部关闭(仅 click 模式生效)
closeOnEscbooleantrueESC 关闭

Events

事件名参数说明
open-打开
close-关闭
update:modelValuebooleanv-model 更新