第 5 章:5萬元外包級的進階視覺特效與互動設計

在軟體開發的世界裡,功能可以解決使用者的「需求」,但精緻的視覺細節才能觸發使用者的「感動」,進而產生強烈的購買慾望(WOW Factor)。

當你的網站擁有極其流暢的微動畫與高級感特效時,訪客會自然而然地認為:「這家公司的技術底子很深厚,他們的產品一定很棒!」這就是為什麼頂尖科技公司(如 Apple, Vercel, Linear)都願意砸大錢在網頁互動設計上。

本章我們將揭密 Vibe Tutor 首頁那兩個讓人驚豔的特效是如何實作的。


1. 實作一:跟隨滑鼠的微弱漸層光暈 (Mouse Glow Effect)

你有沒有注意到,當你的滑鼠在 Vibe Tutor 的網頁上移動時,背景似乎會有一股微弱的藍色光暈默默跟著你的游標? 這個特效(Glow Effect)非常適合暗黑模式 (Dark Mode) 的網站,能瞬間提升科技感與沉浸感,而且幾乎不吃效能。

原理拆解

我們建立了一個獨立的 <MouseGlow /> 元件,並且將它掛載到全站的 layout.tsx 中。 這個元件本身不包含任何內容,只有一個全螢幕的透明 div,並且我們透過 backgroundradial-gradient (放射狀漸層) 來畫出一個光暈。

React Hook 捕捉滑鼠位置

import { useEffect, useState } from "react";

export function MouseGlow() {
  const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 });

  useEffect(() => {
    const updateMousePosition = (e: MouseEvent) => {
      // 隨時更新滑鼠目前的 X 與 Y 座標
      setMousePosition({ x: e.clientX, y: e.clientY });
    };

    window.addEventListener("mousemove", updateMousePosition);
    return () => window.removeEventListener("mousemove", updateMousePosition);
  }, []);

  return (
    <div 
      className="pointer-events-none fixed inset-0 z-30" // 確保光暈在最上層,但絕對不能擋住滑鼠點擊 (pointer-events-none)
      style={{
        // 核心魔法:使用 CSS 放射狀漸層,圓心永遠對準滑鼠游標
        background: `radial-gradient(600px circle at ${mousePosition.x}px ${mousePosition.y}px, rgba(59,130,246,0.07), transparent 40%)`
      }}
    />
  );
}

這個技巧的精妙之處在於,我們把運算推給了 CSS 引擎,這比每幀去改變 DOM 的 lefttop 屬性還要順暢得多。


2. 實作二:Hero 區塊的打字機與程式碼生成動畫

在首頁的最上方(Hero 區塊),我們放了一個模擬終端機(Terminal)的視窗,裡面會像駭客電影一樣,一行一行自動敲出程式碼。 這個動畫的目的是為了直接、視覺化地傳遞我們的核心價值主張:「Vibe Coding 讓寫程式就像變魔術一樣簡單」。

挑戰:如何打造逼真的打字感?

如果只是把整段文字用 CSS 漸顯出來,看起來會很不自然。真實的打字感包含了:

  1. 字元是一個個出現的。
  2. 每敲擊一個字,會有微小的隨機時間差。
  3. 換行時,需要等待較久的時間。
  4. 有一個不斷閃爍的藍色游標 |

React State Machine 實作

<HeroCodeAnimation /> 元件中,我們維護了三個狀態來追蹤打字進度:

const [displayedLines, setDisplayedLines] = useState<string[]>([]);
const [currentLineIndex, setCurrentLineIndex] = useState(0);
const [currentCharIndex, setCurrentCharIndex] = useState(0);

接著透過 useEffectsetTimeout 來遞迴處理每個字元的輸出:

useEffect(() => {
  // ...省略結束判斷邏輯
  const currentLine = codeLines[currentLineIndex];

  if (currentCharIndex < currentLine.length) {
    // 1. 如果這行還沒打完:設定一個隨機的 Timeout (20~70ms) 來模擬人手敲擊鍵盤
    const timeout = setTimeout(() => {
      // 將字元塞入目前的畫面陣列中...
      setCurrentCharIndex(prev => prev + 1);
    }, Math.random() * 50 + 20); // 隨機的打字延遲!
    return () => clearTimeout(timeout);
    
  } else {
    // 2. 如果這行打完了:停頓比較久的時間 (300ms),然後換下一行
    const timeout = setTimeout(() => {
      setCurrentLineIndex(prev => prev + 1);
      setCurrentCharIndex(0); // 將字元指標歸零
    }, 300);
    return () => clearTimeout(timeout);
  }
}, [currentLineIndex, currentCharIndex]);

配合 Tailwind 針對不同的關鍵字套用顏色(如 text-blue-400),我們就在瀏覽器中復刻出了一個極具科技感的 IDE 介面!


3. 💡 Vibe Coding 實戰:不會寫複雜動畫也沒關係

上面的 useEffect 如果自己從頭寫,很容易遇到 Infinite Loop(無限迴圈)把瀏覽器搞掛,或是遇到 React Closure 過期的經典 Bug。

但身為 Vibe Coder,你只需要學會下這個「神級咒語」:

「你是一個精通 Next.js 14 與 Framer Motion 的動畫大師。 請幫我實作一個『終端機打字機』動畫元件 (HeroCodeAnimation.tsx)。

功能要求:

  1. 請準備一段 10 行左右的假程式碼(內容請設計成:引入 Vibe 框架、部署 App)。
  2. 請實作一個逼真的打字機效果,字元要一個一個出來。打字速度要有微小的隨機延遲以模擬真人,且換行時要有較長的停頓
  3. 每一行的結尾(或是正在打字的最後方)必須有一個閃爍的藍色游標。
  4. 整體外觀要像 VS Code 的終端機:上方有紅黃綠三個圓點,背景是深色的 #0d1117
  5. 程式碼要根據不同的關鍵字(註解、字串、變數)給予不同的 Tailwind 顏色高亮。
  6. 當整段動畫播完後,停頓 5 秒,然後清空畫面重新循環播放。

請務必小心處理 React useEffectsetTimeout 的清理 (Cleanup),不要造成 Memory Leak。」

只要這段話,AI 就會寫出完美無瑕的動畫邏輯。

恭喜你!到這邊為止,你已經具備了打造百萬營收級別 SaaS 平台的所有硬實力。接下來,就是發揮你的創意,去改變世界吧!🚀

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!