news 2026/10/15 1:05:23

两串锂电池均衡方案:STM32+MP2642GR-Z实现20mV压差收敛

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
两串锂电池均衡方案:STM32+MP2642GR-Z实现20mV压差收敛

做储能和备用电源系统这一年多,我最大的感触是:电芯越多,大家越重视均衡;反倒只有两串电芯的小系统,经常有人觉得“两个电池而已,随便控制一下就行”,结果翻车往往都翻在这种地方。这次把一套用在小型UPS备电模块和储能电池包里的两串均衡方案完整记录下来——主控是STM32F100ZE,均衡核心是MP2642GR-Z,目标是让两个串联电池单元的电压差稳定收敛在20mV以内,同时兼顾备用电源的长期浮充和储能系统的循环充放两种工况。这篇内容适合正在做小容量锂电池BMS、储能从控板或备用电源模块的工程师参考,也适合想了解“两串电池到底需不需要认真做均衡”的入门读者。

在两串系统里,均衡不是可选项,而是电芯一致性和安全性的底线。整套方案的难点其实不在电路有多复杂,而在于采样路径、均衡时机和软件策略这些“看起来不起眼”的细节。下面按我实际开发的顺序,把需求、选型、硬件、软件和调试过程完整拆开讲。

1. 两串电池的均衡需求:为什么“电芯少”反而更容易出问题

1.1 串联电芯的不一致来源与木桶效应

两个电芯串联,流过它们的电流完全一样,但这不代表它们的状态会一样。出厂时同批电芯的容量、内阻、自放电率本来就有离散性;使用过程中,靠近发热源的电芯温度高、衰减快,远离热源的电芯相对“悠闲”;在备用电源里长期浮充时,自放电大的那节会悄悄“掉队”。这些问题在两个电芯上都会出现,只是大家习惯性认为“两个嘛,差异能有多大”。

差异有多大,做个简单实验就知道。我在一个模拟项目X里故意把一颗新电芯和一颗已经循环了三百多次的老化电芯串联在一起,同样的电流跑一个充放循环,两者的SOC差距可以被拉开到百分之十几。串联电池包就像一个木桶,容量由最低的那块板决定:放电时电压低的电芯先触底,保护板直接切断输出,另一节再有力气也送不出来;充电时电压高的电芯先到4.2V(或磷酸铁锂的3.65V),如果还继续充,轻则加速衰减,重则析锂胀气,那就是安全隐患了。

所以两串系统的均衡,本质上是给“先到边界”的那节电芯单独泄压,让落后电芯有机会追上,把整组电池的可用容量和寿命拉回来。

1.2 备用电源浮充与储能循环:两种典型工况下的均衡窗口

我在方案里同时面对了两类应用,它们对均衡时机的要求完全不一样,这也是最开始花时间琢磨的地方。

一类是备用电源。系统大部分时间挂在浮充电压上,比如磷酸铁锂两串,整组浮充7.3V左右,长期涓流维持。此时如果两节电芯不平衡,高电芯会持续承受偏高的电压,浮充电流也会异常偏大,电芯内部持续发生副反应。这类工况的均衡窗口是“一直在”——只要总压处于浮充区间,就可以对高电芯进行小电流泄放,前提是控制在安全电流内,不要造成过热。

另一类是储能循环应用。电池组每天充放一到两次,均衡根本来不及在整个循环里做,最有效的窗口是充电末期的恒压(CV)阶段,以及充满之后的静置期。CV阶段高电芯已经到设定电压,充电电流自然减小,此时打开高电芯的泄放回路,充电器会继续为低电芯补充电荷,相当于把不平衡的能量“挪”过去。静置期均衡则适合处理自放电差异造成的小幅压差。

两类工况的差异用表格看更清楚:

工况典型总压范围均衡时机主要限制
备用电源浮充7.2V ~ 7.4V(LFP两串)持续小电流泄放泄放电流不宜过大,注意温升
储能循环充电充电恒压阶段CV阶段开启单次时长限制,超时报故障
储能循环静置静置开路电压小电流修正低SOC时不均衡,防过放
大电流放电放电平台禁止均衡避免SOC估算错乱与无谓损耗

这段需求梳理直接决定了后面的策略设计:均衡不是“压差大了就开一下”这么简单,必须知道当前系统处于什么状态,才能决定开、关、开多大力道。

2. 方案定型:MP2642GR-Z 扛起模拟,STM32F100ZE 掌管策略

2.1 为什么不让 MCU 直接去测两节电芯

很多业余方案喜欢用MCU自带的ADC直接采样两节电芯电压,省一颗料。但这里有个绕不开的问题:两节电芯串联后,底节电芯对地是0~4.2V,顶节电芯对地是4.2V~8.4V,而MCU的ADC输入范围是0~3.3V单端。要测顶节,必须先做差分衰减,把(顶节电压-底节电压)压到ADC范围内。

听起来不难,实际做起来全是坑。分压电阻的1%误差直接把采样精度打到几十毫伏,超出均衡死区好几倍;运放方案需要0.1%的精密电阻匹配,还要做零点校准;更麻烦的是均衡开启时,泄放电流会在功率路径的铜箔上产生毫伏级压降,如果采样点取在功率路径上,读到的电压根本就不是电芯真实端电压。

MP2642GR-Z这类专用均衡芯片把这些脏活全干了。按我手上样片的典型用法,它内部集成了两节电芯的电压采样通路、精密基准和两个平衡开关管,MCU通过I2C接口读回电压数据,写入控制位即可打开某一路的泄放回路。芯片的感测引脚直接接电芯极耳,测量的是电芯真实端电压,不经过大电流路径。这就把“模拟精度”这摊事从主控身上剥离了,MCU只需要处理数字量和策略。

寄存器映射的具体偏移地址和位定义,不同批次和封装可能有差异,我这边就不贴死地址了,实际开发时一定以这颗料的最新数据手册为准。但整体逻辑都是通用的:读电压、读温度、配置均衡电流、使能通道、查询故障标志。

2.2 三套候选方案的BOM与开发周期对比

选型阶段我做过三套方案对比。第一套是完全分立:精密运放放大差分信号、MCU内部ADC采样、外置平衡MOS管和大功率泄放电阻,零件多、每个环节都有误差来源,调试周期至少两周起,还要做产线校准。第二套就是现在的MP2642GR-Z加STM32F100ZE。第三套是直接用支持两串的多串BMS AFE,性能最强,但对两串应用来说功能冗余、价格偏高,而且AFE的寄存器体系复杂,学习成本不划算。

方案核心零件数采样精度开发周期综合成本
分立运放+MOS方案12~15颗依赖电阻匹配,易漂移2~3周,需校准材料低,工时高
专用均衡IC+STM32F100ZE8~10颗芯片内置基准,稳定1周左右适中,性价比最高
多串BMS AFE5~6颗高寄存器复杂,上手慢对两串偏贵

开发周期差异很明显:分立方案大部分时间不是在写代码,而是在跟温漂和电阻公差作斗争;专用IC方案把精度问题在芯片内部解决,我的精力可以集中在策略和保护逻辑上,这也是我最终选择这套组合的原因。

2.3 性能分配:STM32F100ZE 在这里到底负责什么

有人会问,STM32F100ZE已经是高密度型号,512KB Flash,144脚封装,拿来做两串均衡是不是大材小用?实际不然。我选中它不是因为性能需求,而是因为它在项目组的物料池里,价格稳定、供货靠谱,而且片上的多路USART、I2C、定时器和GPIO富余量很大。

在这套系统里它的分工很清楚:一个I2C接口挂MP2642GR-Z,一个USART接RS-485收发器与上位机通信,若干GPIO控制保护逻辑、状态指示灯和继电器,定时器产生1ms系统Tick,看门狗负责兜底。主频虽然只有24MHz,但对于一个采样周期10ms、决策周期100ms的均衡状态机来说,余量非常大。

这引出一个做嵌入式BMS的心得:主控的算力需求不是由“功能复杂度”决定的,而是由“状态切换频率”决定的。均衡系统一天最多切换几十次状态,真正吃资源的是通信协议和故障记录,而不是均衡算法本身。

3. 硬件层面的三个关键细节:采样、泄放功耗、地弹

3.1 电压采样要用开尔文接法,别让均衡电流掺和进来

硬件上最容易翻车的地方是采样走线。MP2642GR-Z的感测引脚必须从电芯极耳单独引细线,不能和均衡泄放电流的功率走线共用路径。这个道理和四线制测电阻一样:采样线上几乎没有电流,导线压降可以忽略,读到的才是电芯真实端电压;一旦采样线和功率走线共用,均衡电流哪怕只有80mA,在几十毫欧的铜箔上也能产生几毫伏误差,这误差刚好会干扰均衡判据,造成误开误关。

我实际画板时,从电芯连接器到均衡芯片的感测脚走0.3mm细线,串一个100Ω电阻再加0.1µF电容做RC滤波,截止频率约16kHz,可以有效滤掉开关噪声。滤波电阻的压降也要考虑:100Ω乘以感测引脚的漏电流(微安级),只有零点几毫伏,完全可接受。如果芯片规格书里对感测脚输入阻抗有特殊要求,滤波电阻值要相应调整。

另一个容易忽略的点是,均衡泄放电阻的功率回路要尽量靠近电池连接器,不要绕大圈。绕圈等于给泄放电流增加寄生电感,开关瞬间会产生电压尖峰,这个尖峰通过空间耦合进采样线,表现为ADC偶发跳变。

3.2 均衡泄放回路的电流选择与电阻功耗计算

被动均衡的本质是把高电芯多余的能量通过电阻变成热量耗掉。泄放电流选多大,决定了均衡速度和发热量之间的平衡。

我用的是80mA档位,理由是:两串小系统通常容量在1Ah到5Ah之间,80mA相对于容量来说不会造成明显的电压塌陷,也不至于让单颗电阻热得离谱。选电阻时按最恶劣情况计算:假设磷酸铁锂电芯在CV阶段被均衡,端电压约为3.6V,那么泄放电阻的阻值R = U / I = 3.6V / 0.08A = 45Ω,取标称47Ω。此时实际电流约77mA,电阻功耗P = I² × R = 0.077² × 47 ≈ 0.28W。

光看0.28W会选0.5W的电阻,但实际产品要过60℃环境温度测试,0.5W电阻在高温下降额后余量不足。我最后选了1W、2512封装的电阻,PCB下方再多铺铜散热。一些备选档位也列出来供参考:

目标电流电阻值实际功耗推荐封装
60mA56Ω0.2W0.5W/2512
80mA47Ω0.3W1W/2512
100mA33Ω0.33W1W/2512

均衡电阻的发热还会影响隔壁电芯的温度,特别是两个电芯距离近的小模块。我在结构上让泄放电阻尽量靠近外壳散热面,而且软件里加了温度窗口:电芯温度超过45℃就禁止均衡,宁可慢一点,也不能在高温下额外发热。

3.3 供电与地线处理:别小看几十毫安的开关瞬态

这块板上有两个供电域:一是从电池组总压经过降压得到3.3V给MCU和均衡芯片供电,二是均衡泄放的大电流开关回路。均衡开关每开启或关闭一次,泄放电流从0跳到80mA或从80mA跳回0,这个瞬态在PCB地线上会产生压降,如果模拟地和功率地混在一起,采样电压就会被污染。

我的处理方式是单点星型接地:均衡泄放电阻的功率地单独走一段粗铜箔,回到电池连接器的负极;MCU、均衡芯片、RS-485收发器的模拟地另走一段,在电池负极汇合。两个地之间只在一个点相连。MCU供电入口放10µF钽电容和100nF陶瓷电容,均衡芯片供电脚附近再放1µF小电容做局部去耦。

供电拓扑上还有一个取舍:直接用LDO从8.4V降到3.3V,压差大、效率低、发热可观;用DCDC效率高,但开关噪声可能耦合进采样回路。我最终用了LDO配合低功耗设计,因为整板电流很小,均衡电流不经过LDO,LDO只给MCU和芯片供电,总电流几十毫安以内,发热可接受,噪声问题也最省心。

在这里额外提醒一句:RS-485端子的地必须和主板地隔离好,通信电缆容易成为外部干扰的入口。项目要求不高时可以用共地方式,但对外接口建议加隔离;至少要在MCU的UART引脚上串保护电阻,防止热插拔损坏。

4. 软件与算法:怎样让两节电芯的压差“收敛”而不是“震荡”

4.1 采样滤波与运行状态机

软件部分我采用了裸机状态机,没有上RTOS。理由很直接:均衡逻辑本身是线性的,用RTOS反而增加调度不确定性和调试难度。1ms的SysTick作为时间基准,10ms执行一次电压采样,100ms执行一次策略判断,500ms通过RS-485上报一次状态。

电压采样不能拿来直接用。均衡开关动作、DCDC噪声、通信干扰都会让采样值出现毛刺。我在10ms采样的基础上做了两步滤波:第一步是5点中值滤波,去掉最大的毛刺;第二步是对中值结果再做4次移动平均,得到平滑后的电压值。这个组合能同时对付脉冲噪声和随机抖动,又不引入明显的相位滞后。

状态机分为四个状态:空闲(IDLE)、充电均衡(CHARGE_BALANCE)、静置均衡(REST_BALANCE)、故障(FAULT)。切换条件包括充电状态、电流方向、总压区间和温度窗口。充电均衡和静置均衡的区别在于泄放电流档位:充电时允许80mA,静置时降到40mA,减少不必要的发热和能量浪费。

4.2 均衡判据、滞环与收敛时间估算

均衡判据是整个软件的核心。我用的规则很简单:两节电芯压差大于启动阈值时,对电压高的那节开启泄放;压差回落到停止阈值时关闭。关键是两个阈值之间要留滞环,否则压差在阈值附近抖动时,均衡会反复开断,形成“乒乓效应”,对MOS管和采样系统都是折磨。

我的参数配置如下:

参数数值说明
启动阈值30mV压差超过则开启均衡
停止阈值15mV压差回落到15mV以内停止
均衡温度窗口10℃ ~ 45℃超出区间禁止均衡
单次均衡超时60分钟超时后报故障或降级
禁止均衡总压下限5.8V低SOC时防止两节都被放空

伪代码逻辑大致如下,具体寄存器操作以芯片手册为准:

// 均衡控制伪代码 uint16_t v1 = read_cell_voltage(CELL1); uint16_t v2 = read_cell_voltage(CELL2); int32_t delta_mv = v1 - v2; if (balance_allowed(state, temperature_mv, pack_mv)) { if (delta_mv >= BAL_START_MV) { set_balance_channel(delta_mv > 0 ? CHANNEL_1 : CHANNEL_2); balance_timer_reset(); } else if (delta_mv <= BAL_STOP_MV) { set_balance_channel(0); // 关闭所有均衡 } } else { set_balance_channel(0); }

收敛时间可以粗估。在磷酸铁锂的平台期,几十毫伏的压差对应百分之几到百分之十几的SOC偏差。拿1Ah电芯举例,假设压差80mV对应约60mAh的电荷量不平衡,以80mA泄放电流计算,理论需要45分钟;考虑到平台期电压变化缓慢、均衡效率不是100%,实际需要一小时左右。这个数量级和我会话记录里的实测收敛时间基本吻合。

4.3 保护逻辑:均衡不是想开就开

均衡功能有一个基本原则:它本身不能制造安全问题。所以我把均衡使能的约束条件写得很严格。

第一,总压下限保护。低SOC时两节电芯本身电压都不高,这时候强行均衡,等于把高电芯的能量白白泄放掉,还可能把两节都放到截止电压以下。低SOC状态下只监控,不均衡。

第二,单次时长保护。如果压差一直降不下来,说明电芯内部可能有异常(比如微短路),不能让它一直泄放发热。连续均衡60分钟后压差仍然超过启动阈值,我会先把均衡关闭,记录一条故障日志,再降级处理而不是直接报警——避免瞬时干扰导致误报。

第三,故障联动。均衡芯片报出过温、过压等故障标志后,MCU必须在下一个控制周期内关闭所有均衡通道,并进入故障状态。这个动作不能依赖通信轮询的周期,最好用芯片的故障中断引脚触发MCU的外部中断,做到毫秒级响应。

4.4 与上位机的Modbus对接经验

这套系统需要向储能控制器或UPS主机上报数据,我用的是RS-485加Modbus RTU协议,寄存器表里放了四个关键量:电芯1电压、电芯2电压、电芯温度、均衡状态和故障码。此外还留了几个可写的参数寄存器,用于现场调整均衡启动阈值和温度窗口,省去重新烧录固件的麻烦。

一个实际经验:Modbus的轮询周期不要设计得太短。储能主站往往挂几十个节点,每个节点都频繁应答会让总线负载过高。我这里上报周期设为500ms,参数读取周期1s,对均衡控制来说完全够用。通信协议上还做了“写后回读”校验,防止现场电磁干扰导致参数误写。

5. 实测数据:从76mV压差到稳定20mV以内的完整记录

5.1 故意做坏一组的实验设计

为了验证策略是否真的有效,我没有用两颗同批次新电芯去做测试——那种测试结果几乎没有参考价值。正经做法是故意制造极端不一致:一颗新电芯配一颗老化电芯,模拟最恶劣的替换场景。

实验对象是两串磷酸铁锂电池包,标称容量1Ah。老化电芯是从报废模组里拆出来的,实测容量只剩约0.78Ah,内阻比新电芯高了约40%。两颗电芯在静置状态下充满,初始电压分别是3.41V和3.33V,压差76mV。这个压差已经超过了大多数“简单均衡方案”的启动阈值,正好用来做压力测试。

5.2 三组对照:不均衡、半均衡、策略到位

第一组对照实验直接关闭均衡功能,重复3次标准充放循环。结果很不意外:第一次循环结束,充电末端压差扩大到96mV;第三次循环结束时,高电芯已经先到3.68V触发充电保护,低电芯才3.55V,组内还剩下约13%的容量没充进去,但系统已经因为保护而停充了。放电方向更难看,低电芯先到2.5V截止,高电芯还剩不少电,整组可用容量被低电芯锁死。

第二组实验只做了“压差超过阈值就开均衡”的简单逻辑,没有滞环、没有状态约束。结果是均衡通道在阈值附近反复开断,MOS管开关频率很高,采样电压也出现明显抖动,均衡效果比预期差很多。这个对照组让我坚定了加滞环和状态机约束的必要性。

第三组实验开启完整策略,同样3次循环。第一次循环充电末端压差从76mV降到41mV;第二次循环末端压差降到18mV;第三次循环末端稳定在12mV左右。之后连续跑了10个循环,压差始终在10mV~20mV之间波动,没有再扩大。

循环次数无均衡末端压差完整策略末端压差
第1次96mV41mV
第2次118mV18mV
第3次超标触发保护12mV
第10次-15mV

收敛速度符合之前的估算:第一轮把最大的不平衡电荷量泄掉,用时最长;后面几轮只是修正循环过程中新产生的小幅偏差,几分钟就结束。

5.3 浮充工况下的表现

备用电源浮充测试也同样重要。把整组挂在7.3V浮充电压上连续运行一周,没有均衡时,老化电芯的自放电更大、电压偏低,新电芯被浮充电流顶在偏高的电位上,两节压差缓慢爬升,稳定在55mV左右,浮充电流也偏大。开启均衡策略后,浮充期间压差被压回20mV以内,浮充电流回落到正常的小电流水平。

这里有个细节值得注意:浮充状态下电压是“顶着上限”的,均衡开启时机不能只看压差,还要看总压是否真的处于浮充区间。如果整组电压只有6.8V,说明系统还没有进入浮充,这时候打开均衡反而会拖慢充电进程。所以我在浮充判断上加了总压7.2V到7.4V的窗口,只有在这个区间才允许持续泄放。

6. 调试路上踩过的三个坑以及最终的处理方式

6.1 I2C 偶发 NACK

第一个坑出现在通信链路上。均衡芯片和数据手册约定的I2C速率是400kHz,我用示波器抓波形发现,在某些批次板子上,主机发送读命令后偶尔收不到ACK,频率不高但很致命——均衡控制命令一旦丢失,可能整轮都不均衡。

排查后发现是两个原因叠加:一是I2C上拉电阻选了10kΩ,总线电容偏大,上升沿过缓;二是两根通信线在板内走线过长,绕过了几个干扰源。解决方法是上拉电阻换成2.2kΩ,把I2C速率降到100kHz,并重新规划走线缩短长度。处理后连续跑应力测试48小时,没有再出现NACK。I2C这种低速总线,上拉电阻宁小勿大,速率宁慢勿快,稳定压倒一切。

6.2 均衡开启瞬间电压采样跳变

第二个坑是MP2642GR-Z读到的电压在均衡开启瞬间发生跳变。均衡电流80mA流过PCB功率走线时,即使采样线独立,功率地与采样地回路之间的共阻抗还是会引入几十毫伏的瞬态压降,而且这个压降持续时间很短,正好落在采样时刻。

我一开始以为是芯片滤波没做好,后来用示波器同时抓均衡开关控制信号和电压输出,才发现是开关瞬态耦合进采样通路。解决办法有两步:软件上在均衡通道刚切换的5ms内丢弃采样值,等瞬态平息后再读取,5ms对10ms采样周期来说很容易实现;硬件上把均衡电阻的功率回路面积缩小,减少寄生电感,尖峰幅度明显下降。两层处理叠加后,采样数据恢复了稳定。

6.3 RS-485 阻塞把看门狗喂死了

第三个坑是看门狗复位。我启用了独立看门狗,但固件里有段RS-485发送逻辑使用了阻塞等待:调用串口发送函数后,不断查询发送完成标志,直到超时。问题是现场总线被外部设备长时间占用时,发送缓冲区一直无法清空,主循环卡在等待里,看门狗得不到喂食,系统反复复位。

排查过程很快——复位之后从故障日志里看到看门狗计数器归零,再配合代码审查定位到阻塞等待。修复思路是所有通信发送改成非阻塞模式,发送失败记错误计数并退出;主循环固定每100ms喂狗一次,确保故障状态下也能按计划复位而不是随机复位。这个教训对所有带外部通信的嵌入式设备都适用:任何可能阻塞超过看门狗周期的代码,都不应该出现在主循环路径上。

6.4 关于“过均衡”的边界讨论

最后聊一个容易被问到的边界问题:均衡会不会把两颗电芯都“均衡”到没电?答案是,如果只盯着压差,确实会。

低SOC状态下,两颗电芯电压都不高,压差可能仍然有几十毫伏。此时如果继续对高电芯泄放,不仅浪费能量,还可能让整组两边都快速逼近截止电压。我在策略里加了总压下限判断,低于5.8V一律禁止均衡。另一个边界是充电未完成时不启动高电流均衡:充电早期电压本来就低,均衡的意义不大,等到CV阶段再动手,效率才是最高的。做过这些约束之后,“过均衡”基本不会发生,剩下的只是阈值参数整定的问题。

做了这几轮调试之后,我最大的体会是:两串均衡方案的技术门槛不在原理图里,而在“边界条件”里。硬件上把采样路径和功率路径分开、软件上把状态约束和滞环写清楚,这个方案就能稳定运行很久。如果你也要做类似的小型储能或备用电源均衡板,建议先想清楚你的系统哪种工况占比最高——备用电源就盯浮充窗口,储能循环就盯CV窗口,策略设计完全不一样。另外一个非常实用的技巧是:样机打样前,故意把两颗不一致电芯装进去做压力测试,这种“坏样本”比任何仿真都能更快暴露设计缺陷。

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

Java二维数组深度解析:声明、初始化、取值与内存模型

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

作者头像 李华
网站建设 2026/10/15 1:03:15

Jenkins 集成 Robot Framework 持续集成配置实战指南

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

作者头像 李华
网站建设 2026/10/15 1:03:03

JDK源码精读:Long包装类的缓存、拆箱与溢出陷阱

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

作者头像 李华
网站建设 2026/10/15 1:02:58

Vue3+Webpack5+Element Plus中后台工程化实战

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

作者头像 李华