PJL Blog 设计规范(Clay 主题)
本文档基于当前访客站实际使用的样式源码整理,设计令牌以 src/main/resources/static/css/var.css 为唯一来源。新增或修改页面样式时,应优先复用本文档中的变量与组件类名。
1. 设计风格
1.1 核心关键词
| 维度 |
描述 |
| 风格 |
Claymorphism(粘土拟态) |
| 气质 |
柔和、轻盈、略带童趣 |
| 视觉 |
大圆角 + 内外阴影 + 浅色渐变背景 |
| 主色倾向 |
紫色为品牌强调色,珊瑚色用于渐变点缀 |
1.2 设计原则
- 变量优先:颜色、圆角、间距一律使用
var(--clay-*) 或布局变量,禁止在页面 CSS 中硬编码色值。
- 阴影成套:每个表面色都有对应的
-shadow / -shadow-hover / -shadow-active 三态阴影。
- 对比清晰:深色文字
--clay-text-dark 用于标题,中等灰 --clay-text-medium 用于正文与辅助信息。
- 动效克制:过渡时长 0.2s–0.3s,悬停以
translateY + 阴影变化为主,避免剧烈缩放。
2. 色彩系统
2.1 背景色
| 变量 |
色值 |
用途 |
--clay-bg-primary |
#f5f5fa |
页面主背景(body) |
--clay-bg-secondary |
#eee8ff |
浅紫辅助底:代码块、边框替代、悬停浅底 |
--clay-bg-tertiary |
#eefbf5 |
浅绿辅助底(预留) |
2.2 表面色(组件填充)
| 变量 |
色值 |
推荐文字色 |
典型场景 |
--clay-surface-white |
#ffffff |
--clay-text-dark |
卡片、导航、按钮、页脚 |
--clay-surface-dark |
#2d3557 |
--clay-text-light |
深色按钮 / 卡片 |
--clay-surface-purple |
#d6a2ff |
--clay-text-light |
品牌强调色:链接、主按钮、Logo 点缀 |
--clay-surface-coral |
#f76d6d |
--clay-text-light |
渐变起点、装饰 blob |
--clay-surface-blue |
#62cdff |
--clay-text-light |
装饰 blob、彩色卡片 |
--clay-surface-green |
#7ae582 |
--clay-text-dark |
装饰 blob、彩色卡片 |
--clay-surface-peach |
#ffb347 |
--clay-text-dark |
装饰 blob、彩色卡片 |
--clay-surface-pink |
#ff9eb5 |
--clay-text-light |
装饰 blob、彩色卡片 |
--clay-surface-mint |
#a8e6cf |
--clay-text-dark |
装饰 blob、彩色卡片 |
2.3 文字色
| 变量 |
色值 |
用途 |
--clay-text-dark |
#2d3557 |
标题、主文字、导航品牌名 |
--clay-text-medium |
#555b7a |
正文段落、日期、摘要、次要说明 |
--clay-text-light |
#f1f1f1 |
深色 / 彩色表面上的文字 |
2.4 语义色映射(开发约定)
项目中已统一以下语义对应关系,新增样式请保持一致:
| 语义 |
使用变量 |
| 主文字 |
--clay-text-dark |
| 次要文字 |
--clay-text-medium |
| 强调 / 链接 / 主操作 |
--clay-surface-purple |
| 浅色表面 |
--clay-surface-white |
| 边框 / 分割线 |
--clay-bg-secondary |
| 代码块背景 |
--clay-bg-secondary |
| 轻阴影 |
--white-shadow |
| 中阴影 |
--white-shadow-hover |
| 紫色按钮悬停 |
--purple-shadow-hover |
2.5 渐变
| 场景 |
写法 |
| 标题强调文字 |
linear-gradient(135deg, var(--clay-surface-coral), var(--clay-surface-purple)) |
| 工具类 |
.gradient-text、.accent-clay(见 base.css / banner.css) |
2.6 装饰阴影(半透明)
| 变量 |
值 |
用途 |
--clay-shadow-purple |
rgba(170, 63, 254, 0.42) |
紫色光晕 |
--clay-shadow-coral |
rgba(247, 109, 109, 0.40) |
珊瑚光晕 |
--clay-shadow-blue |
rgba(98, 205, 255, 0.40) |
蓝色光晕 |
3. 阴影系统
每个表面色配套三组粘土阴影,通过外投影 + 内高光/内暗部模拟立体感。
| 表面 |
默认 |
悬停 |
按下 |
| 白色 |
--white-shadow |
--white-shadow-hover |
--white-shadow-active |
| 深色 |
--dark-shadow |
--dark-shadow-hover |
--dark-shadow-active |
| 紫色 |
--purple-shadow |
--purple-shadow-hover |
--purple-shadow-active |
| 珊瑚 |
--coral-shadow |
--coral-shadow-hover |
--coral-shadow-active |
| 蓝色 |
--blue-shadow |
--blue-shadow-hover |
--blue-shadow-active |
| 绿色 |
--green-shadow |
--green-shadow-hover |
--green-shadow-active |
| 桃色 |
--peach-shadow |
--peach-shadow-hover |
--peach-shadow-active |
| 粉色 |
--pink-shadow |
--pink-shadow-hover |
--pink-shadow-active |
| 薄荷 |
--mint-shadow |
--mint-shadow-hover |
--mint-shadow-active |
文章卡片 .post-card 使用独立的复合阴影(偏紫色调),悬停时阴影加深并 translateY(-5px) scale(1.01)。
4. 字体与排版
4.1 字体族
| 用途 |
字体 |
加载来源 |
| 正文 |
Nunito |
Google Fonts |
| 标题 h1–h4 |
Quicksand → Nunito 回退 |
Google Fonts |
| 品牌 / Hero |
Comfortaa → Quicksand 回退 |
Google Fonts |
| 代码 |
ui-monospace, SFMono-Regular, Menlo, Consolas, monospace |
系统字体 |
4.2 字号阶梯
| 元素 |
规则 |
body |
1rem,行高 1.65 |
h1 |
clamp(1.5rem, 4vw, 3rem) |
h2 |
clamp(1.25rem, 3vw, 2.5rem) |
h3 |
clamp(1rem, 2vw, 1.5rem) |
h4 |
clamp(0.875rem, 1.5vw, 1.25rem) |
| Hero 标题 |
clamp(3rem, 8vw, 6.5rem) |
| 导航品牌 |
1.25rem / 700 |
徽章 .clay-badge |
0.82rem / 700 |
4.3 文章正文(Markdown)
定义于 markdown.css:
- 行高
1.75,颜色 --clay-text-dark
- 链接色
--clay-surface-purple,带下划线
- 引用块左边框
--clay-bg-secondary
- 代码块背景
--clay-bg-secondary,圆角 --btn-radius
5. 布局与间距
5.1 布局变量
| 变量 |
值 |
用途 |
--header-height |
64px |
顶栏高度 |
--header-top |
20px |
顶栏距视口顶部 |
--section-max |
1060px |
内容区最大宽度 |
--card-radius |
32px |
大卡片圆角 |
--btn-radius |
12px |
按钮、小圆角元素 |
--gap |
16px |
标准间距 |
5.2 页面结构
┌─────────────────────────────────────┐
│ .nav(fixed, z-index: 101) │ ← top: 20px, max-width: 1060px
├─────────────────────────────────────┤
│ .bg-blobs(fixed, z-index: -1) │ ← 背景浮动色块
├─────────────────────────────────────┤
│ .site-main(max-width: 1060px) │ ← padding-top 补偿顶栏
│ 页面内容 │
├─────────────────────────────────────┤
│ .site-footer │
└─────────────────────────────────────┘
主内容区顶部内边距:
padding-top: calc(var(--header-height) + var(--header-top) + 20px);
5.3 响应式断点
| 断点 |
行为 |
≤ 640px |
导航切换为汉堡菜单 + 下拉面板 |
≤ 576px |
三列网格 .gird / .post-grid 变单列 |
6. 组件规范
6.1 按钮 .clay-btn
- 基础:
border-radius: var(--btn-radius),padding: 16px 36px
- 小尺寸:
.clay-btn.small → 8px 16px
- 悬停:
translateY(-3px) + 对应 -shadow-hover
- 变体:
--white --dark --blue --green --purple --peach --pink --mint --coral
6.2 卡片
| 类名 |
说明 |
.post-card |
文章列表卡片,白底大圆角,悬停上浮 |
.clay-card |
通用卡片容器,配合颜色类使用 |
.white .purple .coral … |
表面色 + 阴影,可加 [data-hover] 启用悬停动效 |
6.3 徽章 .clay-badge
- 全圆角胶囊:
border-radius: 999px
padding: 8px 20px,字重 700
6.4 导航 .nav
- 白色粘土顶栏:
.nav.white
- 毛玻璃:
backdrop-filter: blur(16px)
- 圆角
20px,内边距 0 16px
- Logo 点缀块
.logo-dot:紫色粘土方块 36×36,圆角 12px
- 链接悬停:
background: rgba(214, 162, 255, 0.15)
移动端(≤ 640px)
- 显示
.nav-toggle 汉堡按钮(44×44,白底粘土阴影)
- 菜单面板:固定定位白卡片,
box-shadow: var(--white-shadow-hover)
- 全屏遮罩
.nav-backdrop:rgba(45, 53, 87, 0.28),独立于 .nav 外渲染
- 打开时
body.is-nav-open { overflow: hidden }
6.5 背景装饰 .bg-blobs
五个模糊圆形色块(purple / coral / blue / mint / peach),filter: blur(80px),opacity: 0.35,缓慢浮动动画。
6.6 分页 .pagination
- 居中对齐,
padding: 2rem 0
- 禁用态
.pagination__btn--disabled:透明度 0.55
6.7 错误页 .error-page
- 错误码颜色:
--clay-surface-purple
- 主按钮:紫色底 +
--purple-shadow,悬停 --purple-shadow-hover
7. 动效与无障碍
7.1 过渡时长
| 场景 |
时长 |
| 按钮 / 导航 |
0.2s ease |
| 卡片悬停 |
0.3s ease |
| 菜单展开 |
0.25s ease |
7.2 动画
| 名称 |
文件 |
用途 |
fadeSlideDown |
banner.css |
导航入场 |
fadeSlideUp |
banner.css |
Hero 副标题 / CTA |
heroWordPop |
banner.css |
Hero 标题逐字弹出 |
blobFloat1/2/3 |
layout.css |
背景色块漂浮 |
shapeFloat |
banner.css |
Hero 装饰图形 |
7.3 无障碍
- 汉堡按钮:
aria-expanded、aria-controls、aria-label
- 菜单:
aria-hidden 随开关切换
- 键盘:
Escape 关闭菜单
prefers-reduced-motion: reduce 时禁用动画(见 layout.css)
8. 样式文件结构
static/css/
├── var.css # 设计令牌(唯一色板来源)
├── base.css # 重置、排版、按钮、卡片、工具类
├── header.css # 顶栏与移动端导航
├── layout.css # 背景 blob、减少动效
├── footer.css # 页脚
├── banner.css # Hero 区域
├── home.css # 首页文章网格与分页
├── post.css # 文章详情、回到顶部
├── markdown.css # 正文 Markdown 排版
├── error.css # 404 / 错误页
├── archives.css # 归档页
├── categories.css # 分类页
├── about.css # 关于页
└── index.css # 入口(import 公共样式)
各页面模板通过 layout:fragment="head-extra" 引入页面级 CSS。
9. 主题切换说明
| 项目 |
现状 |
| 脚本 |
static/js/theme.js 支持 light / dark 切换 |
| HTML 属性 |
document.documentElement[data-theme] |
| CSS 变量 |
当前仅定义明亮 Clay 主题,var.css 中尚无 [data-theme="dark"] 覆盖 |
| 代码高亮 |
文章页随 data-theme 切换 highlight.js 主题 |
若后续补齐暗黑模式,应在 var.css 中为 [data-theme="dark"] 增加对应变量覆盖,并同步更新本文档。
10. 开发检查清单
新增 UI 时逐项确认:
- [ ] 颜色来自
var.css 已有变量
- [ ] 圆角使用
--card-radius 或 --btn-radius
- [ ] 间距优先使用
--gap 或 1rem 倍数
- [ ] 可点击元素有
cursor: pointer 与悬停反馈
- [ ] 焦点态可见(如
outline: 2px solid var(--clay-surface-purple))
- [ ] 移动端在
640px / 576px 断点下检查布局
- [ ] 未引入已废弃的
--color-* / --shadow-* / --radius-* 变量
11. 色板速查
背景
primary #f5f5fa secondary #eee8ff tertiary #eefbf5
文字
dark #2d3557 medium #555b7a light #f1f1f1
强调 & 装饰
purple #d6a2ff ★ coral #f76d6d blue #62cdff
green #7ae582 peach #ffb347 pink #ff9eb5
mint #a8e6cf dark #2d3557 white #ffffff
布局
header 64px top 20px max-width 1060px
card-r 32px btn-r 12px gap 16px
文档版本:与 var.css 当前实现同步。修改色板时请同时更新 var.css 与本文档。