vue-effort-slider 教程:带 WebGL 火焰拖尾的 Vue 3 滑块组件

发布于 2026-07-12 02:10 1214 字 7 min read ... 访问量

手把手用 vue-effort-slider 实现一个受 Claude Code 启发的 Vue 3 滑块组件:实时 WebGL 火焰拖尾、平滑吸附动画、10+ 主题色可配、v-model 双向绑定。
朗读本文
0:00 / --:--

vue-effort-slider 教程:带 WebGL 火焰拖尾的 Vue 3 滑块组件

这是什么

vue-effort-slider 是一个高度可定制的 Vue 3 滑块组件,最大特点是带实时 WebGL 火焰拖尾特效——灵感来自 Claude Code 的 effort slider。当滑块拖到阈值(默认满值)时,会激活 GPU 加速的火焰拖尾;同时具备平滑的「吸附到刻度」动画、动态配色以及零运行时依赖。

简单说,它把一个普通的 0–100 滑块,做成了一个有科技感、可随手调外观的 AI「思考深度」选择器。

效果预览

拉到最大档位时的火焰拖尾效果:

Max 档位的火焰拖尾效果
Max 档位的火焰拖尾效果

常规拖动的实时演示(动图):

vue-effort-slider 拖动演示

核心特性

  • WebGL2 火焰拖尾:滑块达到阈值时激活 GPU 实时渲染的火焰效果。
  • 吸附刻度动画:以 cubic ease-out 平滑吸附到最近的 25% 档位。
  • 完全可主题化:10+ 颜色属性,可定制滑块、拖尾、轨道、标签、辉光等每个视觉元素。
  • v-model 支持:标准 Vue 双向绑定(modelValue)。
  • 圆角裁切(Squircle):卡片与轨道采用 Apple 风格超椭圆裁切路径。
  • 响应式:宽度接受像素值或 CSS 字符串(如 '100%')。
  • 帮助气泡:内置帮助图标 + teleport tooltip。
  • 轻量:零运行时依赖,仅需 Vue 3 作为 peerDependency。

安装

npm install vue-effort-slider

快速开始

从零创建项目

# 1. 创建项目
npm create vite@latest my-slider -- --template vue
cd my-slider
npm install vue-effort-slider

修改 src/App.vue

<script setup>
import { ref } from 'vue'
import { EffortSlider } from 'vue-effort-slider'
import 'vue-effort-slider/style.css'

const value = ref(75)
</script>

<template>
  <EffortSlider v-model="value" />
  <p style="color:#71717a;text-align:center;margin-top:16px">Current value: {{ value }}</p>
</template>
# 2. 运行
npm run dev

打开 http://localhost:5173,即可看到带火焰拖尾的滑块。

全局注册

// main.js
import { createApp } from 'vue'
import App from './App.vue'
import VueEffortSlider from 'vue-effort-slider'
import 'vue-effort-slider/style.css'

const app = createApp(App)
app.use(VueEffortSlider)
app.mount('#app')
<template>
  <EffortSlider v-model="value" />
</template>

<script setup>
import { ref } from 'vue'
const value = ref(75)
</script>

局部引入

<template>
  <EffortSlider v-model="value" label="思考深度" />
</template>

<script setup>
import { ref } from 'vue'
import { EffortSlider } from 'vue-effort-slider'
import 'vue-effort-slider/style.css'

const value = ref(50)
</script>

子模块按需引入(Tree-shaking)

// 完整组件
import { EffortSlider } from 'vue-effort-slider'
import 'vue-effort-slider/style.css'

// 仅组件
import { EffortSlider } from 'vue-effort-slider/EffortSlider'

// 单独引入 composable
import { useSliderState } from 'vue-effort-slider/useSliderState'
import { useWebglFire } from 'vue-effort-slider/useWebglFire'

// 或批量从 composables 引入
import { useSliderState, useWebglFire } from 'vue-effort-slider/composables'

// 仅着色器(GLSL 源字符串)
import { VERT, FRAG_SIM, FRAG_BLUR, FRAG_COMP } from 'vue-effort-slider/shaders'

独立火焰 Canvas

useWebglFire 可以把火焰拖尾效果加到任意 canvas 上:

<template>
  <canvas ref="canvasRef" width="400" height="60"
    style="width:400px;height:60px;border-radius:10px;background:#0c0c0c" />
</template>

<script setup>
import { ref } from 'vue'
import { useWebglFire } from 'vue-effort-slider/useWebglFire'

const canvasRef = ref(null)
const sliderValue = ref(100)
const isActive = ref(true)

useWebglFire(canvasRef, sliderValue, isActive, () => '#a857f7')
</script>

在线配置面板

组件配套一个在线配置面板 slider.qiyuan.icu,可以实时调整每个 prop、预览火焰拖尾效果,并一键复制生成的代码(动图):

vue-effort-slider 实时配置面板

想直接上手调参,打开 slider.qiyuan.icu 即可。

Props

基础 Props

Prop类型默认值说明
modelValueNumber75当前值,支持 v-model,范围 0100
widthString | Number376组件宽度,像素数字或 CSS 字符串(如 '100%'
labelString'Slider'顶部标签文字
thresholdNumber100激活 WebGL 火焰效果的阈值,设 100 即仅满值激活
scaleLabelsString[]['Faster', 'Smarter']轨道两端的刻度标签
statusLabelsObject{ level1:'Minimal', level2:'Low', level3:'Medium', level4:'High', level5:'Max' }5 档状态文字
backgroundString'#000000'卡片背景色(任意 CSS 颜色)
borderRadiusString | Number20卡片圆角(像素)
showHelpBooleantrue是否显示帮助图标
helpTextString'Drag the slider to adjust AI thinking depth'点击帮助图标弹出的提示内容

颜色 Props

所有颜色属性均接受任意合法 CSS 颜色值(hex / rgb / hsl 等)。

Prop类型默认值说明
labelColorString'#b0b0c7'顶部标签文字颜色
statusColorString'#a1a1aa'未达阈值时的状态文字颜色
activeColorString'#c084fc'达阈值时状态文字颜色(带辉光)
highlightColorString'#c084fc'达阈值时滑块辉光颜色
scaleLabelColorString'#b0b0b8'端点标签颜色
helpIconColorString'#a1a1aa'帮助图标颜色
trailColorString'#a857f7'WebGL 火焰拖尾颜色
thumbColorString'#ffffff'滑块拖柄颜色
trackColorString'#0c0c0c'轨道背景色
dotColorString'#494950'轨道上 5 个装饰圆点颜色

Events

事件回调参数说明
update:modelValueNumber拖动过程中持续触发,供 v-model 使用
changeNumber拖动结束、吸附动画完成后触发一次,参数为最终吸附值
help点击帮助图标时触发