组件/BaseAnchor 锚点定位

BaseAnchor 锚点定位

锚定在触发元素旁的浮层基础组件

已验证自 0.3.4

用法

基础

示例加载中...

展开动画

默认的 expand 从靠近 reference 的角弹簧展开,关闭时折回。

示例加载中...

方向

placement 是首选方向,空间不足时翻到对侧;展开起点跟随最终落位。

示例加载中...

动画模式

animation.type 取 expand(默认)、transfer、boom、opacity 或 none。

示例加载中...

液滴下坠

drip 让面板像液滴从触发器淌出;带 data-liquid-item 的菜单项随面板生长逐项显现。

示例加载中...

张力收腰

bead 与 drip 共用引擎,两侧随运动速度收腰;beadPinch 设每侧峰值收腰量(px)。

示例加载中...

自定义缓动

时长与缓动都写在 animation 里,组件没有顶层的 duration / ease prop。

示例加载中...

面板材质

panelBackground 切换材质,surfaceMotionAdaptation 决定动画期间材质是否降级。

示例加载中...

最佳实践

  • 优先使用 TxPopover、TxDropdownMenu 或 TxContextMenu;只在构建新的锚点组件或需要虚拟定位时直接使用 TxBaseAnchor。
  • 直接使用时,按内容类型自行提供 role、焦点管理与键盘导航。
  • 浮层只放轻量内容;多步骤表单、危险确认与整屏流程改用 Drawer 或 Dialog。
  • 坐标菜单传 virtualReference,坐标或画布变换后调用 updatePosition()。
  • eager 与 keepAliveContent 保留的是可测量的内容,不是定位:关闭时只量尺寸,坐标取自 reference 或已打开的面板。

API 参考

属性

属性名类型默认值说明
modelValuebooleanundefined是否打开(v-model);省略时为非受控。
disabledbooleanfalse阻止打开,并关闭已打开的面板。
eagerbooleanfalse首次打开前就挂载面板,便于预先测量。
placementBaseAnchorPlacement'bottom-start'首选方向,空间不足时翻到对侧。
offsetnumber8与 reference 的间距(px)。
widthnumber0面板宽度;0 时由内容决定。
minWidthnumber0最小宽度。
maxWidthnumber360最大宽度。
maxHeightnumber420最大高度,按视口剩余高度收缩。
unlimitedHeightbooleanfalse取消高度限制;maxHeight <= 0 同效。
matchReferenceWidthbooleanfalsewidth 为 0 时与 reference 等宽。
referenceClassBaseAnchorClassValueundefinedreference 包装层的 class;其余 attrs 都落在面板上。
virtualReferenceBaseAnchorVirtualReferenceundefined按虚拟 reference(如光标坐标)定位,reference 插槽仍渲染。
disableFlipbooleanfalse不翻到对侧,但仍推回视口;用于宿主自行测量的 virtualReference。
animationBaseAnchorAnimationOptions{}动画配置;未写的字段取该类型的默认值。
useCardbooleantrue用内置 TxCard 包裹内容。
panelVariant'solid' | 'dashed' | 'plain''plain'TxCard 的边框形态。
panelBackground'pure' | 'mask' | 'blur' | 'glass' | 'refraction''refraction'面板背景,refraction 即琉光。
panelShadow'none' | 'soft' | 'medium''soft'面板阴影。
panelRadiusnumber18面板圆角(px)。
panelPaddingnumber10面板内边距(px)。
panelCardBaseAnchorPanelCardPropsundefined透传给 TxCard 的高级参数,如 maskOpacity、refraction*。
surfaceMotionAdaptation'auto' | 'manual' | 'off''auto'运动期间的材质降级:auto 跟随动画,manual 读 panelCard.surfaceMoving,off 不降级。
showArrowbooleanfalse显示跟随定位的箭头。
arrowSizenumber10箭头尺寸(px)。
keepAliveContentbooleanfalse关闭后保留内容挂载及其内部状态。
closeOnClickOutsidebooleantrue点击外部时关闭。
closeOnEscbooleantrue按 Esc 时关闭。
toggleOnReferenceClickbooleantrue点击 reference 时切换;自行处理点击的 reference 设为 false。
hoverBridgebooleanfalse打开期间在 reference 与面板间铺透明命中区;TxTooltip 按需自动开启。

事件

事件名参数说明
open-打开时触发。
close-关闭时触发。
update:modelValueboolean开合状态变化时触发。
floating-enterMouseEvent指针进入浮层(面板或悬停桥)。
floating-leaveMouseEvent指针离开整个浮层。

插槽

插槽名说明
reference触发元素。
default浮层内容;接收最终方向 { side }。

暴露方法

方法名参数说明
close-关闭面板。
toggle-切换开合。
updatePosition-重新计算定位。
getPanelRect-面板当前绘制的 DOMRect,未挂载时为 null。
containsFloating(target: Node)target 是否在浮层内(含悬停桥)。
getSide-最终落位方向:top / right / bottom / left。

类型

BaseAnchorAnimationOptions

字段类型默认值说明
type'expand' | 'transfer' | 'boom' | 'opacity' | 'none' | 'drip' | 'bead''expand'expand 弹簧展开,transfer 沿方向位移,boom 从模糊中缩放,opacity 淡入淡出,none 瞬时;drip / bead 为液态。
closeType同 type 的取值同 type关闭阶段的类型。液态两端必须同型,混搭时回落为对称并在开发环境告警。
durationnumber按类型(expand 400 / 经典 432 / 液态 260)打开时长(ms)。
closeDurationnumber按关闭类型(expand 240 / 经典为打开时长 × 0.45 / 液态 150)关闭时长(ms)。
easestring按类型(expand 按面板高度解出的弹簧,约 63px 以内为 spring(10, 0.6) / 经典 back.out(2) / 液态 linear)打开缓动:GSAP 缓动名、cubic-bezier(...) 或 spring(omega, zeta),显式值原样运行;液态只认 linear 与 cubic-bezier(...)。
closeEasestring按关闭类型(expand power2.in / 经典 power3.in / 液态 cubic-bezier(0.25, 0.46, 0.45, 0.94))关闭缓动,写法同 ease。
distancenumber按类型(expand 12 / transfer 30)expand 的漂移与 transfer 的位移距离(px)。
scalenumber按类型(expand 0.88 / boom 0.94 / transfer 0.92)打开时的初始缩放。
blurnumber12boom 的初始模糊半径(px)。
opacitynumber0expand / boom / opacity 的初始透明度。
exit{ scale?, distance?, blur?, opacity? }见说明仅关闭阶段的几何;未写字段先取同名共享字段,再取 closeType 的默认值。
gooBlurnumber4.5仅 drip / bead。goo 滤镜的模糊半径,决定颈部能撑多宽。
gooThresholdnumber20仅 drip / bead。alpha 阈值的斜率。
gooThresholdOffsetnumber-9仅 drip / bead。alpha 阈值的偏移。
outlineColorstring--tx-border-color仅 drip / bead。轮廓环颜色,默认跟随主题。
triggerRadiusnumber实测仅 drip / bead。触发器圆角,缺省时从 reference 测量。
seedHeightnumber12仅 drip / bead。起始时的面板高度(px)。
itemSelectorstring'[data-liquid-item]'仅 drip / bead。逐项显现的元素;无匹配时内容整体显现。
beadPinchnumber60仅 bead。每侧峰值收腰量(px),随运动停息归零。
beadVelocityRefnumber4仅 bead。收腰达到峰值所需的速度。

概述

  • 传 modelValue 时受控,否则内部维护开合;状态变化时派发 open 或 close。
  • maxHeight 随视口剩余高度收缩;超出部分在卡片 body 内滚动,滚动位置从 body 读取。
  • 锚点家族默认不画箭头:BaseAnchor、Tooltip、Popover 及基于它们的 DropdownMenu、ContextMenu、Select 都是如此。showArrow 的箭头随面板内容层一起运动。
  • drip / bead 只用于纵向落位,横向时降级为 opacity;需要可测量的高度,unlimitedHeight 时瞬时显隐。
  • drip / bead 自绘表面,不渲染 TxCard 与箭头,面板背景、阴影与边框均不生效;触发器需自带不透明背景。
  • 减少动态效果时,所有动画直接跳到终态。

技术实现

  • 面板 teleport 到 <body>,由 Floating UI 按文档坐标定位;经典类型由 GSAP 驱动,drip / bead 由 rAF 循环驱动。
  • 源码:packages/tuffex/packages/components/src/base-anchor/。
查看源码
packages/tuffex/packages/components/src/base-anchor/index.ts