Skip to content

tznthou/day-13-cyber-glitch

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Cyber Reality Glitcher

License: MIT Live Demo Vanilla JS Web Audio API

← 回到 Muripo HQ

網頁現實駭客 — 把任何網站變成 Cyberpunk 故障模式

English Version


TL;DR

一個 Bookmarklet 工具,只要拖到書籤列,就能在任何網站上啟動 Glitch 效果。滑鼠滑過文字會變成亂碼、滑過圖片會產生 RGB 分離和抖動、點擊任何元素會讓它旋轉消失。完美用來「駭入」討厭的廣告或假裝自己是電影裡的駭客。


開發心得

這個專案的初衷是想創造一種體驗的改變

我想做一個「破壞器」,或者說是一個「現實改變器」。從網頁開始動手——當滑鼠滑過文字時,文字會瞬間崩解成亂碼;那些煩人的廣告?直接砸碎它!圖片看起來像是故障了一樣閃爍抖動。

主要的想法是:讓我們在瀏覽網頁的時候,可以用另一個角度來看這個世界。

每個網頁都是別人精心設計的「現實」,但透過這個工具,你可以暫時打破它、扭曲它、甚至消滅它的一部分。這種「破壞」的快感,加上賽博龐克的視覺風格,我覺得會是一個很有趣的效果。

所以,我開發了這個功能。🎮


系統架構

graph TB
    subgraph Injection["注入層"]
        BOOKMARKLET["Bookmarklet<br/>javascript:(function(){...})()"]
        SCRIPT["glitcher.min.js<br/>~12KB 壓縮腳本"]
    end

    subgraph Core["核心模組"]
        STATE["狀態管理<br/>WeakMap"]
        CSS["CSS 注入器<br/>動態樣式"]
        AUDIO["音效系統<br/>Web Audio API"]
    end

    subgraph Effects["效果引擎"]
        SCRAMBLER["Text Scrambler<br/>文字亂碼化"]
        GLITCH["Image Glitch<br/>RGB 分離 + 抖動"]
        ZAP["Element Zap<br/>旋轉消失"]
    end

    subgraph UI["介面層"]
        PANEL["控制面板<br/>開關 | 音效 | 重置"]
        EVENTS["事件委派<br/>Capturing Phase"]
    end

    BOOKMARKLET --> |"載入"| SCRIPT
    SCRIPT --> STATE
    SCRIPT --> CSS
    SCRIPT --> AUDIO

    CSS --> |"注入 keyframes"| Effects
    STATE --> |"追蹤元素狀態"| Effects

    EVENTS --> |"hover"| SCRAMBLER
    EVENTS --> |"hover"| GLITCH
    EVENTS --> |"click"| ZAP

    PANEL --> |"控制"| STATE
    AUDIO --> |"播放"| Effects
Loading

使用流程

sequenceDiagram
    participant User as 使用者
    participant Browser as 瀏覽器書籤列
    participant Target as 目標網站
    participant Glitcher as Cyber Glitcher

    User->>Browser: 拖曳 Bookmarklet 到書籤列
    Note over Browser: 一次性安裝

    User->>Target: 瀏覽任意網站
    User->>Browser: 點擊 CYBER_GLITCH 書籤
    Browser->>Target: 注入 glitcher.min.js
    Target->>Glitcher: 初始化

    Glitcher->>Target: 注入 CSS 樣式
    Glitcher->>Target: 建立控制面板
    Glitcher->>Target: 綁定事件監聽

    Note over Target: 🎮 Glitch Mode 啟動!

    alt 滑鼠滑過文字
        User->>Target: hover <p>
        Glitcher->>Target: 文字變亂碼
        User->>Target: 移開滑鼠
        Glitcher->>Target: 漸進還原文字
    end

    alt 滑鼠滑過圖片
        User->>Target: hover <img>
        Glitcher->>Target: RGB 分離 + 抖動
    end

    alt 點擊元素
        User->>Target: click 任意元素
        Glitcher->>Target: 旋轉縮小消失
        Glitcher->>Target: 顯示 [null] 標記
    end

    alt Shift + 點擊文字
        User->>Target: Shift+Click <p>
        Glitcher->>Target: 永久鎖定亂碼
    end
Loading

安裝方式

方法一:拖曳安裝(推薦)

  1. 前往 Demo 頁面
  2. 找到綠色的 CYBER_GLITCH 按鈕
  3. 直接拖曳到瀏覽器書籤列
  4. 完成!

方法二:手動安裝

  1. 在書籤列上按右鍵 → 新增書籤
  2. 名稱填:CYBER_GLITCH
  3. 網址填入以下程式碼:
javascript:(function(){if(window.__CYBER_GLITCHER__)return;var s=document.createElement('script');s.src='https://tznthou.github.io/day-13-cyber-glitch/dist/glitcher.min.js';document.body.appendChild(s);})();

方法三:本地開發

# 複製專案
git clone https://github.com/tznthou/day-13-cyber-glitch.git
cd day-13-cyber-glitch

# 直接開啟測試頁
open demo/test-page.html

# 或使用 Live Server
npx live-server

功能特色

功能 觸發方式 效果說明
文字擾亂 Hover 文字 文字瞬間變成 █▓▒░@#$% 等亂碼字元
漸進還原 移開滑鼠 文字一個字一個字慢慢恢復原狀
永久鎖定 Shift + Click 文字永遠保持亂碼狀態
圖片故障 Hover 圖片 RGB 色差分離 + 高速抖動 + 隨機反色
元素粉碎 Click 任意元素 元素旋轉 720° 縮小消失,留下 [null]
控制面板 右下角浮動 開關、音效切換、重置頁面
合成音效 自動播放 Web Audio API 即時合成 glitch 音效

控制面板說明

啟動後會在網頁右下角出現控制面板:

按鈕 功能
[ACTIVE] / [PAUSED] 開關 Glitch 效果
[SOUND: OFF] / [SOUND: ON] 開關音效
[RESET] 還原所有被修改的文字與圖片

提示:被 [null] 消除的元素需要重新整理頁面才能恢復。


技術棧

技術 用途
Vanilla JavaScript (ES6+) 核心邏輯,無框架依賴
IIFE 立即執行函式 防止全域命名空間污染
WeakMap 元素狀態管理,防止記憶體洩漏
Event Delegation 單一監聽器處理所有事件
Capturing Phase 確保事件在頁面處理前被攔截
Web Audio API 即時合成 glitch 音效
CSS Keyframes 動畫效果(抖動、旋轉、閃爍)

專案結構

day-13-cyber-glitch/
├── index.html              # 展示頁 + 安裝說明(支援中英文切換)
├── src/
│   └── glitcher.js         # 核心腳本(有註解,~650 行)
├── dist/
│   └── glitcher.min.js     # 壓縮版(~12KB)
├── demo/
│   └── test-page.html      # 本地測試頁
├── README.md               # 中文說明
├── README_EN.md            # 英文說明
├── package.json            # npm 設定(terser 壓縮用)
└── LICENSE                 # MIT 授權

核心演算法

文字亂碼化(Text Scrambler)

const GLITCH_CHARS = '█▓▒░╬╠╣┼◢◣◤◥@#$%^&*!?<>/\\|_-=+[]{}~';

function scrambleChar(char) {
  // 保留空白
  if (/\s/.test(char)) return char;
  // 保留標點符號
  if (/[.,!?:;'"()-]/.test(char)) return char;
  // 保留中文標點
  if (/[\u3000-\u303F\uFF00-\uFFEF]/.test(char)) return char;
  // 隨機替換成 glitch 字元
  return GLITCH_CHARS[Math.floor(Math.random() * GLITCH_CHARS.length)];
}

漸進還原動畫

// 時間常數集中管理
const TIMING = {
  SCRAMBLE_INTERVAL: 50,    // 文字擾亂更新間隔
  RESTORE_CHAR_DELAY: 25,   // 每個字元還原間隔
  RESTORE_MULTIPLIER: 30,   // 還原時間計算係數
  RESTORE_BUFFER: 100       // 還原緩衝時間
};

function restoreText(el, original) {
  const chars = el.textContent.split('');
  let i = 0;

  const interval = setInterval(() => {
    if (i >= original.length) {
      clearInterval(interval);
      return;
    }
    chars[i] = original[i];  // 每次還原一個字元
    el.textContent = chars.join('');
    i++;
  }, TIMING.RESTORE_CHAR_DELAY);  // 使用常數,方便調整
}

防重複注入

if (window.__CYBER_GLITCHER__) {
  console.warn('[CYBER_GLITCHER] Already active.');
  return;
}
window.__CYBER_GLITCHER__ = true;

設計理念

色票

名稱 Hex 用途
Terminal Green #00ff00 主要強調色、文字效果
Magenta #ff00ff RGB 分離左側陰影
Cyan #00ffff RGB 分離右側陰影
警告紅 #ff0000 RESET 按鈕

視覺風格

靈感來自《駭客任務》和《賽博龐克 2077》:

  • 掃描線濾鏡覆蓋整個頁面
  • 霓虹綠發光效果
  • 等寬字體(Courier New / Monaco)
  • 高對比度配色

瀏覽器相容性

瀏覽器 版本 支援狀態
Chrome 80+ ✅ 完整支援
Firefox 75+ ✅ 完整支援
Safari 13+ ✅ 完整支援
Edge 80+ ✅ 完整支援
IE - ❌ 不支援

注意事項

  1. 某些網站可能阻擋:有 CSP(Content Security Policy)的網站可能無法載入外部腳本
  2. 不會修改原始碼:所有效果只在瀏覽器端,重新整理就恢復正常
  3. 消除的元素:被 Click 消除的元素需要重新整理頁面才能恢復
  4. 效能考量:在元素極多的頁面上可能略微影響效能

授權

License: MIT

本專案採用 MIT License 授權。

About

網頁現實駭客 - Transform any webpage into cyberpunk glitch mode

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •