倒立摆模糊控制实战:MATLAB/Simulink仿真从建模到避坑
简介这份资源围绕倒立摆的模糊控制展开基于MATLAB/Simulink环境搭建面向智能控制方向的初学者与课程实验学习者帮助理解模糊逻辑在非线性系统稳定控制中的应用。包内共140个文件以mat数据文件、m脚本、mdl仿真模型、fis模糊规则文件为主另含png/jpg截图、avi仿真视频、docx实验报告及少量xml、pdf等说明文档压缩包约6.15MB。内容覆盖角度模糊PID控制、位置与角度分段模糊控制等实验配套规则文件、仿真模型、动态数据获取与动画脚本以及原始与改进仿真的对比视频便于直观观察控制效果差异。实验报告还梳理了控制策略设计、仿真结果分析与常见问题处理思路。目前已有6456人学习下载适合作为模糊控制入门实践与Simulink建模练习的参考素材。1. 倒立摆为什么难控一个被模糊逻辑化解的非线性死结倒立摆是控制理论里最经典的“劝退级”对象。你推小车摆杆往反方向倒你收力摆杆又因为重力继续歪。线性控制器在平衡点附近还能勉强稳住一旦初始角度偏大或者参数漂移立刻翻车。更麻烦的是倒立摆的动力学方程里含有 $\sin\theta$ 和 $\cos\theta$ 项本质上是非线性的而经典 PID 或 LQR 都是基于线性化模型设计的天然存在适用边界。模糊控制的思路完全不同它不追求精确的数学模型而是把“摆角偏大、角速度也大那就使劲推”这类人类操作经验编码成规则库用隶属度函数做软切换。这份资源用 MATLAB/Simulink 搭了一套完整的倒立摆模糊控制系统从物理建模到模糊推理再到仿真验证链路完整适合初学者顺着信号流把每个环节都跑通一遍。搞懂它你就理解了模糊控制为什么能在模型不准、非线性强的场景下 work。2. 倒立摆的物理建模从拉格朗日方程到 Simulink 状态空间2.1 为什么不能直接用牛顿第二定律硬推倒立摆系统由小车和摆杆组成小车受水平力 $F$摆杆绕铰点转动。用牛顿第二定律分别对小车和摆杆做受力分析会得到一组耦合的微分方程推导过程冗长且容易在符号上出错。更常见的做法是用拉格朗日方程从能量角度出发选取广义坐标 $x$小车位置和 $\theta$摆杆与竖直方向夹角写出动能和势能再代入拉格朗日方程$$ \frac{d}{dt}\left(\frac{\partial L}{\partial \dot{q_i}}\right) - \frac{\partial L}{\partial q_i} Q_i $$其中 $L T - V$ 是拉格朗日量$Q_i$ 是非保守力对应的广义力。这样得到的方程结构清晰物理意义明确。对于倒立摆最终整理出的两个方程分别描述小车平动和摆杆转动二者通过耦合项相互影响。常见的实现思路是先把这两个方程解成 $\ddot{x}$ 和 $\ddot{\theta}$ 的显式表达式再在 Simulink 里用积分器链搭建。2.2 状态空间形式与 Simulink 实现把 $x$、$\dot{x}$、$\theta$、$\dot{\theta}$ 作为四个状态变量系统可以写成$$ \dot{\mathbf{x}} f(\mathbf{x}, u) $$其中 $u$ 是小车驱动力。由于 $f$ 是非线性的不能写成 $\dot{\mathbf{x}} A\mathbf{x} Bu$ 的线性形式。在 Simulink 里通常用 MATLAB Function 模块或者 Embedded MATLAB Function 来写这个非线性函数输入是四个状态和控制量输出是四个状态的导数。然后接四个 Integrator 模块形成闭环。下面是一个典型的 MATLAB Function 代码片段用于计算状态导数function dxdt inverted_pendulum_dynamics(x, u) % 输入 % x [x_cart; x_dot; theta; theta_dot] % u 小车驱动力 F % 输出 % dxdt [x_dot; x_ddot; theta_dot; theta_ddot] M 0.5; % 小车质量 kg m 0.2; % 摆杆质量 kg l 0.3; % 摆杆半长 m g 9.8; % 重力加速度 x_cart x(1); x_dot x(2); theta x(3); theta_dot x(4); % 中间变量 sin_t sin(theta); cos_t cos(theta); denom M m - m * cos_t^2; % 角加速度 theta_ddot (g * sin_t - cos_t * (u m * l * theta_dot^2 * sin_t) / (M m)) ... / (l * (4/3 - m * cos_t^2 / (M m))); % 小车加速度 x_ddot (u m * l * (theta_dot^2 * sin_t - theta_ddot * cos_t)) / (M m); dxdt [x_dot; x_ddot; theta_dot; theta_ddot]; end这段代码里denom和theta_ddot的表达式来自拉格朗日方程的解析解。注意4/3这个系数它对应的是均匀细杆绕端点转动的转动惯量 $J \frac{1}{3}ml^2$代入后化简得到。参数M、m、l可以根据实际模型调整但要注意单位一致。如果仿真时摆杆直接飞出去先检查denom是否接近零那意味着分母奇异通常是参数设置不合理导致的。2.3 线性化模型的对照作用虽然模糊控制不依赖线性化但初学者最好还是把平衡点附近的线性化模型也搭出来作为对照。在 $\theta \approx 0$、$\dot{\theta} \approx 0$ 附近做泰勒展开得到 $A$、$B$ 矩阵然后用ss或tf建立线性模型。这样你可以先跑一个 LQR 控制器看看线性控制的效果边界在哪里再切换到模糊控制器对比两者在大角度扰动下的表现差异。这个对比过程能帮你直观理解模糊控制的优势区间。3. 模糊控制器的设计规则库、隶属度函数与推理机制3.1 模糊化把精确量变成语言变量模糊控制的第一步是模糊化。倒立摆的输入通常选两个摆角误差 $e \theta_{ref} - \theta$ 和角速度误差 $\dot{e} -\dot{\theta}$。输出是小车驱动力 $u$。每个变量都要定义模糊集比如 $e$ 可以分成 {负大, 负小, 零, 正小, 正大}对应英文缩写 {NB, NS, ZO, PS, PB}。每个模糊集用一个隶属度函数描述常见的有三角形、梯形和高斯型。在 MATLAB 的 Fuzzy Logic Toolbox 里可以用mamfis或者图形化编辑器fuzzyLogicDesigner来建。三角形隶属度函数的参数是 $[a, b, c]$表示左脚、峰值、右脚。比如 NB 可以设为 $[-1, -1, -0.5]$PB 设为 $[0.5, 1, 1]$。注意论域范围要覆盖实际可能出现的误差如果摆角最大会到 0.5 rad那论域至少设到 $[-0.5, 0.5]$否则超出部分会被截断导致控制量饱和。3.2 规则库IF-THEN 背后的直觉规则库是模糊控制的核心。每条规则形如如果 $e$ 是 PB 且 $\dot{e}$ 是 ZO那么 $u$ 是 PB。翻译成人话就是摆角偏正大但角速度接近零说明摆杆正在往正方向倒需要大力往正方向推。规则条数通常是 $5 \times 5 25$ 条也可以精简到 9 条或 15 条。规则的设计没有固定公式靠的是对系统行为的理解。一个常见的坑是规则表不对称导致正负方向控制力度不一致摆杆会往一边偏。建议先画一个对称的规则表再根据仿真结果微调。下面是一个典型的 5×5 规则表行是 $e$列是 $\dot{e}$$e \backslash \dot{e}$NBNSZOPSPBNBNBNBNBNSZONSNBNBNSZOPSZONBNSZOPSPBPSNSZOPSPBPBPBZOPSPBPBPB这张表的意思是当摆角误差和角速度误差同号且都大时输出大力当二者异号时输出趋于零或反向小力起到阻尼作用。你可以把它理解成一个非线性的 PD 控制器但增益是随工作点变化的。3.3 模糊推理与去模糊化推理机制通常用 Mamdani 型每条规则先做“与”运算取小或乘积得到触发强度然后裁剪输出隶属度函数最后把所有规则的裁剪结果聚合起来得到一个总的模糊输出。去模糊化常用重心法centroid即计算聚合后模糊集合的重心横坐标作为精确输出。在 Simulink 里模糊控制器可以直接用 Fuzzy Logic Controller 模块把.fis文件加载进去。模块的输入是 $e$ 和 $\dot{e}$输出是 $u$。注意采样时间要设对模糊控制对采样周期不敏感但太大会导致响应迟滞一般取 0.01 s 到 0.05 s 之间。如果仿真时输出抖动厉害先检查去模糊化方法重心法通常比高度法平滑。3.4 量化因子与比例因子实际系统里$e$ 和 $\dot{e}$ 的物理范围可能和模糊论域不一致需要量化因子 $K_e$、$K_{\dot{e}}$ 做缩放。输出 $u$ 也需要比例因子 $K_u$ 映射回实际力的大小。这三个因子的选择直接影响控制效果$K_e$ 太大系统对误差敏感容易振荡太小响应迟钝。$K_u$ 太大控制量饱和太小推不动。常见的整定思路是先固定 $K_e$ 和 $K_{\dot{e}}$让 $e$ 和 $\dot{e}$ 落在论域中间区域然后调 $K_u$ 直到摆杆能稳住。如果摆杆在平衡点附近高频抖动适当减小 $K_u$ 或增大 $K_{\dot{e}}$。4. Simulink 仿真搭建从模块连接到数据可视化4.1 整体框图与信号流一个完整的倒立摆模糊控制仿真包含这几个部分参考信号通常设 $\theta_{ref}0$、误差计算、模糊控制器、倒立摆模型、状态输出。信号流是当前状态 $\theta$ 和 $\dot{\theta}$ 反馈回来和参考值比较得到 $e$ 和 $\dot{e}$送入模糊控制器算出 $u$$u$ 驱动倒立摆模型模型输出新的状态。整个闭环在 Simulink 里用图形化连线完成不需要写脚本。建议把倒立摆模型封装成一个 Subsystem输入是 $u$输出是四个状态。这样主模型看起来干净也方便替换不同的被控对象。模糊控制器也封装成 Subsystem内部放 Fuzzy Logic Controller 模块。两个 Subsystem 之间用信号线连起来形成闭环。4.2 关键模块参数设置Integrator 模块的初始条件很重要。摆杆初始角度一般设 0.1 rad 到 0.3 rad模拟一个初始扰动。如果设 0系统一开始就在平衡点看不出控制效果。小车初始位置设 0初始速度设 0。仿真时间设 10 s 左右步长用变步长ode45最大步长限制在 0.01 s保证精度。Scope 模块用来观察 $\theta$ 和 $x$ 的响应曲线。建议把 $\theta$ 和 $u$ 放在同一个 Scope 里用不同颜色区分这样能直观看到控制量和摆角的关系。如果摆角收敛但小车一直往一个方向跑说明位置环没有约束这是正常的倒立摆模糊控制通常只稳摆角不控小车位置。如果需要同时控位置得再加一个位置环或者用多变量模糊控制。4.3 仿真结果的分析方法跑完仿真后重点看三个指标超调量、调节时间和稳态误差。超调量反映规则库的激进程度如果摆角冲过零位很多才回来说明规则表里大误差对应的输出太猛适当降低 $K_u$。调节时间反映系统响应速度如果摆角长时间在零位附近晃说明阻尼不够增大 $K_{\dot{e}}$ 或者调整规则表里异号规则的输出。稳态误差通常很小因为模糊控制器在零附近有 ZO 规则但如果存在静差可以在规则表里加一条积分型规则或者在外面套一个积分器。提示仿真步长不要设得太大否则积分器累积误差会导致结果失真。如果发现曲线毛刺多先减小步长再检查模糊控制器的采样时间是否和仿真步长匹配。5. 避坑与排查倒立摆模糊控制仿真中的常见翻车点5.1 摆杆直接飞出去现象仿真一开始摆角迅速增大到 90 度以上小车冲出画面。原因最常见的是模糊控制器输出方向反了。规则表里 PB 对应正力但如果被控对象模型里力的正方向和摆角正方向定义不一致就会形成正反馈。另一个原因是量化因子 $K_e$ 或 $K_{\dot{e}}$ 符号搞错导致误差输入反号。解决先单独测试开环响应给一个正力看摆角往哪边倒。确认方向后检查规则表的符号。如果方向对但力不够增大 $K_u$。如果力太大导致过冲减小 $K_u$。5.2 摆角在零位附近高频抖动现象摆角曲线在零附近快速振荡控制量 $u$ 也在正负之间跳变。原因模糊控制器的输出在零附近切换太频繁本质上是规则表在 ZO 区域的分辨率不够或者去模糊化方法导致输出不连续。另一个可能是仿真步长太大离散化引入的延迟。解决在 ZO 附近增加模糊集比如把 {NB, NS, ZO, PS, PB} 扩展成 {NB, NM, NS, ZO, PS, PM, PB}提高分辨率。或者改用 Sugeno 型模糊系统输出是输入的线性函数天然连续。还可以在控制器输出后加一个低通滤波器平滑控制量。5.3 仿真报错“代数环”现象Simulink 提示代数环错误无法求解。原因模糊控制器的输出直接反馈到输入中间没有状态变量隔离。Simulink 要求每个反馈回路至少有一个状态模块如 Integrator。解决检查信号流确保反馈路径上经过 Integrator。如果模糊控制器内部有直接馈通可以在输出后加一个 Memory 模块或者 Unit Delay打断代数环。5.4 规则表不对称导致单边偏现象摆杆稳定后角度不是零而是偏向一边的某个小角度。原因规则表里正负方向的规则不对称比如 PB 对应的输出比 NB 对应的输出大导致正方向控制力偏强。解决把规则表做成中心对称即第 $i$ 行第 $j$ 列的输出等于第 $6-i$ 行第 $6-j$ 列的输出取反。检查隶属度函数是否对称论域是否关于零对称。5.5 仿真速度慢到无法忍受现象仿真跑几分钟才前进 1 秒CPU 占用高。原因变步长求解器在非线性环节附近反复试探步长被压得很小。模糊控制器里的查表操作也可能拖慢速度。解决改用定步长求解器步长设 0.001 s 到 0.01 s。把模糊控制器换成查表模块预先计算好输入输出映射表运行时直接插值。如果精度要求不高步长可以放宽到 0.02 s。6. 从仿真到实物的距离设计取舍与进阶方向仿真跑通只是第一步真正把模糊控制用到实物倒立摆上还有几个硬骨头要啃。首先是传感器噪声仿真里状态变量是干净的实物里编码器有量化误差陀螺仪有漂移这些噪声进入模糊控制器后会被微分环节放大导致控制量抖动。常见的做法是在反馈路径上加低通滤波或者改用积分型模糊控制降低对微分噪声的敏感度。其次是执行器延迟电机从收到指令到出力有几十毫秒的滞后仿真里通常忽略实物里必须补偿否则摆杆会在平衡点附近极限环振荡。可以在控制器输出后加一个前馈补偿项或者用 Smith 预估器抵消延迟。模糊控制器的规则库设计也有取舍。规则越多控制越精细但调试工作量指数上升。25 条规则已经能覆盖大部分工况如果追求更高精度可以上自适应模糊控制让量化因子或规则表根据状态在线调整。但自适应会引入稳定性问题需要额外的监督机制。另一个方向是和 PID 或 LQR 做混合控制大角度时用模糊控制快速回中小角度时切换到 LQR 做精细调节。这种切换控制能兼顾响应速度和稳态精度但切换瞬间的抖动需要处理。我自己的习惯是每次调完参数先把仿真跑三遍一遍初始角度 0.1 rad一遍 0.3 rad一遍加白噪声扰动。三遍都稳了才敢往实物上搬。实物调试时先用手扶住摆杆给一个小扰动看电机响应方向对不对再松手。这个流程帮我省了很多次烧电机的钱。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

物理AI、世界模型与具身智能:术语混战背后的技术真相

物理AI、世界模型与具身智能:术语混战背后的技术真相

最近几个月跑了几场技术交流,明显感觉到一个现象:大家明明在聊同一件事,张嘴却各说各话。有人张口“物理AI”,闭口“世界模型”;有人坚持“具身智能才是正路”;还有同事在私下吐槽,说这两个词“…

2026/10/17 12:22:48 阅读更多 →
影视APP双端源码从编译到上架完整落地笔记

影视APP双端源码从编译到上架完整落地笔记

简介:这份影视APP双端源码程序面向移动应用开发者与影视类项目创业者,提供一套覆盖安卓与苹果双端的在线视频聚合应用完整实现,可用于学习跨平台开发、用户体系搭建与分销运营逻辑。压缩包为zip格式,整体约42.5MB,文件…

2026/10/17 12:22:48 阅读更多 →
大模型参数量的本质:能力底座而非数字游戏

大模型参数量的本质:能力底座而非数字游戏

1. 这不是“堆料”,而是大模型能力的物理底座 你刷到过那种视频吗?一个AI助手三秒内写出五千字行业分析报告,还能配图、做PPT、生成短视频脚本——最后弹出一行小字:“模型参数量:700亿”。很多人第一反应是&#xff1…

2026/10/17 12:21:47 阅读更多 →

最新新闻

动态规划入门实战:六道经典题吃透状态、转移与边界

动态规划入门实战:六道经典题吃透状态、转移与边界

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

2026/10/17 13:16:24 阅读更多 →
AI PR门禁实践:基于GitHub Actions与大模型的代码审查自动化

AI PR门禁实践:基于GitHub Actions与大模型的代码审查自动化

1. 先搞清楚:传统 CI 卡不住的那些问题 先说个很多团队都遇到过的场景:PR 提交上来,流水线亮绿灯——编译过了、单测过了、覆盖率没跌、Lint 也没报错,看起来一切正常。结果人工 review 的时候发现,整个 PR 只是把某个…

2026/10/17 13:16:24 阅读更多 →
用 Deep Agents 构建生产级 Agent Harness:基于 LangGraph+LangChain 的长周期智能体实践与 TaoToken 接入

用 Deep Agents 构建生产级 Agent Harness:基于 LangGraph+LangChain 的长周期智能体实践与 TaoToken 接入

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

2026/10/17 13:16:24 阅读更多 →
深度学习GPU环境排查:cuDNN卷积算法获取失败报错的解决方案

深度学习GPU环境排查:cuDNN卷积算法获取失败报错的解决方案

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

2026/10/17 13:16:24 阅读更多 →
物联网+区块链四大落地方向:设备可信、轻量存证、协同治理与隐私增强

物联网+区块链四大落地方向:设备可信、轻量存证、协同治理与隐私增强

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

2026/10/17 13:16:24 阅读更多 →
Django电商性能优化:FastDFS、页面静态化与Redis缓存实战

Django电商性能优化:FastDFS、页面静态化与Redis缓存实战

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

2026/10/17 13:15:23 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →