我对博客字体的要求是希望能使用思源宋体,实际配置中发现还需要让正文行内的代码部分字体减小的效果。这篇博客记录了我在配置字体的时候学到的一些机制以及踩到的坑。
字体配置是如何生效的
就我的理解,Hexo可以帮助把我的博客静态化,产生一系列html,我的字体配置会体现在html中,具体是:
- 在html的
<head>
中,通过超链接方式对于字体的引用。
1 | <!-- 这个链接和在google fonts里选中字体,Embed模式里给的链接一样--> |
- 有了上面的
stylesheet
,在CSS里就可以使用font-family: Noto Serif SC;
去使用字体了。具体的,从Chrome Developer Tools可以看到:
1 | // 这里的字体顺序可以对后续字体变量的描述加以验证 |
字体变量是如何定义的
这里分为两个层面,一个是底层的字体变量定义,另一个是Next模板配置文件_config.yml
中提供的对字体变量覆盖的选项。
字体变量的定义_base.styl
在source/css/_variables/base.styl
里有关于字体变量的定义,主要关注一下字体:
1 | // Font families. |
因为字体有Fallback机制,会按照定义的顺序尝试使用字体,如果不可用会换到下一个,从这段关于字体变量的定义不难发现,$font-family-base
的第一个选项是get_font_family('global')
,也就是在主题配置文件里设置的global字体,然后才是第一行定义的$font-family-chinese
,而下面的logo、headings、posts则都是以base为基础,如果在主题配置文件里定义了相关的则覆盖。$font-family-monospace
又加了几项备用的等线字体。
Next主题配置文件_config.yml
Next主题的配置文件_config.yml
里有一段关于字体配置的选项:
1 | font: |
就像上一节讲的,这里填写相应的字体会作为最优先使用的字体,这边的缺点是这个配置文件里不能在一项里面配置多个字体。
字体获取
字体可以在Google Fonts 挑选,填入_config.yml
里面相应类型的family
字段即可。
看别的文章讲fonts.googleapis.com
的稳定性问题,这些文章一般会建议使用fonts.loli.net
,这次看到这篇帖子前端 CDNJS 库及 Google Fonts、Ajax 和 Gravatar 国内加速服务,才知道原来是后者反代了前者。
1 | font: |
正确地修改字体样式
以上的配置只能配置字体、设置字体大小,如果要进一步修改字体样式:如定制code类型的字体大小,就需要自定义样式。新版本的Next自定义样式不再使用next/source/css/_custom/custom.styl
,而是用了更通用的,放在hexo的source
目录下的方式。
首先在_config.yml
里面启用相应想要自定义的部分:
1 | custom_file_path: |
但是这个自定义样式的方式不能覆盖变量默认定义的值,只能先注释掉变量默认的定义,然后在自定义变量里面定义。
在styles.styl
里可以对一些样式进行更改(更通用地),比如我迫切需要的正文中的<code>
部分字体减小。
减小正文中<code>
的字体大小
默认配置下,正文中的<code>
部分和正文字体大小是一样的(之前用的老版本不是这样),视觉效果很差,我想把这部分的字体减小为正文字体的一定百分比。
一番寻找之后,找到的是定义代码框中字体大小的$table-font-size = $font-size-small;
,但这条设置只能控制代码框里面的字体,不能控制正文中的<code>
部分,找了挺久没有找到相关的设置,因此只能自定义。在source/_data/styles.styl
写:
1 | code { |
这样就可以达到想要的效果了。
踩的坑
一些教程太老了,可能一方面是当时的Next版本对各种配置的支持性没有现在好,然后另一方面也是因为一开始自己对这些配置并不了解,逐渐踩坑逐渐理解了这些。
因为我一开始只是想使用思源宋体,看的教程Google Fonts 已支持思源宋体!,他的做法是自己从google fonts上获取了Embed的链接,然后放到next/layout/_partials/head/external-fonts.swig
里面(也没写怎么去加载这个.swig),相当于是自己强行在html的head里又贴了一段<link rel="stylesheet"
。
并且,当时的Next版本自定义格式使用的是next/source/css/_custom/custom.styl
,我在v7.8.0用这种方式发现不生效,查了一下改了自定义的机制,新机制确实更合理了。