主题与布局
主题与布局
Vergil 的相册系统采用可扩展的主题架构——你可以使用内置主题,也可以自己动手制作新主题。
多主题系统
相册主题的核心是一个注册表机制。每个主题是一个独立的组件包,在注册表中登记后,相册 Markdown 文件的 theme 字段就能调用它。
目前内置的相册主题如下:
| 主题 | 风格 | 适用场景 |
|---|---|---|
| Golden | 深色背景 + 金色点缀 | 建筑摄影、黑白作品、商业摄影 |
| Seasons | 四季主题 + 背景视频 | 自然风光、旅行摄影、四季记录 |
主题系统本身没有限制。如果你会写 Astro 组件,完全可以制作自己的主题。下方有自定义主题的指南。
Golden 主题
Golden 主题采用深色背景配合金色强调色,营造出高端、沉稳的视觉氛围。
---
theme: 'golden'
background: '#0a0a0a'
accent: '#C8A464'
layout: 'grid'
photoFit: 'cover'
---
特点:
- 全屏视频 Hero + 金色调视觉
- 建筑/空间摄影风格
- 编号图片展示
- EXIF 信息栏
Seasons 主题
Seasons 主题专为四季摄影设计,支持季节过滤、诗歌卡片、时间控制台和粒子动画。
---
theme: 'seasons'
background: '#0d0d12'
accent: '#C8A464'
layout: 'grid'
seasonFilter: true
seasonDefault: 'summer'
---
特点:
- 四季背景视频
- Polaroid 风格卡片
- 季节过滤标签(春/夏/秋/冬)
- 诗歌卡片与时间控制台
- 季节粒子特效
季节过滤 (seasonFilter: true) 会在页面顶部显示季节切换标签。需要在 images 中为每张照片指定 season 字段:
images:
- src: '@img/albums/my-album/spring/cherry.jpg'
season: 'spring'
- src: '@img/albums/my-album/summer/beach.jpg'
season: 'summer'
布局方式
布局独立于主题,任何主题都可以搭配任意布局。
| 布局 | 说明 | 状态 |
|---|---|---|
grid | 规则网格排列 | 已实现 |
masonry | 瀑布流,高度自适应 | 尚未实现,当前渲染为 grid |
timeline | 按时间线排列 | 尚未实现,当前渲染为 grid |
carousel | 轮播图展示 | 尚未实现,当前渲染为 grid |
schema 接受这四个值,但样式层只实现了 grid。填另外三个值不会报错,data-layout 属性会正确输出,只是视觉上和 grid 没有区别。
Grid 布局
最常用的布局方式,照片以规则网格排列。
---
layout: 'grid'
photoFit: 'cover'
---
photoFit: 'cover'— 图片裁剪填满网格(默认)photoFit: 'contain'— 完整显示图片,可能有留白photoFit: 'auto'— 保持原始比例
Masonry 布局
瀑布流布局,适合竖图横图混合的照片集。
---
layout: 'masonry'
---
Timeline 布局
按时间顺序排列,适合有明确拍摄时间线的摄影项目。
---
layout: 'timeline'
---
Carousel 布局
轮播展示,适合少量精选照片的全屏展示。
---
layout: 'carousel'
---
自定义主题
如果你想制作自己的相册主题,只需三步:
1. 创建主题目录
src/components/album/themes/└── mytheme/ ← 你的主题名 ├── index.astro ← 主题入口组件(必须) ├── MyHero.astro ← 可选:Hero 区域 ├── MyGallery.astro ← 可选:画廊区域 └── ... ← 其他子组件2. 实现入口组件
index.astro 是主题的入口,接收统一的 Props:
---interface Props { title: string; description?: string; images: Array<{ src: string; alt?: string; caption?: string; featured?: boolean; exif?: Record<string, string>; }>; layout?: string; photoFit?: string; background?: string; accent?: string; // ... 其他相册字段} const { title, description, images, layout, photoFit } = Astro.props;--- <div class="mytheme-wrapper"> <h1>{title}</h1> <p>{description}</p> <div class="gallery"> {images.map(img => ( <img src={img.src} alt={img.alt} /> ))} </div></div> <style> .mytheme-wrapper { /* 你的主题样式 */ }</style>3. 注册到主题系统
打开 src/components/album/themes/index.ts,把你的主题加入注册表:
import GoldenTheme from './golden/index.astro';import SeasonsTheme from './seasons/index.astro';import MyTheme from './mytheme/index.astro'; // ← 新增 export const ALBUM_THEMES: Record<string, any> = { golden: GoldenTheme, seasons: SeasonsTheme, mytheme: MyTheme, // ← 注册};注册完成后,在相册 Markdown 中通过 theme: 'mytheme' 即可使用。
制作主题时,可以参考 golden/ 和 seasons/ 的源码,它们展示了两种截然不同的设计思路。Golden 偏向极简和排版,Seasons 偏向交互和动效。找到适合你作品风格的方向,比堆砌功能更重要。