CSS揭秘笔记5-字体排版

Author Avatar
KING Jun 15, 2016 Jun 15, 2016 UPDATED

连字符断行

设计师迷恋文本的两端对齐效果。看一眼杂志和书籍中的精美排版,就会发现这种效果无处不在。不过在网页中,两端对齐却极少使用,而且越是有经验的设计师就越少使用。从 CSS 1 开始就已经有 text-align:justify; 了。

在对文本进行两端对齐处理时,需要调整单词的间距,此时会出现“单词孤岛”现象。这个结果不仅看起来很糟糕,而且损伤了可读性。在打印媒介中,两端对齐总是与连字符断行相辅相成的。因为连字符允许单词在音节分界处断开并折行,所以在处理对齐时所需要调整的间距就少得多了,文本看起来也自然很多。

以前,有一些在网页上实现连字符断行的方法,但这类方法完全是“伤敌八百,自损一千”。常见的方法包括服务器端预处理、JavaScript 后期处理、用在线生成器单独处理,甚至还有开发者耐着性子在单词中纯手工插入软连字符( ­ ),以便浏览器可以在正确的地方断开单词。

CSS 文本(第三版)引入了一个新的属性 hyphens 。它接受三个值:none 、 manual 和 auto 。 manual 是它的初始值,其行为正好对应了现有的工作方式:我们可以在任何时候手工插入软连字符,来实现断词折行的效果。 hyphens: none; 会禁用这种行为;

通过 auto属性,CSS 就可以产生想要的效果:hyphens: auto;

当然,为了确保它奏效,需要在 HTML 标签的 lang 属性中指定合适的语言。

如果需要更细粒度地控制连字符的行为(比如在简短的引文中),仍然可以通过一些软连字符( ­ )来辅助浏览器进行断词。这个 hyphens属性会优先处理它们,然后再去计算其他可以断词的地方。

CSS 连字符可以非常平稳地退化。如果 hyphens 属性不被支持,得到的文本对齐效果就是图1的程度。这个效果确实算不上好看,也算不上特别易读,但它的可访问性还是完美可靠的。

文本折行的工作原理是怎样的?
与计算机科学中的很多事情类似,文本折行听起来简单易行,但实际上并非如此。这方面的算法有很多,最流行的方案主要是贪婪算法和 Knuth-Plass 算法。贪婪算法的工作原理是每次分析一行,把尽可能多的单词(当连字符可用时则以音节为单位)填充进该行;当遇到第一个装不下的单词或音节时,就移至下一行继续处理。

Knuth-Plass 算法(得名于开发它的工程师)的工作方式就要高级很多。它会把整段文本纳入考虑的范畴,从而产生出美学上更令人愉悦的结果,但其计算性能要明显差一些。绝大多数桌面文字处理程序采用 Knuth-Plass 算法。不过出于性能考虑,浏览器目前采用的是贪婪算法,因此它们的两端对齐效果往往不尽如人意。