news 2026/9/2 19:12:51

AI视频生产实战:Claude+Seedance 2.5+剪映半自动链路

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI视频生产实战:Claude+Seedance 2.5+剪映半自动链路

做视频最贵的时间成本,从来不是剪辑本身,而是你对着关键帧反复拖动的那几个小时。尤其是短视频里的开场动效、转场特效、字幕卡点、画中画位移动画,看似不复杂,真要做精致,一帧一帧调下来,半天就没了。你不是不努力,而是素材生产和剪辑调整完全靠纯人工,这个效率瓶颈已经存在太久了。

这篇文章想聊一个更务实的组合:把 Claude 当创作大脑,用 Seedance 2.5 生成视频动效素材,最后在剪映里完成合成与发布。这个链路解决的不是“某一把操作更快”,而是把视频生产从“手工制作”变成“半自动装配”。读完后,你会拿到一套可以直接上手的流程:用 Claude 生成分镜脚本和字幕文件,用 Seedance 2.5 产出动态视觉素材,再回到剪映完成最终交付。

先说判断:这是一个适合内容创作者、剪辑师和想用 AI 提效的开发者的生产方案。它的关键不在于某一个工具多智能,而在于三者之间能用“文件”和“脚本”稳定衔接。下面从概念拆起,一步步讲到可运行的代码。

1. 先搞懂这三者分别解决什么问题

很多人的误区是:Claude 就是聊天机器人,Seedance 2.5 是个视频生成网站,剪映就是剪辑工具。把它们放在一起,就以为“自动生成视频”。实际上,三者的分工完全不同。

1.1 Claude 负责“结构化生成”

Claude 是 Anthropic 推出的 AI 助手,它的强项不只是写文章、聊天,而是输出结构化内容。比如:

  • 为一段短视频写分镜脚本,并且按固定 JSON 结构输出,方便后续程序读取;
  • 生成一份符合剪映导入格式的字幕文件(SRT 或 ASS);
  • 写 Python / Node.js 脚本,把素材文件批量改名、排序、整理;
  • 在终端里通过 Claude Code 直接操作项目目录,生成批处理脚本。

这些工作有一个共同点:它们不需要多强的审美,但对格式、逻辑、字段一致性要求很高。人做这些事太枯燥,但 AI 做恰恰合适。

1.2 Seedance 2.5 负责“视觉素材生成”

从公开信息和产品定位看,Seedance 是字节跳动在 AI 视频生成方向推出的能力,Seedance 2.5 是这个方向的新版本。它的作用是解决“用文字生成视频画面”的问题。

放在我们的工作流里,它的价值是:你不需要去素材网站买一堆模板,也不需要自己用 AE 拉三维场景。只要写好提示词,它就能生成符合描述的动态素材,比如科技感粒子流动、城市夜景延时、光效转场。

这里必须说清楚:视频生成模型的效果受提示词影响极大。同样的“城市夜景”,有人生成的是霓虹灯流动,有人生成的是静止照片。所以,Seedance 2.5 对“提示词质量”的要求,比比以往任何时候都高。而我们正好可以用 Claude 来批量生成高质量提示词。

1.3 剪映负责“合成与交付”

剪映是字节跳动旗下剪辑工具,它承担的是最终的素材组装:把 Seedance 2.5 生成的视频片段、Claude 生成的字幕、你录制的口播片段、背景音乐放在时间线上,调整顺序、叠加效果、导出成片。

剪映的定位是整个生产链路的终点。它不需要多智能,但它必须稳定:支持多轨道、支持字幕导入、支持高码率导出。这三点对交付质量有直接影响。

所以,三者的关系可以概括成一句话:

Claude 生产的是“可被程序消费的内容”,Seedance 2.5 生产的是“可被剪辑使用的画面”,剪映完成的是“可被观众观看的成品”。

2. 为什么说这是“半自动生产线”

很多人想象中的 AI 生产视频是:输入一句话,AI 直接给你一部片子。现实不是这样,现阶段的模型也很难做到。

真正高效的方式是“半自动装配”:

  1. Claude 先写脚本和分镜,确定这条视频的结构;
  2. Claude 再根据分镜生成 Seedance 提示词,让画面生成有依据;
  3. Seedance 2.5 按提示词生成素材片段
  4. Claude Code 批量生成字幕、整理文件、检查素材清单
  5. 人工在剪映里做最终判断:选哪个镜头、转场用多长、音乐什么时候淡出。

这个流程的核心优势是:每个环节的输出都可以被下一个环节直接使用。分镜是 JSON 格式,提示词是表格,字幕是 SRT,素材命名有序。人只需要做审美决策,而不是从零开始做所有重复劳动。

这也是我特别想强调的一点:不要追求“全自动”。AI 生成的内容必须经过人工筛选,尤其是在视频领域,一个视觉素材不合适,整条片子就垮了。把 AI 用在结构化、重复性、量大的环节,把判断力留给自己,这才是 ROI 最高的做法。

3. 环境准备:安装 Claude Code、准备大模型访问凭证、安装剪映

在动手之前,先把环境搭好。下面所有操作都基于 Windows 11 + 剪映 Windows 版演示,macOS 和 Linux 思路完全一致。

3.1 安装 Claude Code

Claude Code 是 Anthropic 推出的终端编程助手,你可以在终端里直接和它对话,让它写脚本、改文件、执行批处理命令。它是我们整个自动化流程里打通“生成脚本”和“执行任务”的关键。

安装前先检查 Node.js 环境:

node -v npm -v

如果没有安装 Node.js,需要先到 Node.js 官网下载 LTS 版本安装。Node.js 自带了 npm,装好之后执行:

npm install -g @anthropic-ai/claude-code

装完后验证版本:

claude --version

如果你在 Windows 的 cmd 或 PowerShell 里遇到这样的报错:

'claude' 不是内部或外部命令,也不是可运行的程序或批处理文件。

这通常说明 npm 的全局安装目录没有加入系统 PATH。先查看 npm 全局目录:

npm config get prefix

通常输出是C:\Users\你的用户名\AppData\Roaming\npm。把这个目录手动加到系统环境变量的 PATH 里,重新打开终端,再执行claude --version即可。

安装好之后,在命令行输入claude进入交互界面,按提示完成账号登录或 API Key 配置。Claude Code 本质上是一个命令行版的 Claude,你可以在里面自然语言输入指令,比如“读取当前目录下的 srt 文件,检查时间码是否有重叠”,它会自动完成。

3.2 准备 Claude API 访问凭证

如果你的开发场景里要写 Python 或 Node.js 代码调用 Claude 模型,建议把 API Key 放到环境变量中,不要写死在代码里。创建环境变量的方式:

Windows PowerShell:

setx ANTHROPIC_API_KEY "你的API密钥"

macOS / Linux:

export ANTHROPIC_API_KEY="你的API密钥"

代码里调用时统一读取环境变量,这样即使代码被提交到仓库,也不会泄露密钥。后面第 5 章会给出完整的调用示例。

3.3 Seedance 2.5 的获取:不要轻易尝试本地部署

关于“Seedance 2.5 本地部署”这个话题,我这里要先给一个偏保守的技术判断:视频生成模型对显存和推理管线要求非常高,个人电脑本地部署通常不现实。如果你不是专门做模型推理优化的工程师,不建议把时间花在这上面。

更稳妥的方式是使用官方提供的云端服务或 API。具体入口以字节跳动官方发布为准,一般流程是:打开官方平台,注册账号,创建应用,获取 API 凭证,然后按文档调用。

在本文的流程里,Seedance 2.5 的核心作用是“生成视觉素材”。你可以在官方网页端手动输入提示词生成,也可以用 API 批量生成。考虑到批量生成的成本更高,日常制作建议先用网页端确认效果,跑通之后再用 API 做批量生产。

3.4 安装剪映

剪映可以直接从官网下载 Windows 或 macOS 版本,安装后注册登录即可。建议使用最新版本,因为新版本对 AI 功能、字幕导入和模板支持更好。

准备好之后,新建一个项目草稿,把它作为本次实验的容器。建议给草稿建立一个固定的素材目录,我们后面生成的所有文件都会放到这个目录里,方便剪映直接导入。

4. 核心流程拆解:从创意到成片的五步

整个流程不需要一次写完,先拆开看每一环节产出的东西是什么。

第一步,用 Claude 生成分镜脚本。你只要告诉它视频主题、时长、风格,它会生成一条一条的分镜,包括画面描述、文案、镜头长度。这里的关键是:要求它按 JSON 数组输出,这样后续代码可以直接读取。

第二步,用 Claude 生成 Seedance 提示词。把第一步的分镜描述喂给 Claude,让它转换成适合视频生成模型的提示词。提示词需要包含主体、动作、镜头运动、光线、风格、时长等要素。这一步是为了减少 Seedance 2.5 生成时的“提示词试错成本”。

第三步,用 Seedance 2.5 生成素材。将第二步的提示词逐条输入 Seedance 2.5,生成视频片段。生成完成后,把文件统一放到素材目录中,命名规则尽量带序号,这样才能在剪映里快速对应到分镜。

第四步,用 Claude Code 生成字幕和配置文件。字幕不需要手动敲,用 Claude 把分镜文案转成 SRT 格式即可。如果分镜里有多个视频片段的时间轴信息,也可以让 Claude Code 生成一份导入剪映时参考的时间轴清单。

第五步,在剪映里完成最终合成。把 Seedance 2.5 生成的视频拖入轨道,按分镜顺序排列,导入字幕文件,添加音乐和音效,调整转场,导出成片。这一步是人工审美决策的核心环节,也是 AI 无法替代的部分。

5. 完整示例与代码实现

下面给出四个可以直接运行的示例。先跑通最小链路,再往真实项目里扩展。

5.1 示例 1:用 Python 调用 Claude 生成分镜脚本

先安装依赖:

pip install anthropic

然后创建一个 Python 文件generate_storyboard.py

import os import json from anthropic import Anthropic client = Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY")) def generate_storyboard(topic: str, duration: int, style: str): prompt = f""" 你是一名短视频导演。请为一条{duration}秒的短视频生成分镜脚本。 主题:{topic} 风格:{style} 要求: 1. 输出 JSON 数组,数组每个元素代表一个分镜。 2. 每个分镜对象必须包含以下字段: - id: 分镜序号,从1开始 - shot_content: 画面内容描述 - copy: 口播或字幕文案 - duration: 该分镜时长,单位秒,所有分镜时长加起来必须等于{duration} - motion: 运镜方式,如固定、推近、横移、上升 3. 只输出 JSON,不要输出任何解释文字。 """ message = client.messages.create( model="your-claude-model-id", max_tokens=4096, messages=[ {"role": "user", "content": prompt} ] ) text = message.content[0].text # 兼容 Markdown 代码块包裹的情况 if "```" in text: text = text.replace("```", "").strip() text = text[text.index("["):text.rindex("]") + 1] return json.loads(text) if __name__ == "__main__": script = generate_storyboard( topic="新品发布会开场视频", duration=15, style="赛博朋克科技感" ) print(json.dumps(script, ensure_ascii=False, indent=2))

运行方式:

python generate_storyboard.py

注意:

  • model参数需要替换成你正在使用的 Claude 模型 ID,以你账号实际可用模型为准;
  • 如果 API 返回的文本包含 Markdown 代码块,上面的strip逻辑会去掉 ``` 标记,避免json.loads直接报错;
  • 如果你的网络环境和访问策略不允许直接调用海外 API,请在合规前提下使用可获得服务的渠道,或改用国内已开放的模型服务。

这段代码的价值在于:它不是让你问 Claude “给我写个脚本”,而是让它输出精确的 JSON 结构。有了这个结构,后面的提示词生成、字幕整理都可以程序化处理。

5.2 示例 2:把分镜脚本转成 Seedance 2.5 提示词

Seedance 2.5 这类模型对提示词的理解,直接影响素材质量。所以在 Seedance 2.5 生成前,我们可以再用 Claude 转换一轮。

创建generate_seedance_prompt.py

import os import json from anthropic import Anthropic client = Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY")) def to_seedance_prompts(shots): prompt = f""" 请把以下分镜脚本转换成适合视频生成模型的提示词。 输入分镜: {json.dumps(shots, ensure_ascii=False, indent=2)} 要求: 1. 先输出一个 JSON 数组,数组顺序与输入顺序一致。 2. 每个元素是一个字符串,字符串内用逗号分隔画面要素。 3. 提示词必须包含以下信息: - 主体:画面核心对象 - 动作:主体正在做什么 - 运镜:镜头运动方式 - 光线:主光源和环境光 - 风格:整体视觉风格 - 画幅:16:9 横屏 4. 不要输出任何解释文字。 """ message = client.messages.create( model="your-claude-model-id", max_tokens=4096, messages=[ {"role": "user", "content": prompt} ] ) text = message.content[0].text if "```" in text: text = text.replace("```", "").strip() text = text[text.index("["):text.rindex("]") + 1] return json.loads(text) if __name__ == "__main__": shots = [ {"id": 1, "shot_content": "赛博朋克城市夜景", "duration": 3, "copy": "未来已来"}, {"id": 2, "shot_content": "粒子汇聚成产品轮廓", "duration": 4, "copy": "科技从未如此靠近"} ] prompts = to_seedance_prompts(shots) output_path = "seedance_prompts.json" with open(output_path, "w", encoding="utf-8") as f: json.dump(prompts, f, ensure_ascii=False, indent=2) print("已生成提示词文件:", output_path) for i, p in enumerate(prompts, 1): print(f"分镜 {i} 提示词:{p}")

运行后,你会得到一个seedance_prompts.json,里面每条提示词都可以直接复制到 Seedance 2.5 里生成素材。这样做的收益是:提示词风格统一、结构完整,生成结果的可用率会明显提升。

5.3 示例 3:用 Python 批量生成剪映可导入的 SRT 字幕

字幕是视频制作里最容易被忽略但最耗时的部分。下面是生成 SRT 字幕脚本。

创建generate_srt.py

import json def format_timestamp(seconds): hours = int(seconds // 3600) minutes = int((seconds % 3600) // 60) secs = int(seconds % 60) millis = int((seconds - int(seconds)) * 1000) return f"{hours:02}:{minutes:02}:{secs:02},{millis:03}" def generate_srt(shots, out_path="subtitles.srt"): lines = [] current_time = 0.0 for idx, shot in enumerate(shots, start=1): duration = shot.get("duration", 0) end_time = current_time + duration lines.append(str(idx)) lines.append(f"{format_timestamp(current_time)} --> {format_timestamp(end_time)}") lines.append(shot.get("copy", "")) lines.append("") current_time = end_time with open(out_path, "w", encoding="utf-8") as f: f.write("\n".join(lines)) print("字幕文件已生成:", out_path) if __name__ == "__main__": # 这里的数据通常由示例 1 的分镜脚本产生 shots = [ {"id": 1, "duration": 3, "copy": "未来已来"}, {"id": 2, "duration": 4, "copy": "科技从未如此靠近"} ] generate_srt(shots)

运行方式:

python generate_srt.py

生成出来的subtitles.srt可以在剪映中直接导入。关键点有四个:

  1. 必须用 UTF-8 编码,否则中文字幕在剪映里可能乱码;
  2. 时间码格式必须是小时:分钟:秒,毫秒,SRT 标准格式不接受其他写法;
  3. 字幕时间轴要与你最终剪辑的时间轴一致,如果剪映里调整了片段长度,字幕也要同步改;
  4. 建议生成后用文本编辑器打开检查一遍,确认时间递增没有重叠。

5.4 示例 4:用 Claude Code 在终端里整理素材

如果你素材很多,手动改名、归档太累,可以直接用 Claude Code 完成。

在素材目录打开终端,运行:

claude

然后输入指令:

请扫描当前目录下所有 .mp4 文件,按文件修改时间从早到晚排序,统一重命名为 clip_01.mp4、clip_02.mp4 这样的格式。不要移动文件,不要删除文件,只重命名。

Claude Code 会自动生成并执行一个重命名脚本。执行前它会先让你确认,避免误操作。

这里要强调一下安全边界:任何批量重命名、批量移动、删除操作,在执行前务必确认路径正确,并且提前备份。尤其是在自动化工作流里,一个命令写错可能把你的素材目录搞得一团糟。建议先在一个临时目录里测试,再对正式素材执行。

6. 运行结果与效果验证

脚本能不能用,不是“跑完没报错”就行。要按下面的标准逐项验证。

验证分镜脚本是否合法:运行generate_storyboard.py后,终端会输出 JSON 数组。你可以在 Python 里用json.loads确认没有报错,观察duration字段总和是否等于你要求的视频总时长。如果总时长对不上,说明 Claude 输出的分镜时长有误差,需要让它修改。

验证 Seedance 提示词是否可用:打开seedance_prompts.json,检查每条提示词是否包含主体、运镜、光线、风格这几个要素。建议先挑 2 到 3 条在 Seedance 2.5 网页端试生成,确认整体方向正确再批量生成。批量生成前先想清楚成本预算。

验证 SRT 字幕是否可以导入:打开剪映,在时间线区域右键选择“导入字幕”,选择subtitles.srt,看字幕是否正常显示、时间轴是否和素材对应。如果字幕乱码,把文件用记事本重新另存为 UTF-8 编码再导入。如果字幕和画面不同步,优先检查duration字段和剪映时间线实际长度。

验证素材文件是否规整:素材目录应该能一眼看出分镜顺序,比如clip_01.mp4clip_02.mp4。如果命名混乱,建议回到 Claude Code 里重新整理。

7. 常见问题与排查思路

问题现象可能原因排查方式解决方案
claude不是内部或外部命令npm 全局目录未加入 PATH执行npm config get prefix查看全局目录将对应目录加入系统 PATH,重启终端
Claude 报错或提示新用户不可用账号区域策略或开放策略限制查看官方公告不要尝试绕过限制,关注官方开放进度,或使用合规可用的模型服务
Seedance 2.5 生成素材不理想提示词缺少主体/运镜/光线细节检查生成 JSON 里的提示词字段是否齐全让 Claude 补充画面要素,逐条修正后重试
剪映导入字幕乱码SRT 文件编码不是 UTF-8用文本编辑器查看编码另存为 UTF-8 编码后重新导入
字幕时间轴错位分镜 duration 与实际视频长度不一致对比 SRT 时间码和剪映片段时长在剪映里调整素材长度,重新生成 SRT
剪映提示“暂不支持导出复合片段”时间线上存在复合片段需要先还原或简化导出设置检查时间线是否有嵌套复合片段在导出前把复合片段展开,或者调整导出配置后再导出
剪映人声分离卡住音频文件过大或内存不足检查任务管理器 CPU/内存占用关闭其它大程序,重启剪映,或把音频切短后再分离
Python 解析 API 返回内容报错Claude 返回内容包含代码块或额外说明打印原始返回值增加代码块清理逻辑,或要求模型“只输出 JSON”
API 返回内容被截断max_tokens 设置太小查看返回内容的结束原因调大 max_tokens,或拆分长任务多次生成

排查时记住一个原则:先看原始输出,再改代码。很多人遇到 JSON 解析报错,第一反应是改解析逻辑,其实应该先打印模型的原始返回值,确认它到底返回了什么。

8. 最佳实践与工程建议

这套流程真正跑起来之后,你会遇到的不只是“工具会不会用”的问题,还有工程化的问题。下面几条经验值得提前记住。

第一,建立提示词模板库。不要每次让 Claude 从零写分镜。把你常用的视频类型,比如产品介绍、活动预热、账号口播、知识科普,各沉淀成一套标准提示词模板。下次做同类型视频时,只改关键变量(主题、时长、关键词),输出质量会非常稳定。

第二,在项目根目录维护一个 CLAUDE.md 文件。Claude Code 启动时会自动读取这个文件,把它当作项目上下文。你可以在里面写清楚:素材目录在哪、字幕格式要求是什么、每类文件怎么命名。这样 Claude Code 在帮你执行批处理时,不需要你反复解释项目背景。

第三,素材命名规范比想象中重要。推荐这样的命名格式:序号_场景描述_版本。例如01_opening_particles_v2.mp4。有了规范之后,剪映导入按名称排序即可对应分镜,Claude Code 批量整理也更安全。

第四,成本控制从提示词开始。每一步让 Claude 输出内容时,都明确设置max_tokens。分镜脚本控制在 4096,提示词转换控制在 2048,字幕生成用脚本本地处理,不额外消耗模型调用。Seedance 生成素材前,先小批量试效果,不要一次性大量生成。

第五,不要把敏感数据放进提示词。如果你用 API 调用 Claude,注意不要把账号密码、内部报价、未上线产品信息写入对话。对视频行业来说,还要特别注意素材版权和平台规则。用 Seedance 生成的素材如果涉及真人肖像、品牌 Logo 或特定风格,发布前要确认是否符合平台规定。

第六,最终成片一定要人工审核。AI 生成的字幕可能存在同音错别字,AI 生成的画面可能存在不合理的细节。剪映里导出前,建议完整看一遍成片,重点关注:字幕是否有错别字、画面是否有穿帮、转场是否突兀、配音和画面是否同步。这些细节决定了视频能不能发布。

9. 总结与后续学习方向

这条 Claude + Seedance 2.5 + 剪映的生产链路,核心思路不是用 AI 替代全部创作,而是把大量结构化、重复性、低创造性的工作交给工具:分镜脚本、提示词转换、字幕生成、文件整理,全部程序化;审美、节奏、取舍,留给自己。

下一步你可以从这三个方向继续深入:一是提示词工程,研究如何让 Claude 输出更稳定的 JSON 结构,让 Seedance 2.5 生成更符合预期的画面;二是剪辑模板化,把剪映里常用的转场、字幕样式沉淀成项目模板,缩短最终合成时间;三是探索更多自动化边界,比如用 Claude Code 定期批量检查素材目录、自动生成发布文案,真正把视频从创作到上线的链路串联起来。工具会继续更新,但“AI 先生成草稿、人来做判断”的分工方式,会在很长一段时间里持续有效。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 19:11:49

Hubmesh:零LLM调用实现多跳RAG,破解复杂问答延迟与成本难题

如果你正在构建一个基于大语言模型(LLM)的问答系统,大概率遇到过这个困境:用户的问题稍微复杂一点,需要结合多个文档片段才能回答,系统就“卡壳”了。传统的 RAG(检索增强生成)流程通…

作者头像 李华
网站建设 2026/9/2 19:11:46

黑马商城项目导入IDEA报错?从zip损坏到环境配置全流程排查指南

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

作者头像 李华
网站建设 2026/9/2 19:11:01

VTK 9.3.0自编译实战:VS2019+Qt5.15.2双版本配置全攻略

简介:一份面向 VS2019 与 Qt5.15.2 环境的 VTK 9.3.0 自编译开发包,适合需要在 C 项目中集成 3D 可视化、并希望同时拥有 Debug/Release 配置的开发者。该版本额外启用 Java 与 Python 接口,并整合 zlib、hdf5、Qt5、tiff、libxml2、jsoncpp、…

作者头像 李华
网站建设 2026/9/2 19:08:31

电话呼叫源码实战:FreeSWITCH+WebRTC从零搭建呼叫系统

简介:这套电话呼叫源码工程包定位为通信与计算机电话集成方向的开发参考资料,适合具备一定编程基础、想了解自动外呼、交互式语音应答、呼叫路由、通话录音等功能实现原理的技术人员。源码以C语言为主,完整覆盖拨号控制、语音合成识别、坐席分…

作者头像 李华
网站建设 2026/9/2 19:07:06

本地AI+Markdown:极简笔记工具VelocityNote部署与实测指南

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

作者头像 李华
网站建设 2026/9/2 19:06:58

斯坦福AI交叉硕士深度拆解:非CS背景的隐藏申请路径

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

作者头像 李华