FlipOverlay 翻转遮罩
从触发源翻转展开的 3D Overlay
FlipOverlay 翻转遮罩
从触发源翻转展开的 3D Overlay,适合卡片详情、图片预览与过渡式页面。
基础用法
示例即将加载...
设计要点
source决定动画起点,可传HTMLElement或DOMRect。rotateX/rotateY与perspective控制 3D 质感。- Header 渲染优先级:
- 提供
#header时,完全覆盖内置 header。 - 未提供
#header且header=false时,不渲染 header。 - 未提供
#header且header=true时,使用内置 header(支持#header-display/#header-actions/#header-close)。
- 提供
closable=false会完全隐藏右上角 close 区(#header-close也不会渲染)。- 卡片默认内置
surface背景层(基于TxBaseSurface),可通过surface/surfaceColor/surfaceOpacity调整。 globalMask控制全局遮罩层,默认开启。border控制边框样式(solid/dashed/none,dash等价于dashed)。randomTilt可为每次打开添加轻微随机偏移。maskClosable=false时遮罩点击不会关闭,可通过close()控制关闭。- 连续打开多个 overlay 时,背景遮罩由单例全局层统一渲染并下沉到所有卡片下方;仅顶层保留可交互点击层,下层交互层不可交互且不会遮挡下层卡片露边。
- 叠层位移仅在相邻层尺寸接近时自动启用(宽高分别满足
|delta| <= max(8px, 上一层尺寸 * 5%))。 - 位移叠层最多强化 3 层(
-18/-36/-54px+0.95/0.90/0.85缩放),超过 3 层后按层级渐隐(1.00 → 0.92 → 0.78 → 0.62 → 0.38 → 0.16 → 0)。 preventAccidentalClose=true可开启防误关闭模式:遮罩点击不关闭、监听页面退出(刷新/关闭)并拦截,误操作时卡片周围会出现红色警示光。- 通过
open/opened/close/closed事件联动外围 UI。
API
Props
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
modelValue | boolean | false | 显示状态(v-model) |
source | HTMLElement | DOMRect | null | null | 动画起点 |
sourceRadius | string | null | null | 起点圆角 |
duration | number | 480 | 动画时长(ms) |
perspective | number | 1200 | 3D 透视距离 |
rotateX | number | 6 | X 轴旋转角度 |
rotateY | number | 8 | Y 轴旋转角度 |
randomTilt | boolean | true | 随机轻微倾斜 |
tiltRange | number | 2 | 随机倾斜范围 |
easeOut | string | 'back.out(1.25)' | 打开动画缓动 |
easeIn | string | 'back.in(1)' | 关闭动画缓动 |
maskClosable | boolean | true | 点击遮罩关闭 |
preventAccidentalClose | boolean | false | 防误关闭(阻止遮罩关闭 + 页面退出拦截 + 红光警示) |
globalMask | boolean | true | 是否渲染全局遮罩层 |
surface | 'pure' | 'mask' | 'blur' | 'glass' | 'refraction' | 'refraction' | 内置卡片背景模式 |
surfaceColor | string | '' | 内置背景基础色(默认跟随主题) |
surfaceOpacity | number | 0.96 | 内置背景透明度(mask 模式) |
header | boolean | true | 是否启用内置 header(未使用 #header 时生效) |
headerTitle | string | '' | 内置 header 标题 |
headerDesc | string | '' | 内置 header 描述 |
closable | boolean | true | 是否显示内置右上角关闭按钮 |
closeAriaLabel | string | 'Close' | 关闭按钮无障碍文案 |
maskClass | string | '' | 遮罩 class |
cardClass | string | '' | 卡片 class |
border | 'solid' | 'dashed' | 'dash' | 'none' | 'solid' | 卡片边框样式(dash 等价于 dashed) |
scrollable | boolean | true | 内容区是否内部滚动 |
Events
| 事件名 | 参数 | 说明 |
|---|---|---|
open | - | 打开动画开始 |
opened | - | 打开动画完成 |
close | - | 关闭动画开始 |
closed | - | 关闭动画完成 |
update:expanded | (value: boolean) | 同步 expanded |
update:animating | (value: boolean) | 同步 animating |
Slots
| 插槽 | 参数 | 说明 |
|---|---|---|
default | { close, expanded, animating, closable, headerTitle, headerDesc } | Overlay 内容区 |
header | { close, expanded, animating, closable, headerTitle, headerDesc } | 全量自定义 header(会覆盖内置 header 体系) |
header-display | { close, expanded, animating, closable, headerTitle, headerDesc } | 自定义标题/描述区 |
header-actions | { close, expanded, animating, closable, headerTitle, headerDesc } | 自定义关闭按钮左侧操作区 |
header-close | { close, expanded, animating, closable, headerTitle, headerDesc } | 自定义关闭区域(closable=false 时不渲染) |