<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>博客 on Huanhe</title><link>https://huanhe.site/tags/%E5%8D%9A%E5%AE%A2/</link><description>Recent content in 博客 on Huanhe</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Sun, 25 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://huanhe.site/tags/%E5%8D%9A%E5%AE%A2/index.xml" rel="self" type="application/rss+xml"/><item><title>给博客换一张脸：薄暮花海、拉链小虫和一场安静的搬家</title><link>https://huanhe.site/p/site-makeover/</link><pubDate>Sun, 25 Oct 2026 00:00:00 +0000</pubDate><guid>https://huanhe.site/p/site-makeover/</guid><description>&lt;img src="https://huanhe.site/p/site-makeover/cover.webp" alt="Featured image of post 给博客换一张脸：薄暮花海、拉链小虫和一场安静的搬家" /&gt;&lt;p&gt;博客是从十月初开始陆陆续续改的，最近几天集中做了一次大翻新：从&amp;quot;主题默认皮&amp;quot;改成了现在这个样子。这篇不写教程，只记录一下&lt;strong&gt;改了什么、为什么这么改、踩了哪些坑&lt;/strong&gt;，顺便把藏在角落里的几个小彩蛋交代清楚。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-先定一个调子薄暮花海"&gt;🎨 先定一个调子：薄暮花海
&lt;/h2&gt;&lt;p&gt;一开始的想法很朴素——&amp;ldquo;背景好看点就行&amp;rdquo;。试了几版都不太对：纯色太素，照片平铺又太吵。最后定下来的方向叫「&lt;strong&gt;薄暮花海&lt;/strong&gt;」：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;薄暮&lt;/strong&gt;：深靛蓝 → 雾紫 → 雾粉的渐变夜空，叠一层缓慢漂移的柔光光斑&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;花海&lt;/strong&gt;：飘落的花瓣 / 叶片，以及首页那条&amp;quot;走到哪算哪&amp;quot;的花海进度&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关键原则是&lt;strong&gt;不额外请求任何图片&lt;/strong&gt;：渐变、光斑、花瓣全是 CSS 和 SVG 画的，首屏几乎零成本。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* 背景是两层伪元素：底层渐变 + 上层极光 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;before&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;linear-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;radial-gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;drift&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="kt"&gt;s&lt;/span&gt; &lt;span class="kc"&gt;ease-in-out&lt;/span&gt; &lt;span class="kc"&gt;infinite&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;配上玻璃拟态卡片（半透明 + &lt;code&gt;backdrop-filter&lt;/code&gt; + 细描边 + 柔和投影），标题换成衬线体（宋体系），正文保持黑体——文学感和可读性各退一步，刚好。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-导航从左侧栏搬到顶部胶囊"&gt;🧭 导航：从左侧栏搬到顶部胶囊
&lt;/h2&gt;&lt;p&gt;主题原本是左侧栏 + 右侧小部件。我把它换成了&lt;strong&gt;顶部胶囊导航&lt;/strong&gt;，两侧小部件全部收进导航和页脚。&lt;/p&gt;
&lt;p&gt;这里有个小细节：主题的 JS 依赖 &lt;code&gt;#toggle-menu&lt;/code&gt;、&lt;code&gt;#main-menu&lt;/code&gt;、&lt;code&gt;#dark-mode-toggle&lt;/code&gt; 这三个节点，覆盖布局时&lt;strong&gt;要把它们保留下来&lt;/strong&gt;，否则汉堡菜单和明暗切换会莫名其妙失效——这大概是改主题时最容易翻车的地方。&lt;/p&gt;
&lt;p&gt;首页做了全屏 Hero：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;照片直接当整页背景（&lt;code&gt;data-src&lt;/code&gt; 懒加载 + 预加载下一张）&lt;/li&gt;
&lt;li&gt;居中站名「huanhe」，配一行手写体&lt;/li&gt;
&lt;li&gt;语录&lt;strong&gt;逐字打出、逐字退格&lt;/strong&gt;，像打字机一样&lt;/li&gt;
&lt;li&gt;每次进首页&lt;strong&gt;随机&lt;/strong&gt;选一张照片、随机挑一条语录，所以刷新几次每次都不一样&lt;/li&gt;
&lt;li&gt;往下滚动，背景会&lt;strong&gt;渐进模糊&lt;/strong&gt;，把视线让给正文&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文章列表改成了 3 / 2 / 1 列的响应式网格，卡片高度自动对齐。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-季节主题春天和秋天不是一回事"&gt;🌸 季节主题：春天和秋天不是一回事
&lt;/h2&gt;&lt;p&gt;给整站做了一套&lt;strong&gt;季节配色&lt;/strong&gt;：按月份自动切换（3–5 春、6–8 夏、9–11 秋，其余冬），也支持用 &lt;code&gt;?season=spring&lt;/code&gt; 这样临时预览。&lt;/p&gt;
&lt;p&gt;做法是把颜色全部收进 CSS 变量，一处切换全站生效：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-season&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;spring&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;--season-accent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#d9558f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;--season-bg-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#2a1f3d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="err"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;data-season&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;autumn&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;--season-accent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#c4691f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;--season-bg-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;#2b1d2c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="err"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;飘落装饰也跟着季节换：&lt;strong&gt;春樱瓣 / 夏绿叶&lt;/strong&gt;是 SVG 剪影（同系三种颜色随机），&lt;strong&gt;秋枫叶 🍂 / 冬雪花 ❄️&lt;/strong&gt; 直接用 emoji。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这里有个我自己推翻的决定：一开始手机上&lt;strong&gt;直接关掉了&lt;/strong&gt;飘落效果，怕卡。后来在手机上刷自己博客，觉得少了点意思，就改成&amp;quot;&lt;strong&gt;少而小&lt;/strong&gt;&amp;quot;——桌面 34 片，手机 14 片、尺寸打八折，跨断点还会自动重建。&lt;/p&gt;
&lt;p&gt;另外手机浏览器的地址栏会收放，&lt;code&gt;100vh&lt;/code&gt; 并不可靠，所以高度用了 &lt;code&gt;vh&lt;/code&gt; 和 &lt;code&gt;dvh&lt;/code&gt; 双写，支持 &lt;code&gt;dvh&lt;/code&gt; 的浏览器自动用更准的那套。&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="-花海进度9---个地方"&gt;🗺 花海进度：9 / ∞ 个地方
&lt;/h2&gt;&lt;p&gt;首页有一张卡片，记录我走过的地方：临沂、图书馆、南大、海尔、幂律、洛阳、西安、北京、洛杉矶。&lt;/p&gt;
&lt;p&gt;数字不是写死的，来自 &lt;code&gt;data/places.yaml&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;临沂&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;note&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;家&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;article&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 有文章就填目录名，可以点击跳转&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;72&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;显示成「&lt;strong&gt;9 / ∞ 个地方&lt;/strong&gt;」——分母是无穷大，因为地方是走不完的。已点亮的地方在进度条上开出一朵朵小花，整条光带是流动的，永远走不到头，倒也挺符合&amp;quot;去看花海的路上&amp;quot;。&lt;/p&gt;
&lt;p&gt;花海&lt;strong&gt;专题页&lt;/strong&gt;现在是空的，只写了一行「待开发」。原因是我对两版自动生成的地图都不满意——这一页我想&lt;strong&gt;自己画&lt;/strong&gt;。地图画好之后，把 &lt;code&gt;places.yaml&lt;/code&gt; 里的坐标点上去就行。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-小彩蛋一条会漏虫子的拉链"&gt;🐛 小彩蛋：一条会漏虫子的拉链
&lt;/h2&gt;&lt;p&gt;导航框下方挂了一条&lt;strong&gt;拉链&lt;/strong&gt;和一个小挂件。左右拖动挂件，拉过的地方链齿会岔开，然后……&lt;strong&gt;漏出小虫子&lt;/strong&gt;（三只 Q 版小家伙随机一只，掉到屏幕底下就自己消失）。&lt;/p&gt;
&lt;p&gt;快速拖动的时候会有个坑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一版用&amp;quot;&lt;strong&gt;绝对位置&lt;/strong&gt;&amp;ldquo;记账——快拉时一次跳过一大段，中间那段既没漏虫、也永远不会再漏，表现就是&amp;quot;漏一半就停&amp;rdquo;&lt;/li&gt;
&lt;li&gt;而且滴漏是靠 &lt;code&gt;requestAnimationFrame&lt;/code&gt; 驱动的，在没有渲染帧的环境里干脆一动不动&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;后来改成了三个东西配合：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;按拉开距离记账&lt;/strong&gt;（每 26px 一只），快速大步拖动也不会漏掉距离&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;令牌桶限速&lt;/strong&gt;，突发有上限、持续有速率，性能可控&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定时器滴漏&lt;/strong&gt;，松手之后继续把这段拉链漏完&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 只留待漏距离，慢慢滴完
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;drainTick&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;refillTokens&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bugBalance&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;BUG_STEP&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;spawnBug&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;bugBalance&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="nx"&gt;BUG_STEP&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;scheduleDrain&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;顺手加了个互动：&lt;strong&gt;点一下虫子就能把它按掉&lt;/strong&gt;（冻结在当前下落位置 → 缩小淡出）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-手绘风贴纸标签和框格"&gt;🏷 手绘风：贴纸标签和框格
&lt;/h2&gt;&lt;p&gt;导航框下面粘了四个&amp;quot;贴纸&amp;quot;：GitHub、哔哩哔哩、邮箱、微信。手绘描边 + 每张略微倾斜，鼠标移上去会&amp;quot;扶正&amp;quot;一点。邮箱和微信&lt;strong&gt;点一下就是复制&lt;/strong&gt;，不用手动选中。&lt;/p&gt;
&lt;p&gt;配合的还有一套「手绘框格」样式：纸张质感底 + 不规则圆角 + 双层描边，用在评论区和一些卡片上，跟夜景渐变意外地搭。&lt;/p&gt;
&lt;p&gt;手机上这四个贴纸会挤，所以窄屏（≤560px）&lt;strong&gt;只留图标&lt;/strong&gt;，去掉文字标签就舒服了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-播放器从资源加载失败到自己的播放条"&gt;🎵 播放器：从&amp;quot;资源加载失败&amp;quot;到自己的播放条
&lt;/h2&gt;&lt;p&gt;原来用的是网易云的外链 &lt;strong&gt;iframe&lt;/strong&gt; 播放器，图省事。结果经常弹一句：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;资源加载失败&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;排查下来是第三方 iframe 在跨站环境里自己加载不了资源。于是干脆自己做了一个播放条，只借它的&lt;strong&gt;外链音频地址&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://music.163.com/song/media/outer/url?id=&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;song&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.mp3&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;现在的播放器：▶ / ⏸、&lt;strong&gt;进度条点哪跳哪&lt;/strong&gt;、上一首 / 下一首、播放时 ♪ 音符从按钮里跳出来；整页刷新会&lt;strong&gt;接着上次的位置播&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;歌单也不再写死了。构建时用脚本抓一次公开歌单，只保留&lt;strong&gt;真的能播&lt;/strong&gt;的歌：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;playable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;song_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;外链音频地址是否真的返回音频（VIP / 下架会跳到 404 页面）&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;audio&amp;#34;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ctype&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;VIP 歌曲匿名播不了，脚本会自动跳过——所以歌单里加 VIP 歌是看不到的，不是坏了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;踩到最深的坑&lt;/strong&gt;：&lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 里 Hugo 会自动把字符串渲染成合法的 JS 字面量，我多套了一层 &lt;code&gt;jsonify&lt;/code&gt;，结果歌曲 ID 变成了&lt;strong&gt;带引号&lt;/strong&gt;的字符串：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;请求地址：?id=%222724791369%22.mp3 ← 引号被转义进去了
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;网易返回：MEDIA_ELEMENT_ERROR: Format error
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;去掉那层 &lt;code&gt;jsonify&lt;/code&gt; 就好了。这个坑很隐蔽——页面看起来一切正常，只有播放器默默不响。&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3 id="切页面音乐不能断"&gt;切页面音乐不能断
&lt;/h3&gt;&lt;p&gt;旧方案还有个致命问题：点一下链接整页重载，播放器被销毁，音乐戛然而止。&lt;/p&gt;
&lt;p&gt;解决办法是把站内跳转改成 &lt;strong&gt;PJAX&lt;/strong&gt;：只替换内容区，&lt;strong&gt;导航（以及导航里的播放器）原地不动&lt;/strong&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;DOMParser&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;parseFromString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;text/html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;pjax-root&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 每页的样式靠 body 类名区分
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="nx"&gt;runScripts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// innerHTML 插入的脚本不会自动执行
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;&lt;/span&gt; &lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pushState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;pjax&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;换页后要顺手同步&lt;strong&gt;标题、body 类名、菜单高亮&lt;/strong&gt;，还要把新内容里的 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 重新执行一遍。&lt;/p&gt;
&lt;p&gt;⚠️ 代价是&lt;strong&gt;页面脚本必须幂等&lt;/strong&gt;：反复进出首页不能叠加定时器和监听器。我的处理是给首页脚本发一个 token，旧循环自己退出；花瓣层重建前先清掉旧的；&amp;ldquo;回到顶部&amp;quot;改成事件委托 + 只注册一次。要是哪个链接不想走 PJAX，加个 &lt;code&gt;data-no-pjax&lt;/code&gt; 就行。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-评论区和一点隐私"&gt;💬 评论区和一点隐私
&lt;/h2&gt;&lt;p&gt;评论用的是 &lt;strong&gt;giscus&lt;/strong&gt;（基于 GitHub Discussions），外面套了玻璃卡片和一句「留下一句话」的衬线标题。评论框的配色也自己托管了两套 CSS，跟着站点主题走，不再依赖第三方的默认皮肤。&lt;/p&gt;
&lt;p&gt;邮箱和微信号我做了个&lt;strong&gt;防爬&lt;/strong&gt;处理：不在源码里写明文，改成 Base64 存放，点击复制的那一刻才解码。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data-copy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;atob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* 兼容旧写法 */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;说白了这只能挡住&amp;quot;扫源码的笨爬虫&amp;rdquo;，防不了有心人——但聊胜于无，至少不会第二天就开始收垃圾邮件。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-性能把好看的代价压下去"&gt;⚡ 性能：把&amp;quot;好看&amp;quot;的代价压下去
&lt;/h2&gt;&lt;p&gt;动效和图片是最容易把首屏拖垮的两样东西，所以专门收拾了一轮：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;之前&lt;/th&gt;
&lt;th&gt;现在&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;首页照片&lt;/td&gt;
&lt;td&gt;JPG&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;WebP 1600×900&lt;/strong&gt;，体积小 54%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;角落里的吉祥物&lt;/td&gt;
&lt;td&gt;PNG 237KB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;WebP 17.8KB&lt;/strong&gt;（省 93%）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;首页 HTML&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;gzip 后约 &lt;strong&gt;12KB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;静态资源缓存&lt;/td&gt;
&lt;td&gt;默认&lt;/td&gt;
&lt;td&gt;图片 30 天、带 hash 的 JS/CSS 一年 &lt;code&gt;immutable&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;服务器传输&lt;/td&gt;
&lt;td&gt;默认&lt;/td&gt;
&lt;td&gt;开了 gzip（压缩级别 5，兼顾 CPU）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;另外所有动效只用 &lt;code&gt;transform&lt;/code&gt; 和 &lt;code&gt;opacity&lt;/code&gt;，并且尊重系统的「减少动态效果」设置——开了这个选项，动画会安静下来，只剩淡淡的状态切换。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-部署双击一下就完事"&gt;🚀 部署：双击一下就完事
&lt;/h2&gt;&lt;p&gt;部署链路是 &lt;strong&gt;push → GitHub Actions 构建 → rsync 同步到服务器&lt;/strong&gt;，本地只留一个 &lt;code&gt;publish.bat&lt;/code&gt;（add / commit / push），不用记命令。&lt;/p&gt;
&lt;p&gt;有个小机关：如果&lt;strong&gt;本地没有任何改动&lt;/strong&gt;，它会自动建一个空提交，用来&amp;quot;纯刷新&amp;quot;站点。因为歌单是构建时抓的，我在网易云加了歌，本地文件其实一个字节都没变——没有这个空提交，&lt;code&gt;git push&lt;/code&gt; 只会回一句 &lt;code&gt;Everything up-to-date&lt;/code&gt;，什么都不会发生。&lt;/p&gt;
&lt;p&gt;另外挂了个定时任务&lt;strong&gt;每 2 小时&lt;/strong&gt;重新构建一次，顺手把歌单刷新了，不想等就手动双击一次。&lt;/p&gt;
&lt;p&gt;服务器这边也在&lt;strong&gt;搬家&lt;/strong&gt;的路上（换机房，备案接入审核中）。搬家期间老机器继续服务，域名不解析到新机器——这是备案的硬规矩，急不得。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-写在最后"&gt;📝 写在最后
&lt;/h2&gt;&lt;p&gt;这一轮改下来最大的体会是：&lt;strong&gt;静态博客也能做出&amp;quot;活着&amp;quot;的感觉&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;不需要后端，光靠 CSS 变量、&lt;code&gt;transform&lt;/code&gt; 动画、一点点原生 JS，就能有四季、有随机、有能玩的拉链、有不间断的音乐。代价是每个动效都要想清楚&amp;quot;它在低端机上要花多少&amp;quot;，这也是我中途推翻好几个效果的原因——好看是加分项，卡顿是减分项，而后者的权重更高。&lt;/p&gt;
&lt;p&gt;接下来想做两件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;把&lt;strong&gt;花海地图&lt;/strong&gt;自己画出来，让那 9 个地方真正落在图上&lt;/li&gt;
&lt;li&gt;继续补细节：Hero 文字的对比度、分享卡片、响应式图片&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;改站如改人，慢慢来。&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;本站用的还是 &lt;strong&gt;Hugo + Theme Stack&lt;/strong&gt;，所有改动都在站点级覆盖里，没动主题源码——这样以后升级主题不会把这一堆自定义全冲掉。&lt;/p&gt;&lt;/blockquote&gt;</description></item></channel></rss>