空間 / 尺寸類指令的澄清時機
核心原則
空間 / 尺寸類指令缺少明確數值時、先列計算過程或假設、確認後再實作。 直接用估算寫死會在使用者實際看到結果時才被發現不對、引起多輪試錯。澄清的成本是「多打一句話」、收益是「一次到位」。
為什麼空間指令需要澄清
商業邏輯
「對齊」「擺在旁邊」這類描述是關係性指令 — 描述了兩個元素的相對位置,但沒給絕對數值。實作時需要把關係轉成具體數字(padding 多少、top 多少)。
執行者依憑感覺取數字 = 用自己的估算代替使用者的意圖。估算與意圖不一致時、使用者看到結果才知道、糾正成本高。
把計算過程列出來確認 = 把「估算」變成「協商」 — 使用者有機會在實作前指正。
這次任務的實際情境
觀察
| 情境 | 指令 | 我的處理 | 結果 |
|---|---|---|---|
| Filter 的 padding 對齊 | 「padding 對齊到搜尋欄下緣」 | 估算 padding-top: 152px 寫死 | 視覺差 ~10px、要重做 |
| Breakpoint 取值 | 「桌面顯示左欄、手機隱藏」 | 取 768px 寫死 | 視窗 1200 時看不到 filter、要重做 |
| Filter 寬度 | 「左欄 400px」 | 直接用 400 | 一次到位 |
第三個是少數有明確數值的情境、那次一次到位。前兩個沒給數字、靠估算、結果都要重做。
判讀
差別在「使用者有沒有給確定值」。沒給時、執行者該做的不是「自己決定」、是「把計算列出來確認」。
執行:澄清 protocol
收到空間 / 尺寸類指令時、先檢查:
| 檢查項 | 動作 |
|---|---|
| 使用者給了具體數值嗎? | 是 → 直接用;否 → 進下一步 |
| 我能依據已知元件尺寸推算嗎? | 是 → 列出計算過程確認;否 → 直接問 |
| 推算依賴的假設明確嗎? | 是 → 列出假設與數字;否 → 列出選項供選擇 |
例:
「padding 對齊到搜尋欄下緣 — 我會用 H1 64px + form 68px = 132px 當基準、加 8px buffer 共 140px、OK 嗎?或是你想要其他數字?」
把計算過程攤開、使用者可以指正「H1 沒這麼高、應該 70px」、避免實作後重做。
內在屬性比較:四種空間指令處理方式
| 處理方式 | 一次到位機率 | 重做成本 | 適用情境 |
|---|---|---|---|
| 直接照使用者給的數值寫 | 100% | 無 | 使用者明確給數值 |
| 列計算過程確認後寫 | 高 | 低 | 數值可推算 |
| 用估算值寫、之後再調 | 中 | 中 — 一兩輪 | 視覺差容易調的場景 |
| 不確認直接寫死 | 低 | 高 — 多輪試錯 | 不適用 |
優先順序:有數值用、可算就算、估算寫死最後選。
列計算的好習慣
1. 攤開假設
1計算 filter padding-top:
2 H1 height = 64px(假設、實際看 theme 渲染可能不同)
3 Form height = 68px(pagefind input 64 + border 4,鎖定 scale=1.0)
4 Gap = 20px(pagefind drawer 預設 margin-top)
5 Total = 152px每個值來源寫清楚 — 使用者可以指出某個假設錯了。
2. 用變數表達
1padding-top: calc(var(--search-title-h) + var(--search-form-h) + var(--search-gap));使用變數取代 magic number — 改一處全部跟著動、未來調整成本低。
3. 區分「設計值」與「量測值」
| 值類型 | 來源 | 例子 |
|---|---|---|
| 設計值 | 設計師決定的固定值 | filter 寬度 400px |
| 量測值 | runtime 才知道 | scope UI 高度(受字型換行) |
| 推算值 | 由其他值計算 | filter padding = title + form + gap |
確認時把每個值的類型寫清楚、使用者知道哪些是「我可以決定」、哪些是「實作時才知道」。
設計取捨:空間/尺寸指令的處理策略
四種做法、各自機會成本不同。這個專案在缺數值時選 A(列計算過程確認)當預設、其他做法在特定情境合理。
A:列計算過程確認後實作(這個專案的預設)
- 機制:把計算過程與假設攤開、給使用者確認、再用
calc(var(...) + var(...))實作 - 選 A 的理由:使用者能指正特定假設(不只「對」「不對」)、實作後改 token 自動跟上
- 適合:缺數值的空間 / 尺寸指令(大多數情境)
- 代價:多一輪對話確認
B:直接照使用者給的數值寫
- 機制:使用者給「filter 寬 400px」就直接
width: 400px - 跟 A 的取捨:B 一次到位、無需確認;前提是使用者已給確切數值
- B 比 A 好的情境:使用者明確指定數值、執行者只需照寫
C:用估算值寫、之後再調
- 機制:執行者依感覺給數字(「padding-top: 152px」)、寫了之後等使用者試
- 跟 A 的取捨:C 看似省溝通成本、實際把確認延後到實作後;C 在估算錯時要重做
- C 才合理的情境:視覺差容易調(< 5px 微差)、且確認成本比實作高(罕見)
D:不確認直接寫死
- 機制:執行者自己決定數值、不問也不告知
- 成本特別高的原因:跟使用者意圖不一致時要重做、多輪試錯
- D 是反模式:「使用者會看到的數字」屬於該確認的決定(#21 可決定 vs 該先確認)— 自決會跟意圖不一致、被退回時白做
判讀徵兆
| 訊號 | 應該觸發澄清的指令 | 第一個該確認的 |
|---|---|---|
| 「對齊到 X」 | 對齊基準是 X 的哪個邊(top / bottom / center)? | 基準位置 |
| 「靠在 Y 旁邊」 | 多近?同 row 還是 above / below? | 相對方向與距離 |
| 「desktop 顯示、mobile 隱藏」 | Breakpoint 多少 px? | viewport 切換點 |
| 「跟 Z 一樣高」 | Z 的高度是固定還是動態? | 量測 vs 寫死 |
| 「適中的 padding」 | 「適中」對應多少 px? | 給選項供選擇 |
核心原則:空間關係描述只是意圖、不是實作數字。把意圖翻譯成數字的過程要對外可見、讓使用者參與。
第三輪指令類型現有五類:空間(本卡)/ 相對位置(#17)/ 隔離(#18)/ 決定權(#21)/ 篩選(#58)。前四類缺幾何 / 邊界 / 拍板資訊、第 5 類缺操作層級資訊。