从零写一个轻墨主题

从零写一个轻墨主题

轻墨的“主题”本质是一层皮肤:把一个文件夹放进 themes/,里面声明自己是谁、并给出一份 style.css,前台就完全换了一副面孔。本文带你从复制默认主题开始,做出一套属于自己的界面,顺便讲清楚它能改什么、不能改什么。

主题到底是什么

先看轻墨的主题机制,其实只有两个文件是“必需”的:

themes/我的主题名/
├── theme.php      # 主题的身份证:名字、介绍、版本、作者
└── style.css      # 决定前台长什么样的样式表

系统怎么决定前台用哪套 CSS?规则写死在 includes/functions.phptheme_css_url() 里:

  • 后台启用了一个主题(存在 data/config.phptheme 字段里);
  • 如果该主题不是 default 且它的文件夹里有 style.css → 前台引用 themes/主题名/style.css
  • 否则回退到 assets/style.css(也就是默认复古主题那套)。

换句话说:默认主题没有自己的 CSS,它“借用” assets/style.css;你自己写的主题只要带 style.css,就从零接管前台长相。

小提示:theme.php 不是必须的。缺了它系统也能把主题列出来,只是名字会显示成文件夹名。还是建议写上。

第一步:复制默认主题改个色

最稳的开局不是从空文件开始,而是复制一个现成主题改。打开:

themes/paper/          # 或 themes/modern、themes/sakura

整文件夹复制一份,改名成你喜欢的 slug(只允许字母、数字、下划线、连字符),比如 themes/myfirst/。然后改 theme.php

<?php
return [
    'name' => '我的第一个主题',
    'description' => '照着教程做的第一个轻墨主题。',
    'version' => '1.0.0',
    'author' => '你的名字',
    // 以后想支持深色模式,就加这一行(详见下文)
    // 'dark_support' => 1,
];

保存后进后台「主题市场」,就能看到它并一键启用。到这一步你已经“做”了一个主题——接下来才是好玩的部分。

主题要打扮的舞台长什么样

CSS 只管“长得像”,页面结构还是核心模板给的。前台的结构大致是这样(includes/header.php 开个头,index.php 出内容,includes/footer.php 收尾):

<body class="theme-myfirst">
  <div class="container">
    <div class="header">
      <h1 class="site-title"><a>博客名</a></h1>
      <p class="desc">站点描述</p>
      <nav class="nav">
        <a>首页</a><span class="nav-sep">|</span><a>归档</a>…
      </nav>
      <form class="search-box">
        <input class="search-input"> <button class="search-btn">搜索</button>
      </form>
    </div>
    <div class="main">
      <!-- 首页:文章列表 -->
      <div class="post-list">
        <div class="post-item">
          <h2><a>标题</a></h2>
          <div class="post-meta">发表于… | 分类… | 评论… | 阅读…</div>
          <div class="post-summary">摘要…</div>
          <div class="tag-list"><a>标签</a></div>
        </div>
      </div>
      <!-- 文章页:正文 + 页脚 -->
      <div class="post-content">
        <h1>标题</h1>
        <div class="post-meta">…</div>
        <div class="content">正文 HTML…</div>
        <div class="tag-list">…</div>
        <div class="post-footer">标题/链接/作者/协议</div>
      </div>
      <!-- 评论:单条 + 楼中楼 -->
      <div class="comment-list">
        <div class="comment-item" id="comment-1">
          <div class="comment-meta"><strong>昵称</strong> 发表于…</div>
          <div class="comment-content">内容(含 <span class="at-mention">@某人</span>)</div>
          <button class="reply-btn">↩ 回复</button>
          <div class="comment-children">…子回复…</div>
        </div>
        <div class="emoji-bar"><button class="em">😀</button>…</div>
        <div class="comment-form">…输入框…</div>
      </div>
      <!-- 友链页 -->
      <div class="links-page">
        <div class="friend-links">
          <div class="friend-link"><a class="friend-link-name">站名</a>
            <p class="friend-link-desc">介绍</p></div>
        </div>
      </div>
    </div>
    <div class="sidebar">
      <div class="box"><h3>分类</h3><ul>…</ul></div>
      <div class="box"><h3>最新评论</h3><ul>…</ul></div>
    </div>
    <div class="clear"></div>
    <div class="footer">版权区…</div>
  </div>
</body>

写样式时,从上到下把这些区块都照顾到,页面就不会“漏馅”:

  • 外层与头.container.header.site-title.desc.nav.nav a.search-box / .search-input / .search-btn
  • 两栏.main.sidebar.sidebar .box h3.clear
  • 文章列表.post-item.post-item h2 a.post-meta.post-summary.tag-list a
  • 文章页.post-content.content.content pre/code/blockquote/img.post-footer
  • 评论.comment-list.comment-item.comment-meta.comment-content.comment-children.reply-btn.at-mention.emoji-bar .em.comment-form
  • 杂项.pagination.msg.success/.error.friend-link.footer

有个实用细节:.container 内容区里 .main.sidebar 是靠 float 排成两栏的。移动端记得在媒体查询里把两者都改成 float:none; width:100%,否则手机上看会挤成一团(参考内置主题的 @media 段落)。

深色模式:一行声明 + 一套变量

轻墨 v2.0 的深色模式是“CSS 变量”方案,主题只要:

  1. theme.php 里加 'dark_support' => 1。这一步会让系统自动:在页面 <head> 里读取用户偏好(跟随系统或上次手动选择),并在导航栏渲染出 🌓 切换按钮——你完全不用写 JS。
  2. style.css 里把所有颜色抽象成变量,再补一套深色值:
:root {
    --bg: #faf8f5;  --text: #2d2d2d;  --card: #fff;
    --accent: #e8a0bf;
    color-scheme: light;
}
html[data-theme="dark"] {
    --bg: #17121a;  --text: #e7dce4;  --card: #241c26;
    --accent: #e8a0bf;
    color-scheme: dark;
}
body { background: var(--bg); color: var(--text); }

只要正文里全用 var(--xxx),切到深色时整站自动跟着变。注意:如果某处偷懒写了十六进制硬色(尤其背景、输入框、边框),深色模式下就会“亮瞎眼”,所以从一开始就养成用变量的习惯最省事。

自己动手的参考:三种做法

  1. 换肤(推荐入门):只写 style.css,保留系统给的结构。改字体、配色、圆角、卡片、hover 动效,一小时能出效果。
  2. 参考内置主题themes/paper/ 结构极简适合入门;themes/modern/ 展示了完整变量化 + 深色模式;themes/sakura/ 展示了全套组件都做粉彩化的写法。
  3. 想动结构怎么办:主题层目前只提供视觉皮肤,不能替换 header.php/index.php 的标签结构。如果你确实需要不一样的整体布局,有两条路:
  • 只改前台少量行为:可以发布插件(或直接改 includes/header.php)——但后者会影响所有主题;
  • 把它当作轻墨的一个长期定制版来维护(fork 模板文件)。

CSS 做不到的“注入”可以靠钩子:前台 <head>qm_head 动作钩子(插件用它加字体、统计代码都很方便),详见《轻墨插件开发指南》。

发布你的主题

主题做完就是普通文件夹。分享给别人时:

  1. 保证里面有 theme.php(含 name/description)和 style.css
  2. 把文件夹打包成 主题名.zip
  3. 对方解压到站点根目录 themes/ 下,刷新后台「主题市场」即可看到并启用。

对照检查清单:首页、归档、文章页、友链页、评论楼中楼、搜索框、移动端各看一遍,重点盯两栏布局在窄屏的收拢和深色下的输入框。


一句话版本:复制一个现成主题 → 改 theme.php 声明身份 → 用 CSS 变量重写 style.css → 后台主题市场启用。想支持深色,再加一个 dark_support => 1

标签: Qingmo, 主题, 教程