社交媒体

把夜色做成一个可以阅读的网站

把夜色做成一个可以阅读的网站

从气氛词开始

最初的设计文档里没有组件清单,只有几组词:月光、山脊、纸张、远灯、呼吸感。我不急着把它们变成某种具体风格,而是先问自己,如果一个网站真的拥有这些气质,阅读时会发生什么。

答案并不是更多装饰。月亮不需要出现在每个角落,山峰也不必成为按钮轮廓。真正重要的是节奏:首屏给标题留出足够空间,文章行宽适合长时间阅读,卡片之间有能让目光停顿的距离,图片在夜色里保持自己的明暗。

于是页面从一组接近墨色的背景开始。它们并非同一个黑,而是依靠微弱的亮度差建立前后关系。正文使用温和浅色,青绿色只在链接、焦点和主要操作中出现,像夜路上偶尔照到石面的冷光。

内容决定页面形状

我不希望首页只是文章列表。一个长期维护的个人站还会有照片、短记录、关于页面和来自友邻的更新,它们应当拥有不同密度。文章卡需要标题与摘要,瞬间适合沿时间线展开,图库更依赖影像本身,友链则不仅是徽标集合,还应提醒人每个链接背后都有持续写作的站点。

这也是为什么我先准备真实长度的内容,再调整主题。只有标题真的长短不一、摘要有两三行、文章里同时出现二级标题、图片和代码时,才能看出布局是否可靠。用整齐的占位文字做出的页面,常常会在真实内容进入后立刻失衡。

归档页保持简单,让年份和文章自然排列;分类与标签承担不同工作,前者代表相对稳定的主题,后者允许一次具体兴趣穿过多篇文章。关于页既是独立内容,也能把摘要带回首页,让首次访问的人知道这里为什么存在。

长文需要安静的辅助

文章页加入目录和阅读进度,并不是为了把阅读变成完成度游戏。目录帮助读者理解结构,也方便在技术长文中返回某一节;进度条只提供方向感,不显示预计还要花多少分钟。阅读速度属于读者,不应该被页面催促。

移动端的目录不能长期占据狭窄屏幕,因此收进可打开的面板;键盘焦点必须能看见,关闭后也要回到原来的按钮。动画则遵循系统的减少动态效果设置。很多细节平时不会被注意,但它们决定一个页面是否真的尊重不同使用方式。

“继续阅读”只推荐少量相关内容,不做无限滚动。我希望每篇文章有清楚的结尾。读完以后,读者可以选择继续,也可以关掉页面,让刚才的内容停留一会儿。

让影像保持呼吸

图库采用响应式影像墙,但我不想把所有照片裁成同样比例。横幅、竖幅和接近方形的照片应该共同保留,页面通过间距而不是强制裁切维持秩序。进入详情后,可以查看标题、说明和 EXIF,也可以前往相邻照片,让一次观看有明确路径。

EXIF 是技术信息,不是作品价值的证明。焦距和快门能够帮助理解拍摄条件,却不能替代图片本身。因此它被放在次要位置,需要时才阅读。更重要的是准确的替代文本:它不必写成文学说明,而应让无法看到图片的人知道画面里有什么。

瞬间则更轻。它可以只有一句话,也能附带图片、视频、音频或文章链接。长文章保存完整思考,瞬间保留尚未展开的触感,两者互相补充,而不是互相竞争。

技术应该退到内容背后

主题基于 Halo 的内容模型和模板系统,前端资源由 Vite 构建。对使用者而言,这些技术不应该成为浏览网站的前提。没有 JavaScript 时,文章仍然可以阅读,分页仍然有服务端链接;增强功能加载失败时,也不应让正文一起消失。

Playground 是一个例外,因为运行代码本身需要脚本和外部沙箱。但即便如此,文章中的源码仍应以结构化、可读的形式保存。只有读者主动运行时,示例代码和依赖才会交给第三方运行环境。功能越强,越需要清楚说明边界。

主题也不重复制造插件已有的数据。图库、瞬间和友链分别由对应插件管理,山月记只负责把它们放进一致的阅读环境。这样内容不会被锁在某一套视觉里,主题也能专注于展示。

一个可以继续生长的容器

设计完成并不是所有页面都不会再变化。真实网站会不断出现新情况:一篇特别长的标题、一组没有 EXIF 的旧照片、一个暂时无法访问的友链、一段在小屏幕上需要横向滚动的代码。主题真正的稳定,不是把变化挡在外面,而是为变化保留余地。

我把山月记理解成一个容器。它有明确气质,却不要求每篇内容都谈论月亮和山;它偏爱夜色,却仍应容纳白昼、雪地和明亮的屏幕;它重视文字,也给图片、声音与可运行代码留下位置。

如果访问者先注意到文章,过一会儿才意识到页面本身很安静,那么这个设计大概已经完成了它的工作。