Onion主题开发

开发日志

2024-11-10

本篇博客将重点放在更加感性化的关于Onion主题开发过程的回忆和记录上。对于hexo-onion的使用说明等技术性内容,我会简洁的写在其github仓库的README文件内。

写在前面

说实话,此刻我的心情是很激动的。此次开发的这个主题不仅是我真正意义上完成的第一个开发项目,更是我高中(准确地说,高二搭建这个博客)以来的宿愿。高中时苦于技术不足(虽然现在依然不足)和缺少时间,一直只能将这个愿望高高挂起。如今步入大学,我想是时候着手满足一下高中时期的缺憾了,于是Onion主题便应运而生。

首先,我要向一些人或物表示感谢,他们的协助对我的开发过程至关重要。

  • GitHub,一切的源头和支撑。
  • ChatGPT4o,它教会了我使用jQuery,还完美地帮我写了不少代码。
  • Bootstrap5,它的设计风格很符合我的审美,丰富的样式库更是令人惊喜。
  • hexo的许多插件的开发者们,好用的插件赋能便利的功能实现,大大提升开发效率。
  • 所有我阅读的关于自主开发hexo主题的教程文章的作者。尤其是这一系列文章的作者smile-yan,没有他的文章,Onion主题就不会起步。
  • 我的电脑。伟大无需多言。

我十分敬佩能够完成系列教程文章的作者们,他们的努力是极富意义的。

设计理念

Onion主题是一款极简风格、响应式的hexo主题。

主题的设计理念是使创作者能够专注于创作(不需要考虑除了普通Markdown格式之外的任何格式问题),并且使读者能够专注于文章内容,尽可能获得舒适的阅读体验。

主题支持更强大的Markdown渲染,本地搜索等功能[1],并内置了一些实用的脚本功能,比如目录提取与聚焦、返回顶部等。

Onion主题的样式基于Bootstrap5框架,这使得我几乎没有自己编写任何一个css文件。我很喜欢Bootstrap5的设计风格,简洁而优雅,用起来也很方便。

不幸的是,使用Bootstrap5的方式是在元素内部指定class内容,这导致我难以为hexo根据内容渲染的网页内容指定样式。因此,我不得不采取网页脚本的方式为特定元素分配属性,我决定使用jQuery实现这一功能,因此为了正常使用本主题,请务必保证您的前端环境支持jQuery。

功能介绍

这部分更加详细的内容会放在介绍文档里。简单地说,除了一般的阅读功能外,我为Onion主题内置了如下功能:

  • 本地搜索
  • 代码高亮
  • LaTeX数学公式渲染
  • fancybox图片显示
  • 按首字母排序的归档
  • 自动目录提取
  • 返回顶部按钮
  • i18n国际化支持

为了保证这些功能的正常运行,需要进行一些的插件的安装或者库的引用,具体方法在github仓库中给出。

开发思路

聊一聊我在部分内容开发时的思路,以及一些未竟的想法。有一种幕后花絮的感觉……

导航栏和页脚

这部分参考了Bootstrap5官网给出的模板,加之小小个性化修改即成。只是单纯的懒

主页

灵感同样来自于官网模板,借鉴了卡片样式,自主添加了文章封面图展示功能。

信息栏(页面侧边栏)

受到之前使用的Icarus主题的启发,我设计了挂件式的侧边信息展示栏。根据实际页面的不同,它会显示作者信息、文章封面图及摘要或者目录等,并且总是显示站点的分类和标签。我为各个挂件添加了对应的链接功能,方便阅读者实现站内快速跳转。

基本上,用于描述个人信息的文本我都进行了封装,使得Onion主题的使用者能够通过改编主题目录下的配置文件来修改显示信息。

文章页

标题显眼地放在最上方,右侧设计了信息框展示文章分类和发布时间(由于个人写作习惯,Onion主题被设计为适配单层文章分类,即一篇文章至多一个分类,但可以有多个标签)。标题栏下部展示了文章标签,若文章无标签则展示为占位框。

文章主内容框占据主要地位。为了整体美观,Onion主题会将md源文件中的h1、h2标题统一渲染为h3标题并添加下边框,其余标题渲染为h5。侧边栏自动提取文章目录的脚本会统一处理渲染后的h3标题而忽略h5标题。

我为Markdown文件中的大部分格式添加了对应的样式,相应的效果可以在本站的md测试文章里看到.比较值得一提的是Onion主题支持LaTeX渲染(需要加装插件)。

代码高亮基于highlight.js,支持指定语言显示。

我希望实现的效果是在保证创作过程的方便的基础上,尽量使得一切常用的md格式都可以美观且较为符合风格地显示。Onion主题的设计理念是赋能创作者无须在markdown文件里另外写任何除了元数据和普通md格式之外的格式内容,一切美化渲染的工作交给主题完成。我使用的是Typora编辑器,这意味着我只要保证文章在本地渲染正常,它在网页也会是显示正常的。

归档页

基于hexo插件的按首字母分类的归档功能。为什么不使用常用按年份归档而改为按首字母?一方面是由于首页文章已经按照发布时间排序了,另一方面我不认为按时间分类就效率而言比按标题分类更加有效率。对于想要查找文章的读者而言,按标题查找显然比按时间查找更为可行。

侧边弹出栏

提供了一个存放更多功能的接口,唯一的问题是我目前还没有足够多的功能放进去,因此,它现在仅仅是一个模板。可以在配置文件中选择关闭这个组件。

进一步美化

依据之前的经验,还可以为博客网站添加许多所谓的美化功能,比如随机动漫背景图,背景漂浮的线条或者雪花,鼠标点击事件,等等等等。我在两年前建站伊始十分沉迷于这一类小玩意的配置,然而在阅读其他类似的博客网的过程中,我意识到过于多的美化效果其实反而不利于聚焦阅读,这与Onion主题的设计理念背道而驰。因此,我不会在主题中内置任何花里胡哨的效果。当然,或许在后续的开发中我会单独为网站加一些美化效果,但是它们将会是独立的插件,不会与Onion主题合并。

我想要单独提的一点是看板娘。在建站初期我很魔怔地想要实现一个完美的看板娘,因此碰了不少钉子(详见我合并整理的2022年更新日志)。我承认我目前并没有完全地从魔怔的状态中走出来,因此可能未来我会为网站添加一个可爱的妹子。不过,出于前述的原因,她也不会与Onion主题有什么关系。

日后我可能会增加评论功能支持、更加复杂的文章标记和分类系统等等。总的来说,一切以加强创作和阅读体验为重。

总结

碍于本人水平有限,Onion主题的功能远谈不上强大。如果读者愿意尝试为自己的博客使用Onion主题并反馈意见[2],我将感到十分荣幸。

出于学习交流的目的,我欢迎任何人对Onion主题的修改和增强。

最后,希望Onion主题能越来越好。


  1. [1]部分功能需要安装插件,详见github仓库 ↩︎
  2. [2]在首页可以找到我的邮箱 ↩︎