Skip to content

魚花 bg

魚花(hî-hue),指水裡魚群游動時,於靜止水面上泛開的如花般漣漪。

日花同樣來自《日花閃爍:台語的美麗詞彙&一百首詩》

看著魚兒在水底悠游,水面泛起一圈圈魚花,就像看著一首寫不完的詩。

技術關鍵字

名稱 描述
Canvas 2D API基礎的 2D 繪圖 API,可以高效繪製比 DOM 更複雜的圖形
SVG FilterSVG 濾鏡效果,例如:模糊、扭曲、顏色調整等等
物理模擬模擬真實世界物理現象,如重力、碰撞、速度等物理效果
Pointer 事件偵測滑鼠或觸控點移動、點擊、懸停等等事件,取得座標、目標等等資訊

使用範例

基本用法

點擊畫面便泛開一朵魚花,範圍內隨機浮出幾尾小魚,繞游片刻後潛入水底消失。

台語裡獨有的漂亮詞彙 魚花 hî-hue 水裡魚群游動,在靜止的水面上
泛出如花一般的漣漪,
台語將此波紋稱為「魚花」。
《魚花》 午後的池塘睡得很沉
連雲都繞著走
魚兒在水面綻開
一朵朵 看一眼便忘的花
池塘記不住
雲也記不住
只有蹲在岸邊的我
記了一整個下午
The afternoon pond sleeps deep,
even the clouds detour around it.

On the water, fish bloom —
flower after flower, forgotten at a glance.

The pond does not remember,
nor do the clouds.
Only I, crouched on the bank,
remembered the whole afternoon.
查看範例原始碼
vue
<template>
  <div class="w-full flex flex-col gap-4">
    <bg-hi-hue class="w-full cursor-pointer border rounded-xl">
      <div class="font-wenkai h-full flex flex-col items-center justify-center gap-12 p-8 md:p-14">
        <!-- 名詞解釋 -->
        <div class="flex flex-col items-center gap-6 text-center">
          <span class="text-xs tracking-[0.5em] opacity-60">
            台語裡獨有的漂亮詞彙
          </span>

          <span class="flex items-baseline gap-4">
            <span class="text-6xl md:text-7xl tracking-[0.15em]">
              魚花
            </span>
            <span class="text-xl md:text-2xl italic tracking-wider text-cyan-700/60 dark:text-cyan-300/70">
              hî-hue
            </span>
          </span>

          <span class="block max-w-md text-base tracking-wider leading-loose">
            水裡魚群游動,在靜止的水面上
            <br>
            泛出如花一般的漣漪,
            <br>
            台語將此波紋稱為「魚花」。
          </span>
        </div>

        <span class="block h-px w-16 bg-gray-300 dark:bg-slate-700" />

        <!-- 新詩 -->
        <div class="flex flex-col items-center gap-7 text-center">
          <span class=" tracking-[0.4em]">
            《魚花》
          </span>

          <span class="block tracking-[0.15em] leading-[2.4]">
            午後的池塘睡得很沉
            <br>
            連雲都繞著走
          </span>

          <span class="block tracking-[0.15em] leading-[2.4]">
            魚兒在水面綻開
            <br>
            一朵朵 看一眼便忘的花
          </span>

          <span class="block tracking-[0.15em] leading-[2.4]">
            池塘記不住
            <br>
            雲也記不住
            <br>
            只有蹲在岸邊的我
            <br>
            記了一整個下午
          </span>

          <!-- 英譯 -->
          <span class="block max-w-md text-sm italic leading-relaxed opacity-60">
            The afternoon pond sleeps deep,
            <br>
            even the clouds detour around it.
            <br><br>
            On the water, fish bloom —
            <br>
            flower after flower, forgotten at a glance.
            <br><br>
            The pond does not remember,
            <br>
            nor do the clouds.
            <br>
            Only I, crouched on the bank,
            <br>
            remembered the whole afternoon.
          </span>
        </div>
      </div>
    </bg-hi-hue>
  </div>
</template>

<script setup lang="ts">
import BgHiHue from '../bg-hi-hue.vue'
</script>

原理

小魚生命週期

每次點擊在點擊位置附近隨機出生數條小魚,依序經歷三個階段:

  • 浮出(emerging):從深處上升至水面,透明度由 0 漸顯為最大值,尺寸同步放大。
  • 游動(swimming):在水面繞行,隨機改變游動目標,產生自然的探索軌跡。
  • 下潛(diving):透明度與尺寸同步衰減,沉入水底後從畫面移除。

整個生命週期約 4 至 7 秒,期間以深度(depth)參數同時驅動透明度與縮放,模擬游近水面與潛入深處的視覺差異。

蛇形運動

魚的身體由多段組成,每段跟隨前一段移動並加上正弦擺動偏移,模擬魚類游動姿態。尾鰭擺動振幅隨段數遞增,越靠近尾端擺動越明顯。繪製時利用每段的位置與朝向描出紡錘形輪廓,再延伸出燕尾鰭,呈現自然的魚形。

水波視覺

點擊產生的水波同時運用兩種技術:

  • SVG feDisplacementMap:以動態位移圖扭曲水波範圍內的背景內容,對有紋理的畫面(如卡片、文字)產生強烈折射感。
  • Canvas 明暗環:在獨立的覆蓋層上繪製徑向漸層環(內側陰影、外側反光),確保在純色背景下仍能清楚看到波紋擴散。

兩者各司其職,無論背景是空白還是有內容,水波都能保持可見度。

原始碼

API

Props

interface Props {
  /** feDisplacementMap scale。@default 10 */
  displacementIntensity?: number;
  /** 點擊扭曲半徑(px),0 表示自動擴散至最遠角落。@default 0 */
  distortionRadius?: number;
  /** 水波衰減時間(秒)。@default 3 */
  distortionDecay?: number;
  /** 每次點擊生成的魚數量。@default 3 */
  count?: number;
  /** 魚的尺寸倍率。@default 1 */
  sizeScale?: number;
}

Slots

interface Slots {
  default?: () => unknown;
}

v0.65.0