SRS模板怎么写?软件需求规格说明书九段式结构与验收标准全解析
简介软件需求规格说明书SRS模板是一份面向项目经理、软件开发工程师、测试工程师等角色的标准文档范本旨在帮助团队在启动阶段快速厘清系统目标、用户特点与需求边界解决需求描述不一致、沟通成本高等常见问题。压缩包仅含1个doc文件体积61KB轻量易用可直接下载后按章节替换内容。文档按引言、任务概述、需求规定、运行环境规定等核心模块编排其中需求规定部分细分为功能规定、性能规定精度、时间特性、灵活性、输入输出要求、数据管理能力、故障处理与其他专门要求便于逐项核对与跟踪。模板还对编写目的、背景、定义、参考资料、用户特点、假定与约束等条目给出引导性说明适合在需求分析、方案评审或需求基线管理时作为统一格式。目前已有3411人学习浏览是软件工程入门与项目文档规范化的实用工具。1. 搜「SRS」搜出两种结果你找的是能救场的这一种搜「SRS」这个词的时候一半人看到的是流媒体服务器正在为推流延迟头疼另一半人找的是 Software Requirements Specification——软件需求规格说明书。后者是软件工程里最老派、最不受待见、却最能救场的文档。我见过太多项目需求会上拍胸脯开发到一半才发现「当时说的根本不是这个意思」于是返工、扯皮、互相甩锅。SRS 模板的价值不是让你填一份漂亮文档而是逼着所有角色在写代码之前对「到底要做什么」达成一次可验证的共识。它适合产品、开发、测试都要参与评审的中小团队也适合接了外包、怕被甲方口头需求反复折磨的技术负责人。2. 拆开一份能用的 SRS 模板它长什么样、每段用来干什么2.1 SRS 在需求文档体系里的位置和 BRD、PRD 的分工写 SRS 之前先搞清楚它站在哪。BRD 是立项用的讲商业价值老板看PRD 是产品给开发和 UI 看的讲交互过程和页面逻辑SRS 则是需求规格化的最终载体它把「用户能上传 Excel 文件」这种含糊话变成「系统应支持用户上传 .xlsx 格式文件单文件大小不超过 10MB」这种可验证的技术契约。SRS 承上启下——承 PRD 的交互启技术设计与测试用例。很多团队跳过 SRS直接从 PRD 进开发短期看着快。但项目一旦遇到人员流动或外包交付需求就变成黑匣子后面接手的人只能靠猜。我一般建议的裁剪方式是小项目把 SRS 和 PRD 合并成一份但功能需求部分必须按 SRS 的写法来中大型项目或涉及多方验收的合同必须单独出 SRS。评审会上SRS 是唯一的仲裁依据谁说话都不如文档里的白纸黑字好使。2.2 最小 SRS 模板骨架九段式结构我给团队做模板时不搞花哨的目录按 IEEE 830 流派精简成九段。太长的模板没人愿意填填了也是复制粘贴太短的又盖不住关键信息。下面这个骨架是我实践下来性价比最高的结构每一段都有明确用途不是凑章节。章节核心内容常见错误1 引言编写目的、项目背景、读者对象写成公司简介2 总体描述产品定位、用户特征、运行环境没有运行环境约束3 功能需求需求项列表含 ID/优先级/验收标准按页面罗列没有需求属性4 非功能需求性能、安全、可用性、兼容性写「性能要好」这种废话5 外部接口需求对接的系统、协议、数据格式遗漏第三方接口6 数据需求核心数据实体、字段约束、保留策略要求不明导致后期改表7 约束与假设技术栈约束、业务假设、合规要求假设不写明后期被反问8 验收标准可执行的整体验收条目和第三条重复或冲突9 附录术语表、变更记录术语不做统一九段不是每段都要长篇大论。约束与假设最少可以只写三行但必须有——它保护你「系统在 Chrome 94 下运行不承诺兼容 IE」这句话写进文档比验收时吵十句都有用。变更记录也不要省哪怕只有日期和一句改动说明都是后续追责和排查的线索。2.3 需求项核心属性表ID、优先级、来源一个都不能少功能需求是 SRS 的主体但很多人按「序号」写需求然后评审时发现没法引用——「第三段说的那个功能」和「3.2.4 节」完全不是一回事。我的做法是给每个需求项一个固定 ID格式建议用「模块前缀 三位数字」比如 LOG-001、USR-002。ID 一旦分配永久不变哪怕需求被删了也不重用防止追踪历史时错乱。每个需求项至少带五个属性ID、需求名称、优先级、来源、验收标准。优先级我坚决用三档而不是五档——「高/中/低」足够决策五档里的「紧急且重要」和「重要不紧急」在评审现场永远吵不清楚。来源字段填写提出人或文档编号这条需求说不清来历时直接按低优先级处理或打回能有效遏制「评审时突然冒出来的新需求」。表格字段再多也要在正文里写完整的需求描述。属性表只是索引不是需求本身。我见过有人把整份 SRS 写成一个 Excel属性表里塞了需求描述结果超过 5000 字后完全没法评审——人眼在表格里读长文本效率远低于读分段的正文。属性表做索引正文做描述各管各的。2.4 把「能登录」写成可验证的句子场景描述与验收雏形「系统支持用户登录」这种表述在 SRS 里等于没写。可验证的写法是把前置条件、操作过程、预期结果拆开「用户已注册且账号状态为正常前置在登录页输入正确手机号和密码并点击登录按钮操作系统应在 2 秒内跳转至首页顶部导航栏显示用户名结果。」这样写开发和测试拿到就能干活不需要再来找你问「正常登录到底什么算正常」。写场景描述有个技巧用「如果……那么……」的口吻来起草。先不管文笔把每个操作分支写出来再整理成正式条目。分支里有异常情况的比如密码错误、账号锁定、验证码过期这些不写在正常流程里单列成边界条件放需求项的最下方。SRS 不是给正常人走正常路的文档它是把所有人可能走的弯路都标出来的地图——地图上没有标注的坑开发不会主动绕开。3. 把功能需求写实原子性、边界条件与验收标准3.1 功能需求的原子性一条需求只描述一件事评审会上最常见的翻车现场是需求条目里一句话包含三个动作——「系统应支持导入 Excel 并校验数据且展示错误提示」。开发拿到后心想「那就是导入啊」测试拿到后理解成「验证错误提示」产品和开发对完需求发现理解不一致。问题的根源是这条需求不原子。原子性要求一条需求只描述一个可独立验收的行为多个操作必须拆开。原子性具体执行起来有三个判断标准能不能独立测试、能不能给独立优先级、能不能单独变更而不影响其他条目。三个条件任一不满足继续拆。按这个标准上面那条需求拆成三条「系统应在数据导入页提供 .xlsx 文件选择入口」「系统应对已上传文件按字段规则校验并生成错误报告」「系统应在校验完成时展示错误条数和首个错误行的字段内容」。拆完你会发现优先级也好排了——校验可以低优先级先上线导入不能。原子性不等于碎片化。每条拆出来的需求仍然要能对应到业务价值上拆到「点击按钮颜色变蓝」这种程度就过了头。边界线画在哪我心里有个判断标准一个需求写完后能否用一句话向非技术同事说清它的价值。说不清说明拆出了技术步骤不是需求。3.2 边界条件是评审最容易放过的部分至少写三到四条我在评审 SRS 时有个顽疾样的习惯先跳过正文看每条需求的边界条件。因为正常流程谁都会写真正的分歧全部藏在边界里。「导入十万行的 Excel」和「导入空文件」是两个世界「断网时点了保存」和「正常保存」在开发工作量上差出三倍。但大多数模板都没把边界条件这个字段突出出来需求描述里写着「系统应支持导入文件」开发默认处理一万行以内客户测试直接丢一个 200MB 的 CSV 进来当场崩掉。每个需求项下方我要求至少写三条边界条件且必须包含输入为空或格式错误时系统的处理方式、数据量达到上限时的处理方式、操作超时或网络中断时的处理方式。三条打底再根据业务特性补充权限边界无权限用户能否触发、状态边界重复提交、并发操作、数据边界特殊字符、超长字段。边界条件写的是系统在异常情况下的行为不是「友好提示」这种形容词——「系统应拒绝导入超过 10MB 的文件并提示文件大小超限」才是合格表述。写边界条件有个血泪经验最容易被漏掉的是「用户重复操作」。双击提交按钮、连续两次扫码、同一请求并发发送这类问题在开发环境永远复现不出来上线第一周就被真实用户触发。我建议在边界条件里固定加一条「系统应对重复提交做幂等处理同一操作重复触发时只生效一次并提示正在处理」。这条不起眼但能替你省掉很多个深夜。3.3 验收标准怎么写给定输入、步骤、可观测输出验收标准是 SRS 里最容易被当成摆设的部分。很多人觉得验收是测试的事需求文档里写个「功能正常」就行。实际上验收标准写不清楚测试用例就靠猜开发自测就靠感觉最后验收扯皮就从需求阶段延续到了交付阶段。我坚持的写法是四段式给定输入、操作步骤、预期输出、性能约束。前两段描述怎么触发后两段定义什么叫通过——「给定一个包含 1000 条有效记录的 .xlsx 文件用户点击导入按钮系统应在 10 秒内完成校验并展示成功条数」。验收标准不是越细越好但要细到「换一个人也能照着执行」。比如「跳转至首页」不行要写「地址栏 URL 变为 /home页面头部显示当前用户名」「提示错误信息」不行要写「页面顶部出现红色提示条文案包含错误字段名」。我一般会在每条第 3 类——中优先级需求——上做验收标准的全覆盖高优先级本来就写得多低优先级可以只写通过/不通过判定倒逼需求方把高优先级的事想清楚。3.4 非功能需求量化性能、安全、可用性的写法非功能需求是 SRS 里水分最大的章节最常见的写法是「系统应运行稳定、响应快速、界面美观」。这类词填在任何项目里都成立但等于没写。非功能需求必须量化量化才有验收依据。性能里我必写四个数接口响应时间区分 P95 和 P99、并发用户数、数据量上限、批量任务完成时限。可用性写两项系统可用率按年计还是按月计、故障恢复时间RTO和数据恢复点RPO。这些数不是拍脑袋定的要结合业务承受力——给内部 20 人用的管理系统写 99.99% 可用率和给在线交易系统写完全是两个成本量级。安全非功能需求不能只写「系统应保证数据安全」要落到具体措施和标准上密码存储用哪种哈希算法、传输层是否强制 TLS 1.2、接口鉴权用 token 还是证书、日志保留时长和脱敏范围。兼容性量化最简单的例子是写浏览器支持矩阵——Chrome 两个大版本、Edge 两个大版本、是否支持移动端一张表列清楚比写十行「系统应兼容主流浏览器」都管用。量化非功能需求的最佳参考是历史事故上一版系统在哪崩过、哪慢过、哪被攻击过这些事件对应的指标就是这版 SRS 必须量化的点。4. 写 SRS 的五个常见问题与避坑清单4.1 需求写成设计开发直接拒绝执行现象需求条目写着「系统应通过 Redis 缓存用户会话过期时间 30 分钟」。评审时开发当场反对「用不用缓存、用什么组件是设计决策需求文档里写死了后面想换架构都动不了」。原文档作者委屈「我只是想表达会话别太快过期」。原因在于把「怎么做」写进了「做什么」的文档SRS 管业务行为技术选型留给设计文档。解决把需求描述改回用户视角——「用户登录后 30 分钟内无操作再次操作时应被要求重新登录」。至于这 30 分钟用什么实现是架构师的事。我在文档里加了一条硬性要求需求描述中禁止出现框架名、组件名、协议名一旦出现即视为设计污染打回重写。4.2 「用户」「管理员」含义飘移一个词两种解释现象SRS 全文 200 处「用户」其中 80 处指 C 端消费者90 处指后台运营人员还有 30 处指两者兼具的「登录账号」。评审时产品说「用户能看到这个入口」开发问「哪个用户C 端还是后台」吵了半小时发现文档里根本没定义角色。原因术语表放在附录最后写作的人从头写到尾没回看过一眼。解决第一术语表前置到第一章结尾定义每个角色名词的权限范围和描述第二需求描述里禁止使用裸词「用户」必须写成「已登录的C端消费者」或「具备订单管理权限的后台运营人员」第三评审时逐条核对角色词的命中率凡是没有角色修饰语的需求条目一律标记为含糊项。4.3 主观形容词混入需求「操作友好」「界面美观」「灵活可扩展」现象「系统应提供操作友好的表单界面」——这条需求进入开发后UI 按自己的审美做了深色主题产品觉得浅色才友好测试也不知道「友好」的验收标准是什么最终需求变成了悬案。原因把评价词当成了描述词。解决主观词全部置换为可观测行为。「操作友好」置换为「表单必填项应带星号标识错误输入应在对应字段下方提示且不丢失已填内容」「界面美观」置换为「按设计稿实现设计稿以附件形式随本文档归档」。我在文档规范里写了一条强制原则需求描述中所有形容词都必须能转化为「用户能看到什么、能做什么、系统返回什么」的表达转化不了的词删掉。4.4 模板没有裁剪默认条款和项目实际无关现象外包团队套用公司标准 SRS 模板里面写着「系统应支持与公司统一身份认证平台对接」实际项目是在内网跑的独立系统根本没有这个平台。开发照着这条需求搭了一套 OAuth 流程交付时甲方一脸茫然。原因模板是审核用的清单不是项目的事实直接套模板导致虚构需求混入规格。解决每条从模板带过来的默认条款必须回答两个问题——本系统是否需要此功能不需要的依据是什么。我在评审 SRS 时会把模板中的内容用批注标注出来正文里出现的每一条需求都要能追溯到原始来源来源填「模板默认」的条目直接打回。裁剪比填充更花时间但不裁剪的结果是开发做了一堆没人要的功能——那些功能每个都标着「来自 SRS 模板」你连反驳的余地都没有。5. 用需求追踪矩阵把 SRS 收口从需求 ID 一路查到测试用例SRS 的终极价值是给开发、测试、验收提供同一个参照系。我的习惯是文档快定稿时花半天时间建一张需求追踪矩阵RTM表头按「需求 ID、需求描述、优先级、对应测试用例 ID、开发负责人、当前状态」六列来搭。这个矩阵不在 SRS 正文里是独立交付物但它让 SRS 从「一份文档」变成了「一套可追踪的工程基准」。没有 RTM 的 SRS需求改没改、测了没测、交付没交付全靠记忆——记忆在项目复盘时从来不靠谱。RTM 的建立不必等全部需求定稿需求评审通过一批就登记一批。每个需求 ID 在 RTM 里对应至少一条测试用例 ID测试用例 ID 写测试计划里的编号不用展开细节。变更发生时在 RTM 的「当前状态」列标出变更版本号能一眼看出哪些需求的测试用例还没同步更新。我见过最惨的一次验收现场是开发说按最新需求改完了测试拿着旧用例测出三个 bug两边在会议室对着代码争执——文档里没有版本基线谁都证明不了自己是对的。这个矩阵也直接影响需求变更的工作量评估。甲方提一句「这个页面再加个筛选条件」你翻 RTM 看到这个需求关联的用例数、涉及模块和负责人半小时内能给出相对靠谱的排期没有矩阵就只能说「我回去评估一下」然后被追着催三天。另外RTM 还能用来做覆盖率检查——需求列表里没有任何用例关联的条目基本就是没测到的高风险区评审时我会主动标记这些条目为「未覆盖」要求补充或删除。早些年我做项目不建矩阵总觉得文档写完就万事大吉后来在一次三方对账时被甲方一条一条问「这条需求你们测了没有」我只能现场到处翻聊天记录狼狈得不行。从那以后RTM 成了我所有项目的最后一道工序SRS 定稿当天建好矩阵此后每一次变更先改矩阵再加内容。这套流程不复杂但它把「我们大概做完了」变成「每条需求都有据可查」。希望这份 SRS 模板的心得能帮你在下一个项目里把需求的账算得清楚一点少熬几个为「当时到底怎么说的」而失眠的夜。本文还有配套的精品资源点击获取

相关新闻

粤语会议纪要总整理到崩溃?实测一套从录音到归档的落地方法

粤语会议纪要总整理到崩溃?实测一套从录音到归档的落地方法

如果你在广州、佛山、香港等地工作,粤语会议几乎是日常。普通话转写工具遇到粤语口语、懒音、语速快、多人抢话,输出常像加密文本。会后还要靠记忆补全,纪要整理两小时起步。行业现状是,会议记录正在从人工速记转向 AI 语音转写。…

2026/10/12 12:01:02 阅读更多 →
销售沟通哪个工具好?6款录音转写工具实测与销售复盘落地指南

销售沟通哪个工具好?6款录音转写工具实测与销售复盘落地指南

销售沟通有一个很现实的难题:聊的时候信息量很大,聊完以后却很难完整还原。客户随口提到的预算、决策人、竞品顾虑、交付要求,往往散落在几十分钟甚至几小时的对话里。如果只靠手写笔记和记忆,复盘容易漏,周报月报也容…

2026/10/12 12:01:02 阅读更多 →
IPD集成产品开发流程培训:从立项到上市的系统化管理

IPD集成产品开发流程培训:从立项到上市的系统化管理

简介:IPD集成产品开发流程培训PPT从新产品开发现实情况切入,指出新产品贡献企业六成年销售额与五成利润,但大量企业因缺乏过程管理、科学模式与团队协作,导致开发效率低下;优秀新产品过程需具备多层级、规范化和跨职能…

2026/10/12 12:01:02 阅读更多 →

最新新闻

边缘计算网关桥梁监测方案:从传感器接入到算法部署的落地实践

边缘计算网关桥梁监测方案:从传感器接入到算法部署的落地实践

1. 桥梁监测这件事,为什么非得把算力推到边缘侧桥梁结构安全监测算不上新话题,早些年做这行的都知道,传统方案基本是“传感器布一圈、数据回传到中心服务器、后台统一算”。这套逻辑在实验室或者单一小桥上跑得挺顺,一旦上了跨江跨…

2026/10/12 12:50:01 阅读更多 →
半边结构:多边形网格处理的核心数据结构

半边结构:多边形网格处理的核心数据结构

有些东西,你不亲手写一遍数据结构,真的很难体会它为什么要设计成那样。多边形网格处理这本书的前面几章看起来像是在“复习数学”,等翻到关于网格表示那一章,才开始真正进入几何处理的腹地。今天我用一整篇的篇幅,把这…

2026/10/12 12:50:01 阅读更多 →
JavaScript执行顺序深度解析:从执行上下文到事件循环

JavaScript执行顺序深度解析:从执行上下文到事件循环

JS 的执行顺序,不是靠“从上到下读一遍”就能搞定的。我见过不少人写代码几年,遇到变量提升、闭包、定时器回调混在一起时,照样踩坑。有一次线上有个功能时好时坏,查到最后,问题出在一个var变量在函数声明之前被使用&a…

2026/10/12 12:50:01 阅读更多 →
Python局域网设备扫描:ARP缓存表原理与多线程实现

Python局域网设备扫描:ARP缓存表原理与多线程实现

1. 从一个真实需求说起:为什么要自己写局域网设备检测很多人第一次接触"局域网设备检测"这个概念,是因为家里或者办公室里遇到了一个很具体的问题:路由器后台显示的已连接设备列表里,出现了几个自己完全不认识的设备名。…

2026/10/12 12:50:01 阅读更多 →
Zynq7020嵌入式Linux实战:从启动链到驱动开发全解析

Zynq7020嵌入式Linux实战:从启动链到驱动开发全解析

1. 项目缘起与整体设计思路1.1 为什么选择Zynq7020做Linux实验Zynq7020这颗芯片在嵌入式圈子里算是老面孔了,但它的生命力一直很旺盛。核心原因在于它的架构——PS端双核Cortex-A9加上PL端Artix-7 FPGA逻辑,这种ARMFPGA的异构组合让它在工业控制、图像处…

2026/10/12 12:50:01 阅读更多 →
Agent外挂记忆系统实战:从原理到接入Mem0的完整指南

Agent外挂记忆系统实战:从原理到接入Mem0的完整指南

如果你做过一个稍微上点规模的AI客服Agent,大概率遇到过这种崩溃瞬间:用户问“我上次那个退款怎么回事”,Agent一脸茫然地开始重复要订单号;或者用户已经说清楚了“我在上海,想找一个周末的线下活动”,下一…

2026/10/12 12:49:01 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →