基于Matlab的锂离子电池宽频EIS阻抗谱计算与拟合实践

发布时间:2026/10/20 1:45:39

基于Matlab的锂离子电池宽频EIS阻抗谱计算与拟合实践 锂离子电池的阻抗特性说白了就是电池在充放电过程中内部电荷传递、离子扩散、界面膜形成等一系列物理化学过程的综合体现。之前做项目时我花了不少时间在某一充电状态下测一条完整的宽频阻抗谱测完还要手工分段拟合一个数据点一个数据点地挑效率非常低。后来我把这套流程整理成了一套基于Matlab的计算脚本核心是在不同充电状态State of Charge, SOC下自动完成宽带电化学阻抗谱EIS的数值计算与拟合。这篇博文就把整个研究思路、原理、实现步骤和踩过的坑写清楚希望对正在做电池建模、BMS算法或老化诊断的同行有帮助。1. 为什么要在不同充电状态下测量阻抗谱锂电池的阻抗不是一个固定值。同一个电芯在10%电量和80%电量下测出来的Nyquist图差异非常大。原因在于不同SOC对应着不同的电极材料嵌锂浓度、不同的电解液界面状态、甚至不同的温度分布这些都会直接影响电荷传递电阻和扩散阻抗。1.1 SOC对阻抗影响的物理本质负极石墨材料的嵌锂过程分阶段进行。低SOC时石墨负极表面锂离子浓度低界面电荷传递反应速率慢所以电荷传递电阻偏大随着SOC升高负极嵌锂量增加反应活性增强中段SOC区间的电荷传递电阻通常最小。正极材料比如三元或磷酸铁锂也有类似规律而且正极的相变过程会在特定SOC附近导致阻抗特性突变。除了电极本身SEI膜固体电解质界面膜的阻抗、电解液中的离子电导率也会随SOC变化。特别是低温或高倍率条件下同一个电芯在不同SOC下的阻抗差异会更加明显。这也是为什么BMS在做状态估计时不能简单用一条固定的阻抗曲线去描述电池的动态特性。1.2 宽频阻抗谱的特殊价值传统EIS测试通常只覆盖10kHz到10mHz左右的频率范围但宽频EIS会把频率下限扩展到μHz级别或者把上限推到MHz级别。低频段主要反映锂离子在活性颗粒内部的固相扩散过程这对判断电池的老化状态、析锂风险非常关键高频段则能解析接触阻抗和电解液电阻的细微变化。把全频段的阻抗数据整合起来才能更完整地描述电池内部各过程的动力学参数。从工程角度讲不同SOC下的宽频阻抗谱数据是电化学模型参数辨识的基础。比如基于pseudo-two-dimensionalP2D模型的参数校准、等效电路模型的参数辨识、甚至基于阻抗谱的快速SOH估计都依赖于这套数据。2. 实验设计与数据获取宽频EIS不是简单扫个频率要计算不同SOC下的宽频阻抗谱首先得有一套可靠的实验方案。这里我用的对象是商用18650三元电芯标称容量2.5Ah测试温度为25摄氏度恒温环境。2.1 硬件配置与测试流程EIS测量通常用电化学工作站完成但宽带阻抗谱对设备要求比较高。我选择的方案是电化学工作站配大电流放大器频率范围从10mHz到100kHz每个频率点至少采集5个周期取平均。整个测试流程按下面几步走先用标准1C恒流恒压CC-CV流程把电池充满静置2小时让电池内部达到平衡态。以0.5C电流放电到目标SOC比如每10%设一个测试点从100%、90%、80%……一直测到10%。每到一个SOC点静置1小时以上确保开路电压稳定、浓度梯度充分弛豫。依次施加正弦激励信号振幅设为电池电压的5mV左右避免大信号激励引起非线性效应。完整采集阻抗谱后再把电池继续放电到下一个SOC点。有个细节需要注意放电到中间SOC点时电压下降速度比较快如果静置时间不够测出来的阻抗谱中低频段会带明显的漂移。我做过对照实验静置30分钟和静置2小时测出来的低频扩散弧差别很大后者的重复性明显更好。2.2 数据有效性校验电化学阻抗谱测量有个基本校验规则叫做Kramers-KronigKK检验。意思是说对于一个稳定的线性时不变系统实部和虚部之间存在确定性的积分关系。如果实验测出来的数据不满足KK关系说明系统不稳定数据不可信。我最初测的几个SOC点低频段KK检验残差特别大检查了很久才发现是夹具接触不良导致的高频抖动。换成压力夹具并重新打磨极耳接触面之后残差降到了0.5%以内。建议大家在做正式拟合之前先把所有阻抗数据过一遍KK检验这是最基本的数据质量门槛。多数商用EIS软件自带这个功能Matlab里也可以用自定义积分核函数实现。2.3 多SOC下的典型阻抗图谱特征把所有SOC点的Nyquist图叠在一起可以看到非常明显的变化趋势。低SOC区域10%-30%高频区半圆明显更大说明电荷传递电阻偏大中SOC区域40%-70%半圆直径缩到最小整体阻抗最低高SOC区域80%-100%半圆又逐渐增大。低频扩散支线在低SOC时倾斜角更接近45度慢扩散特征高SOC时则更偏向纯电容行为。这些图谱特征直接对应着电池内部的微观过程变化。拟合的时候如果只用一个固定拓扑的等效电路去套所有SOC点一定会出问题因为不同SOC区间主导的物理过程发生了变化。3. 等效电路模型与参数辨识从ZView走向Matlab自动化等效电路模型ECM是锂离子电池EIS分析的经典工具。常见的拓扑有一阶RC、二阶RC、含Warburg元件的扩散模型等。针对宽频EIS数据我推荐使用R (R//CPE) (R//CPE) W这种结构也有人会把高频感应支路加进去但一般情况下用不到。3.1 为什么用CPE而不是纯电容实测的EIS半圆圆心通常不在实轴上而是下沉到实轴下方这说明电极界面存在弥散效应用理想电容无法描述。于是引入常相位角元件CPE其阻抗表达式为Z_CPE 1 / (Y0 * (j*w)^n)其中n的取值范围是0到1。n1时CPE退化为理想电容n0时退化为纯电阻。n值偏离1的程度可以反映电极表面的粗糙度、孔隙率和电流分布不均匀性。在拟合中n通常作为自由参数参与优化初始值设在0.8到0.95之间比较合理。用CPE替换纯电容以后拟合残差能显著下降。特别是覆盖宽频范围时纯电容模型在高频段和低频段的拟合偏差会叠加CPE能够用更少的参数达到同样的拟合精度。3.2 参数辨识的目标函数与权重阻抗拟合适用的目标函数是最小化加权实部和虚部残差的平方和。但要注意宽频EIS数据的实部与虚部数值跨了多个量级高频段阻抗值可能只有几十毫欧低频段扩散阻值可能到几百毫欧。如果不加权最终拟合会偏向大数值区域。我用的加权方式是每个频率点的权重取该点阻抗模值的倒数等效于在相对误差层面进行拟合。这样可以保证全频段的数据点对拟合结果都有贡献而不会让低频大阻值点主导整个优化过程。3.3 Matlab实现的核心流程这部分直接给核心框架完整的脚本结构包括数据导入、初始参数设置、加权最小二乘优化、结果输出与绘图。优化函数用的是Matlab自带的lsqnonlin然后配上自己写的阻抗模型函数。function Z eis_model(w, P) % P参数顺序: R0, R1, Y01, n1, R2, Y02, n2, Yw R0 P(1); R1 P(2); Y01 P(3); n1 P(4); R2 P(5); Y02 P(6); n2 P(7); Yw P(8); Z_CPE1 1 ./ (Y01 * (1j*w).^n1); Z_CPE2 1 ./ (Y02 * (1j*w).^n2); Z_W 1 ./ (Yw * sqrt(1j*w)); % 简化的Warburg阻抗 Z R0 1 ./ (1./R1 1./Z_CPE1) ... 1 ./ (1./R2 1./Z_CPE2) Z_W; end初始参数不能乱给。R0可以从最高频点的实部读出来R1和R2可以按半圆直径粗略估计Y0的初始值用半圆顶点频率反推。如果初始值偏离太远lsqnonlin很容易收敛到局部极小值。我建议多组初始值并行拟合然后比较目标函数值选择全局最优结果。4. 宽频阻抗谱的计算逻辑与Matlab代码实现这一节是全文实操性最强的部分我直接拆开来讲。4.1 频率轴的生成与激励信号参数宽频EIS数据计算的首要问题是频率轴划分。我采用对数均匀分布10mHz到100kHz范围内按每十倍频程20个点的密度生成频率向量。低频点需要更长的稳定时间实际测试时为了保证信噪比单点测量时长超过2秒整条谱测下来大约需要40分钟。f_min 1e-2; % 10 mHz f_max 1e5; % 100 kHz points_per_decade 20; decades log10(f_max) - log10(f_min); f logspace(log10(f_min), log10(f_max), round(decades * points_per_decade)); w 2 * pi * f;计算阻抗响应时激励信号幅度按线性系统处理直接由传递函数计算。实际使用中为了让计算更贴近实测可以把激励信号和响应信号分别加噪声再作FFT取阻抗但直接在频域计算更快。我的做法是前者用于验证模型后者用于生成合成训练数据。4.2 多SOC批量计算的组织方式每个SOC点对应一组独立参数所以需要把所有SOC点的数据存放在一个结构体数组里。每个SOC计算完成后把拟合参数、残差、拟合曲线和实测数据一起存储。SOC_points [100 90 80 70 60 50 40 30 20 10]; results struct(SOC, {}, params, {}, Z_fit, {}, Z_exp, {}, residual, {}); for k 1:length(SOC_points) soc SOC_points(k); [Z_exp, f] load_eis_data(soc); % 读取实验数据 w 2 * pi * f; P_init initialize_params(soc); % 基于SOC设定初始值 P_fit lsqnonlin((P) obj_fun(P, w, Z_exp), P_init, lb, ub, options); Z_fit eis_model(w, P_fit); results(k).SOC soc; results(k).params P_fit; results(k).Z_fit Z_fit; results(k).Z_exp Z_exp; results(k).residual (real(Z_fit) - real(Z_exp)) ./ abs(Z_exp) ... 1j * (imag(Z_fit) - imag(Z_exp)) ./ abs(Z_exp); end这段逻辑非常关键因为不同SOC点的初始参数差异很大完全可以在initialize_params函数里加入SOC相关的经验公式这样能大幅降低拟合收敛失败率。4.3 显示与输出拟合完成之后需要用可视化检查每个SOC点的拟合质量。我最常用的图是Nyquist图和Bode图每条拟合曲线和实测点用不同符号标记。批量处理时把所有SOC点放在一张图上对比颜色用colormap映射SOC值非常直观。figure; colors jet(length(results)); hold on; for k 1:length(results) plot(real(results(k).Z_exp), -imag(results(k).Z_exp), o, ... Color, colors(k,:), MarkerSize, 5); plot(real(results(k).Z_fit), -imag(results(k).Z_fit), -, ... Color, colors(k,:), LineWidth, 1.2); end xlabel(Z (ohm)); ylabel(-Z (ohm)); title(不同SOC下的宽频EIS实测与拟合对比);还有一个容易忽略的点拟合参数随SOC的连续变化曲线。把R1、R2、Y01、n1等参数对SOC作图可以直接看出参数随SOC的变化规律用于后续建模时参数插值。这个图比单条阻抗谱的信息量更大值得仔细做。5. 拟合结果的物理解读与参数规律计算完成后的数据处理远不止画图参数背后有着非常具体的物理含义。5.1 电荷传递电阻随SOC的非线性变化我在这一组三元电芯数据里R2对应中低频段半圆的电荷传递电阻在SOC 50%附近出现最小值大约实测阻抗值的一半不到SOC 10%时R2增大到最低点的四倍左右。这种变化趋势可以用正负极活性物质嵌锂量的变化来理解。负极石墨在低SOC时处于单相态锂离子嵌入需要克服较大的能垒到中段SOC进入两相共存区域反应活性提高高SOC阶段接近满嵌态界面锂离子浓度接近饱和传质推动力下降电荷传递电阻回升。正极材料的层状结构也会有类似的嵌锂状态变化但转折点位置不同。正是这种多因素耦合构成了阻抗随SOC变化的复杂规律。5.2 CPE参数的物理对应CPE指数n1和n2的拟合值在0.82到0.95之间波动。有趣的是n值在中段SOC区域更接近1说明该状态下的电极界面更像理想电容表面反应均匀性更好低SOC和高SOC时n值下降反映界面反应不均匀或者存在局部浓差极化。Y0值随SOC变化趋势与R的规律相反。考虑到CPE在物理上可以等效为分布参数网络这个现象本质上反映了界面双电层结构在不同嵌锂状态下的差异。拟合参数之间存在耦合关系在建模时不能独立看待。5.3 扩散阻抗(Warburg)的处理宽频EIS的低频段扩散支线通常不是严格的45度直线而是出现一定的弯曲。这说明固相扩散过程并不能用理想半无限大扩散模型描述更加精确的处理方式是用有限长度扩散元件如Finitelength Warburg。不过引入该元件会多出两个参数拟合复杂度显著增加。我的处理策略是先只对低于1Hz的数据点单独做局部拟合估算扩散相关的等效参数再代入全频段全局拟合。这样全频段拟合的收敛性会好很多扩散参数的物理意义也更明确。6. 批量计算流程与实验复现细节本节把从原始阻抗数据到最终图表输出的完整流程走一遍方便直接复现。6.1 数据处理链路总览整条链路由五个阶段组成原始数据导入、数据清洗与KK校验、初始参数估计、分段或全局拟合、结果存储与可视化。每个阶段对应一段独立代码这样便于单独调试。6.2 参数上下限设置要注意的坑lsqnonlin里面的参数边界对于拟合成功至关重要。我用到的典型边界如下参数下限上限说明R0 (ohm)0.0050.05欧姆电阻不会差太多R1 (ohm)0.00050.05高频半圆SEI膜相关Y01 (S·s^n)1e-60.1CPE导纳值n10.51.0CPE指数物理范围R2 (ohm)0.0010.5中频电荷传递电阻Y02 (S·s^n)1e-60.1同Y01n20.51.0同n1Yw (S·s^0.5)1e-610Warburg导纳下限别设太高边界设得太宽会导致优化器在无物理意义区域搜索设得太窄又会漏掉真解。特别是n值物理上不会超过1但有些优化器在接近1时会缓慢爬行此时可以把n的上限设为0.999避免在边界处出现数值奇异。6.3 自动化绘图与成果导出批量计算完成后我通常会生成三张图全SOC对比Nyquist图、参数随SOC变化图、残差热力图。残差热力图的横轴是频率、纵轴是SOC颜色表示拟合相对误差这样能一眼找出拟合质量较差的区域。低频段和中频段的拟合残差通常偏大这是所有分布式参数模型的共性现象需要用权重调节来优化。7. 过程中踩过的坑与优化经验这里整理一下我在实际复现中最常遇到的问题每一条都是花过时间调试出来的。7.1 高频感抗伪迹有些电芯在高频段会出现下半平面凸起看起来像感抗。这个现象通常不是电池本身的特性而是测试线缆和夹具的寄生电感效应。如果测试中忽略了这个问题拟合时就要额外增加一个电感元件但这会掩盖真实的高频信息。解决方法是缩短测试线缆、使用四端子连接、并在校准阶段扣除短路补偿。7.2 低频数据漂移与不稳定性宽频EIS低频段耗时长电池状态可能发生缓慢变化导致复平面数据出现螺旋状漂移。我处理的办法是让电池在测量前充分静置同时每个频率点的测量周期数随频率自适应调整。再不行就对低频数据做趋势校正但需要非常谨慎不能把真实扩散行为当成漂移剔除。7.3 拟合收敛到局部最优阻抗谱拟合是典型的多参数非线性问题很容易掉进局部最优解。我解决这个问题有三板斧一是多组初始值并行拟合二是先用解析法估算零频极限和高频极限的阻抗值来约束R0和总电阻三是用全局优化算法比如pswarm或simulannealbnd先跑一遍粗糙搜索再把结果作为lsqnonlin的初始值。这里有个很实用的技巧把band图中两个半圆的顶点频率直接读出来反推RC时间常数用时间常数设置R和CPE的初始耦合关系。这样初始参数基本不会偏离全局最优太远。7.4 Matlab版本兼容性lsqnonlin在不同Matlab版本中的算法选项不完全一致。低版本里没有trust-region-reflective算法时会自动切换为levenberg-marquardt输出结构字段也不同。我在脚本里做了兼容处理依据是matlab版本号判断是否使用optimoptions。8. 代码扩展方向从离线拟合到在线应用完成不同SOC下的宽频EIS计算后这套方法可以直接往几个方向扩展。8.1 构建SOC与温度的阻抗参数地图把测试温度扩展到0度、10度、25度、40度每个温度下再测一组SOC扫描。最终形成一张以SOC和温度为输入的参数映射表。这个表可以直接嵌入BMS的老化诊断或者热管理策略中。查表比在线实时拟合快得多且不需要额外的计算资源。8.2 老化循环中的阻抗谱追踪电池经过长时间循环后各SOC点下的EIS特征会发生可辨识的变化。最明显的是SEI膜电阻随循环次数增大电荷传递电阻的变化则受温度、倍率等因素影响。通过定期测量特定SOC点的宽频阻抗谱并对拟合参数做趋势分析可以建立老化的非破坏性评估指标。我在项目里实测过某电芯循环500次后SOC 50%点的R1SEI膜电阻增大了约60%R2增大约35%n2下降了0.08。这些趋势指标远比单纯容量衰减曲线提供更多信息。8.3 结合机器学习做自动诊断如果数据量足够可以把不同SOC、不同温度、不同老化状态下的阻抗谱数据整合成训练集用神经网络或高斯过程回归建立阻抗谱到电池状态的映射。宽频EIS数据作为输入维度很高可以先做等效电路参数压缩再把参数作为特征输入模型。这样能显著降低模型规模并保留物理意义。另外说下一个小坑直接用全频谱数据训练模型虽然精度上限高但每次都要求测量完整宽频EIS在线场景耗时太长。参数压缩后的模型对测量要求就低很多只需测量几个特征频率点就能估算状态。9. 常见问题小结FAQ把大家常问的问题集中答复一下。9.1 为什么高频段会出现负实部现象个别电池在极高频下实部出现负值本质上来自分布参数网络中的相位超前效应或者是设备量程受限导致的数据失真。用这个数据做拟合时要特别小心建议将明显失真的高频数据裁剪掉裁剪频率点视夹具而定一般在100kHz以后。9.2 等效电路阶数选择RRCRC还是RRC只覆盖中频段或者频率范围不宽时单RC模型就够用。但宽频EIS数据跨度大至少需要两个RC回路才能分辨SEI膜过程与电荷传递过程。用三个RC在某些情况下更好但参数增多后拟合不稳定性上升。我的经验是先用两个RC做全频段拟合若残差超误差容忍再考虑增加第三个RC。9.3 能否用最小二乘拟合后的参数直接算DOD或SOC拟合参数与SOC高度相关理论上可以用查表法估计SOC但这种方法的精度受温度、老化状态影响较大。更适合的用法是把这些参数作为辅助特征融合到无迹卡尔曼滤波器或等效电路模型中。单靠阻抗谱来做SOC估计的鲁棒性还不够。9.4 Matlab代码能否直接用于其他类型电池代码主体可以复用但等效电路拓扑和参数边界需要根据电池化学体系调整。比如磷酸铁锂正极的阻抗谱在低SOC区域会出现更明显的扩散支线低温条件下和高温条件下的表面膜特征也不同。仿真的模型参数边界要重新标定不能拿三元电芯的参数直接套用。10. 个人实践体会与后续计划这套宽频EIS计算脚本在目前的十几个SOC测试点上整体效果理想Nyquist图的拟合残差基本控制在1%以内。最大的收获是形成了参数随SOC变化的全景图像对后续基于模型的电池状态估计帮助很大。我在实际操作中体会到阻抗谱拟合不仅仅是一个数值优化问题更是一个物理认知问题。当你看到拟合参数偏离物理预期时先别急着调算法回头检查一下实验数据、检查一下夹具接触、检查一下静置时间往往问题的根源在数据端而不是算法端。最后分享一个小技巧处理批量SOC数据时建议把每一条阻抗谱的拟合结果都单独存档包含原始数据、拟合参数、残差和绘图参数这样可以追溯后续分析中的每一个数值。我吃过亏一开始只存拟合参数后来想重新画某个SOC点的局部放大图还得重新跑一遍数据导入非常浪费时间。后续我打算把温度变量加进来把这套脚本扩展成SOC-温度二维扫描的自动化分析工具并尝试结合深度学习做一个阻抗谱快速预测模块。到时候再来和大家分享。
延伸阅读

更多相关文章

2026/10/20 1:45:39

Synology_HDD_db 完整指南:第三方硬盘兼容警告一次解决

Synology_HDD_db 完整指南:第三方硬盘兼容警告一次解决 【免费下载链接】Synology_HDD_db Add your HDD, SSD and NVMe drives to your Synologys compatible drive database and a lot more 项目地址: https://gitcode.com/GitHub_Trending/sy/Synology_HDD_db 你刚往群…

2026/10/20 2:55:42

TensorRT实战手册:GPU推理优化与INT8量化完整指南

要说GPU推理优化,TensorRT是绕不过去的那一个。框架跑训练、TensorRT做上线推理,这个分工在工业级落地里已经成了默认组合。简单讲,TensorRT是一个专攻推理阶段的高性能优化引擎,它把训练好的模型拿到手,通过层融合、精…

2026/10/20 2:55:42

Python工业相机实时画面获取实战:SDK配置到稳定出图

最近有个项目要在 Python 里把一台工业机器人相机的实时画面快速调出来。听起来真不算难:SDK 一装,OpenCV 一显示,不就成了吗?但真上手才发现,从设备枚举到图像格式转换,每一环都藏着能把人绊倒半天的细节。…

2026/10/20 2:55:42

Tomcat 9与Tomcat 11同机共存:端口、环境变量与配置实操

最近接手了一个交接过来的老项目,用的还是 Tomcat 9,而新起的服务又要求跑在 Tomcat 11 上。开发机就一台,来回卸了装、装了卸,折腾两天后我实在忍不了了——干脆研究了一下怎么让两个版本在同一台电脑上和平共处。这篇文章就是把…

2026/10/20 2:55:42

CNN-RNN-Attention时间序列预测实战:从数据处理到模型调参

前阵子有个朋友做某园区的能耗预测,单用 LSTM 效果一直卡在同一个台阶上,尖峰时刻总是慢半拍。我让他试试在 LSTM 前后分别加一层卷积和注意力,也就是标题里说的 CNN-RNN-Attention 结构,同一份数据上误差肉眼可见地往下走。时间序…

2026/10/20 2:55:42

MATLAB实现P-III型分布水文频率计算与适线法

简介:这份资源面向水文统计、工程计算与数据分析领域的学习者,提供在MATLAB中实现皮尔逊-III型(P3)分布的完整代码与示例数据,帮助完成数据建模、预测分析与不确定性评估。压缩包共2个文件,包含1个m脚本与1…

2026/10/20 2:50:42

别让向量检索背锅:GraphRAG与Agent调度器重塑RAG检索架构

做RAG项目的同学,最焦虑的时刻往往不是模型回答错了,而是检索回来的上下文看起来都对,模型却给出了一个完全编造的数字。最近我把一整套知识问答系统的检索层重构了一遍,核心思路就是标题里那句话:别让向量检索背上所有…

2026/10/19 18:06:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/20 1:05:37

单片机C运行时从启动到多任务:中断安全与共享资源冲突

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

2026/10/20 1:05:37

GCC编译四步详解:预处理、编译、汇编、链接实战

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

2026/10/20 1:05:37

FIW线是什么?FEP注塑线与普通氟塑料线的区别及应用指南

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑