Communitygithub.com

Wensity 版面配置

使用間距刻度、清晰的群組、對齊、網格、容器、表格和響應式結構來編排 Web UI,使其能從 320px 手機延伸到寬螢幕。在建立頁面、區塊、表單或儀表板版面,或是在 React、Next.js、Tailwind CSS 或 CSS 中調整間距、對齊、網格、容器或響應式行為時使用。

Wensity 版面配置 是什麼?

Wensity Layout 是一個 AI 代理技巧,用於建立一致的、視覺上引人注目的 Web UI 佈局。它強制執行三個核心習慣:固定的 4px 基底間距刻度、通過距離進行分組以及統一的對齊系統,確保間距、對齊和響應式結構始終清晰且有意義。該技巧特別適用於 React、Next.js、Tailwind CSS 和純 CSS 專案。它提供了詳細的指引,涵蓋了從間距標記和容器寬度到高級網格系統和觸控目標的所有內容。通過遵循其規則,開發人員可以避免諸如隨機間距、佈局斷裂和行動裝置上出現橫向捲軸等常見問題。該技巧提倡「先行動裝置」的設計,使用邏輯屬性進行 RTL 支援,並根據意圖(例如行銷、日常使用、資料工具)調整密度,確保每個佈局都能有效溝通其優先級。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/wensity/skills/tree/HEAD/skills/wensity-layout

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

Wensity 版面配置 是做什麼的?

版面配置是頁面在人們閱讀文字之前,告訴他們什麼是重要的、什麼是屬於一起的方式。好的版面配置來自三個習慣:固定的間距刻度、按距離分組,以及統一的對齊系統。此技巧將設定這三者,並涵蓋響應式結構。

如果專案已有間距刻度和容器寬度,請沿用它們。

1. 間距刻度

使用 4px 基底。每個 margin、padding 和 gap 都來自此列表:

代號px典型用途
14圖示到標籤、緊湊的行內間距
28控制項內部、標籤與其輸入框之間
312緊湊列表中的項目之間、按鈕的垂直內距
416卡片內距(緊湊)、相關控制項之間的間距、行動裝置頁面邊距
520按鈕的水平內距(大)
624卡片內距、表單欄位之間的間距
832區塊內的群組之間
1040區塊標題與其內容之間(大)
1248行動裝置上的區塊內距
1664應用程式中的區塊之間、平板上的區塊內距
2080
2496桌面行銷頁面上的區塊內距
32128主視覺區內距、圍繞一個重大聲明的空間

Tailwind 的預設刻度已遵循 4px 基底(p-4 是 16px),因此請使用其步驟,不要發明 p-[13px]。只有在您於渲染中檢查過的光學修正情況下,才允許使用奇數值(例如一個看起來偏了 1px 的圖示)。

2. 按距離分組

單一最重要的版面規則:群組內部的空間小於群組之間的空間。 標籤距離其輸入框 8px;下一個欄位距離 24px。卡片的標題距離其文字 8px;下一張卡片距離 24px。當內部與外部間距相等時,所有東西都會漂浮分散,沒有任何東西看起來像是一個群組。

  • 目標是內部與外部間距的比例約為 1:2 或 1:3。
  • 標題上方比下方有更多空間。 標題屬於其後的內容。典型:標題上方 48px,下方 16px。
  • 盒子之前的間距。 先使用距離進行分組。僅在距離不足時才添加邊框、分隔線或背景(例如密集的表格、工具欄、繁忙背景上的內容)。給每個群組都加上一個盒子會讓頁面顯得很沉重。
  • 對同層級元素使用 gap(flex gap-4、grid gap-6),而不是對子元素使用 margin。這能將間距集中在一個地方,並避免在列表末尾出現多餘的 margin。

3. 節奏,而非千篇一律

一個每個區塊都有 96px 內距、置中標題和三欄網格的頁面沒有節奏。有目的地改變密度:

  • 交替使用密集區塊(功能網格、表格、標誌)和開放區塊(一個陳述、一張大圖)。
  • 讓重要的區塊佔據更多空間。空間是你分配注意力的方式。
  • 僅在內容真正屬於同一類事物時才重複版面。

4. 對齊

  • 單一起始邊。 區塊內的標題、段落、按鈕和圖片共享同一條起始線。大多數「看起來不對勁」的抱怨都是因為兩條邊相差了幾像素。
  • 預設對齊到起始邊(text-align: start,在英文中是靠左,在阿拉伯文或希伯來文中是靠右)。僅將簡短、獨立的內容置中:主視覺標題、單一 CTA 區塊、空白狀態。表單、表格、列表和長文字對齊到起始邊。
  • 在表格和數據列中將數字對齊到結束邊。
  • 對齊到文字,而非盒子。 圖示旁的標籤應對齊標籤的 cap height 或中心,而不是行盒的頂部。在 flex 行中,單行使用 items-center;多行文字則使用 items-start 並在圖示上添加一個小的上外邊距。
  • 光學調整: 播放圖示、箭頭和圓形形狀在數學上置中時看起來會偏移。在看到後,將其微調 1 到 2px。

5. 容器與寬度

容器最大寬度用途
Prose65ch(約 640 到 720px)文章、文檔、長段落
Narrow560 到 640px表單、登入、聚焦的任務、置中的主視覺陳述
Content1120 到 1280px大多數行銷區塊和應用程式頁面
Wide1440 到 1600px儀表板、畫廊、編輯器
Full bleed100%背景、圖片、應觸及邊緣的產品照
  • 頁面邊距: 手機上 16px,平板上 24px,桌面上 32 到 48px。保持一致:整個網站每個斷點只有一個邊距值。
  • 將背景與內容寬度分開。 區塊的背景可以全幅顯示,而其內容則保持在內容容器中。
  • 不要讓文字在寬螢幕上全幅顯示。 圖片和網格可以增長;段落則不行。

6. 網格

  • 行銷版面使用 12 欄,可以實現一半、三分之一、四分之一以及不對稱分割(7 和 5、8 和 4)。不對稱分割看起來比 6 和 6 更具設計感。
  • 卡片使用自動填充網格,讓欄數跟隨空間變化:
.cards { display: grid; gap: 24px; grid-template-columns: repeat(auto-fill, minmax(min(100%, 280px), 1fr)); }

min(100%, 280px) 可防止在寬度小於 280px 的螢幕上溢出。 auto-fill 在只有一兩張卡片時保持卡片寬度穩定;auto-fit 則會拉伸少數卡片以填滿行。要有目的地選擇。

  • 讓彈性軌道可以縮小。 Grid 和 flex 子元素預設拒絕縮小到其內容以下,這就是為什麼長文字或寬表格會溢出儀表板。對彈性軌道使用 minmax(0, 1fr),對包含文字的 flex 子元素使用 min-width: 0(Tailwind min-w-0):
.app-shell { display: grid; grid-template-columns: 16rem minmax(0, 1fr); }
.row > .text { min-width: 0; }
  • 僅對等高的內容使用等高的卡片。 在一行中的卡片預設會拉伸到最高的一張。這對於方案集合來說沒問題;但當其中一張卡片明顯是主打商品時就不合適了。
  • Bento 網格: 根據重要性改變磁貼大小,保持一個間距值,並為每個磁貼提供真實的內容。空白的裝飾性磁貼看起來像個模板。
  • 當一行中的卡片需要彼此對齊標題、正文和按鈕時,使用 subgrid(grid-template-rows: subgrid)。

7. 響應式結構

先設計行動裝置,然後隨著空間增加再添加結構。

  • 斷點應跟隨內容,而非裝置。 在版面開始看起來不對勁的地方添加一個。Tailwind 的 sm 640、md 768、lg 1024、xl 1280 是不錯的預設值。
  • 重組結構,而不僅僅是縮小。 在行動裝置上,三欄功能網格變成一欄,並排的文字和圖片堆疊起來,圖片放在第二(如果圖片傳達了訊息則放在第一),表格變成卡片列表或在其自己的容器內水平滾動,側邊欄變成抽屜。
  • 對出現在不同寬度中的元件使用容器查詢(例如側邊欄和主要欄位中的卡片):
.card-wrap { container-type: inline-size; }
@container (min-width: 480px) { .card { grid-template-columns: 160px 1fr; } }

在 Tailwind v4 中:在父元素上使用 @container,在子元素上使用 @md:grid-cols-2。

  • 根據螢幕縮放間距。 區塊內距:行動裝置 48px,平板 64px,桌面 96px。間距可以從 16 逐步增加到 24 再到 32。
  • 視口高度: 對於全高版面,使用 min-h-dvh(或 100dvh),而不是 h-screen(100vh)。在帶有工具欄的行動瀏覽器上,100vh 比可見區域高,因此內容會隱藏在工具欄下方。
  • 帶有瀏海的手機的安全區域: 固定底部欄使用 padding-bottom: env(safe-area-inset-bottom),並在 viewport meta 標籤中設置 viewport-fit=cover。
  • 從右到左的語言: 使用邏輯屬性(margin-inline-start、padding-inline、inset-inline-end;Tailwind ms-*、pe-*、start-*)代替 left 和 right,並使用 dir="rtl" 進行測試。鏡像方向性圖示(返回箭頭、V 形符號),不要鏡像標誌或每個圖示。
  • 永遠不要出現水平頁面滾動。 在 320px 處檢查。通常的原因包括固定寬度、長單詞或 URL、w-screen 元素(它包含了滾動條寬度)或負的 margin。

8. 表格

  • 標題行扮演標籤角色,在表格滾動時固定(position: sticky; top: 0),使用帶色調的背景或更強的下邊框。
  • 按密度設定行高: 緊湊 36px,預設 44px,舒適 52px。當使用者需求不同時,提供切換選項。
  • 行之間使用細線分隔符或斑馬紋色調分隔,兩者不要同時使用。
  • 數字使用 tabular-nums 並對齊到結束邊; 文字對齊到起始邊;狀態和操作放在最後幾欄。
  • 行動裝置上的寬表格: 在其自己的容器內水平滾動(overflow-x: auto),並固定第一欄,或者切換到每行的堆疊卡片。永遠不要讓表格將頁面推向側面。
  • 空白、載入和錯誤狀態應位於表格框架內,保留標題,以便使用者知道將出現什麼內容。

9. 密度

根據螢幕的使用頻率來匹配密度:

  • 行銷和入門: 開放。每螢幕項目少,空間寬敞,字型大。
  • 日常使用的應用程式畫面: 緊湊。行高 36 到 44px,間距 8 到 12px,14px 文字。每天使用螢幕的人希望一次看到更多內容。
  • 表格和資料工具: 密集,如果使用者需求不同則提供密度切換。
  • 不要在一個面板內混合不同的密度。

10. 觸控目標與點擊區域

  • 觸控螢幕上任何可點擊的內容都需要 44x44px 的目標,即使可見圖示只有 16px。(WCAG 2.2 AA 要求至少 24x24px;44px 是舒適的大小。)使用內邊距放大點擊區域,或使用一個以控制項為中心、不可見的偽元素,這樣版面就不會改變:
.icon-btn { position: relative; }
.icon-btn::before {
  content: ""; position: absolute; left: 50%; top: 50%;
  width: max(100%, 44px); height: max(100%, 44px);
  transform: translate(-50%, -50%);
}
  • 獨立觸控目標之間至少間隔 8px,以免拇指同時碰到兩個。

11. 分層

保持一個小的 z-index 範圍,並僅使用這些值:

:root { --z-dropdown: 10; --z-sticky: 20; --z-overlay: 30; --z-modal: 40; --z-toast: 50; --z-tooltip: 60; }

使用 showModal() 開啟的原生 <dialog> 以及帶有 popover 屬性的元素會渲染在瀏覽器的頂層,高於所有 z-index,因此它們不需要設定 z-index。z-index: 9999 表示對堆疊的理解不足。應該修復堆疊上下文(通常是父元素上多餘的 transform、filter 或 isolation),而不是提高數值。

12. 固定與固定定位元素

  • 固定 header:保持較短(56 到 64px),並且只在頁面在其下方滾動時才為其添加背景(純色或模糊),這樣頁面頂部可以保持乾淨。
  • 在被錨定的標題上添加一個等於 header 高度的 scroll-margin-top,這樣頁內鏈接就不會落在 header 下方。
  • 行動裝置上的固定底部欄需要上述的安全區域內邊距,並且不能覆蓋頁面上的最後一個內容;在頁面底部添加等於該欄高度的內邊距。

13. 完成前檢查

  • 每個間距值都在 4px 刻度上。
  • 群組內部的空間明顯小於群組之間的空間。
  • 標題上方比下方有更多空間。
  • 每個區塊有一個起始邊;表格中的數字對齊到結束邊。
  • 彈性軌道使用 minmax(0, 1fr);文字子元素可以縮小。
  • 即使在寬螢幕上,段落也限制在約 65ch 以內。
  • 版面在行動裝置上會重組結構,而不僅僅是縮小。
  • 在 320px 處無橫向滾動;全高區塊使用 dvh。
  • 觸控目標至少 44px(絕不小於 24px)。
  • z-index 值來自該範圍。
  • 瞇眼測試:最重要的事物和群組,在細節模糊的情況下依然清晰可見。

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相關技能