CSS 對標點擠壓的支持目前處於什麼狀態,有哪些技術難點,有何替代方案?

我查了一下,似乎在 2012 01 19 的 CSS 3 Text 草案中,text-spacing 屬性被推遲至 CSS Text Level 4。

我想問一下:

一、目前 CSS Text Level 4 對標點擠壓的討論進展如何?

二、為什麼拖了這麼久也沒能實現?可以看到,牽涉到屬性名稱也是反覆改動,從最初的 punctuation-trim 到 text-trim 到最後的 text-spacing。技術難點在什麼地方?

三、在 CSS Text Level 4 之前,有何替代方案?能否通過 Web Font 加連字的方案,手工將所有需要擠壓的可能場景提前處理?

還有一個問題,在現有草稿中,Closing + Opening 的情況下,並沒有擠壓任何標點空格,這是出於什麼考慮?感覺這樣很不美觀,比如說「:「」,空格會特別大。


漢字標準格式(Han.css)支援連續標點擠壓、行首/行尾標點擠壓等功能 [1][2]。目前預設不處理「冒號-開引號」的樣式,但只要使用CSS加入相應的規則即可。如圖,左右的灰線表示文字容器邊界,

這個實作引入「字級、詞組選擇器」的概念,使用findAndReplaceDOMText庫 [3],並非一般的字串替換,對跨節點的連續標點也能完善地處理,比如:

&&《書名》&、「文字」、&『重點』&。&

顯示為:

解釋一下實作原理,

  1. 先將所有的連續標點(二個以上)包裹在h-char-group元素節點中
  2. 再單獨包裹所有的標點在h-char元素中,按其種類加入相應屬性
  3. 以CSS的letter-spacing、margin-left屬性,將所有可被擠壓的標點縮減為半個漢字大小
  4. 單獨按標點屬性在其前方或後方加入半個漢字大小的空格(必須為U+0020),使標點恢復原有的(一個漢字)大小
  5. 以CSS隱藏連續標點之間的空格

註:以上所有處理不得破壞標點本身的「行內」特性,比如不可以使用「display: inline-block」來設置元素的寬高,以便最大程度地保留瀏覽器本身的避頭尾禁則及文字對齊處理。

如此一來,標點在行間時,仍正常顯示為一個漢字的大小、連續標點間的多餘空間會隱藏;若標點剛好位在行首或行尾,其前後的空白空間會因「空格塌陷」[4] 的特性被「擠壓」掉。利用了這個原理,漢字標準格式也實作了「行尾點號懸掛」的功能 [5]。

使用漢字標準格式提供的標點字體Biaodian Pro Sans、Biaodian Pro Serif會有較佳的效果。

最重要的是,這些功能毋需判斷標點在行間的位置,而是賦予標點「可以被擠壓」「可以被懸掛」的特性,如此一來,視窗或容器寬度改變時仍可以實時渲染效果,不必監聽事件,更可以在server-side完成腳本渲染。

CC BY 3.0

[1]: http://css.hanzi.co/manual/hang_de_zucheng#biaodian_jiya

[2]: http://ethantw.github.io/Han/latest/jiya.html

[3]: https://github.com/padolsey/findAndReplaceDOMText

[4]: http://www.w3.org/TR/css3-text/#white-space-rules

[5]: http://ethantw.github.io/Han/latest/hanging.html


題主說的連字擠壓的方法,我做過一個類似的,用的是 Kerning : Mojikumi

比較粗糙,主要是實驗下效果,純展示頁面用用問題應該不大。做完後的一些記錄: Mojikumi - Houkanshan"s Blog


text-spacing 屬性在早期規範叫 text-autospace,後來 『text-trim』 和 『text-autospace』 合併為 『text-spacing』。

IE5.5 開始就支持了早期規範的 text-autospace 屬性。 CSS Text Level 3-ms-text-autospace property (Internet Explorer),只不過可能實現上還不夠讓人滿意。

在排版上,微軟才是業界良心。

目前 CSS Text L4 基本上處於在開發的階段,屬性名稱曾經歷過大的變動。況且中文排版,很多東西尚未定論。

從瀏覽器當前的利益角度來看,實現一個布局模塊遠比實現一個文字模塊要來的直接。比如:CSS Flex L1,實現了我能更好的適配不同尺寸的移動設備。

從用戶的角度來看,Web 頁面是一種「快速消費品」,普通用戶根本不會察覺你的標點是否擠壓,甚至也不會去懷疑中文標點在行首有何不妥。

那些精美的雜誌布局(CSS region)尚未成為主流,而且在移動小屏幕上發揮不了優勢,頗為尷尬。

所以技術上並不是主要的難點,幾個瀏覽器廠商說白了現在是競爭對手的關係,如果這個技術真的能吸引用戶,他們會去推動和實現的。


可以通過 letter-spacing 就能實現標點擠壓

弄了一個實現 Letter-spacing 實現標點擠壓 , 選擇方面還是有點問題的。


推薦閱讀:

Typography 翻譯為「字體排印」是否恰當?是否有更好的翻譯?
很多人都說日本的字體好,好在哪?
奢侈品牌 Prada 的商品吊牌為什麼會出現諸多文字排印紕漏的情況?
如何強制wordpress中所有中文字體設置為雅黑,英文字體可在設置中修改?
字體分類方法有那些?

TAG:前端開發 | CSS | 字體排印 | CSS3 |