1476 字
7 分钟
– 次浏览
– 位访客
读完那篇「跳出舒适区」,我把侧栏折了起来
AI 摘要
正在生成摘要…

前阵子读到威言威语的一篇博客:《十九年后,我第一次跳出自己的舒适区》。

作者自述自己写博客超过十九年,博客主题换过不少,但回头一看,清一色都是双栏布局——侧边栏、分类、标签、最新评论、归档,一个不少,规规矩矩。他突然意识到,这并不是什么设计底线,是一种待了十九年的舒适区。

这次改版,他第一次认真做了个单栏主题。问自己的问题是:

如果没有侧边栏,会怎么样?如果整个页面只剩下文章,它还能不能成立?如果把功能放到第二位,把阅读放到第一位,又会是什么样?

回到我的fuwari博客,看着我的侧栏,折腾了这么久确实还是老样子---左边一整条常驻,正文被挤在右边一窄条里。我自己写东西的时候,明明最该被看见的是文章,结果视觉重心全在左侧那一堆模块上。

于是在这篇博客的影响下,我开始准备对我的博客布局动个小手术。

第一步:让侧栏默认折叠#

原布局是 grid-cols-[17.5rem_auto],左边 17.5rem(280px)的侧栏常驻,正文占剩下的 auto。

我的目标很简单:打开文章页,侧栏默认折叠,正文吃满 --page-width(1168px);想看的,自己点开。

为此在 MainGridLayout.astro 里加了一个状态机,由 <html data-sidebar> 这一个属性统一驱动:

  • collapsed:第一列收成 0px,卡片吃满整宽,侧栏淡出隐藏(默认)
  • expanded:用户手动展开
  • off:本页不适用(首页 / 归档 / 关于),保持原双栏
@media (min-width: 1024px) {
html[data-sidebar="collapsed"] #main-grid {
grid-template-columns: 0px auto;
column-gap: 0;
}
html[data-sidebar="collapsed"] #sidebar {
visibility: hidden;
opacity: 0;
pointer-events: none;
}
}

值得注意的是:

  1. 偏好记忆:展开/折叠状态存 sessionStorage,一次展开,本会话内翻其他文章不再弹回折叠。
  2. 移动端不参与:<1024px 本就是单列堆叠,折叠逻辑只在大屏生效,死按钮不会出现。
  3. 开关是一个贴在正文左缘外侧空白区的小箭头,半透明,hover 才实。展开后箭头转 180° 提示”点我收起”。

第二步:收窄阅读列#

刚开始实现折叠效果时,正文一下吃到 1168px。量宽太宽了——大约 73 个汉字一行,读起来眼睛要横向扫很长的距离。

经过一顿折腾,终于找到的最合适的比例----只把卡片内部的文字列收 800px 并居中,卡片外缘纹丝不动:

如果你觉得更窄一点更好看,那就改一个数字就行:46rem ≈ 46 汉字/行,42rem ≈ 42 汉字/行。

:root { --read-width: 50rem; } /* 50rem = 800px */
html[data-sidebar="collapsed"] #post-container {
padding-left: max(1.5rem, calc((100% - var(--read-width)) / 2));
padding-right: max(1.5rem, calc((100% - var(--read-width)) / 2));
}

padding 的百分比基准是包含块宽度(= 正文列宽),所以 (100% − 800px) / 2 正好把富余宽度左右平分。折叠 / 展开切换时,正文量宽恒为 800px,只是整列左右滑动,不突兀。

收尾:博客永远不会真正完成#

威言威语在文末写:

双栏也好,单栏也好,其实都只是表现形式。真正没有变的,还是我写博客的初衷。……一个博客最大的乐趣,大概就是它永远没有真正完成的时候。

这轮折腾的起点,是别人一篇写了十九年的博客;终点,是我自己屏幕上更安静的一栏文字。

侧栏折起来之后,首页、归档、关于那些”功能型”页面该双栏还双栏——减法不是为减而减,是让文章页把注意力还给文章。至于阅读列定在 800 还是 750,过阵子读到什么、自己读着顺不顺,大概还会再调。

毕竟,和十九年比,我才刚上路。

后续:折叠与沉浸合并成了一条三档光谱#

写这篇之后,博客上又加过一版「沉浸阅读」——点一下把导航、banner、侧栏、页脚全隐去,正文更窄,目录变成常驻侧栏。

两套东西摆在一起之后,重复就变得很明显了:它们做的其实是同一件事,只是深度不同,却各有一个开关、各有一套状态,连 CSS 都要互相抢特异性。于是收成了一条轴上的三档,由 html[data-sidebar] 一个属性驱动:

档收掉什么正文量宽
展开什么都不收(双栏)卡内 800px
折叠(默认)只收侧栏,导航与 banner 都在800px
沉浸导航 / banner / 侧栏 / 页脚全隐736px

一个按钮循环切换,顺序是「展开 → 折叠 → 沉浸 → 展开」,按钮上悬停会提示下一档是什么。

有两点和本文正文写的已经不一样了:

  1. 第一节里那个「贴在正文左缘外侧空白区的小箭头」已经删掉了。 它的职责被工具栏那一枚阅读模式按钮完全覆盖,而少一个按钮本身就是减法。
  2. 量宽并成了一条链。 当初说「想更窄一点就改一个数字」,现在依旧成立,而且只改一个地方——两档都读同一个 --read-width,沉浸档只是把它覆盖成 --immersive-width(46rem)。

至于本文留下的那套折叠 CSS(html[data-sidebar="collapsed"] #main-grid / #post-container 那两段),一个字都没改,现在还是线上跑着的那份。

相关阅读#

AI 参与程度
润色
完全
不使用
读完那篇「跳出舒适区」,我把侧栏折了起来
https://blog.142588.xyz/posts/collapsible-sidebar/
作者
Watch Your Back
发布于
2026-09-13
许可协议
CC BY-NC-SA 4.0

评论

加载中…