Skip to content
歡迎來票選你最喜歡的元件! 也可以告訴我任何你想說的話喔!(*´∀`)~♥

雷之呼吸 cursor

滑鼠快速移動時劈出閃電!=͟͟͞͞( •̀д•́)✧

靈感來自鬼滅之刃中,善逸帥到爆炸的霹靂一閃

不用學呼吸法,也能放雷電了!( ´ ▽ ` )ノ

TIP

此元件針對滑鼠設計,建議使用電腦或可以使用滑鼠的裝置瀏覽。

技術關鍵字

名稱 描述
Canvas 2D API基礎的 2D 繪圖 API,可以高效繪製比 DOM 更複雜的圖形
Midpoint Displacement中點位移法,用於生成自然不規則的路徑,常用於地形生成、雲朵、材質等

使用範例

基本用法

快速移動滑鼠發動霹靂一閃!=͟͟͞͞( •̀д•́)✧

查看範例原始碼
vue
<template>
  <div class="">
    <div class="flex flex-col gap-4 border rounded">
      <base-checkbox
        v-model="visible"
        :label="t('showEffect')"
        class="p-4"
      />
    </div>

    <cursor-thunder-breathing
      v-if="visible"
      class="pointer-events-none fixed left-0 top-0 w-dvw h-dvh"
    />
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'
import { useI18n } from 'vue-i18n'
import BaseCheckbox from '../../base-checkbox.vue'
import CursorThunderBreathing from '../cursor-thunder-breathing.vue'

const visible = ref(false)

const { t } = useI18n()
</script>

原理

這裡我們使用「中點位移法」(Midpoint Displacement)來繪製閃電路徑。◝( •ω• )◟

概念其實很單純:

1. 先畫一條從起點到終點的直線

起點終點

2. 找到中點,往垂直方向隨機偏移

偏移起點終點

3. 對每一段重複同樣的操作

起點終點

4. 每次迭代把偏移量減半,讓細節越來越精緻

起點終點

重複個幾輪下來,一條平淡無奇的直線就會變成鋸齒狀的閃電路徑了。♪( ◜ω◝و(و

光暈效果

不過光有路徑還不夠,一條白線看起來就只是一條白線,完全沒有雷電的感覺。(´-ω-`)

這裡用了一個偷吃步,同一條路徑畫好幾層,從外到內線寬遞減、透明度遞增,疊加起來就會產生發光的視覺效果。

搭配 globalCompositeOperation: 'lighter',重疊的地方會自動加亮,雷電交錯處就會特別刺眼。

source-over(預設)交錯處顏色不變lighter(加亮)交錯處更亮 ✧

是不是很酷啊!( •̀ ω •́ )✧

觸發機制

透過 useMouseVelocity 追蹤滑鼠的移動速度(px/ms),當速度超過門檻值時,從上一次的觸發點到目前位置劈出一道雷電。

速度降低後會重置起點,下次加速時重新開始累積,所以每次快速揮動都會是一段獨立的雷電軌跡。(ゝ∀・)b

抖動與伴隨雷電

為了讓效果更自然,雷電在存活期間會持續微幅抖動,模擬真實閃電的閃爍感。

每次 strike 還有機率產生伴隨雷電,讓畫面更加密集震撼。不過這些都是隨機的,所以每次看到的效果都不一樣,就像真的雷電一樣。(`・ω・´)b

原始碼

API

Props

interface Props {
  /** 觸發雷電的最低速度(px/ms),預設 2 */
  triggerSpeed?: number;
  /** 雷電起點與滑鼠之間的最小距離(px),預設 50 */
  minStrikeDistance?: number;
  /** 雷電配色列表,每次 strike 隨機選取一組 */
  colorPaletteList?: ColorPalette[];
  zIndex?: number;
}

v0.60.0