Communitygithub.com

bompus/hr-better-typography

Web UI 排版規則:字級比例、行高、換行、截斷、表格數字、字型載入與行動裝置輸入文字尺寸。用於設計或檢視 CSS 網頁 UI 中的文字渲染。

hr-better-typography 是什麼?

這個技能提供一套嚴謹的 Web UI 排版規則,涵蓋字級比例、行高、換行控制、文字截斷、表格數字、字型載入及行動裝置輸入框文字尺寸等細節。它強調以 CSS 屬性而非原始標籤來控制外觀,並建議使用語義化的字級命名與單位無關的行高值,以確保排版系統在不同裝置上的一致性。技能支援所有基於 CSS 的 Web 開發環境(如 Tailwind CSS),並提供完整的檢查清單與錯誤修正對照表。透過遵循這些規則,開發者可以避免常見的排版問題,如孤立詞、不對稱的標題、合成字型失真,以及行動裝置上的自動縮放問題。最終目標是建立一個易於維護、可擴展且對使用者友善的文字介面。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/bompus/house-rules/tree/HEAD/skills/hr-better-typography

在你喜歡的 AI 中提問

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

說明文件

排版

排版多半是節制:合理的字級比例、舒適的間距、足夠的對比。標籤、表格儲存格、行銷標題和文章段落不共用同一套規則。

進行檢視時,閱讀渲染後的頁面而非掃描程式碼。錯誤的換行、孤立詞和截斷只有在真實內容長度下才會顯現。

每次修正都應使用專案的樣式系統,並採用下方提供的精確數值,而非看起來類似的等價數值。速查表將每個宣告對應到其 Tailwind 等效項目。

文字本身屬於 hr-better-writing。語義標題結構屬於 hr-better-accessibility。空間 RTL 配置和邏輯屬性屬於 hr-better-layout。對比測量屬於 hr-better-colors。這個技能掌管文字在混合方向內容中如何渲染、換行和表現。

提供正確的格式

在網頁上使用 .woff2,以獲得 Brotli 壓縮和廣泛支援。.woff 是針對非常舊的瀏覽器的備用方案。.ttf 和 .otf 是桌面格式,沒有網頁壓縮。檔案如何載入是專案的問題。

優先使用屬性而非原始標籤

當 CSS 屬性存在時,就使用它。使用 font-weight: 650 而非 font-variation-settings: "wght" 650。使用 font-optical-sizing: auto 而非 "opsz"。使用 font-variant-numeric: tabular-nums 而非 font-feature-settings: "tnum" 1。

屬性在非可變字型備用渲染時仍能正常運作。為自訂軸線("GRAD" 80)和沒有對應屬性的特殊功能("ss01" 1)保留原始標籤。軸線和功能標籤列於 variable-fonts-and-opentype.md。

載入預期的字重和樣式

瀏覽器會合成目前字型家族缺少的字重或樣式,從而扭曲真實的字體。載入設計所使用的字體。

font-synthesis: none 會關閉合成,但它會抹除強調效果而非回報它。只有在檢查過所有必要的粗體、斜體、小型大寫、上標和下標形式在備用字型堆疊中仍保持可區分時,才設定此屬性。

減少字型、尺寸和字重的數量

很少使用超過三種字型。字重和尺寸定義了層級;過度使用會迅速損害可讀性。為對比而非相似性進行配對:襯線字體標題搭配無襯線字體內文是刻意的設計,而兩個幾乎相同的無襯線字體則會被視為錯誤。

在 18px 以下,使用 400 或更重的字重。300 以下的字重僅適用於 28px 以上的顯示用途;它們在文字尺寸下會消失。字型配對指南請見 choosing-fonts.md。

使用帶有語義名稱的字級比例

定義一組少量的尺寸,並盡可能不偏離它們。沒有系統支援的硬編碼尺寸在規模擴大時會崩潰。使用 lint 規則或守衛測試來強制執行此比例,對任何超出允許範圍的任意尺寸進行失敗處理。

單獨的預設名稱(如 text-sm)在使用規則明確時是可以接受的。在團隊中,按用途命名尺寸(如 text-body-sm),以便規則能持續被其他人使用。比例構造請見 spacing-and-sizing.md。

標題尺寸隨層級遞減

將標題層級對應到字級比例中遞減的步驟,使得視覺上次要的標題永遠不會壓過其父標題。相鄰的層級在比例尺的較小端可以共享一個尺寸,只要字重或間距能將它們區分開來。語義元素屬於 hr-better-accessibility;此技能僅設定視覺處理。

按角色設定行高

標題較緊湊,約 1.1。內文為 1.5 到 1.6。優先使用無單位值,以便行高能隨字型尺寸縮放;固定的 24px 則不行。

緊湊的行高適用於短文字。任何換行到三行或以上的文字至少需要 1.4,即使在高度受限的行中也是如此。

按尺寸設定字距

大字標題通常帶有略微負值的字距看起來更好。小型大寫標籤需要一點正值的字距,否則字母會顯得擁擠。閱讀尺寸的內文則兩者都不需要。

限制行長

長行使眼睛難以找到下一行。將長篇文字限制在每行約 60–75 個字元。任何單位都可以,只要存在一個限制值且行長落在範圍內。詳見單位選擇與像素等價。

有意識地控制換行

四個宣告,四個功能:

  • text-wrap: balance 將文字均勻分配在各行。用於標題。
  • text-wrap: pretty 防止單個短詞落在最後一行。用於描述。
  • overflow-wrap: break-word 用於長單詞、連結或 ID 可能溢出容器的地方。
  • white-space: nowrap 用於標籤和徽章,其中換行會顯得很奇怪。

在長篇文字中跳過 balance 和 pretty。

對變化的數值使用表格數字

預設情況下,數字具有不同的寬度,因此計時器、計數器和價格在更新時會改變佈局。對任何變化的值套用 font-variant-numeric: tabular-nums。

在不遺失內容的情況下截斷

對於單行,使用 text-overflow: ellipsis 搭配 overflow: hidden 和 white-space: nowrap。對於多行,使用 line-clamp。截斷會隱藏內容。當遺失的文字很重要時,請在工具提示或展開的檢視中保持完整值可存取。

按欄位選擇。對使用者需要完整識別項目的名稱和標題進行換行。當項目結尾不同時,在中間進行截斷,例如共用網域的文件名、路徑和電子郵件,因為結尾的省略號會使它們看起來相同。永遠不要截斷使用者要比較的數字、金額或日期。詳情請見 wrapping-and-punctuation.md。

自然地撰寫文案,用 CSS 設定樣式

以自然大小寫儲存文字,並使用 text-transform 控制呈現方式,這樣重新設計時就不需要重寫文案。

在渲染的文字中使用智慧標點:

  • 散文使用彎引號,程式碼使用直引號。
  • 範圍使用 en dash:2010–2020。
  • 單個省略號字元,而非三個句點。
  • 使用   將 16 px 保持在一起,避免換行。
  • 使用 ­ 指定長單詞可能斷行的地方。

底線來自字型

預設底線位於瀏覽器決定的任何位置。使用 text-underline-position: from-font 和 text-decoration-thickness: from-font 從字型本身的度量中提取位置和粗細。透過 text-decoration-thickness、text-underline-offset 和 text-decoration-skip-ink 進行手動調整。

text-decoration-style 將線條繪製成點狀、虛線或波浪狀。點狀底線是常見的提示,表示單詞帶有額外資訊,例如縮寫或定義的術語。

顏色是真實底線中唯一能可靠動畫化的部分。因此,除非唯一動畫化的部分是顏色,否則將底線建構為單獨的元素,而不是使用 text-decoration。

行動裝置上的輸入框尺寸為 16px

當輸入框的文字小於 16px 時,iOS Safari 會縮放整個頁面。有兩種修正方法可以將尺寸保持在 16px,但它們看起來不同,因此請詢問設計想要哪一種:

  • 在行動裝置上放大輸入框尺寸(text-base sm:text-sm)。這會改變其在小型螢幕上的外觀。
  • 保持 font-size: 16px 並使用 transform: scale() 渲染預期尺寸,同時補償寬度和 line-height。在每個視口中都相同,但需要維護更多程式碼。

兩種方法都記錄在 details-and-accessibility.md 中。

尺寸與對比下限

長篇內文從 16px(瀏覽器預設值)開始。只有在你能說出理由時才偏離它:字型偏小、行長較窄,或是產品是高密度的專業工具。

UI 文字可以更小。14px 是輸入框和選單的有用起點,13px 用於說明,很少低於 12px。輸入框在行動裝置上仍需要 16px。

當文字看起來對比度低時,使用 hr-better-colors 測量渲染的顏色組合,並使用 hr-better-accessibility 分類需求。除非被要求,否則不要更改顏色。

在根元素上設定字型平滑

在 macOS 上,文字渲染得比預期更粗。在根佈局上套用一次 -webkit-font-smoothing: antialiased 和 -moz-osx-font-smoothing: grayscale,永遠不要在每個元件上套用。Tailwind 的 antialiased 涵蓋了兩者。

語言與雙向行為

設定 lang,以便瀏覽器和輔助技術選擇正確的發音、引號和連字符。在文件層級或內容方向變更的邊界設定 dir。保留數字順序,並使用 <bdi> 來隔離混合方向的值。空間鏡像和邏輯 CSS 屬性屬於 hr-better-layout。

保持有用的文字可選取

預設情況下,保持文字可選取。::selection 可以將品牌帶入閱讀體驗,只要選取的顏色組合保持可讀。

user-select: none 屬於可拖曳或手勢驅動的介面,其中意外的選取會造成干擾。絕對不能應用於整個介面,也不能因為按鈕標籤可以被反白而使用。

完成前檢查清單

錯誤修正
合成的字體與設計不同載入真實字體;僅停用已驗證的合成模式
子標題在視覺上壓過父標題將該部分的層級對應到遞減的比例步驟
根據預設尺寸選擇標題元素先選擇語義,然後在 CSS 中設定尺寸
段落最後一行的孤立詞text-wrap: pretty
不對稱的兩行標題text-wrap: balance
介面中的分散對齊文字text-align: start;保留 justify 給特定的編輯佈局
底線穿過下伸部text-decoration-skip-ink: auto,from-font 度量
混合方向的值渲染順序錯誤修正 lang/dir;使用 <bdi> 隔離該值
整個應用程式框架的選取被停用恢復它;僅在與拖曳或手勢衝突時停用
沒有視覺提示的額外資訊提示透過 text-decoration-style: dotted 設定點狀底線
14px UI 文字使用細/輕字重18px 以下使用 400+ 字重;細字重僅適用於顯示用途
三行卡片描述使用 leading-none任何換行到 3 行以上的文字至少使用 1.4

報告

嚴重性。 HIGH 使文字無法閱讀或截斷內容且無法恢復。MEDIUM 破壞了字型系統或標題層級。LOW 是孤立的打磨問題。

驗證。 沒有瀏覽器:檢查每個標題層級的計算尺寸和字重,確認遞減;檢查宣告的行長和行高;對特定欄位的截斷規則,使用真實的字串長度測試。有瀏覽器:調整視窗大小以捕捉真實內容長度下的換行、孤立詞和截斷。報告你無法執行的每個檢查為 Not verified。

格式。 將發現結果按其違反的原則分組,按嚴重性排序,每個根本原因一行,並列出其出現的每個位置:

嚴重性位置之前之後原因

位置 是 path/to/file:line。原因 說明原則和使用者影響。

當有任何 HIGH 問題遺留時報告 Block,否則報告 Approve,並將剩餘問題留在表格中作為待辦事項。永遠不要 Approve 你未檢查的範圍。沒有可報告的內容時,陳述「沒有可操作的排版發現結果」並報告驗證。

Individual skills in this repo

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

相關技能