AlibabaPuHuiTi-3-55-RegularL3.otf是sans-serif体,证明如下:
fc-match -s sans-serif:lang=zh | grep Alibaba
AlibabaPuHuiTi-3-55-RegularL3.otf: "Alibaba PuHuiTi 3.0" "55 Regular L3"
AlibabaPuHuiTi-3-55-RegularL3.otf也是serif体,证明如下:
fc-match -s serif:lang=zh | grep Alibaba
AlibabaPuHuiTi-3-55-Regular.otf: "Alibaba PuHuiTi 3.0" "55 Regular"
AlibabaPuHuiTi-3-55-RegularL3.otf: "Alibaba PuHuiTi 3.0" "55 Regular L3"
我就头大了,一个字体----AlibabaPuHuiTi-3-55-RegularL3.otf,可以同时具有serif和sans-serif,这两个不相容的性质吗?
没问题啊,只是你“认为”它们是不相容的,可在计算机看来他们都是字体,为什么只能用你不能用我?
而且字体本身并没有衬线、非衬线属性,这些是人为为了排版需求加的分组而已。
如果你学过前端,应该记得声明字体的最佳实践是英文字体在前而中文字体在后,想想看为什么?就明白计算机选择字体的逻辑了。
通常来说声明字体都是“分组”,而不是使用某一种具象化的字体,因为假如没有这种字体难道还不允许用户替代别的字体了?
比如声明中文字体、英文字体等等。中文字体本身也提供英文,难道中文字体不能渲染英文吗?这样你还认为他们是“不相容”的吗?
以你的场景为例,你想要使用“衬线字体”,或“非衬线字体”,这是一种分类而已,好比是你说“我要使用中文字体”,“我要使用英文字体”一样,并没有具体的某个字体名叫
sans-serif
或serif
,对吧?那么他们在计算器看来就相当于某个分类字体,意味着叫sans-serif
有一组候选字体,计算机从中挑选任意一个字体拿来用,这样理解没问题吧?再者说,难道衬线字体不能渲染非衬线字体吗?那么所有的字体都可能是这个分组下的字体,都可以进入候选名单,因此你要做的就是控制优先级,符合分组条件的字体靠前,不符合条件的靠后,仅此而已。
fc-match -s
是按照优先级列出匹配的字体,你只需要管你期望的字体是不是靠前就行了。比如你期望英文字体靠前,中文字体紧随其后,这样对于英文和中文都有不错的渲染效果。你要支持emoji,可能期望emoji字体更靠前,仅此而已。EDIT: 即使你期望使用某个具体的字体,你也会发现几乎所有的字体都在候选列表中:
但是注意优先级