news 2026/10/1 4:47:45

轴流风叶CFD仿真全流程:从网格划分到性能优化的工程实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
轴流风叶CFD仿真全流程:从网格划分到性能优化的工程实战

干这行十年,我算过的轴流风叶没有一百也有八十个。从浴室换气扇里那种小叶片,到数据中心风机、空调外机、工业冷却塔的大风扇,都用CFD(计算流体动力学)跑过。很多人觉得风叶CFD就是把几何导进去、画个网格、点个计算按钮,最后看几个云图交差。真不是这么回事。这个课题看着门槛不高,但坑全藏在细节里——边界条件给错了,算出来的风量能差20%;叶顶间隙网格画粗糙了,泄漏涡根本捕捉不到,效率曲线完全失真。

这篇东西不是教科书,也不是软件操作手册。我先从项目思路讲起,再拆解建模、网格、求解、后处理、优化这几个环节,最后把我这些年踩过的坑和排查经验一并倒出来。适合刚接触风机CFD的工程师,也适合做了几轮仿真但结果总跟样机对不上的朋友。内容不绑定任何特定软件,Fluent、CFX、OpenFOAM还是STAR-CCM+都适用,核心方法是一致的。

1. 先理清思路:轴流风叶CFD要解决什么问题

1.1 轴流风叶性能核心指标,CFD到底能算哪些

做轴流风叶的CFD,本质上是把“气流通过旋转叶片后获得动量”这个过程,用数值方法解出来。我们最终要关心的性能指标无非几个:流量、全压、静压、效率、噪声,有时候还有叶片的强度。具体到CFD能给出什么:

  • 流量与压力:在给定的转速和工作点下,风叶能输送多少风量,能建立多少压头。这是最基本的性能参数。
  • 效率:流体获得的功率与轴功率之比。CFD能算出叶片与流体之间的能量交换,进而得到水力效率。注意水力效率和整机效率的区别,后者还要考虑电机效率、轴承损耗、风机壳体的内部阻力等,这些CFD模型里通常不包含。
  • 流场细节:叶片表面压力分布、叶顶间隙的泄漏涡、吸力面的流动分离、尾迹涡结构。这些是判断问题根源的重要依据。
  • 性能曲线:通过多个工况点的计算,绘制出流量-压力曲线、流量-效率曲线,进而判断风叶的工作范围、喘振裕度、失速特性。

比如说,客户反馈“风扇噪声很大”。噪声在CFD里要算准很难,需要非定常计算加上声类比方法,成本高周期长。但噪声的来源往往和流场结构强相关——叶顶涡脱落、吸力面分离、尾迹干涉,这些都能通过常规流场计算看出来。所以我的做法通常是:先做定常计算看流场结构,找到涡和分离的位置,再做针对性优化,用相对变化来判断噪声趋势,而不是直接去算绝对分贝值。

1.2 定常还是非定常,第一次上手怎么选

这是一上来就要做的方案决策。定常计算(比如稳态MRF方法)假设流动不随时间变化,叶片在旋转参考系里保持静止,通过哥氏力和离心力来模拟旋转效果。非定常计算(比如滑移网格方法)真实模拟转子旋转、叶片扫掠的过程,能得到随时间变化的流场。

我的经验是分场景选择:

  • 性能初算、趋势对比、优化迭代:定常MRF完全够用。一个轴流风叶设计点附近的性能计算,定常结果和非定常的时均结果差距通常在3%以内,但计算量相差一个数量级。优化阶段要跑几十个方案,用非定常根本跑不动。
  • 噪声峰值分析、喘振边界、旋转失速:必须非定常。这些问题本质上是随时间变化的流动现象,定常计算会掩盖掉关键物理特征。
  • 动静干涉强烈的场景:比如风叶后有静叶栅,或者风叶非常靠近进风口导致进气畸变严重,定常计算误差会比较大,也别省那点算力。

顺带说一句,定常计算的初始场可以先算一个低转速工况,再逐步提速,这样收敛更快更稳定。如果没有现成初始场,直接在目标转速下从零开始算,很容易因为流场尚未建立而剧烈震荡。

1.3 全周模型还是周期性单流道

轴流风叶的叶片一般均匀分布,比如7个叶片,那么1/7的流道具有几何周期性。理论上算一个流道就行,网格量小了很多。但有两个前提:一是来流必须均匀,二是叶顶间隙对周期性的扰动可以忽略。实际工程中这俩前提经常不成立——风机进口可能直接对着弯管或者障碍物,进气本身就扭曲;叶顶间隙虽然在几何上周期分布,但泄漏涡对相邻流道的影响在小间隙下不太明显,间隙大了就难说。

所以我的做法是:优化初筛用单流道模型快速对比方案,最终验证时用全周模型复算一次。全周模型等于保险,避免因周期性假设引入偏差。一个7叶片的小风机,单流道网格量可能只有两三百万,全周也就两千万左右,现在的工作站算起来并不吃力,没必要拿一点计算量去赌精度。

2. 建模与边界条件的五个关键细节

2.1 流体域抽取:别忘了延长段

轴流风叶的流体域不是简单地把叶片包起来就完事。叶片所在的旋转域是核心,但它的上游和下游必须要有延长段。原因有两个:一是边界条件不能紧贴着叶片,否则数值边界会直接干涉叶片附近的流场,导致求解发散或物理失真;二是需要充分发展段让气流在进入叶片之前建立稳定的速度剖面,在离开叶片之后让尾迹充分发展,这样你才能在后处理时读取到有代表性的“出口平均压力”。

延长段多长比较合适?我一般按下述经验来:

  • 进口延长段:至少2到5倍叶轮直径。如果空间受限,至少也要保证叶片前缘上方有1到1.5倍的直径距离。再短的话,进口速度分布会受到叶片抽吸作用强烈干扰,边界条件形同虚设。
  • 出口延长段:至少3倍直径。对于轴流风叶,出口带旋,静压恢复需要一段距离。出口延长段不够,尾迹涡还没发展完全就撞上出口边界,会把出口压力算错。

其实可以把延长段理解为给数值计算一个“缓冲空间”。边界条件是人为给定的数学约束,约束离研究对象越远,对核心区域的影响越小。这个道理跟做实验时风洞测量段前后要留足够距离一模一样。

2.2 边界条件设置:入口总压还是质量流量

CFD里给边界条件有两个流派:给定质量流量(或者速度),或者给定压力。对于风机性能计算,我的习惯是:入口给总压或大气压条件,出口给静压或目标背压。这样计算迭代过程中流量会自己平衡出来,和实际风机在管路里的工作状态更接近。因为风机本质上是一个流量发生器,它的工作点取决于负载阻力,不是预先给定的流量。

计算整条性能曲线时,我会固定转速,然后从大风量(低出口静压)开始,逐步提高出口背压,模拟风机阻力逐渐增大、流量逐渐减小直至接近失速的过程。每个工况点单独计算,最后把点连成曲线。注意在高压头工况也就是低流量区,流动容易分离,收敛难度会增加,这时候要提高亚松弛因子或者先用上一个收敛结果为初始场。

有人习惯反过来,给定流量,迭代得到压力。这在某些工况下也能用,但失速区附近容易陷入不收敛的往复振荡。相比之下给压力的方式稳定性更好。另外还有个细节:如果入口有预旋,比如风叶前方有导流罩或者防护网,可以考虑在入口给周向速度分量,不过这种细节一般放在几何建模里更顺,边界上直接给旋流反而容易出问题。

2.3 参考压力与流体物性

空气的密度不是标准的1.225 kg/m³,它会随温度、海拔变化。计算前确认一下实际工作条件,尤其是高原地区或者高温环境风机,密度差个10%很正常,风压和效率都会有明显变化。我自己吃过这个亏:给一个海拔2000米项目的风机做仿真,忘了改密度,算出来的压力场比后面实测偏高10%以上。

参考压力位置也要注意。CFD求解的是相对压力,参考压力点选在入口静止区,让该处压力为零,这样整个流场的压力读数都以它为基准,后处理时不容易混乱。出口静压的基准必须以参考压力为对照,别直接用表压读数。

3. 网格划分策略与质量把关

3.1 旋转域网格怎么布置

轴流风叶的旋转域是网格划分的要点。叶片扭曲复杂,前缘和尾缘附近的曲率变化剧烈,这里的网格必须加密,否则几何特征都丢了,谈何捕捉流动细节。三维建模软件导出的是光顺的CAD曲面,网格离散后是无数个小平面,前缘半径如果本身就很小(比如只有1mm甚至更小),粗网格会把这个小圆角完全磨平,导致计算中前缘附近的压力峰值严重失真。

叶片通道内,我习惯在流体域里画六面体网格或切分后的扫掠网格,如果几何特别复杂而采用四面体,那至少要保证叶片周围1到2层有棱柱层网格来捕捉边界层。叶顶间隙处的网格更要注意,间隙内一般至少要有5到10层网格,才能分辨泄漏流的复杂涡系。间隙要是只画了薄薄一层粗网格,泄漏量会被严重低估,计算效率反而偏高。

3.2 第一层边界层网格高度估算

要说网格对数值结果影响最大的地方,一定是边界层网格。第一层网格高度太小,网格量爆炸;太大,边界层中重要的粘性底层和过渡区没有网格点,壁面函数失效,结果完全不可信。

第一层高度怎么估?这里需要用到一个无量纲量——y+。不同湍流模型对y+的要求完全不同:如果你用k-epsilon配合标准壁面函数,y+在30到300之间是合理的,第一层网格位于对数律层;如果你用SST k-omega这类低雷诺数模型,y+就需要趋近于1,第一层网格必须深入到粘性底层。

估算第一层网格高度的常用公式是:

  • 根据特征速度V和特征长度L,估算雷诺数 Re = ρVL/μ,其中μ是动力黏度。
  • 用经验公式估算壁面摩擦系数 Cf ≈ 0.058 Re^(-0.2),对平板湍流;
  • 壁面剪切应力 τ_w = 0.5 ρ V² Cf,摩擦速度 u_τ = sqrt(τ_w/ρ);
  • 第一层网格高度 y = y+ × μ / (ρ u_τ)。

这套流程看着繁琐,实际上写个Excel表格几十秒就算完了。比如一个叶尖速度30m/s、弦长0.1m的叶片,雷诺数大约2×10^5,算下来如果要y+≈1,第一层高度大约在0.01到0.02mm这个量级。对风叶来说,叶片表面必须有至少15到20层边界层网格,增长率控制在1.1到1.2之间,这样既能保证边界层内分辨率,又不至于网格量失控。

3.3 网格质量检查的底线

网格画完不能直接开算,先查质量。我给自己定了一个底线标准:

  • 偏斜率(Skewness):六面体网格控制在0.85以下,四面体控制在0.9以下。超过0.95的单元几乎必然引发收敛困难。
  • 正交质量(Orthogonal Quality):最好在0.15以上,低于0.1的单元出现在叶片附近基本宣告这轮计算要折腾半天。
  • 最小角度:不能低于18度,再小就出现负体积风险。
  • 网格密度过渡:相邻区域网格体积变化比不要超过1.5倍,突然膨胀的网格会造成数值扩散,等于原地加粘度,流场细节被抹掉。

如果网格质量检查有局部不达标,先别急着全局加密。大概率是几何表面某些缝隙、圆角、过渡面导致的,用局部加密或者网格重构工具处理一下就好。全局加密是最笨的办法,网格量涨一倍,质量还不一定改善。

4. 求解设置与收敛判据

4.1 湍流模型怎么选

轴流风叶的流场中,逆压梯度区域靠近吸力面,容易出现流动分离。选湍流模型时,这是比较重要的判定依据。用k-epsilon算分离流,通常会延迟分离的发生,导致叶片在小流量工况下计算出的性能过于乐观——失真地宽了。我早年做某个贯流风机项目时吃过这种亏,叶片失速点算得比实测晚了整整6度攻角。

SST k-omega是我做风叶计算的主力模型。它在近壁面采用k-omega的稳健性,在远离壁面的自由剪切层切换到k-epsilon行为,对逆压梯度流动的预测更准,而且对网格的适应范围也广。代价是比k-epsilon稍微费一点点算力,但对工程计算完全不是问题。

雷诺应力模型(RSM)理论更高级,可以考虑湍流各向异性,但对网格质量极其敏感,收敛困难,而且工程上收益往往不明显。除非做非常特殊的研究性工作,我不太推荐日常使用。大涡模拟(LES)就别想了,轴流风叶的雷诺数下网格量需要数十亿,不是常规项目能承受的。偶尔用DES(分离涡模拟)做非定常的噪声源分析还差不多。

4.2 求解器参数与收敛策略

求解设置的几个关键参数:

  • 离散格式:压力用二阶格式,动量用二阶迎风,湍动能和湍流耗散率也用二阶。一阶格式虽然稳,但数值耗散太大,算出来的压差和效率都会偏低,只适合用来从零开始建立初始场。
  • 亚松弛因子:轴流风叶计算中,动量亚松弛因子建议从0.5到0.7之间取值,压力从0.3到0.5。如果发散,就把动量的松弛因子降到0.3甚至0.2先稳住,迭代一段时间后再调高。不要从头到尾用低松弛,那样当计算半天,残差迟迟降不下来,白白浪费时间。
  • 库朗数(非定常):非定常计算时,库朗数控制在2以下。库朗数等于速度乘时间步长除以网格尺寸,它过大时每个时间步的信息跨越多个网格,数值上会非常不稳定。时间步长选择可以按叶片转动1度角所用时间来估算。

4.3 监控残差之外的其他收敛判据

残差曲线降到某个值不等于收敛。完全可能残差收敛了但监测的流量还在缓慢漂移。我每次都会设置几个监测点:出口质量流量、叶轮扭矩、叶片表面某点的压力、进口气流角。判断收敛用三把尺子:

  • 各残差降到10^-4以下(对风叶这类中低雷诺数问题通常够了);
  • 监测的出口流量变化幅度小于万分之几,连续迭代几百步都稳定;
  • 全局质量、动量不平衡度低于1%。

有一次我发现残差到了10^-6,但叶轮扭矩还在以千分之一的趋势缓慢变化,说明流场中有一个大尺度涡在缓慢移动,定常计算只是把它冻结住了。这种情况下要先判断它是否影响目标性能的精度,如果影响,需要考虑非定常计算。

5. 结果后处理:把云图变成可用的性能数据

5.1 从流场中提取性能参数的正确姿势

算完了云图很好看,但关键是能提取出“设计报告里能写”的数据。风机的流量、全压、效率这几个参数,在后处理时有明确的截取位置和统计方法,很多人第一个坑就在这里。

流量:在风叶进口或出口的某个截面做面积分。如果你在出口延长段的末端取截面,得到的是管路的流量;如果你在旋转域进出口附近取截面,得到的是叶轮的直接输送流量。两组数字理论上应该一致,但受计算域内泄漏、回流的影响会有细微差异。取两者平均值作为结果,差异控制在1%以内算正常。

全压:全压等于静压加动压。后处理时量测进口全压和出口全压,它们的差值就是风叶提供的全压升。这里最容易出错的是动压的计算——动压要用密度乘以平均速度平方的一半,很多人直接用面平均速度去算,而正确的做法是对速度做面积加权平均(或质量加权平均),两者的数值在小流量工况差别非常明显,因为截面上速度分布很不均匀。

效率:一个最常用的简化公式是η = Q × ΔPt / (M × ω),其中Q是体积流量,ΔPt是全压升,M是叶轮扭矩,ω是角速度。分母M×ω就是输入到叶轮的流体功率(不含轴承和电机损失)。扭矩在后处理里可以直接读取,注意方向别取反了。

5.2 从流线与压力云图里读出问题

云图不只是拿来贴在PPT里好看的。每次计算完我都会先做三个动作:

  • 看叶顶间隙附近的速度流线和涡核位置。泄漏涡如果早期形成且强度大,意味着间隙泄漏严重,抑制手段通常是减小叶顶间隙高度,或者通过改变叶尖区的载荷分布来减弱驱动泄漏的压差。
  • 看吸力面近壁处的极限流线或壁面剪应力分布。流动分离发生的位置和范围,直接关系到叶片失速特性。
  • 看不同叶高截面的静压分布和攻角分布。轴流风叶在不同半径处的最佳攻角并不相同,从展向压力分布能看出负荷是否平衡,有没有局部过载。

一个典型场景:风叶在小流量工况下效率暴跌,云图显示吸力面分离从叶中扩展到叶尖。这说明叶片在低流量下的实际攻角过大。优化方向就是调整叶片安装角分布,削弱叶尖部分的正攻角,把负荷往叶根方向转移。

6. 从CFD结果驱动风叶优化

6.1 常见的优化方向与判断依据

CFD的价值在于让优化不再是“拍脑袋”,而是有流场依据地改型。以下是我反复用到的几个方向:

  • 叶片扭曲角度(安装角):性能曲线的整体水平可以通过调整全叶片的安装角来平移。安装角增大,同一转速下风压上升,但效率最高点会向小流量偏移;减小则反之。依据是计算出的攻角分布与设计攻角之间的偏差。
  • 攻角分布:轴流风叶的理想攻角沿叶高逐渐变化,叶根大一些、叶尖小一些。如果某段翼型的攻角过大,说明改进方向是重新设计该段的扭角分布。对照各截面的压力系数曲线来调。
  • 弦长展向分布:叶片太窄,做功能力不足;太宽,摩擦损失和重量上去了。基于载荷分布,如果某半径段单位弦长的负荷过高,就可能需要增加该处的弦长来降低负荷、延缓分离。
  • 叶顶间隙:间隙对效率的影响很直接。一个经验数据:间隙从叶弦的1%增加到3%,效率可能下降1到2个百分点。优化时先看间隙泄漏涡的强度,如果泄漏损失显著,就考虑从结构上减小间隙,或者设计叶尖小翼来阻碍泄漏流动。
  • 叶片数:叶片数增加,同一流量下单个叶片的负荷下降,声学上可能更安静,但摩擦面积也增大。叶片数的优化经常要结合模态频率和成本来权衡,CFD结果负责给出性能差异。

6.2 参数化优化:从单方案比选到自动寻优

简单的优化就是做几版改型方案,每个方案算一次CFD,然后比性能。这个方法直观但低效。现在更普遍的做法是参数化几何加自动寻优:把叶片的安装角分布、弦长分布、扭曲角分布等参数化,用脚本自动修改几何、重新网格、提交计算、提取指标,配合响应面模型或者遗传算法在参数空间里搜索最优组合。

这套流程听起来高大上,实际落地时最花时间的往往不是优化算法,而是参数化几何模板的建立。软件方面,BladeGen或者自己写基于Bezier曲线控制叶型的脚本都很常用。我的建议是:别一上来就搞全参数自动寻优,先做六到八个手工方案,摸清每个参数对性能的敏感方向,再决定哪些参数值得放进自动寻优里。全自动搜索几十个参数,算力消耗巨大,还不一定收敛到有物理意义的解。

另外,优化目标一定要提前锁定。这时候“效率”还是“全压”还是“噪声”?不同目标的解可能背道而驰。比如纯粹优化效率,算法很可能把叶尖负荷降得很低,导致噪声虽然低了但总压升不足,整个设计推倒重来。我会把目标写成多目标:最小化功率,同时约束风量和风压不低于某值。

7. 常见问题排查与工程经验

7.1 典型问题的快速诊断表

现象可能原因处理方向
残差震荡不收敛亚松弛因子过大;网格某处质量太差;初始流场不合理降低动量亚松弛;检查最差网格位置;先用低转速或一阶格式计算初始场
进出口流量不平衡超1%边界条件设置不当;回流导致局部倒灌检查入口出流是否关闭;延长进出口管段;查看是否存在回流倒灌区域
叶轮扭矩监测值漂移大尺度涡未稳定;定常假设失效增加迭代步数;尝试非定常起始算例;检查周期性假设是否合理
小流量工况发散近失速状态流动分离急剧从相邻工况点的收敛解插值作为初始场;降低松弛因子;检查分离区网格密度
计算效率远超试验值忽略了电机的各种损耗;边界条件可能过于理想;叶顶间隙偏小确认效率对比口径,水力效率与整机效率不要混为一谈;核实间隙实际尺寸
计算风压低于试验值网格在叶片前缘的加密不足;湍流模型对分离的预测偏差加密前缘附近网格;换SST模型;检查转速和密度设置

7.2 三条实操心得与避坑指南

第一,建模阶段多花的时间,会在后期百倍省回来。有的工程师拿到几何后随手一清理就开始网格,结果后续各种数值发散、局部回流,反反复复查问题花了两天。多花两个小时把几何彻底清理干净,确认所有片体法向一致、无缝隙、延长段管径合理,后面一切都会顺畅很多。

第二,网格一定做独立性验证。我见过很多仿真和实验对不上就怀疑CFD方法本身不对,结果一查,网格从300万加密到900万,效率预测就变了两个百分点。一般起码做三套网格,粗、中、细,如果粗细网格之间的性能差异小于1%,再开始做多工况和优化计算,这样才能确定结果是网格收敛的。

第三点,算完之后要回到物理去审视结果。如果算出来效率95%,先别高兴,八成是哪里算错了——轴流风叶的水力效率能做到60%到80%已经算不错了。另外非定常计算的时均结果和定常结果对不上时,先别急着怀疑非定常,先想想定常MRF的假设在这个工况下是否成立。数据不合常理时,永远是模型的问题大于物理的问题。

最后再分享一个小的经验:做多工况性能曲线时,可别用同一个初始解去硬怼所有工况点,这样每个工况都要花很长时间才收敛。按流量从大到小(或背压从小到大的顺序),使用上一个收敛解作为下一个工况的初始场,迭代几百步就能达到收敛条件。这种连续扫描法,基本可以帮我把整条性能曲线的计算时间压缩到原来的三分之一。

CFD说到底只是工具,真正值钱的是对流体物理的洞察和严谨的计算习惯。轴流风叶的优化永远是迭代循环,一次计算的结果不是终点,而是下一轮设计的起点。希望这篇东西能帮你少走一些我当年走过的弯路。

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

DeepSeek昇腾适配与本地部署:从推理引擎到API工具链的工程实践

说句实话,最近技术圈最热闹的事,就是 DeepSeek 把自家模型跑到了昇腾上,而且跑得相当顺。很多人看到这个消息的第一反应是"这是在站队",但以我这两年折腾大模型部署、API 接入和各种工程化工具的视角来看,这…

作者头像 李华
网站建设 2026/10/1 4:46:33

绕过Microsoft Store恢复HP Scan离线扫描功能

1. 项目概述:为什么HP SCAN功能会“消失”在你的打印机上? 你刚拆开一台全新的HP 227FDN,插上电源、连好USB或Wi-Fi,打开扫描盖板,按下机身上的“扫描到电脑”按钮——结果屏幕黑着,或者弹出一句冷冰冰的提…

作者头像 李华
网站建设 2026/10/1 4:46:10

GPUStack 部署 DeepSeek-V4.1 开启 DSpark:JSON 吞吐提升 3.8 倍

这阵子群里聊得最多的就是 DeepSeek-V4.1,以及它发布时同步放出的 DSpark 加速运行时。我原本以为也就是模型体积变大、上下文窗口拉长,没想到真正让我觉得值得写一篇完整记录的东西,是 GPUStack 上一行配置带来的 JSON 吞吐变化——同一个 s…

作者头像 李华
网站建设 2026/10/1 4:46:09

正规矩阵:谱分解可信度的数学基石与工程验证方法

1. 什么是正规矩阵?它不是“正规”的代名词,而是几何与代数的精密交汇点“正规矩阵”这个词,乍一听容易让人联想到“正规操作”“正规流程”——仿佛是某种符合规范、按部就班的矩阵类型。但恰恰相反,正规矩阵(normal …

作者头像 李华
网站建设 2026/10/1 4:46:09

一行配置开启DSpark,DeepSeek-V4.1 JSON吞吐提升3.8倍

1. 项目背景:我为什么会盯上 DeepSeek-V4.1 的 JSON 吞吐1.1 先说一句:JSON 输出为什么是硬指标做 LLM 服务端的人应该都有体会,纯聊天场景再慢,用户顶多觉得“这模型反应钝了点”,但如果接的是工具调用、RAG 抽参、订…

作者头像 李华
网站建设 2026/10/1 4:45:44

Windows Server IIS从安装到排错:Web站点部署完整指南

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

作者头像 李华