📢 新文章推送 · 每周更新优质内容 · 订阅更新 →
向下滚动
游戏娱乐

游戏前台功能实现 - Hugo 主题数据驱动页面

AI 智能总结

概述

Lumin 博客在 娱乐 菜单下新增了 游戏 子页面,以卡片网格形式展示玩过和正在玩的游戏,支持状态筛选、评分配色、平台标签、暗黑模式等交互特性。本文详解前台实现的完整技术方案。

架构设计

1hugo.toml                    → 菜单注册(娱乐 → 游戏,weight=9)
2content/games/_index.md      → 页面元数据(type=games, layout=games)
3data/games.toml              → 游戏数据源(games 数组)
4layouts/games/list.html      → 列表模板(带内联 CSS)
5layouts/games/single.html    → 单页模板(评论容器)

采用 Hugo 的 Data Template 模式:通过 hugo.Data.games.games 读取 data/games.toml 中的结构化数组,在模板中直接遍历渲染,无需创建单独的 Markdown 页面。

与文章分类隔离

游戏展示页路由为 /games/,与已有文章分类 /game/ 使用不同 slug,避免 URL 冲突。数据存储于 data/games.toml,与文章目录 content/game/ 完全独立。

数据模型

 1[[games]]
 2title       = "艾尔登法环"     # 游戏名称
 3status      = "playing"       # playing | completed | planned | onhold
 4rating      = 9.5             # 评分 0-10
 5platform    = "PC"            # 平台
 6developer   = "FromSoftware"  # 开发商
 7publisher   = "Bandai Namco"  # 发行商
 8releaseYear = 2022            # 发行年份
 9genre       = ["动作RPG"]      # 类型标签数组
10desc        = "..."           # 简介
11cover       = "/images/..."   # 封面图片路径
12links       = [{name, url}]   # 相关链接

模板实现要点

内联 CSS 渲染策略

与电影、图书页面一致,所有样式直接写在 <style> 标签内,随 HTML 一起输出。这样做的好处是无需修改主题 CSS 文件,页面样式完全自包含,加载即渲染。

响应式网格布局

1.game-grid { grid-template-columns: repeat(2, 1fr) }           /* 手机 */
2@media (min-width: 600px)  { grid-template-columns: repeat(2, 1fr) }  /* 小平板 */
3@media (min-width: 900px)  { grid-template-columns: repeat(3, 1fr) }  /* 大平板 */
4@media (min-width: 1200px) { grid-template-columns: repeat(4, 1fr) }  /* 桌面 */

专为游戏封面优化的 aspect-ratio: 3/4,比标准 16:9 更接近游戏包装盒比例,视觉效果与电影/图书页面的 2:3 海报比例形成统一的设计语言。

双视觉层

每个卡片包含两个信息层级:

静态层(始终可见):

  • 游戏封面图片
  • 状态角标(在玩/已通关/想玩/搁置,按状态分配颜色)
  • 评分星星角标
  • 游戏标题、平台、类型

悬停信息层(hover 展开):

  • 半透明遮罩渐变背景
  • 游戏名称、类型、开发商、发行商、平台、年份
  • 游戏简介文字
  • 可滚动的内容区域(overflow-y: auto
1.gcw-info {
2  transform: translateY(100%);
3  transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
4}
5.gc:hover .gcw-info { transform: translateY(0); }

筛选器交互

纯 JavaScript 实现的客户端状态筛选,无需服务端请求:

1<button class="game-filter-tag active" data-status="all">全部 (4)</button>
2<button class="game-filter-tag" data-status="playing">在玩 (1)</button>
3<button class="game-filter-tag" data-status="completed">已通关 (3)</button>

点击筛选按钮后遍历 .gc 卡片,通过 data-status 属性匹配显示/隐藏。

废弃 API 迁移

使用 Hugo v0.156+ 推荐的现代语法:

  • .Site.Data.gameshugo.Data.games
  • 消除构建时的 deprecated 警告

暗黑模式适配

通过 [data-theme="dark"] 选择器覆盖所有关键样式:

  • 卡片背景 → rgba(30, 41, 59, 0.9)
  • 页面头部 → 深紫色渐变 #3b0764 → #6b21a8
  • 筛选按钮、链接按钮 → 暗色半透明背景
  • 文字颜色 → #f1f5f9 / #94a3b8

评论区集成

页面底部集成 Twikoo 评论系统,通过 Hugo 的 partial "comments.html" 模板引入。评论区容器使用 max-width: 1480px 与游戏卡片网格同宽,保持视觉一致性。

1{{ if and .Site.Params.comments.enable (ne .Params.comments false) }}
2<div class="game-comments-section">
3  <h3 class="comments-title"><i class="fas fa-comment-dots"></i> 留言评论</h3>
4  {{ partial "comments.html" . }}
5</div>
6{{ end }}

前端涉及的文件

文件作用
hugo.toml菜单注册、icon 配置
content/games/_index.md页面元数据、comments 开关
data/games.toml游戏数据源
themes/.../layouts/games/list.html列表展示模板(含 CSS + JS)
themes/.../layouts/games/single.html单页评论容器

关键收获

  1. Hugo Data Template是展示型数据页的最佳载体——零 Markdown 开销,纯数据驱动
  2. 内联 CSS 模式保持页面自给自足,适合主题化定制场景
  3. 渐进增强 的悬停效果在不支持 hover 的移动端自动降级为静态卡片
  4. Hugo v0.156+hugo.Data 替代 .Site.Data 是未来兼容性的必要迁移
版权声明

本文作者 Lumin

本文链接 https://www.zhengquan.xyz/game/game-frontend-implementation/

许可协议 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

请作者喝杯咖啡 ☕

  • 微信打赏
    微信支付
  • 支付宝打赏
    支付宝
点击按钮查看打赏二维码
🎁 推荐工具
试试这些实用在线工具,提升工作效率
前往工具集 →

留言评论

期待你的想法

评论加载中