Unity WheelCollider载具物理从入门到精通:参数调优与避坑指南
1. 为什么我放弃了刚体加力转向WheelCollider刚接触Unity做载具那会儿我试过最直觉的方案给车壳挂一个Rigidbody用AddForce推着走转向靠直接改transform的rotation。平地上跑起来看着还行但只要速度一快、或者路面稍微有点起伏车就开始飘转弯像在冰面上打滑撞到东西更是直接飞天。后来才明白这套做法本质上是在假装物理轮胎和地面之间没有真正的接触求解摩擦力、侧向抓地力全靠脑补自然经不起推敲。Unity自带的WheelCollider就是为解决这件事而生的。它是一个专门模拟车轮的碰撞体内部封装了一套简化的轮胎物理模型能计算轮胎与地面之间的正向力、纵向摩擦力驱动/制动和侧向摩擦力抓地/侧滑。你不需要自己写轮胎模型只要把参数调对车就能跑出接近真实的手感。这也是为什么绝大多数Unity载具项目无论是竞速Demo还是开放世界里的代步工具底层都绕不开WheelCollider。这篇文章适合两类人一是刚上手Unity、想做个能开的车但被物理搞懵的新手二是用过WheelCollider但总觉得车开起来怪怪的、想搞清楚每个参数到底在干嘛的进阶者。我会从车辆结构搭建讲起把每个关键参数的物理含义、调试方法、以及我踩过的坑都摊开说。读完你应该能独立做出一台转向灵敏、加速线性、过弯不飘的四轮载具并且知道出问题时该动哪个旋钮。先说一个核心认知WheelCollider负责物理车轮的视觉模型是另一回事。WheelCollider本身在Scene视图里只是一个绿色的圆柱线框它不渲染任何东西。你看到的轮胎、轮毂是另外挂上去的Mesh。这两者要同步但职责分离。理解这一点后面很多问题就顺了。2. 车辆骨架的搭建顺序与层级设计2.1 先想清楚层级再动手摆模型很多人一上来就把车模型拖进场景然后到处挂脚本最后层级乱成一团轮子转起来位置全错。正确的顺序是先设计层级再填内容。我习惯的层级结构是这样的Car空物体挂Rigidbody和主控脚本Body车身视觉模型WheelColliders空物体容器WC_FL / WC_FR / WC_RL / WC_RR四个WheelColliderWheelMeshes空物体容器Mesh_FL / Mesh_FR / Mesh_RL / Mesh_RR四个车轮视觉模型为什么要把WheelCollider和视觉Mesh分成两个容器因为它们的更新逻辑不同。WheelCollider由物理引擎驱动位置基本固定除非你做悬挂行程的视觉补偿而视觉Mesh需要每帧读取WheelCollider的状态来同步旋转和位置。分开管理脚本里遍历清晰调试时也能单独隐藏某一层看效果。Rigidbody挂在最顶层的Car上质量Mass建议设在1000到1500之间这个量级和WheelCollider的默认参数比较匹配。质量太小比如100车会轻飘飘容易被撞飞质量太大比如5000悬挂会被压得死死的弹簧参数得跟着大改。我一般从1200起步。2.2 四个轮子的位置不是随便摆的轮子的X、Z坐标决定了轴距前后轮Z方向距离和轮距左右轮X方向距离这两个值直接影响操控。轴距长高速稳但转弯笨轴距短灵活但容易甩尾。轮距宽抗侧翻强轮距窄容易翻车。我的经验值对于一台普通轿车比例的模型轴距设在2.5到3.0之间轮距设在1.5到1.8之间比较均衡。轮子的Y坐标高度要让它刚好接触地面——WheelCollider的半径Radius决定了它的下沿位置轮子中心的高度应该等于Radius这样静止时轮胎正好贴地。比如Radius设0.34轮子中心Y就设0.34。注意WheelCollider的Radius和视觉Mesh的半径要一致否则会出现物理轮子悬空但视觉轮子贴地或者反过来的穿模现象。摆位置时先调WheelCollider再让Mesh去对齐它。2.3 Rigidbody的关键设置Rigidbody上有几个设置对载具特别重要。Drag阻力设0.05左右Angular Drag角阻力设0.5到1之间这两个值能防止车在没输入时无限滑行。更重要的是Interpolate设为Interpolate否则高速行驶时车会看起来一顿一顿的因为物理更新频率和渲染帧率不同步。还有一个容易被忽略的Collision Detection建议设为Continuous Dynamic。默认的Discrete在高速下可能让车穿过薄墙Continuous Dynamic会做连续碰撞检测代价是性能略高但对载具来说值得。3. WheelCollider参数逐个拆解每个数字背后的物理3.1 Mass和Radius最基础也最容易错Mass质量是单个轮子的质量不是整车质量。它影响的是轮子的转动惯量进而影响加速时轮胎打滑的程度。默认值1通常偏小我一般设20到40之间。设太小轮子太轻一给扭矩就空转打滑设太大加速迟钝。Radius半径前面提过要和视觉一致。它决定了轮子转一圈前进的距离周长2πr所以如果你发现车的实际速度和理论速度对不上先检查Radius。Wheel Damping Rate轮子阻尼率默认0.25控制轮子自由转动时的衰减。一般不用动除非你发现松开油门后轮子还在疯狂空转。3.2 Suspension Distance和弹簧悬挂是手感的灵魂Suspension Distance悬挂行程是轮子相对车身能上下移动的最大距离默认0.3。这个值决定了过坎时车身的起伏幅度。设太小过个小坑就颠得厉害设太大车身像坐船一样晃。我一般设0.2到0.3。悬挂的核心是Spring弹簧和Damper阻尼它们藏在WheelCollider展开的Suspension Spring里。这里有个关键概念弹簧刚度Spring决定支撑力阻尼Damper决定震荡衰减速度。Spring设太小车身压下去弹不回来像悬挂断了。Spring设太大车身硬邦邦过坎直接弹飞。Damper设太小车身会一直上下弹跳停不下来。Damper设太大悬挂变得迟钝吸收不了冲击。我的调法Spring从30000起步Damper从3000起步然后根据车重微调。车重越大Spring要越大。有个粗略公式Spring ≈ 车重 × 重力加速度 / 轮子数量 / 期望压缩量。比如1200kg的车4个轮子期望悬挂压缩0.1米那每个轮子承受约3000N的力Spring ≈ 3000 / 0.1 30000。这个算法不精确但能给你一个合理起点。3.3 Forward Friction和Sideways Friction抓地力的两个维度这是WheelCollider最精髓也最难调的部分。摩擦力用Extremum Slip/Value和Asymptote Slip/Value四个点来描述一条曲线。Forward Friction纵向摩擦管的是驱动和制动时的抓地。曲线含义是滑移率Slip从0开始增大摩擦力先上升到一个峰值Extremum然后下降到稳定值Asymptote。Extremum Value就是最大静摩擦力Asymptote Value是滑动摩擦力。默认值Extremum Slip 0.4、Value 1Asymptote Slip 0.8、Value 0.5。意思是滑移率到0.4时抓地力最大1到0.8时降到0.5。如果你觉得车起步容易打滑可以提高Extremum Value比如到1.5让最大抓地力更强。Sideways Friction侧向摩擦管的是转弯时的抓地直接决定车会不会甩尾。默认Extremum Slip 0.2、Value 1Asymptote Slip 0.5、Value 0.75。如果你觉得车过弯太容易漂就提高Extremum Value和Asymptote Value如果觉得转向太死、转不动就适当降低。提示侧向摩擦的Stiffness刚度系数也很关键默认1。调这个比调曲线更省事——想更抓地就调到1.2到1.5想更容易漂移就降到0.8到0.9。3.4 参数速查表参数作用我的常用值调大效果调小效果Mass轮子质量20-40加速迟钝易打滑Radius轮子半径与Mesh一致速度偏快速度偏慢Suspension Distance悬挂行程0.2-0.3起伏大颠簸硬Spring弹簧刚度30000悬挂硬支撑不足Damper阻尼3000迟钝持续弹跳Forward Extremum Value纵向最大抓地1.0-1.5不易打滑易空转Sideways Extremum Value侧向最大抓地1.0-1.5不易甩尾易漂移4. 驱动、转向与视觉同步的脚本实现4.1 驱动逻辑扭矩给谁怎么给WheelCollider通过motorTorque属性接收驱动力。四驱就是四个轮子都给前驱给前两个后驱给后两个。扭矩大小和车的加速能力直接相关我一般从每轮500到1500起步根据车重和想要的加速感调。这里有个关键点扭矩不是恒定的应该随速度衰减。如果一直给满扭矩车会无限加速到很夸张的速度。我的做法是写一个简单的速度-扭矩曲线// 根据当前速度计算扭矩系数 float speed carRigidbody.velocity.magnitude; float torqueFactor Mathf.Clamp01(1f - speed / maxSpeed); float torque maxTorque * torqueFactor * input;这样速度越接近maxSpeed扭矩越小形成自然的加速曲线。maxSpeed设30到50单位是米/秒约108到180km/h比较合理。转向用steerAngle属性前轮设置即可。转向角度不要给太大最大30度左右否则低速时转向过于灵敏。同样建议做速度衰减高速时减小转向角否则一打方向就翻车。float steerFactor Mathf.Lerp(1f, 0.4f, speed / maxSpeed); float steer maxSteerAngle * steerFactor * input;4.2 视觉同步GetWorldPose的正确用法WheelCollider的位置和旋转要通过GetWorldPose方法读取然后赋给视觉MeshVector3 pos; Quaternion rot; wheelCollider.GetWorldPose(out pos, out rot); wheelMesh.transform.position pos; wheelMesh.transform.rotation rot;但这里有个坑GetWorldPose返回的旋转包含了轮子的转向和滚动但视觉Mesh的初始朝向必须和WheelCollider一致。如果Mesh的本地坐标轴和WheelCollider对不上轮子会转得乱七八糟。我的做法是让视觉Mesh的forward轴指向轮子前进方向up轴朝上这样GetWorldPose出来的旋转直接能用。还有一个细节悬挂行程的视觉补偿。WheelCollider在悬挂压缩时它的中心会上下移动GetWorldPose会反映这个位移。但如果你希望车身视觉上也有相应的起伏而不是轮子单独动那就需要额外处理车身模型的Y偏移。简单做法是让车身Mesh跟随四个轮子位置的平均值做轻微上下浮动。4.3 刹车与手刹刹车用brakeTorque给四个轮子同时施加。手刹一般只给后轮且扭矩要大用来做甩尾。刹车扭矩我一般设3000到6000手刹设8000到10000。注意刹车扭矩和驱动扭矩是独立的可以同时存在比如一边加速一边刹车虽然现实中不合理但物理上允许。注意刹车扭矩给太大且瞬间施加车会突然点头甚至前翻。建议刹车也做个渐变用Mathf.Lerp平滑过渡。5. 调参过程中那些让人抓狂的坑5.1 车原地抖动或乱跳这是最常见的问题原因通常有三个。第一悬挂Spring和Damper不匹配弹簧太硬阻尼太小车会一直弹。解决方法是增大Damper或减小Spring。第二WheelCollider的Radius和实际接触不匹配导致物理引擎反复修正穿透。检查轮子中心高度是否等于Radius。第三Rigidbody的Mass和WheelCollider的Mass比例失调整车太重轮子太轻物理求解不稳定。试着把轮子Mass调大。我遇到过一次特别诡异的抖动查了半天发现是车身的碰撞体BoxCollider底部穿过了轮子中心导致车身和地面直接碰撞和轮子的物理打架。解决办法是把车身碰撞体抬高让它底部高于轮子中心。5.2 转向时车像在冰上滑这几乎肯定是侧向摩擦力不够。先检查Sideways Friction的Extremum Value和Stiffness。如果都调高了还滑那可能是重心太高。Rigidbody的Center of Mass默认在几何中心如果车身模型很高重心就高转弯容易侧倾甚至翻车。手动把Center of Mass的Y值调低比如设成-0.5车会稳很多。carRigidbody.centerOfMass new Vector3(0, -0.5f, 0);这一行代码解决过我80%的翻车问题强烈建议一开始就加上。5.3 加速时车头抬起、刹车时车头下沉过度这是俯仰Pitch问题根源是重心和悬挂的配合。重心太靠后加速时后轮压缩、前轮伸展车头就抬。把Center of Mass往前移一点能缓解。另外前后轮的Spring可以设不同值前轮稍硬、后轮稍软能抑制加速抬头。5.4 轮子视觉旋转方向反了如果轮子往前跑但视觉上在倒转说明视觉Mesh的本地坐标轴和WheelCollider的旋转轴不一致。WheelCollider绕它的本地X轴滚动假设你按标准朝向摆放视觉Mesh也必须绕对应的轴。检查Mesh的初始旋转必要时在同步时给rot乘一个修正四元数。5.5 高速时车穿墙或穿透地面前面提过把Collision Detection设为Continuous Dynamic。另外如果地面是薄片比如Plane物理引擎可能检测不到换成有厚度的BoxCollider做地面。6. 从能开到好开进阶手感打磨6.1 用曲线控制扭矩输出前面给的是线性衰减但真实车辆的扭矩输出是非线性的。你可以用AnimationCurve在Inspector里画一条扭矩-速度曲线让低速扭矩充沛、高速扭矩平缓。这样加速感更真实也更容易控制最高速。6.2 差速器的简化模拟真车转弯时内外轮转速不同这叫差速。WheelCollider默认各自独立不会自动差速。如果你想要更真实的过弯可以手动计算转弯时内侧轮扭矩减小、外侧轮扭矩增大。简单实现是根据转向角和车速给左右轮分配不同的扭矩系数。不做这个车也能开但过弯会感觉有点推头。6.3 悬挂的视觉表现纯物理的WheelCollider悬挂看起来比较生硬。可以在视觉Mesh上额外加一层弹簧动画让轮子在过坎时有轻微的额外压缩和回弹。做法是读取WheelCollider的suspensionCompression压缩量映射到视觉Mesh的本地Y偏移上加一点阻尼平滑。6.4 音效与粒子手感的另一半物理调好了但没有声音和烟尘开起来还是像玩具。引擎音效的pitch随速度变化轮胎打滑时播放摩擦音刹车时加刹车音。这些虽然不动物理但对手感的贡献极大。我一般用WheelCollider的GetGroundHit方法读取轮子的滑移状态判断是否在打滑然后触发对应的音效和粒子。WheelHit hit; if (wheelCollider.GetGroundHit(out hit)) { float slip Mathf.Abs(hit.forwardSlip) Mathf.Abs(hit.sidewaysSlip); if (slip threshold) { // 触发打滑音效和烟尘 } }6.5 不同路面的摩擦系数如果场景里有草地、沙地、柏油路可以通过修改WheelCollider的摩擦力曲线或者用PhysicMaterial来区分。更灵活的做法是每帧检测轮子下方的地面材质动态调整Sideways Friction的Stiffness。柏油路1.0草地0.6沙地0.4冰面0.2这样开起来才有环境差异感。7. 我个人的调试流程与经验总结调一台车我现在的流程基本固定下来了。第一步摆好层级和位置Radius对齐Center of Mass压低。第二步调悬挂让车静止时不抖、过坎时不飞Spring和Damper反复试。第三步调摩擦先保证直线加速不打滑再保证转弯不甩尾。第四步调驱动和转向曲线让加速和转向手感线性可控。第五步加视觉同步和音效粒子。整个过程最耗时的永远是悬挂和摩擦这两个调好了车就活了。我建议每次只改一个参数改完立刻在场景里跑一圈记录感受。参数之间会互相影响一次改多个出了问题根本不知道是谁的锅。还有个小技巧在Scene视图里把WheelCollider的Gizmo打开能看到它的接触点、受力和滑移情况。调试时盯着那个绿色的接触点看能直观判断轮子是不是真的贴地、有没有打滑。这个可视化比看数字快得多。最后说一句WheelCollider不是万能的。它适合做街车、越野车这类常规载具。如果你要做摩托车、坦克、或者需要极端物理表现的赛车可能得自己写轮胎模型或者用更专业的物理方案。但对绝大多数项目来说把WheelCollider调透已经能做出相当像样的驾驶体验了。

相关新闻

人工智能习题答案文档使用指南:从搜索推理到机器学习的避坑与代码验证

人工智能习题答案文档使用指南:从搜索推理到机器学习的避坑与代码验证

简介:这份Word版人工智能习题答案面向计算机专业学生及备考人工智能课程的读者,针对教材课后习题缺少标准解答、复习时难以自检的痛点,提供系统化的参考答案。资源为单个doc文档,压缩包约560KB,内容按章节组织&#xf…

2026/10/17 14:39:23 阅读更多 →
房源列表页整合前端开发实战:数据流、筛选联动与性能优化

房源列表页整合前端开发实战:数据流、筛选联动与性能优化

1. 房源列表页到底难在哪:从“能跑”到“好用”的分水岭房源列表页看起来是前端开发里最普通的页面之一——顶部筛选栏、中间卡片列表、底部分页器,三件套一摆就能跑起来。但真正做过房产类产品的人都知道,这个页面是前端工程里最容易“翻车”…

2026/10/17 14:39:23 阅读更多 →
BN与Group Normalization选型指南:小批量训练稳定性问题解析

BN与Group Normalization选型指南:小批量训练稳定性问题解析

1. 为什么BN在2024年依然被频繁质疑——从一个被忽略的训练现象说起Group Normalization(GN)和Batch Normalization(BN)的对比,表面看是两种归一化策略的技术选型问题,但背后牵扯的是深度学习模型训练中一个…

2026/10/17 14:38:22 阅读更多 →

最新新闻

跨平台SSL证书导入脚本:Windows与Linux批量部署指南

跨平台SSL证书导入脚本:Windows与Linux批量部署指南

简介:这份资源提供在Windows与Linux系统中导入SSL证书的自动化脚本,面向需要为Web服务配置HTTPS通信的运维人员与系统管理员。压缩包内共2个文件,分别为Linux平台使用的sh脚本与Windows平台使用的bat脚本,包体仅578B,轻…

2026/10/17 16:31:36 阅读更多 →
viewer.min.js图片查看器集成指南:从初始化到避坑实践

viewer.min.js图片查看器集成指南:从初始化到避坑实践

简介:viewer.min.js 是一款轻量级 JavaScript 图像查看器库,面向需要在前端实现图片缩放、旋转、平移等交互效果的前端开发者。资源包以 viewerjs-main 命名,共包含 177 个文件,整体打包 3.14MB,其中以 121 个 js 文件…

2026/10/17 16:31:36 阅读更多 →
信呼OA系统开源部署指南:中小团队低成本的协同办公方案

信呼OA系统开源部署指南:中小团队低成本的协同办公方案

简介:信呼协同办公OA系统v1.8.6提供了一套开源的企业办公自动化解决方案,适合中小型企业和研发团队使用,能够将流程审批、任务协作、日程管理、移动办公等常见需求整合到一个平台中。这个版本在之前基础上优化了系统稳定性和操作体验&#xf…

2026/10/17 16:31:36 阅读更多 →
Flutter蓝牙开发实战:协议设计、插件选型与跨平台适配

Flutter蓝牙开发实战:协议设计、插件选型与跨平台适配

1. 蓝牙协议在 Flutter 项目中的整体设计思路1.1 为什么要在移动端项目里引入蓝牙能力做移动端项目时间长了,总会碰到一类需求:设备不在云端,也不走 Wi-Fi,而是靠蓝牙近距离通信。比如智能手环同步步数、体脂秤回传数据、便携打印…

2026/10/17 16:31:36 阅读更多 →
油猴脚本从入门到实战:安装配置与高效使用指南

油猴脚本从入门到实战:安装配置与高效使用指南

1. 先搞懂油猴插件到底是什么说到油猴插件,很多人的第一反应是:听说过,但一直没搞懂。以为它是什么灰色地带的黑科技,或者觉得那是程序员才折腾的东西。今天把话说透,油猴插件/脚本就是一个运行在浏览器里的轻量小助手…

2026/10/17 16:31:36 阅读更多 →
TortoiseGit绿色对勾消失?从图标覆盖到注册表抢位的完整排查指南

TortoiseGit绿色对勾消失?从图标覆盖到注册表抢位的完整排查指南

那天我像往常一样打开资源管理器,突然发现整个工作目录的文件夹都变成了最普通的黄色小文件夹——TortoiseGit 的绿色对勾不见了。第一反应是仓库坏了,赶紧打开终端跑了个 git status ,结果文件状态一切正常,也没有任何报错。那…

2026/10/17 16:30:36 阅读更多 →

日新闻

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 阅读更多 →