1322 字
7 分钟
关于本主题的一些改动
前言:
作为非专业人士,我修改博客主题时常因不知如何提问、怕改代码出错而搁置对默认设置(如偏爱深色而非白色背景)的调整,又因喜欢这款主题风格,故记录修改细节以备日后重新部署参考,避免重复迷茫
改动定位
主题色
- 浅色
- 深色✅
打开‘src/constants/constants.ts’文件,找到export const LIGHT_MODE = "light",在3-4行添加 DARK_MODE = "dark";
export const PAGE_SIZE = 8;
export const LIGHT_MODE = "light", DARK_MODE = "dark";手机端头像隐藏
打开‘src/components/widget/Profile.astro’文件,找到<div class="card-base p-3">在17行添加hidden md:block
<div class="card-base p-3">
<div class="card-base p-3 hidden md:block">游戏库
打开‘src/data/’新建一个文件,命名为‘games.ts’ 作为游戏页面
---// 游戏库数据配置export type GameItem = { title: string; playTime: number; lastPlayed: string; achievements: number; totalAchievements: number; cover: string; link: string;};
const localGameList: GameItem[] = [ { title: "斗地主", // 游戏名称 playTime: 66.72, // 小时 lastPlayed: "2016-04-19", // 最后一次游玩时间 achievements: 60, // 已完成的成就数 totalAchievements: 100, // 总成就数 cover: "/assets/desktop-banner/warf.webp", // 游戏封面图片路径 link: "https://store.steampowered.com/app/550/Left_4_Dead_2/", // 游戏Steam页面链接 }, { title: "反恐精英2", playTime: 1, lastPlayed: "2024-03-10", achievements: 1, totalAchievements: 100, cover: "", link: "https://store.steampowered.com/app/730/CounterStrike_2/", },];
export default localGameList;打开‘src/pages/’新建一个文件,命名为‘games.astro’ 作为游戏库数据配置
---import ImageWrapper from "../components/misc/ImageWrapper.astro";import { sidebarLayoutConfig, siteConfig } from "../config";import localGameList from "../data/games";import I18nKey from "../i18n/i18nKey";import { i18n } from "../i18n/translation";import MainGridLayout from "../layouts/MainGridLayout.astro";
// 检查游戏库页面是否启用if (!siteConfig.featurePages.games) { return Astro.redirect("/404/");}
// 检查是否为双侧边栏模式const isBothSidebarMode = sidebarLayoutConfig.position === "both";
// 确保localGameList不是undefinedconst gameList = localGameList || [];
// 计算统计数据const stats = { total: gameList.length, totalPlayTime: gameList.reduce((sum, game) => sum + game.playTime, 0), avgAchievements: (() => { const totalAchievements = gameList.reduce( (sum, game) => sum + game.achievements, 0, ); const totalPossible = gameList.reduce( (sum, game) => sum + game.totalAchievements, 0, ); if (totalPossible === 0) return "0.0"; return ((totalAchievements / totalPossible) * 100).toFixed(1); })(),};---
<MainGridLayout title="游戏库" description="我的游戏收藏"> <div class="flex w-full rounded-[var(--radius-large)] overflow-hidden relative min-h-32"> <div class="card-base z-10 px-9 py-6 relative w-full"> <!-- 页面标题 --> <div class="relative w-full mb-8"> <div class="mb-6"> <h1 class="text-4xl font-bold text-black/90 dark:text-white/90 mb-2 relative before:w-1 before:h-8 before:rounded-md before:bg-[var(--primary)] before:absolute before:top-1/2 before:-translate-y-1/2 before:-left-4"> 游戏库 </h1> <p class="text-black/75 dark:text-white/75">我的游戏收藏与游玩记录</p> </div> </div>
<!-- 统计数据 --> <div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-8"> <div class="bg-[var(--card-bg)] border border-[var(--line-divider)] rounded-[var(--radius-large)] p-4"> <div class="text-2xl font-bold text-black/90 dark:text-white/90">{stats.total}</div> <div class="text-sm text-black/60 dark:text-white/60">游戏总数</div> </div> <div class="bg-[var(--card-bg)] border border-[var(--line-divider)] rounded-[var(--radius-large)] p-4"> <div class="text-2xl font-bold text-black/90 dark:text-white/90">{stats.totalPlayTime.toFixed(1)}</div> <div class="text-sm text-black/60 dark:text-white/60">总游玩时间(小时)</div> </div> <div class="bg-[var(--card-bg)] border border-[var(--line-divider)] rounded-[var(--radius-large)] p-4"> <div class="text-2xl font-bold text-black/90 dark:text-white/90">{stats.avgAchievements}%</div> <div class="text-sm text-black/60 dark:text-white/60">平均成就完成率</div> </div> </div>
<!-- 游戏列表 --> <div class="mb-8"> {gameList.length > 0 ? ( <div id="game-list-container" class={`game-grid-container grid gap-4 md:gap-6 list-mode ${isBothSidebarMode ? "both-sidebar" : "single-sidebar"}`}> {gameList.map(game => { const achievementPercent = game.totalAchievements > 0 ? (game.achievements / game.totalAchievements) * 100 : 0;
return ( <div class="group relative bg-[var(--card-bg)] border border-[var(--line-divider)] rounded-[var(--radius-large)] overflow-hidden transition-all duration-300 hover:shadow-lg hover:scale-[1.02]"> <!-- 封面区域 --> <div class="relative aspect-video overflow-hidden bg-gray-200 dark:bg-gray-800"> <a href={game.link} target="_blank" rel="noopener noreferrer" class="block w-full h-full"> {game.cover ? ( <ImageWrapper src={game.cover} alt={game.title} class="w-full h-full object-cover transition-transform duration-300 group-hover:scale-110" /> ) : ( <div class="w-full h-full flex items-center justify-center"> <svg class="w-16 h-16 text-gray-400" fill="currentColor" viewBox="0 0 24 24"> <path d="M21 6H3v12h18V6zm-1 10H4V8h16v8z"/> </svg> </div> )}
</a> </div>
<!-- 内容区域 --> <div class="p-4"> <h3 class="text-lg font-bold text-black/90 dark:text-white/90 mb-2 line-clamp-1">{game.title}</h3>
<!-- 游玩时间 --> <div class="flex justify-between items-center mb-2"> <span class="text-sm text-black/60 dark:text-white/60">游玩时间</span> <span class="text-sm font-medium text-black/90 dark:text-white/90">{game.playTime} 小时</span> </div>
<!-- 最后游玩 --> <div class="flex justify-between items-center mb-2"> <span class="text-sm text-black/60 dark:text-white/60">最后游玩</span> <span class="text-sm font-medium text-black/90 dark:text-white/90">{game.lastPlayed}</span> </div>
<!-- 成就进度 --> <div class="mb-1"> <div class="flex justify-between items-center mb-1"> <span class="text-sm text-black/60 dark:text-white/60">成就</span> <span class="text-sm font-medium text-black/90 dark:text-white/90">{game.achievements}/{game.totalAchievements}</span> </div> <div class="w-full bg-gray-200 dark:bg-gray-700 rounded-full h-1.5"> <div class="bg-gradient-to-r from-blue-400 to-purple-500 h-1.5 rounded-full transition-all duration-300" style={`width: ${achievementPercent}%`}></div> </div> <div class="text-xs text-black/50 dark:text-white/50 text-right mt-1">{achievementPercent.toFixed(1)}%</div> </div> </div> </div> ); })} </div> ) : ( <div class="text-center py-12"> <div class="text-5xl mb-4">😢</div> <h3 class="text-xl font-medium text-black/80 dark:text-white/80 mb-2"> 游戏库为空 </h3> <p class="text-black/60 dark:text-white/60"> 还没有添加任何游戏到收藏库 </p> </div> )} </div> </div> </div>
<!-- 游戏列表布局样式 --> <style> /* 容器查询支持 */ .card-base { container-type: inline-size; }
/* 游戏网格容器 - 使用容器查询实现响应式列数 */ .game-grid-container { /* 基础配置 - 移动端 */ display: grid; grid-template-columns: repeat(2, 1fr); transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1); }
/* 单侧栏模式 */ .game-grid-container.single-sidebar { @container (min-width: 900px) { grid-template-columns: repeat(4, 1fr); }
@container (min-width: 600px) and (max-width: 899px) { grid-template-columns: repeat(3, 1fr); }
@container (max-width: 599px) { grid-template-columns: repeat(2, 1fr); } }
/* 双侧栏模式 */ .game-grid-container.both-sidebar { @container (min-width: 950px) { grid-template-columns: repeat(3, 1fr); }
@container (min-width: 650px) and (max-width: 949px) { grid-template-columns: repeat(2, 1fr); }
@container (max-width: 649px) { grid-template-columns: repeat(2, 1fr); } } </style></MainGridLayout>打开‘src/config.ts'打开config.ts文件,找到'export const config'
export const config = { featurePages: { anime: true, // 番剧页面开关 diary: true, // 日记页面开关 friends: true, // 友链页面开关 projects: true, // 项目页面开关 skills: true, // 技能页面开关 timeline: true, // 时间线页面开关 albums: true, // 相册页面开关 devices: true, // 设备页面开关 games: true, // 游戏库页面开关
},}打开 ‘src/config.ts’找到'export const navBarConfig: NavBarConfig'菜单栏配置
export const navBarConfig: NavBarConfig = { links: [ LinkPreset.Home, LinkPreset.Archive, // 支持自定义导航栏链接,并且支持多级菜单,3.1版本新加 { name: "Links", url: "/links/", icon: "material-symbols:link", children: [ { name: "GitHub", url: "https://github.com/matsuzaka-yuki/Mizuki", external: true, icon: "fa6-brands:github", }, { name: "Bilibili", url: "https://space.bilibili.com/14516536?spm_id_from=333.1007.0.0", external: true, icon: "fa6-brands:bilibili", }, { name: "游戏库", url: "/games/", icon: "material-symbols:sports-esports", },音乐播放器收起
默认是关闭❌
我设置了收起,打开 ‘src/components/widget/MusicPlayer.svelte’文件,找到'isHidden'变量,将false设置为true即可
// 播放器是否隐藏,默认为 falselet isHidden = false;
// 播放器是否隐藏,默认为 true(默认显示小圆球)let isHidden = true;部分信息可能已经过时