Skip to content
专业版

FaAnimatedBeam 动画光束组件

动态光束连接组件,用于在两个元素之间创建流动的动画光束效果,适合展示元素之间的关联关系。

基础用法

vue
<script setup lang="ts">
const containerRef = useTemplateRef('containerRef')
const fromRef = useTemplateRef('fromRef')
const toRef = useTemplateRef('toRef')
</script>

<template>
  <div ref="containerRef" class="relative">
    <div ref="fromRef">起点</div>
    <div ref="toRef">终点</div>
    <FaAnimatedBeam
      :container-ref="containerRef"
      :from-ref="fromRef"
      :to-ref="toRef"
    />
  </div>
</template>

Props

属性类型默认值说明
containerRefHTMLElement | null必需容器元素引用
fromRefHTMLElement | null必需起点元素引用
toRefHTMLElement | null必需终点元素引用
curvaturenumber0光束曲率(弧度)
reversebooleanfalse是否反向动画
pathColorstring'gray'路径颜色
pathWidthnumber2路径宽度
pathOpacitynumber0.2路径透明度
dottedbooleanfalse是否虚线样式
dotSpacingnumber6虚线点间距
gradientStartColorstring'#FFAA40'渐变起始色
gradientStopColorstring'#9C40FF'渐变终止色
delaynumber0动画延迟(秒)
durationnumber4-7动画持续时间(秒)
startXOffsetnumber0起点 X 偏移
startYOffsetnumber0起点 Y 偏移
endXOffsetnumber0终点 X 偏移
endYOffsetnumber0终点 Y 偏移
classHTMLAttributes['class']-自定义 CSS 类

Slots

Events

示例

基础光束连接

vue
<script setup lang="ts">
import logo from '@/assets/images/logo.svg'

const containerRef = useTemplateRef('containerRef')
const logoRef = useTemplateRef('logoRef')
const viteRef = useTemplateRef('viteRef')
const vueRef = useTemplateRef('vueRef')
</script>

<template>
  <div ref="containerRef" class="relative flex items-center justify-center h-100">
    <div class="flex gap-10">
      <div ref="viteRef" class="p-4 border-2 rounded-full">
        <FaIcon name="i-logos:vitejs" class="size-8" />
      </div>
      <div ref="logoRef" class="p-4 border-2 rounded-full">
        <FaIcon :name="logo" class="size-20" />
      </div>
      <div ref="vueRef" class="p-4 border-2 rounded-full">
        <FaIcon name="i-logos:vue" class="size-8" />
      </div>
    </div>
    <FaAnimatedBeam
      :container-ref="containerRef"
      :from-ref="viteRef"
      :to-ref="logoRef"
      :curvature="-75"
    />
    <FaAnimatedBeam
      :container-ref="containerRef"
      :from-ref="vueRef"
      :to-ref="logoRef"
      :curvature="75"
    />
  </div>
</template>

虚线光束

vue
<template>
  <FaAnimatedBeam
    :container-ref="containerRef"
    :from-ref="fromRef"
    :to-ref="toRef"
    dotted
    :dot-spacing="6"
  />
</template>

反向动画

vue
<template>
  <FaAnimatedBeam
    :container-ref="containerRef"
    :from-ref="fromRef"
    :to-ref="toRef"
    reverse
  />
</template>

自定义渐变色

vue
<template>
  <FaAnimatedBeam
    :container-ref="containerRef"
    :from-ref="fromRef"
    :to-ref="toRef"
    gradient-start-color="#00C9FF"
    gradient-stop-color="#92FE9D"
  />
</template>

曲线路径

vue
<template>
  <FaAnimatedBeam
    :container-ref="containerRef"
    :from-ref="fromRef"
    :to-ref="toRef"
    :curvature="100"
  />
</template>

多光束连接

vue
<script setup lang="ts">
const containerRef = useTemplateRef('containerRef')
const centerRef = useTemplateRef('centerRef')
const topRef = useTemplateRef('topRef')
const bottomRef = useTemplateRef('bottomRef')
const leftRef = useTemplateRef('leftRef')
const rightRef = useTemplateRef('rightRef')
</script>

<template>
  <div ref="containerRef" class="relative h-100">
    <div ref="centerRef" class="absolute inset-center">中心</div>
    <div ref="topRef" class="absolute top-0">上方</div>
    <div ref="bottomRef" class="absolute bottom-0">下方</div>
    <div ref="leftRef" class="absolute left-0">左侧</div>
    <div ref="rightRef" class="absolute right-0">右侧</div>
    
    <FaAnimatedBeam :container-ref="containerRef" :from-ref="topRef" :to-ref="centerRef" />
    <FaAnimatedBeam :container-ref="containerRef" :from-ref="bottomRef" :to-ref="centerRef" />
    <FaAnimatedBeam :container-ref="containerRef" :from-ref="leftRef" :to-ref="centerRef" />
    <FaAnimatedBeam :container-ref="containerRef" :from-ref="rightRef" :to-ref="centerRef" />
  </div>
</template>

注意事项

  1. 必需引用containerReffromReftoRef 都是必需的,需要使用 useTemplateRef 获取 DOM 引用
  2. 容器定位:容器元素必须设置为 relative 定位,光束使用绝对定位
  3. 响应式更新:组件会自动监听容器和元素位置变化,自动更新路径
  4. 动画方向:组件会自动检测光束方向(水平/垂直)并调整动画方向
  5. 性能优化:使用 ResizeObserver 监听容器大小变化,避免频繁重绘
  6. Z 轴层级:光束元素使用 pointer-events-none,不会影响鼠标事件
  7. 曲率效果:正曲率向下弯曲,负曲率向上弯曲

典型使用场景

  • 技术栈关联展示
  • 数据流向可视化
  • 架构图连接关系
  • 功能模块关联图
  • 思维导图连接线