Particle Logo

在 Vue 3 项目里加入 Logo 粒子动画

Vue 导出是一个内置了 Logo 点阵的单文件组件,可以做首屏动画或加载页,并通过参数控制。

更新于

你会得到什么

1. 导出组件

  1. 打开工坊。
  2. 上传 Logo:点击选择 PNG、SVG、JPG 或 WebP 文件,也可以拖到页面上,或按 Ctrl+V / ⌘+V 粘贴。透明背景或纯色背景的 Logo 效果最好;如果有部分没采到,可以调节点阵密度和提取阈值。
  3. 从 9 种效果里选一个,调整粒子大小、形状(方块或圆点)和速度。
  4. 点击导出代码,切到 Vue 3 组件 标签,点下载文件(或复制代码)。这个格式需要 Pro。

2. 放进项目

把文件保存为 src/components/PixelLogoLoader.vue,然后:

<script setup lang="ts">
import PixelLogoLoader from './components/PixelLogoLoader.vue';
</script>

<template>
  <PixelLogoLoader :height="420" />
</template>

组件默认宽度是容器的 100%,高度 420 像素。Logo 会缩放到容器的 72% 以内并居中。外层默认是黑底、16 像素圆角、细边框和阴影,可以在组件文件底部的 .pixel-loader-container 样式里修改。

3. 参数

参数类型默认值作用
variantstring导出时选的效果播放哪种效果,可选值见下表
widthnumber | string'100%'数字按像素计算
heightnumber | string420数字按像素计算
autoPlaybooleantrue自动循环播放:每轮 duration 秒,之后停 1.2 秒
durationnumber3.2每轮的秒数
progressnumber无0 到 100。传入后动画按这个值显示,不再自动播放
colorsstring[]导出时选的配色粒子颜色;自带颜色的点(原图配色)保留自己的颜色
particleSizenumber导出时的大小基础粒子大小,会按容器尺寸缩放
particleShape'square' | 'circle'导出时的形状方块或圆点
speedMultipliernumber导出时的速度粒子移向目标位置的速度倍数
interactivebooleantrue是否响应鼠标:经过时推开粒子,点击触发冲击波

修改 variant、colors、particleSize 或 particleShape 时,组件会重新生成粒子。variant 可选值:

variant 值效果
condense量子凝聚态
mobius-flow莫比乌斯拓扑光流
vortex星系引力坍缩
scan全息光栅断层扫描
diffusion-denoise扩散降噪重构
flux-wave超导磁通涟漪
swarm-assembly纳米蜂群智能组装
gravitational-slingshot引力弹弓时间逆流
cymatics-resonance克拉尼声波共振

4. 做成加载页

传入 progress 后,粒子只移动到这个进度对应的位置,加载完成时 Logo 正好成形:

<script setup lang="ts">
import { ref, onMounted } from 'vue';
import PixelLogoLoader from './components/PixelLogoLoader.vue';

const progress = ref(0);
const ready = ref(false);

onMounted(async () => {
  // 换成你自己的加载步骤
  const steps = [() => fetch('/api/user'), () => fetch('/api/projects')];
  for (let i = 0; i < steps.length; i++) {
    await steps[i]();
    progress.value = ((i + 1) / steps.length) * 100;
  }
  ready.value = true;
});
</script>

<template>
  <PixelLogoLoader v-if="!ready" :progress="progress" :height="360" />
  <main v-else>…</main>
</template>

5. Nuxt 与服务端渲染

组件只在 onMounted 里开始绘制,服务端只会渲染一个空容器。如果你的项目在服务端渲染时报错,用 Nuxt 的 <ClientOnly> 包起来即可。

6. 性能与无障碍

<script setup lang="ts">
const reduceMotion =
  typeof window !== 'undefined' && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
</script>

<template>
  <PixelLogoLoader :progress="reduceMotion ? 100 : undefined" />
</template>
进入工坊

其他教程