iT邦幫忙

2026 iThome 鐵人賽

DAY 10
0

昨日我們完成了格子形變與平滑過渡的動畫實作,成功讓使用者在 4×6、4×5、4×4、3×4 四種預設佈局之間切換時感受到自然的 morphing 動效。隨著動畫的落幕,新的挑戰浮現:如何在佈局頻繁調整的同時,保證操作安全、提供即時回溯,並支援多場景的快速切換?

今天的核心主題聚焦於四大安全與回溯機制——40 步 Undo/Redo 堆疊、核心鍵位守護、智能收縮與自動重排、以及三大快照系統(Biz / Trip / Math)。透過完整的程式設計與 UI 互動,我們將自訂鍵盤打造為即使在高頻率調整下也不失穩定性的專業工具。


專案正式上線體驗與開源倉庫

線上體驗 Live Demo:https://410355-collab.github.io/Premium-Business-Calculator/
(強烈建議使用 iPhone Safari 或 Android 手機開啟體驗!)
GitHub 開源倉庫:https://github.com/410355-collab/Premium-Business-Calculator
歡迎提出建議與指導
(開發環境:Google Antgravity IDE + Google Gemini 協同開發)

一、技術痛點

需求背景

  • 使用者在自訂鍵盤上頻繁拖放新鍵與刪除舊鍵,若操作失誤會導致關鍵鍵位遺失或布局無法回復。
  • 多場景(商務、旅遊、科學)需要即時切換不同的鍵位配置,若每次手動調整會極大降低效率。
  • 佈局變更後常留下全空白的行或列,導致畫面閒置且影響視覺美感。

風險點

  • 無回溯機制會讓使用者在錯誤後無法回到安全狀態。
  • 缺少核心鍵位保護會造成計算式無法正確結束。
  • 空白格未自動收縮會讓鍵盤佔用不必要的螢幕空間。

二、解決方案

40 步 Undo/Redo 堆疊

透過全域物件 HistoryStack,在每次佈局渲染前 push 當前狀態,並限制最大保存步數為 40,確保記憶體使用可控。

// Global HistoryStack – 最多保留 40 步
const HistoryStack = {
  stack: [],          // [{layout, cursorPos, timestamp}, …]
  pointer: -1,        // 當前指向的快照索引
  maxSteps: 40,

  push(state) {
    if (this.pointer < this.stack.length - 1) {
      this.stack = this.stack.slice(0, this.pointer + 1);
    }
    if (this.stack.length >= this.maxSteps) {
      this.stack.shift();
      this.pointer--;
    }
    this.stack.push({ ...state, timestamp: Date.now() });
    this.pointer = this.stack.length - 1;
  },

  undo() {
    if (this.pointer <= 0) return null;
    this.pointer--;
    return this.stack[this.pointer];
  },

  redo() {
    if (this.pointer >= this.stack.length - 1) return null;
    this.pointer++;
    return this.stack[this.pointer];
  }
};

核心鍵位守護

檢查佈局中是否同時存在 BackSpaceClearEqual,若缺失即時提示並自動補齊。

const REQUIRED_KEYS = ['BackSpace', 'Clear', 'Equal'];

function validateCoreKeys(layout) {
  const present = new Set(layout.flat());
  const missing = REQUIRED_KEYS.filter(k => !present.has(k));
  if (missing.length) {
    alert(
      `關鍵鍵位遺失:${missing.join('、')}。\n` +
      `系統已自動加入缺失鍵位,請確認布局是否符合需求。`
    );
    missing.forEach(key => {
      layout[layout.length - 1][0] = key; // 放到最後一列第一格
    });
  }
}

智能收縮與自動重排

在使用者完成編輯(點擊 DONE)時,過濾掉全空白行與全空白列,返回緊湊的布局。

function smartShrink(layout) {
  // 移除全空白行
  layout = layout.filter(row => row.some(cell => cell !== null));

  // 移除全空白列
  const colCount = layout[0].length;
  for (let c = colCount - 1; c >= 0; c--) {
    const isEmptyCol = layout.every(row => row[c] === null);
    if (isEmptyCol) {
      layout.forEach(row => row.splice(c, 1));
    }
  }
  return layout;
}

三大快照系統

使用 localStorage 保存並載入三套預設布局(Biz、Trip、Math),配合 Day 9 的 morphing transition,切換時呈現 300 ms 的平滑過渡。

const SNAPSHOTS = {
  Biz:  'snapshot_biz.json',
  Trip: 'snapshot_trip.json',
  Math: 'snapshot_math.json'
};

function saveSnapshot(name) {
  const layout = JSON.stringify(currentLayout);
  localStorage.setItem(SNAPSHOTS[name], layout);
  alert(`${name} 快照已保存`);
}

function loadSnapshot(name) {
  const data = localStorage.getItem(SNAPSHOTS[name]);
  if (data) {
    currentLayout = JSON.parse(data);
    renderMainKeyboard(); // 觸發 morphing
    alert(`${name} 快照已載入`);
  } else {
    alert(`未找到 ${name} 快照`);
  }
}

三、核心代碼精華:script.js

HistoryStack 物件實作與 undo/redo 觸發綁定
validateCoreKeys 在每次佈局變更後呼叫
smartShrinkhandleDone() 中執行
saveSnapshot / loadSnapshot 於 UI 按鈕事件中掛載

四、深度調校剖析

回溯效能

保存 40 步的快照僅保留 layoutcursorPos,省去動畫狀態,確保 undo/redo 在 3 ms 內完成。
使用 pointer 追蹤當前位置,避免遍歷整個堆疊。

鍵位守護的容錯策略

允許使用者透過設定 autoCoreKeyFix 關閉自動補齊,保持完全手動控制。
缺失鍵位的自動補齊位置固定於最後一列第一格,避免覆寫已有功能鍵。

智能收縮的動畫呈現

smartShrink 執行完後,立即在 renderMainKeyboard 中加入 transition: all 200ms ease,讓格子收縮時伴隨微光漸變。
針對行與列的同時移除,使用逆向迴圈避免索引錯位。

快照切換的流暢度

loadSnapshot 後呼叫 renderMainKeyboard,內部透過 keyGridMorph CSS class 觸發 300 ms 的 morphing。
快照存取僅使用 localStorage,載入時間平均 12 ms,適合行動裝置即時切換。

五、總結

本日我們完成了自訂鍵盤的四大安全與回溯機制,將布局調整的容錯性提升至企業級水準。從 40 步的歷史堆疊到核心鍵位守護、智能收縮以及三大快照系統,使用者現在可以在任何情境下自由拖放、即時回溯、快速切換,且不會因關鍵鍵遺失或空白格產生視覺噪聲。接下來的日程將把這套框架延伸至高階商務金融與科學運算領域,打造全方位的專業鍵盤生態系。

明日預告:高階商務金融特化與科學計算

重現經典 Casio 計算機手感!全新 TAX+ / TAX- 雙向稅率核心 震撼登場:不僅能一鍵切換未稅與含稅、精確拆解稅額差,更能長按呼叫經典 SET 模式快速調整參數,搭配多國幣別獨立稅率持久記憶,讓跨國商務與精準記帳在彈指間流暢一體,帶給你無懈可擊的極致計算體驗。


上一篇
Day 9:【高階商務計算機】五大網格規格秒速切換與平滑形變動畫
下一篇
Day  11:【高階商務計算機】雙向稅率核心與長按 Casio SET 模式
系列文
液態玻璃美學:結合 Gemini 與 Antigravity IDE,打造 120FPS、多視窗比例與網格順延推擠佈局的強大商務運算終端15
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言