BackIcon2025 Blog Redesign

2024年11月28日

Openai logomark

Hamster1963

嗨👋!很久没和大家见面,临近年底,寒冷的空气和繁忙的工作大大降低了创作的欲望,但也是在这种氛围下,可以让我回过头去重新看看先前的项目。

于是这个月以来,陆陆续续把博客翻新了一下,如果说装修的过程是创造,那翻新的过程就是取舍,就让我介绍一下这个“翻新”的博客。

导航栏

CleanShot 2024-11-27 at 11.08.57@2x.png

第一眼注意到的应该是导航栏的重新设计。

在先前开源的博客框架 Nextme 中,导航栏放置在底部,采用图标加文字的方式呈现。

alt: 先前的导航栏

先前的导航栏

这种设计更偏向实用性,在切换页面的时候也有一个简单的过渡动画指示。

但在阅读文章时,尤其在移动端上,导航栏与路径栏的位置过于靠近,在屏幕上整体的视觉风格会让人比较有压力,也降低了阅读的体验。

IMG_4503-portrait.png

因此在翻新的过程中,采用了激进的的方式:

  1. 剔除导航栏中的文字,只保留图标
  2. 将导航栏的位置从底部移动至顶部
  3. 剔除不必要的模糊效果,采用渐变的方式来提高导航栏与内容的对比度。

于是便有了目前新版的导航栏,在新的导航栏下,阅读时不会再去干扰底部内容的可读性,同时更简洁的导航栏也为以后的新增页面预留了更多的空间。

IMG_4504-portrait.png

首页

欢迎动画

在翻新导航栏后,下一步则是添加了首页的欢迎效果。

在首次进入首页时,在顶部会出现一个类似彩虹聚光灯的效果,表示对来访的欢迎👏。

💡这个效果的灵感来自于 Vercel 部署成功后,顶部出现的彩虹条纹提示。

CleanShot 2024-11-27 at 11.36.11@2x.png

这种提示或者说庆祝效果,不侵入用户的页面内容,十分的自然美观。

在代码实现上,出现与消失效果通过 farmer-motion 控制,内部的颜色变换效果通过 css 实现。

'use client'

import { useStatus } from 'lib/status-context'
import { AnimatePresence, m } from 'framer-motion'

export default function AnimatedHeader() {
  const { status } = useStatus()

  return (
    <AnimatePresence>
      {status && (
        <m.div
          initial={{ opacity: 0 }}
          animate={{ opacity: 1 }}
          exit={{ opacity: 0 }}
          transition={{ duration: 0.8 }}
          className="pointer-events-none z-999 flex h-50 w-50 items-center justify-center"
        >
          <div className="fixed -top-52 right-0 left-0 flex h-[300px] items-center justify-center overflow-hidden blur-[80px] saturate-150">
            <div className="animate-orbit absolute h-[500px] w-[500px]">
              <div className="absolute top-[125px] left-[125px] w-[250px] rounded-full bg-sky-500 pb-[250px]"></div>
            </div>
            <div className="animate-orbit2 absolute h-[250px] w-[500px]">
              <div className="absolute top-[50px] left-[125px] w-[200px] rounded-full bg-fuchsia-500 pb-[200px]"></div>
            </div>
            <div className="animate-orbit3 absolute h-[500px] w-[500px]">
              <div className="absolute top-[250px] left-[150px] w-[150px] rounded-full bg-cyan-400 pb-[150px]"></div>
            </div>
            <div className="animate-orbit4 absolute h-[500px] w-[250px]">
              <div className="absolute top-[125px] left-[62.5px] w-[150px] rounded-full bg-green-400 pb-[150px]"></div>
            </div>
          </div>
        </m.div>
      )}
    </AnimatePresence>
  )
}

在 className 中使用了 animate-orbit 动画,其实就是一个简单的 spin 效果,在

tailwind.config.ts

中定义:

ray-so-export.png

从整体的角度看,就是四个圆形在变换位置,从而体现颜色渐变的效果。

最后将这个效果固定在顶部,只显示出底部的部分,就完成了这个欢迎动画效果。

歌曲切换

now-playing 组件在歌曲切换时也有了动画。

通过 farmer-motion ,使用

<AnimatePresence/>

<m.div/>

将封面与歌曲名称分别包裹起来,在切换时,通过修改 id 来触发切换动画效果。

ray-so-export-2.png

<AnimatePresence/>

中,通过设置

initial

false

来避免首次进入页面的触发动画。

同时,需要将

mode

设置为

“wait”

,避免退出未完成时就有新动画插入。

实时指针

在先前的文章中,介绍过博客站点中的实时指针:

博客里的实时指针

在这次翻新中,通过两个方面改进了用户体验:

  1. 指针外观
  2. 显示逻辑

在先前的版本中,采用较浅与低饱和度的颜色作为指针颜色,虽然观感不错,但与博客内使用的色彩并不搭配。

因此目前全部都采用了 Tailwind CSS 中定义的颜色,选用了较深的颜色以在浅色与暗色模式下都有着不错的观感。

同时,在指示器上增加一个内阴影与文字阴影,带来一些立体的效果。

CleanShot 2024-11-27 at 22.04.59@2x.png

在现实逻辑上也进行了优化,先前在全部的页面都会显示本地的指针指示器,而页面内是否有其他的在线用户实际上是不可知的。

因此,在翻新后的逻辑下,只有当前浏览页面存在着其他在线用户,指示器才会显示出来。

所以当你在某个页面发现鼠标旁出现了指示器,按下 / 与其他用户打个招呼吧👋。

悬浮操作栏

在翻新的过程中,最有意思的就是各式的悬浮操作栏了,先前已在更新提示中实现:

为站点增加更新提示

而现在的悬浮操作栏拓展到了评论的操作上:

相同的,动画由 farmer-motion 控制,通过定义初始与退出动画来实现悬浮工具栏效果。

ray-so-export-3.png

景深效果按钮

扁平的按钮看多了确实有些无趣,虽然简洁,但是缺少了一些灵动和有趣。

CleanShot 2024-11-27 at 22.45.10@2x.png

搭配内阴影与文字阴影皆可给按钮带来一些立体的感觉,当鼠标移至按钮上,仿佛真有按下的错觉。

CleanShot 2024-11-27 at 22.50.51@2x.png

在实现上,在 Tailwind CSS v3 版本中,并没有对应可用的类,但我们可通过自定义内阴影与直接定义样式来实现这两个样式,在 className 中,通过对 shadow 类进行自定义,在按钮文字上,直接传入文字阴影样式。

ray-so-export-4.png

新页面

本次翻新还带来了一个新页面,我称之为 Darkroom(暗室),用以展示一些博客数据与后端服务信息。

CleanShot 2024-11-27 at 22.56.42@2x.png

数据从 prometheus 中获取,通过 SSE 的方式实时流式传输到博客前端。

访客位置则是通过 cloudflare 传递的 Header 中获取。

ray-so-export (1).png

欢迎多来 Darkroom 转转,有许多来自世界不同地方进行访问站点的朋友😄。

性能

性能永远都十分重要,无论加入了多少新功能。

Webp

趁着翻新,将博客全部的图片都压缩更新为了 webp 格式,不仅可以大幅降低图片存储空间占用,也带来了更快的页面访问速度。

Next.js 15 + React 19

升级后采用 turbopack 进行本地的开发与调试,构建时采用了 React 编译器,带来了不错的开发性能与编译速度的提升。

Tailwind CSS v4 + inlineCss

借助 Tailwind CSS v4 带来的新编译引擎,开发中页面对于样式的修改更加迅速了。

CleanShot 2024-11-28 at 09.33.28@2x.png

同时,在

next.config.mjs

配置文件中,启用实验性特性

inlineCss

,可降低用户首次打开页面时 FCP(First Contentful Paint) 所需要的时间。

ray-so-export.png

性能监测

在经过这些优化处理并观察一段时间后,博客站点的性能保持在了不错的水平😄。

CleanShot 2024-11-28 at 09.39.49@2x.png

取舍

在这次的翻新中,为了更好的性能,取消了常驻的模糊效果,与一些页面的大范围动画效果,尽可能让动画融入到页面内容中,尽量不让用户明确感知到动画的存在。

虽然站点增加了一些笨重感,但长远来看,简洁的设计、充实的内容再加上一些小彩蛋,才让一个博客站点有其独特的意义。

感谢你的阅读,我们 2026 再见,装修还是翻新?那得取决于上班摸鱼的时间。