在昨天的文章中,我們深入剖析了觸控物理防抖的三層防線機制——從 Hysteresis 15% 遲滯判定徹底消滅按鍵邊界的閃爍誤觸,到 Touch Lift 22px 視線微抬升讓落點永遠顯示在拇指正上方,以及 Spring Drop 彈簧吸附落位帶來的精準物理回饋,並在 Samsung Galaxy S25 與 iPhone 15 裝置上完成了高強度動態壓力測試。
今天,我們要將陣地轉移到自訂鍵盤佈局的動態彈性空間機制。當使用者將新按鍵從庫存區拖入網格,或是將網格中的按鍵拖回庫存區時,版面空間該如何智慧調配?我們將解剖智慧空白格吸收(Smart Blank Absorption)與庫存區轉換兩大核心技術,確保每次拖放調整既能保護既有按鍵不被擠出版面,又能呈現極具現代感的微光虛線動效。
線上體驗 Live Demo:https://410355-collab.github.io/Premium-Business-Calculator/
(強烈建議使用 iPhone Safari 或 Android 手機開啟體驗!)
GitHub 開源倉庫:https://github.com/410355-collab/Premium-Business-Calculator
開發環境:Google Antigravity IDE + Google Gemini 協同開發
在傳統的網格介面拖放設計中,處理新元素加入常見有兩種做法:
直接取代目標槽位上的舊按鍵。這極易導致使用者好不容易配置好的功能按鍵遭到意外抹除。
將目標槽位及其後續所有按鍵一律向後推移一格。這種做法會強制破壞全版的佈局記憶,甚至導致排在最後的按鍵被擠出版面外而消失。
為了提供無痛且精準的自訂體驗,我們採用了「智慧空白格吸收」理念:將版面中的空白格(⬚)視為天然的物理吸收緩衝區。當拖入新按鍵時,系統會自動尋找距離最近的空白格進行定向收縮填補,讓新按鍵順利融入,同時保護所有現存功能按鍵不被擠出版面。
智慧空白格吸收演算法核心分為三個步驟:
當按鍵拖至目標槽位時,計算目標槽位與全版面所有 BLANK_KEY 之間的曼哈頓距離(Manhattan Distance):D = |x_target - x_blank| + |y_target - y_blank|
鎖定曼哈頓距離最短的空白格。若有多個相同距離的空白格,優先選擇同列(Row)或同欄(Column)的槽位以減少擠壓感。
沿著目標槽位到該空白格的路徑,將中間的按鍵依序向空白格方向平移一格,騰出目標槽位供新按鍵落位。
// 智慧空白格吸收與定向填補
function smartAbsorbAndInsert(targetIndex, newKey, gridState) {
const cols = 4;
const targetX = targetIndex % cols;
const targetY = Math.floor(targetIndex / cols);
let closestBlankIndex = -1;
let minDistance = Infinity;
// 1. 搜尋全版面最近的空白格
gridState.forEach((cell, idx) => {
if (cell.type === 'blank') {
const x = idx % cols;
const y = Math.floor(idx / cols);
const distance = Math.abs(targetX - x) + Math.abs(targetY - y);
if (distance < minDistance) {
minDistance = distance;
closestBlankIndex = idx;
}
}
});
// 若完全沒有空白格,退回安全保護機制
if (closestBlankIndex === -1) {
return false;
}
// 2. 沿路徑定向平移收縮,將空白格向 targetIndex 方向吸收
shiftPathTowardsBlank(targetIndex, closestBlankIndex, gridState);
// 3. 落位新按鍵
gridState[targetIndex] = { ...newKey };
return true;
}
當使用者將鍵盤上的按鍵拖回庫存區時,原槽位不會直接留下難看空洞,而是自動轉化為微光虛線空白格(Glowing Dashed Blank Slot)。
這種轉化帶來了顯著的 UX 優勢:
虛線框提示使用者此處為可隨時填入新按鍵的彈性空間。
.key-slot.is-blank {
background: rgba(255, 255, 255, 0.02);
border: 1.5px dashed rgba(255, 255, 255, 0.25);
border-radius: 14px;
box-sizing: border-box;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
animation: dashedPulse 3s infinite ease-in-out;
}
@keyframes dashedPulse {
0%, 100% {
border-color: rgba(255, 255, 255, 0.2);
box-shadow: inset 0 0 4px rgba(255, 255, 255, 0.02);
}
50% {
border-color: rgba(0, 240, 255, 0.5);
box-shadow: inset 0 0 10px rgba(0, 240, 255, 0.15);
}
}
今天我們透過智慧空白格吸收與庫存區微光虛線轉換,實現了自訂鍵盤佈局動態調配與按鍵保護機制。明天我們將解剖科學進階 4×6、標準商務 4×5、精簡 4×4、大數字 3×4 一鍵切換,以及切換時的平滑形變過渡與正弦呼吸光澤。
``|