新栏目《999 个小技巧,让你 Vibe 的产品更有质感》 ✨ 007 让你的文字排版更顺眼(以中英文为例) 不论是英文,还是中文,都需要解决对齐、长度不均,避头尾问题。你可以通过一些简单的 CSS 来进行处理—— 更重要的是,在做 i18n 的时候,让 Agent 结合网页布局选择合适的文本。避免一个词居于两行,也避免过多的空隙。 001–007 都在主页,关注我,每天一个让产品更有质感的小技巧 Prompt 如下,可以直接抄 ⬇️ ``` Polish the typography in my product with a set of CSS switches. Change only how text wraps, spaces, aligns and truncates. No copy, font, colour or layout changes beyond what each rule says. ## 0. Start from what exists - Put the rules in the global text styles (base CSS, typography tokens, Tailwind config or shared text components) so every page inherits them. Add per-component rules only where a component overrides the base. - Every rule below is progressive enhancement: browsers that don't know a property ignore it. Add no polyfills. - Scope the Chinese rules with :lang(zh) and make sure lang is set on <html> or on the element, so English text keeps its own rules. ## 1. Headings break into even lines - On h1-h3, card titles and hero lines: text-wrap: balance; - Lines come out about the same length, so a heading never ends on one lonely word. Short text only: Chrome balances up to 6 lines. ## 2. No lone word at the end of a paragraph - On paragraphs, descriptions and list items: text-wrap: pretty; - Also keep pairs that must not split together with a non-breaking space (&nbsp;): an em dash and the name after it, a number and its unit. ## 3. Numbers that change keep their width - On anything that updates in place or sits in a column (counters, prices, timers, stats, table cells): font-variant-numeric: tabular-nums; - The font must have tabular figures (the tnum feature); check that the width actually stops changing. Leave running text proportional. ## 4. Button labels stay on one line - On buttons and other labels in flex rows: white-space: nowrap; - (flex-shrink: 0 works too.) A crowded row must not squeeze a label onto two lines. ## 5. Long text truncates instead of spilling out - A flex item will not shrink below its content, so text inside it can't truncate. On the flex item: min-width: 0; - And on the text itself: overflow: hidden; white-space: nowrap; text-overflow: ellipsis; - When the text really is cut (scrollWidth > clientWidth), show the full text on hover in a tooltip. ## 6. Chinese body text: justified, on a whole number of characters - On Chinese paragraphs only: text-align: justify; - Set the measure to a whole number of characters (for example max-width: 26em at the paragraph's font size), so a justified line only stretches to absorb Latin words and squeezed punctuation. - Not for narrow columns (under about 15 characters), short text, captions, buttons or mostly-English text: the gaps get uneven. ## 7. Space between Chinese and Latin text or numbers - On Chinese text: text-autospace: normal; - The browser adds a thin gap between Han characters and Latin letters or digits. Don't also hand-type spaces in copy or translation files. Skip code, inputs and monospaced text. ## 8. No half-width gap before an opening bracket at a line start - On Chinese UI text without a first-line indent: text-spacing-trim: trim-start; - An opening 「 “ ( at the start of a line drops its blank half and lines up with the text above. Long-form text with a two-character indent should use space-first instead. Chrome only for now. ## 9. Chinese headings break between words - Chinese has no spaces, so a heading can split a word across lines. Mark the break points between words with BudouX (its Simplified or Traditional Chinese model) as <wbr>, at build time for static copy or at render time for dynamic copy, then: word-break: keep-all; overflow-wrap: anywhere; text-wrap: balance; - Never use keep-all on Chinese without break points: the heading becomes one unbreakable word. Don't use Intl.Segmenter for this (it splits common words wrongly), and don't apply it to body text. ## 10. Line-start and line-end rules (避头尾) - Browsers already keep punctuation off the start of a line and squeeze line-end punctuation. Don't rebuild this. - Find and remove line-break: anywhere used to stop overflow: it turns these rules off. Use overflow-wrap: anywhere instead. - Text drawn on canvas or SVG, or wrapped by hand in JS, gets none of this: apply the rules there yourself. ## 11. When done - List every file and selector you changed. - List every line-break: anywhere and word-break: break-all you removed or kept, and why. - Show before and after on my own pages: a wrapped heading, a paragraph ending, a changing number, a truncated label and a mixed Chinese-English paragraph. ```
Desal

💻SheNicest CIO

好直观的设计教程 与优雅文字对应 最上川
登录并发表评论

评论 · 0