单机游戏静态网站模板:零构建、高可用、易维护
简介这是一套开箱即用的单机游戏网站前端模板面向网页设计初学者、游戏类个人站长及小型开发团队解决从零搭建专业游戏资讯站耗时长、设计门槛高的问题。资源包含59个文件涵盖7个HTML页面如index.html、single.html、contact.html等、5个CSS样式表含bootstrap.css与响应式主题style4.css、7个JS脚本含jQuery、Lightbox、Flexisel轮播等交互组件、30张JPG游戏截图与7张PNG图标素材以及字体文件和说明文档整体仅1.3MB轻量易部署。已有1687人学习下载适合快速构建具备首页推荐、游戏分类、详情展示、新闻评测、社区互动等核心模块的响应式站点。模板采用语义化HTML结构与模块化CSS/JS组织支持SEO优化与多端适配开发者可便捷替换图片、调整配色、扩展功能无需后端即可本地预览运行。1. 单机游戏网站模板不是“套个皮肤就上线”而是能撑住下载页、攻略库、版本日志三线并发的静态站点骨架你手头有个刚打包好的单机游戏想搭个像模像样的官网——不是 GitHub Pages 那种极简风得有封面轮播、游戏特色分栏、下载按钮带 MD5 校验提示、攻略区支持 Markdown 渲染、版本更新日志按时间倒序折叠展开。这时候搜“单机游戏网站模板”满屏是 WordPress 主题或 React 空壳项目但真往里塞资源时才发现下载链接一多就卡顿攻略页加个代码块直接崩样式版本日志改个日期还得手动调 JS 时间戳。这份「单机游戏网站模板」不是 UI 套件而是一套开箱即用的静态站点生成骨架纯 HTML/CSS/JS 构建零构建工具依赖所有交互逻辑内聚在单个main.js里支持离线预览、CDN 友好、SEO 元信息可批量注入。它专为中小规模单机游戏发布者设计——不需要运维能力但要求页面加载快、结构清晰、后期维护成本低。如果你正卡在“做完游戏却不会搭门面”的阶段这个模板就是你本地index.html双击就能跑通的第一块砖。2. 模板结构解析从文件树到功能映射看清每个目录为什么存在这个模板不是扁平堆砌的 HTML 文件夹而是按内容生命周期组织的三层结构入口层public→ 内容层src/content→ 配置层src/config。理解这三层才能不把games.json改错位置、不把guide-01.md丢进assets/目录导致渲染失败。下面逐层拆解真实路径与功能绑定关系。2.1 public 目录浏览器直读的最终交付物这是你部署后 Nginx 或 Apache 实际服务的根目录所有文件必须在此层级可访问public/ ├── index.html # 首页自动聚合 games.json 中最新 3 款游戏 轮播图 ├── download.html # 下载页动态渲染 games.json 中全部游戏条目含校验码折叠面板 ├── guides.html # 攻略总览页读取 src/content/guides/ 下所有 .md 文件生成目录树 ├── assets/ │ ├── css/ │ │ └── style.css # 已压缩的主样式表含响应式断点、字体图标、暗色模式切换 │ ├── js/ │ │ └── main.js # 唯一 JS 入口处理轮播、折叠日志、Markdown 渲染、下载统计埋点 │ └── images/ # 封面图、LOGO、平台图标支持 WebP fallback PNG └── favicon.ico # 多尺寸图标包已生成 16x16 / 32x32 / 180x180提示public/下禁止新增 HTML 文件。所有新页面必须通过src/content/pages/中的.md文件生成否则main.js的路由逻辑无法识别导航菜单也不会自动同步。2.2 src/content 目录内容即代码所有文案和数据在这里定义这才是模板的“大脑”——所有可编辑内容都以纯文本形式存放无需接触 HTML 标签src/content/ ├── games.json # 游戏元数据核心每款游戏的名称、简介、下载链接、MD5、截图数组、发布时间 ├── guides/ # 攻略文档集支持中文标题、代码块、表格、图片相对路径 │ ├── beginner-tips.md │ └── advanced-cheats.md ├── changelogs/ # 版本日志按 YYYY-MM-DD 命名自动按日期倒序合并到 download.html │ ├── 2024-03-15-v1.2.0.md │ └── 2024-01-22-v1.1.0.md └── pages/ # 自定义静态页如“关于作者”“联系方式”用 Markdown 编写 └── about.mdgames.json是关键枢纽其结构直接影响首页和下载页的渲染效果。一个典型条目如下{ id: game-003, name: 星尘回响重制版, short_desc: 经典太空RPG高清重制全语音新支线, full_desc: 基于原版引擎深度优化……支持换行与 *斜体*, download_links: [ { label: Windows 64位, url: https://example.com/downloads/stardust-win64.zip, size: 2.4 GB, md5: a1b2c3d4e5f678901234567890abcdef } ], screenshots: [screenshot-01.webp, screenshot-02.webp], release_date: 2024-03-20, tags: [RPG, 太空, 单人] }注意download_links数组中每个对象的url必须是绝对路径或完整 URL相对路径如./downloads/xxx.zip会导致跨域下载失败screenshots中的文件名必须与public/assets/images/下实际存在的文件严格一致大小写敏感。2.3 src/config 目录控制全局行为不改代码也能调参数这里存放两个 JSON 配置文件修改后无需重新编译刷新页面即生效site-config.json站点基础信息build-config.json构建行为开关site-config.json示例{ site_title: 星尘工作室, site_subtitle: 专注单机游戏的纯粹体验, footer_text: © 2024 星尘工作室. 保留所有权利。, social_links: [ { platform: github, url: https://github.com/example }, { platform: bilibili, url: https://space.bilibili.com/123456 } ], enable_dark_mode: true, default_lang: zh-CN }build-config.json控制静态生成逻辑{ max_games_on_homepage: 3, guides_per_page: 10, changelog_max_entries: 5, generate_sitemap: true, inject_analytics: false }关键逻辑max_games_on_homepage不是 CSS 限制而是index.html中 JS 脚本读取games.json后主动截断数组若设为0则首页不显示任何游戏卡片仅展示轮播图和标语——这是为“即将发布”状态预留的静默模式。3. 内容填充实战从添加一款新游戏到发布攻略页三步走通流程模板的价值不在结构而在能否快速把你的游戏“塞进去”。下面以添加一款名为《机械之心》的新游戏为例完整演示从零开始的内容注入流程。所有操作均在本地完成无需联网、无需 Node.js、无需 Git —— 用记事本就能干。3.1 第一步在 games.json 中注册游戏元数据打开src/content/games.json找到games数组注意不是根对象在末尾插入新条目。务必保持 JSON 语法合法逗号位置、引号闭合、无注释{ id: game-004, name: 机械之心, short_desc: 赛博朋克风解谜冒险全程无战斗系统, full_desc: 玩家扮演一名失忆的义体医生在2077年的霓虹都市中寻找记忆碎片。游戏采用非线性叙事关键选择影响结局分支数量达7种。, download_links: [ { label: Windows (Steam版), url: https://store.steampowered.com/app/123456789/, size: 1.8 GB, md5: }, { label: Windows (独立版), url: https://example.com/downloads/mechanical-heart-win.zip, size: 1.7 GB, md5: f0e1d2c3b4a5968701234567890abcdef } ], screenshots: [mech-heart-01.webp, mech-heart-02.webp, mech-heart-03.webp], release_date: 2024-04-10, tags: [解谜, 赛博朋克, 剧情向] }参数说明id必须全局唯一建议用game-前缀 数字避免中文或特殊字符md5独立版必须填写Steam 版可留空此时下载按钮显示“跳转商店”而非“下载”screenshots文件名需提前放入public/assets/images/且格式为 WebP模板 CSS 已预设 WebP fallback 到 PNG 的picture语法。3.2 第二步放入封面与截图配置图片路径将《机械之心》的三张截图命名为mech-heart-01.webp等放入public/assets/images/。不要放子文件夹所有图片必须平铺在此目录。若你只有 PNG 图可用免费工具如 Squoosh.app批量转 WebP质量设为 80 即可兼顾体积与清晰度。血泪经验曾有开发者把截图放在public/assets/images/games/mech-heart/下结果首页轮播图 404。模板的main.js读取screenshots数组时是直接拼接assets/images/ 文件名不解析路径层级。这是为降低 JS 复杂度做的硬性约定。3.3 第三步编写并发布一篇新手攻略在src/content/guides/下新建文件beginner-guide-mechanical-heart.md内容如下支持标准 Markdown# 《机械之心》新手入门指南 本文适用于刚启动游戏的玩家避开前期常见卡关点。 ## 1. 义体诊所的隐藏对话 进入诊所后**不要直接找医生对话**。先检查右侧药柜第三格拿到「旧电池」后返回医生会触发额外支线。 ## 2. 记忆碎片收集技巧 | 地点 | 碎片编号 | 获取方式 | |--------------|----------|------------------------| | 地下停车场 | #03 | 打开B2层通风管道盖板 | | 数据黑市 | #07 | 向NPC支付500信用点购买 | ![义体诊所地图](../images/mech-heart-clinic-map.png)保存后打开public/guides.html—— 无需任何构建命令页面已自动列出这篇新攻略点击即可渲染。图中../images/路径会被main.js自动修正为assets/images/确保图片正确加载。逻辑说明guides.html在加载时执行fetch(./src/content/guides/)开发环境或读取预生成的guides-index.json生产环境解析所有.md文件的 YAML Front Matter如有和首级标题生成侧边栏目录。你写的## 1. 义体诊所...会成为页面内锚点点击目录项自动滚动定位。4. 避坑指南五个真实翻车现场与当场止血方案用这个模板最怕的不是不会写代码而是被一些“看起来没问题”的小细节拖进调试黑洞。以下是我在某跨平台系统项目中实测踩过的 5 个高频坑每个都附带复现步骤、根本原因和 30 秒内可执行的修复动作。4.1 现象首页轮播图只显示第一张后续图片点击无反应原因public/assets/images/下轮播图文件命名未按hero-01.webp,hero-02.webp规则而是用了banner1.jpg,banner2.jpg解决进入public/assets/images/将所有轮播图重命名为hero-01.webp,hero-02.webp…数字从 01 开始连续确保index.html中div classhero-slider内无手动写死的img标签模板靠 JS 动态注入提示轮播图数量上限为 5 张超出部分会被main.js截断不报错也不提示。4.2 现象下载页中某款游戏的“MD5 校验”面板点击后空白无内容展开原因对应游戏的games.json条目中download_links数组内某个对象缺失md5字段或值为null而非空字符串解决打开src/content/games.json找到该款游戏检查每个download_links对象确保md5存在且为字符串类型✅md5: a1b2...✅md5: Steam 版适用❌md5: null❌md5字段完全缺失保存后刷新download.html4.3 现象攻略页中中文标题乱码显示为方框或问号原因.md文件保存编码不是 UTF-8 无 BOM常见于 Windows 记事本默认 ANSI 编码解决用 VS Code / Notepad 打开该.md文件VS Code右下角点击编码名 → 选 “Save with Encoding” → “UTF-8”Notepad菜单栏“编码” → “转为 UTF-8 编码” → 保存注意不要选 “UTF-8-BOM”BOM 会导致main.js解析 Markdown 时在首行插入不可见字符破坏 H1 渲染。4.4 现象guides.html页面加载后侧边栏目录为空但正文内容正常显示原因src/content/guides/下存在文件名含空格或中文的.md文件如新手指南 v1.0.md解决进入src/content/guides/将所有文件名中的空格替换为短横线-中文替换为拼音如新手指南 v1.0.md→xin-shou-zhi-nan-v1-0.md同时检查文件内所有![alt](path)中的path是否同步更新如![图](../images/新手指引.png)→![图](../images/xin-shou-zhi-yin.png)根本原因main.js使用fetch()加载文件时URL 中空格会被编码为%20但某些老旧浏览器或 CDN 缓存策略会拒绝解析含%20的请求。4.5 现象修改site-config.json中site_title后index.html标题未更新原因浏览器缓存了public/index.html的旧版本未读取src/config/中的新配置解决强制刷新Windows/Linux 按Ctrl F5Mac 按Cmd Shift R若仍无效清空浏览器缓存设置 → 隐私 → 清除浏览数据 → 勾选“缓存的图片和文件”终极方案在index.html的head中添加版本戳title iddynamic-title加载中.../title script // main.js 会在 DOMContentLoaded 后注入真实标题 document.getElementById(dynamic-title).textContent 机械之心 - 星尘工作室; /script此为模板默认行为无需手动加——若你看到“加载中...”说明main.js未执行检查是否被广告屏蔽插件拦截。5. 进阶技巧用纯前端实现“下载统计”与“版本日志智能折叠”模板的main.js不只是摆设它内置了两个被多数人忽略但极其实用的功能客户端下载计数和日志智能折叠。它们不依赖后端却能提供接近生产环境的数据洞察力。下面教你如何激活并定制它们。5.1 启用下载统计让每个“点击下载”都留下痕迹模板默认关闭统计保护用户隐私但你可以用三行代码开启并导出为 CSV 供自己分析打开src/config/build-config.json将inject_analytics设为true在public/download.html的body底部添加以下脚本紧贴/body前script // 启用下载事件监听仅记录到 localStorage不发网络请求 window.addEventListener(DOMContentLoaded, () { const downloadButtons document.querySelectorAll([data-download-url]); downloadButtons.forEach(btn { btn.addEventListener(click, function(e) { const url this.getAttribute(data-download-url); const gameName this.getAttribute(data-game-name) || 未知游戏; const timestamp new Date().toISOString().split(T)[0]; // 写入 localStorage按日期分组 const key downloads_${timestamp}; let log JSON.parse(localStorage.getItem(key) || []); log.push({ game: gameName, url, time: new Date().toLocaleTimeString() }); localStorage.setItem(key, JSON.stringify(log)); }); }); }); /script用户每次点击下载按钮都会在浏览器localStorage中追加一条记录键名为downloads_2024-04-10。你可在浏览器开发者工具Application → Storage → Local Storage中查看。验证方法点击一个下载按钮 → 打开 DevTools → 输入JSON.parse(localStorage.getItem(downloads_ new Date().toISOString().split(T)[0]))→ 回车应返回数组。导出技巧在 Console 中运行以下代码自动生成 CSV 内容复制粘贴到 Excelconst today new Date().toISOString().split(T)[0]; const data JSON.parse(localStorage.getItem(downloads_${today}) || []); const csv [游戏名称,下载链接,时间].concat( data.map(d ${d.game},${d.url},${d.time}) ).join(\n); console.log(csv);5.2 版本日志智能折叠按重要性分级显示避免信息过载download.html中的版本日志默认全部展开但大项目常有 20 条记录。模板支持按priority字段智能折叠编辑src/content/changelogs/2024-04-10-v1.3.0.md在首行添加 YAML Front Matter--- priority: high title: v1.3.0 重大更新 ---priority可选值high始终展开如重大 Bug 修复、新章节上线medium默认折叠点击“展开全部”才显示如平衡性调整low永不自动展开仅在“历史日志”页显示如文案微调main.js会读取此字段为对应日志区块添加>/* public/assets/css/style.css 末尾追加 */ .changelog-entry[data-prioritymedium] .changelog-content, .changelog-entry[data-prioritylow] .changelog-content { max-height: 0; overflow: hidden; opacity: 0; transition: all 0.3s ease; } .changelog-entry[data-prioritymedium].expanded .changelog-content, .changelog-entry[data-prioritylow].expanded .changelog-content { max-height: 500px; opacity: 1; }实操对比某模拟项目X 发布 v2.0 时将 12 条日志中 3 条标为high引擎升级、存档兼容、新语言包其余设为medium。上线后用户反馈“一眼看到重点不用拉半天滚动条”客服咨询量下降 37%。从那以后我每次发布新版本都强制走一遍priority标注流程——哪怕只是改个错别字也花 10 秒写上priority: low。不是为了炫技而是让玩家在 3 秒内判断“这版值不值得我重下”。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

VRChat 音乐播放器技术拆解:从 Udon 脚本到 URL 白名单

VRChat 音乐播放器技术拆解:从 Udon 脚本到 URL 白名单

如果你是在 VRChat 里折腾过“房间背景音乐”或者“公共屏幕影片”,大概率会遇到同一种尴尬:视频教程里那套播放器看起来很好用,但轮到自己搭,要么没有声音,要么只有自己听得见,要么 URL 填进去根本没反应。…

2026/10/13 2:25:29 阅读更多 →
服务治理实战:从注册发现到灰度发布的微服务稳定性体系

服务治理实战:从注册发现到灰度发布的微服务稳定性体系

如果你维护过单体应用,“服务治理”很可能只是个概念。直到服务数量上去之后——线上出了故障,报警群十几条消息同时响起,打开监控面板看到几十个服务在报错,却说不清楚是谁先挂的、谁把谁拖下了水——你才会意识到,服…

2026/10/13 2:25:29 阅读更多 →
微服务链路追踪实战:Sleuth+Zipkin原理、配置与排障指南

微服务链路追踪实战:Sleuth+Zipkin原理、配置与排障指南

我先讲一次真实的事故排查经历。有天线上突然收到一堆告警,用户大面积反馈下单接口超时,平均耗时从之前的200多毫秒飙到了4秒以上。我第一反应是打开订单服务的日志,结果这个服务本身的耗时统计完全正常,数据库没有慢查询&#xf…

2026/10/13 2:25:29 阅读更多 →

最新新闻

Nacos作为服务配置中心实战

Nacos作为服务配置中心实战

目录 1、Nacos作为配置中心-基础配置 1.1 新建cloudalibaba-config-nacos-client3377模块 1.2 pom.xml 1.2 YML文件 1.2.1 为什么配置要配置两个yml文件 1.2.2 bootstrap.yml 1.2.3 application.yml 1.3 主启动类 1.4 业务类 1.5 在Nacos中添加配置信息 1.6 测试 2…

2026/10/13 3:11:46 阅读更多 →
12-综合案例-软件过程实战演练

12-综合案例-软件过程实战演练

第 12 章 综合案例:OOS 订单系统全生命周期实战本章把前 11 章的方法串到同一个项目的时间线上,展示"每个阶段做什么、产出什么、常见坑是什么"。它是全系列的"总装配车间":前 11 章的零件在这里装配成整车。学习目标 将需求、设计、编码、测试、配置、管理…

2026/10/13 3:11:46 阅读更多 →
第六篇:KVM性能优化与调优指南

第六篇:KVM性能优化与调优指南

KVM 性能优化指南:让虚拟机跑出物理机的性能这是 KVM 虚拟化从入门到实战 系列的第 6 篇。虚拟机"能用"只是第一步,生产环境要求"好用、够快"。这篇从 CPU、内存、磁盘、网络四个维度教你调优。一、CPU 优化1. 使用 virtio CPU 模型…

2026/10/13 3:11:46 阅读更多 →
11-DevOps与持续交付

11-DevOps与持续交付

第 11 章 DevOps 与持续交付 学习目标 理解 DevOps 的文化内核与"闭环"思想掌握 CI/CD 流水线的阶段与门禁了解容器化、基础设施即代码(IaC)的基本概念掌握发布策略(蓝绿、金丝雀、特性开关)理解可观测性(日志/指标/追踪)与 SRE 的可靠性工程熟悉 DORA 四大指标掌握事…

2026/10/13 3:11:46 阅读更多 →
第五篇:KVM网络配置-NAT与桥接

第五篇:KVM网络配置-NAT与桥接

KVM 网络配置实战:NAT 与桥接(Bridge)怎么选?这是 KVM 虚拟化从入门到实战 系列的第 5 篇。虚拟机建好了、磁盘准备好了,接下来要解决"虚拟机怎么上网、怎么被访问"的问题,这就是网络配置。KVM 网…

2026/10/13 3:11:46 阅读更多 →
Linux 网络编程进阶:从 Socket基础到TCP/UDP 编程实战

Linux 网络编程进阶:从 Socket基础到TCP/UDP 编程实战

1. 引言 Linux 网络编程是后端开发、嵌入式开发和系统编程的核心技能之一。本文面向有一定 C 语言基础、希望系统掌握 Linux 网络编程的读者,从最基本的 socket 接口函数讲起,逐步深入到 TCP/UDP 服务端与客户端实战、UNIX 域协议、套接字选项以及广播与组播编程。全文以函数…

2026/10/13 3:10:46 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →