使用text-autospace为中英文混排自动添加空格
目前,主流浏览器Chrome/Edge(140+)、Firefox(147+)、Safari(18.4+)都开始支持 text-autospace: normal 属性,使用它为中英文混排自动添加空格,效果比pangu.js要好。
1. pangu.js的问题
很早的时候,我其实就是使用pangu.js自动添加空格。但是它有两个问题:
其一,由于要加载js文件,因此整个页面在刚开始加载的时候是没有空格的.然后等加载完pangu.js之后,空格才被加上,这样整个页面就会有一个明显的「布局抖动」。
其二,pangu.js会把整个页面里加上空格,包括侧边栏和页脚。而这些地方空间本来就小,加上空格时候地方就更不够了。而且遇到连续的数字和文字混杂在一起的时候,空格太多也不好看。
这些问题当然也有解决方法。
第一个问题可以通过使用hexo-pangu插件在生成html文件的时候就把空格加上。
第二个问题我最初是通过魔改pangu.js解决的,把不想添加空格的部分用<nopangu></nopangu>包起来,然后识别这个标签不加空格。
最新的NexT主题也注意到了这个问题,v8.24之后的版本只对<main>部分加空格,算是部分解决了这个问题。
不过后来我慢慢习惯在输入的时候就手动添加空格,就不再使用pangu.js了。
2. 使用text-autospace: normal
从caniuse可以看到,最新的浏览器基本上支持了text-autospace: normal属性:
关于Firefox浏览器的说明
text-autospace 特性在143版本时被加入,但是没有实际启用。
实测在144版本可以手动启用:
在aboud:config页面中,将layout.css.text-autospace.enable选项改为true,即可启用这个功能。
使用方法也很简单。在source/_data/style.styl里添加:
1 | body { |
即可。
从效果来看,使用text-autospace: normal的效果要优于pangu.js,主要表现有两点:
其一,text-autospace添加的空格是1/8em的宽度,会显得紧凑一些,特别是前面提到的连续的数字混排的情况,看上去明显更自然。
其二,之前pangu.js会在一些不应该加空格的地方加空格。比如会在「定理-1」中间加空格变成「定理 -1」,就显得非常难看。text-autospace目前还没发现这类问题。
仔细看了一下MDN文档,text-autospace: normal只启用了ideograph-alpha和ideograph-numeric,没有启用punctuation,即只在CJK字符和字母、数字之间添加间距,不在标点符号周围添加间距,因此就没有上面第二个问题。
本文在所有地方都没有手动加空格,可以看一下效果。