📢 新文章推送 · 每周更新优质内容 · 订阅更新 →
向下滚动
开发编程

博客侧边栏模块化设计与配置

AI 智能总结

设计目标

侧边栏是博客中信息密度最高的区域之一。一个好的侧边栏设计需要满足:

  1. 模块化:每个功能组件独立封装,可插拔
  2. 可排序:管理员可自由调整模块的显示顺序
  3. 可配置:每个模块拥有独立的参数配置
  4. 一致性:所有模块共享统一的视觉风格

架构设计

配置驱动

hugo.toml 中通过 widgets 数组定义侧边栏:

 1[[params.widgets]]
 2  type = "profile"
 3  width = "full"
 4
 5[[params.widgets]]
 6  type = "announcement"
 7  width = "full"
 8
 9[[params.widgets]]
10  type = "categories"
11  width = "full"
12  params = { limit = 8, depth = 1 }
13
14[[params.widgets]]
15  type = "tags"
16  width = "full"
17  params = { limit = 20, paginate = true }
18
19[[params.widgets]]
20  type = "statistics"
21  width = "full"

数组的顺序即侧边栏的显示顺序,新增和删除只需在数组中增删条目。

模块类型与参数

模块type可配置参数
个人资料profileavatar, bg, socials, description
站点公告announcementtitle, content, link
IP 访客visitor-
日历calendar-
倒计时countdownmain, additions
最新文章recentPostslimit
最新评论newestCommentslimit
分类导航categorieslimit, depth
标签云tagslimit, paginate
打赏rewardwechat, alipay
公众号qrcodeimage, title, text
站点统计statistics-

模板实现

主容器

 1{{/* layouts/partials/sidebar.html */}}
 2<aside class="sidebar">
 3  {{- range .Site.Params.widgets -}}
 4    {{- $widgetPath := printf "widgets/%s.html" .type -}}
 5    {{- if templates.Exists (printf "partials/%s" $widgetPath) -}}
 6      <div class="widget widget-{{ .type }} widget-{{ .width | default "full" }}">
 7        {{- partial $widgetPath (dict "Site" $.Site "Params" .params) -}}
 8      </div>
 9    {{- end -}}
10  {{- end -}}
11</aside>

这里的关键是 templates.Exists,它能检查模板文件是否存在,从而实现安全的动态加载。

模块模板示例:个人资料

 1{{/* layouts/partials/widgets/profile.html */}}
 2<div class="widget-profile">
 3  <div class="profile-bg" style="background-image: url('{{ .Params.bg }}')"></div>
 4  <img class="profile-avatar" src="{{ .Params.avatar }}" alt="头像">
 5  <h3 class="profile-name">{{ .Params.name | default .Site.Title }}</h3>
 6  <p class="profile-desc">{{ .Params.description }}</p>
 7  <div class="profile-socials">
 8    {{- range .Params.socials -}}
 9      <a href="{{ .url }}" target="_blank" rel="noopener" title="{{ .name }}">
10        <i class="{{ .icon }}"></i>
11      </a>
12    {{- end -}}
13  </div>
14</div>

模块模板示例:站点统计

 1{{/* layouts/partials/widgets/statistics.html */}}
 2<div class="widget-statistics">
 3  {{- $postCount := len (where .Site.RegularPages "Type" "in" .Site.Params.mainSections) -}}
 4  {{- $catCount := len .Site.Taxonomies.categories -}}
 5  {{- $tagCount := len .Site.Taxonomies.tags -}}
 6  <div class="stat-item">
 7    <span class="stat-number">{{ $postCount }}</span>
 8    <span class="stat-label">文章</span>
 9  </div>
10  <div class="stat-item">
11    <span class="stat-number">{{ $catCount }}</span>
12    <span class="stat-label">分类</span>
13  </div>
14  <div class="stat-item">
15    <span class="stat-number">{{ $tagCount }}</span>
16    <span class="stat-label">标签</span>
17  </div>
18</div>

视觉一致性

所有模块共享 CSS 基类 .widget

 1.widget {
 2  background: var(--card-bg);
 3  border-radius: 12px;
 4  padding: 20px;
 5  margin-bottom: 20px;
 6  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
 7  transition: box-shadow 0.3s ease;
 8}
 9.widget:hover {
10  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
11}
12
13.widget-title {
14  font-size: 18px;
15  font-weight: 700;
16  margin-bottom: 16px;
17  padding-bottom: 10px;
18  border-bottom: 2px solid var(--primary-color);
19}

暗黑模式适配

1[data-theme="dark"] .widget {
2  background: var(--card-bg-dark);
3  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
4}
5[data-theme="dark"] .widget:hover {
6  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.5);
7}

后台可视化配置

Lumin Admin 后台提供了拖拽排序的侧边栏管理面板:

  • 拖拽调整模块顺序
  • 开启/关闭模块
  • 编辑模块参数
  • 实时预览侧边栏效果

配置修改后立即同步写入 hugo.toml,下次 Hugo 构建时生效。

总结

侧边栏模块化设计的优势:

  • 极低的维护成本:新增模块只需创建 HTML 模板 + 配置条目
  • 高度的灵活性:每个模块参数独立,排列顺序自由
  • 统一的视觉风格:共享基类 + 独立定制,保证一致性
  • 对新手友好:可视化后台管理,无需手动编辑代码
12 / 16
版权声明

本文作者 Lumin

本文链接 https://www.zhengquan.xyz/code/sidebar-widgets-design/

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

请作者喝杯咖啡 ☕

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

留言评论

期待你的想法

评论加载中