Beta多样性分析全解析:从核心概念到R语言实战避坑指南
1. 项目概述从“是什么”到“为什么”的深度解析“Beta多样性”这个词乍一听可能有点学术感觉离我们很远。但如果你曾好奇过为什么你家后山的树林和几公里外的湿地公园看到的动植物种类差别那么大或者为什么同一片农田今年种水稻和明年改种玉米后土壤里的微生物群落会天差地别这些现象背后其实都藏着Beta多样性的影子。简单来说Beta多样性衡量的就是不同群落或生境之间物种组成的差异程度。它不是数一个地方有多少种生物那是Alpha多样性也不是算整个区域的总物种数那是Gamma多样性而是专门研究“变化”和“差异”的。这个概念在生态学、环境科学、微生物组研究乃至农业和医学领域都扮演着至关重要的角色。比如环保部门想评估一条河流上游和下游的污染对生物的影响光看某一段的物种数量不够必须比较上下游物种组成的差异有多大这个差异就是Beta多样性。再比如医生研究肠道菌群与健康的关系发现健康人和病人的肠道菌群种类差异显著这种差异的量化同样依赖于Beta多样性分析。它就像一个精密的“差异探测器”帮助我们理解生物在空间、时间或环境梯度上是如何分布和更替的。对于生态研究者、环境评估员、微生物组分析师甚至是从事农业土壤改良或水产养殖的朋友掌握Beta多样性的分析和解读意味着你能从一堆物种名单里读出更深层的生态故事是环境过滤起了主导作用还是物种间竞争决定了格局干扰过后生态系统是恢复了原状还是走向了新的平衡接下来我将结合十多年的实操经验为你拆解Beta多样性的核心计算逻辑、主流分析方法、实操软件选择以及如何避开那些教科书上不会写的“坑”。2. 核心概念与计算逻辑不止一个数字理解Beta多样性首先要破除一个误区它不是一个单一的、固定的数值。相反它是一个概念家族包含多种指数和算法各自从不同角度刻画“差异”。选择哪种指数完全取决于你的科学问题。2.1 二元数据与丰度数据计算的基石差异在计算之前你的数据通常以“物种-样本”矩阵的形式存在。矩阵里的每个值代表某个物种在某个样本中的“量”。这个“量”有两种基本类型决定了你后续能选用哪些指数二元数据Presence-Absence Data只关心物种“有”或“无”用1和0表示。它忽略了物种的个体数量或相对丰度。适用于数据粗糙、或关注物种分布格局本身的研究。丰度数据Abundance Data包含了物种的相对丰度如百分比、标准化后的序列数。它包含了更多信息能反映物种的优势度差异。这是高通量测序如16S rRNA、宏基因组数据的常态。注意很多初学者拿到测序数据后直接使用基于丰度的Beta多样性指数这没错。但如果你同时有环境因子数据想进行后续的关联分析如db-RDA有时将丰度数据转换为二元数据即只保留出现与否的信息再进行计算可能会得到更稳定、更容易解释的结果因为它降低了高丰度物种的权重。这是一个需要根据研究目标权衡的选择。2.2 主流Beta多样性指数拆解基于上述数据类型衍生出几大类核心指数2.2.1 基于二元数据的指数这类指数只考虑物种的有无计算两个样本共享的物种数和不共享的物种数。Jaccard 距离D (b c) / (a b c)a两个样本共有的物种数。b仅存在于样本1的物种数。c仅存在于样本2的物种数。解读值域0-1。0表示两个样本物种组成完全相同1表示完全不同。它简单直观但对稀有物种敏感。Sørensen 距离D (b c) / (2a b c)解读与Jaccard类似但公式分母不同使得它对共有物种a给予了两倍权重。因此Sørensen指数通常比Jaccard指数值更小被认为对共有物种更“友好”在实际生态学中应用极广。2.2.2 基于丰度数据的指数这类指数同时考虑了物种有无和相对丰度信息量更丰富。Bray-Curtis 相异度这是生态学中最常用、最经典的丰度Beta多样性指数。D Σ|xi - yi| / Σ(xi yi)xi,yi物种i在样本x和y中的丰度。解读值域0-1。0表示丰度组成完全一致1表示完全不同。它计算的是两样本间各物种丰度差异的绝对值之和除以两样本的总丰度。它的核心优势是稳健对样本总丰度的差异不敏感即一个样本总序列数10万另一个1万也能比较且对中等丰度物种的变化敏感。UniFrac 距离这是微生物组研究领域的“明星”指数由Rob Knight实验室开发。它的革命性在于引入了物种间的系统发育关系。未加权UniFrac只考虑物种有无但计算的是两样本间独有的进化枝分支长度占系统发育树总长度的比例。它回答了“样本间的微生物在进化历史上有多大的独特性”加权UniFrac在未加权的基础上进一步引入了物种的丰度信息作为权重。它回答了“样本间占主导地位的微生物在进化历史上有多大的差异”。解读UniFrac距离尤其是加权能揭示基于纯物种列表如Bray-Curtis无法发现的生态过程例如是否存在系统发育聚集或分散。但它的计算依赖于一棵可靠的系统发育树。2.2.3 选择哪个指数一个实操决策表指数类型代表指数核心考虑因素适用场景注意事项二元型Jaccard, Sørensen物种有无分布格局研究、数据为名录时、关注物种周转忽略丰度可能丢失重要生态信息丰度型Bray-Curtis物种丰度差异绝大多数微生物组、群落生态学研究最通用、稳健是首选的基准指数系统发育型(加权) UniFrac物种丰度进化关系微生物组研究关注进化历史或功能潜力差异计算较慢需构建或引用可靠的系统发育树实操心得在我的项目中我几乎总会同时计算Bray-Curtis和加权UniFrac距离。先用Bray-Curtis做主体分析因为它解释性强、结果稳定再用加权UniFrac作为补充和深化看看系统发育信号是否提供了新的视角。如果两者结果高度一致说明丰度格局主导如果不一致那可能就是一篇新文章的切入点——为什么进化关系上近似的物种丰度分布却不同3. 分析流程与可视化从矩阵到洞察计算出Beta多样性距离矩阵后工作才完成了一半。如何将这个“数字方阵”变成直观的、可解释的图形和结论才是关键。3.1 降维与可视化PCoA与NMDS距离矩阵本身难以解读我们需要降维技术将其投影到二维或三维空间让样本间的相似关系以点图的形式呈现。主坐标分析PCoA又称经典多维尺度分析MDS原理基于距离矩阵寻找能最大程度保留样本间原始距离的坐标轴主坐标。它类似于PCA但输入是距离矩阵而非原始数据。优点计算快结果有明确的坐标轴和方差贡献率PC1解释XX%的变异便于量化描述。缺点它是线性模型假设样本间关系在降维后能用直线距离完美表示。对于复杂的非线性生态梯度可能扭曲严重。非度量多维尺度分析NMDS原理它不试图精确保持数值距离而是保持距离的排序关系。即如果样本A和B在原始矩阵中比A和C更相似那么在NMDS图中点A和B也应该比A和C更近。它通过迭代优化来找到一个满足这种排序关系的图形布局。优点能处理任何类型的距离矩阵对非线性的关系拟合更好非常适合生态学数据。缺点结果是迭代出来的每次运行可能略有不同需设置随机种子保证可重复性没有像PCoA那样的方差贡献率拟合优劣用应力值Stress衡量。通常Stress 0.2表示可用 0.1表示很好。如何选我个人的黄金法则是首选NMDS。因为它更稳健对数据分布没有苛刻假设。PCoA可以作为快速预览和补充。在报告中我常展示NMDS图并在图注中说明Stress值以证明降维的可信度。3.2 统计检验差异是否显著可视化看到了分组但需要统计检验来确认这种分组不是偶然。相似性分析ANOSIM一种非参数检验比较组内和组间的距离排名差异。R值介于(-1,1)越接近1表示组间差异大于组内差异。P值检验显著性。心得ANOSIM计算快易于理解但功效较低即不容易检测出真实的差异且对均衡设计敏感。现在已逐渐被PERMANOVA取代。置换多元方差分析PERMANOVA又称Adonis目前的主流方法。它像传统的ANOVA但基于距离矩阵通过置换检验来评估不同分组因素对群落差异的解释程度。公式核心思想将总距离平方和分解为组间平方和与组内平方和计算伪F值再通过随机置换样本标签获得F值的零分布从而计算P值。优势可以处理多因素、非均衡设计并能给出每个因素的解释度R²。致命注意事项PERMANOVA的零假设是“组间距离的均值中心相同”它对组内离散度即方差的差异非常敏感如果不同组本身的离散程度差异很大即方差异质性即使组中心相同也可能得到显著的P值假阳性。因此必须进行组间离散度同质性检验。组间离散度检验PERMDISP/Betadisper这是PERMANOVA的“黄金搭档”。它检验不同分组的样本到其组中心距离的方差是否齐同。操作流程先用betadisper()函数R的vegan包检验组间离散度。如果离散度无显著差异P0.05再进行PERMANOVA结果可靠。如果离散度有显著差异PERMANOVA的结果需要谨慎解读。此时应回到NMDS图观察是否确实是组中心分离还是仅仅因为某个组特别分散。可能需要寻找导致离散度差异的原因如某个处理组不稳定或在报告中明确指出此局限性。3.3 完整实操流程示例以R语言为例假设我们有一个物种丰度表otu_table行是样本列是物种一个样本分组信息group因子变量。# 加载必要包 library(vegan) library(ggplot2) library(ggpubr) # 1. 计算距离矩阵以Bray-Curtis为例 dist_bray - vegdist(otu_table, method bray) # 2. NMDS分析并绘图 set.seed(123) # 设置随机种子保证结果可重复 nmds_result - metaMDS(dist_bray, k2, trymax50) # k2维 trymax增加尝试次数 stress - nmds_result$stress # 获取应力值 nmds_points - as.data.frame(nmds_result$points) nmds_points$Group - group # 绘制NMDS图 p_nmds - ggplot(nmds_points, aes(xMDS1, yMDS2, colorGroup)) geom_point(size3) stat_ellipse(level0.68, linetype2) # 添加68%置信区间椭圆约1个标准差 labs(titlepaste(NMDS Plot (Stress , round(stress, 3), )), xNMDS1, yNMDS2) theme_bw() print(p_nmds) # 3. 组间离散度同质性检验 dispersion - betadisper(dist_bray, group) permutest(dispersion) # 置换检验查看离散度差异是否显著 # 4. PERMANOVA分析假设离散度检验通过 permanova_result - adonis2(dist_bray ~ group, permutations999) print(permanova_result) # 查看R²和P值这段代码构成了Beta多样性分析的核心骨架。可视化图形让你“看见”差异而PERMANOVA和离散度检验则从统计上“证实”差异及其可靠性。4. 高级应用与深度解读超越“显著与否”当基础分析完成后如何挖掘更深层的价值这里分享几个进阶思路。4.1 分解Beta多样性周转与嵌套Beta多样性本身可以进一步分解为两个生态过程物种周转Turnover一个地方的物种被另一个地方的完全不同的物种所替代。这通常由竞争、环境过滤等过程驱动。物种嵌套Nestedness一个地方的物种是另一个地方物种的子集。这通常由扩散限制、灭绝顺序等过程驱动。使用betapart包R语言可以轻松实现分解。例如计算beta.sor总Beta多样性Sørensen指数它可以分解为beta.sim纯周转成分和beta.sne纯嵌套成分。通过比较两者谁占主导可以推断主导的生态过程。比如在环境梯度陡峭的山地可能周转主导而在岛屿生境中可能嵌套主导。4.2 关联环境因子db-RDA与Envfit我们常想知道是哪些环境因子如pH、温度、养分驱动了群落结构的差异即Beta多样性。距离衰减冗余分析db-RDA这是将RDA冗余分析应用于距离矩阵的扩展。它可以直接检验环境因子对Beta多样性距离矩阵的解释能力。# 假设env_data是环境因子数据框 dbRDA_result - dbrda(dist_bray ~ pH Temperature Nitrogen, dataenv_data) anova(dbRDA_result, bymargin) # 依次检验每个因子的贡献 summary(dbRDA_result) # 查看整体解释率Envfit拟合这是一种更轻量、探索性的方法。它在已有的NMDS或PCoA图上将环境因子作为向量箭头拟合上去箭头的方向和长度表示该因子与群落变化的相关性强弱和方向。env_fit - envfit(nmds_result, env_data, permutations999) plot(env_fit, addTRUE) # 添加到NMDS图上心得我通常先做Envfit进行可视化探索找出可能重要的因子再用db-RDA进行严格的统计检验和方差分解。注意环境因子之间可能存在多重共线性需要进行预处理如标准化、剔除高度相关的因子。4.3 时间序列分析Beta多样性的动态变化在长期监测或时间序列实验中Beta多样性可以揭示群落演替或响应扰动的轨迹。分析方法计算每个时间点与前一个时间点或与初始状态的Beta多样性距离形成一条距离随时间变化的曲线。使用主响应曲线Principal Response Curves, PRC这是一种专门用于分析时间序列群落数据的约束排序方法能清晰展示不同处理组随时间偏离对照组的轨迹。解读曲线的上升代表群落变化加剧平台期可能代表达到新的稳态。比较不同处理组的曲线可以量化干扰的强度和恢复的速度。5. 常见陷阱与避坑指南基于大量项目经验以下是一些最容易出错的地方数据标准化之殇在计算距离前必须对物种丰度表进行标准化以消除样本间测序深度不同带来的影响。最常用的是“按比例标准化”即每个样本的总和缩放到1或100%或“使用CSS、TMM等标准化方法”对于测序数据更稳健。vegan的decostand()函数提供了多种选择。绝对不要直接用原始测序序列数如OTU counts计算Bray-CurtisPERMANOVA的方差异质性陷阱如前所述这是最高发的错误。不检查离散度就直接相信PERMANOVA的P值结论可能完全错误。务必养成betadisper()adonis2()的连用习惯。距离指数的误用用欧几里得距离处理物种丰度数据是常见错误。欧氏距离对双零两个样本都缺失某物种敏感且不符合生态学数据的特性。对于群落数据应始终使用Bray-Curtis、Jaccard等生态学距离。可视化中的过度解读NMDS图的坐标轴本身没有单位点与点之间的距离是相对关系。切勿试图去解释“为什么样本沿着NMDS1轴从左到右变化”除非你通过Envfit拟合了环境因子发现某个因子与NMDS1轴高度相关。轴的生物学意义需要外部信息赋予。忽略稀有物种的影响极低丰度的物种如只出现一次的OTU可能包含大量测序错误或污染物它们会极大地扰动基于二元数据的指数如Jaccard。在分析前通常需要设置一个阈值过滤掉这些稀有物种如剔除总丰度小于0.001%或在少于X个样本中出现的物种。这是一个需要根据数据情况谨慎调整的参数。软件与版本依赖不同的R包或工具如QIIME2, mothur在计算某些指数特别是UniFrac时默认参数或算法细节可能有细微差别。在论文中必须明确写明“使用R的vegan包版本x.x.x的vegdist函数计算Bray-Curtis距离”以确保结果的可重复性。Beta多样性分析远不止点几下软件按钮。它要求分析者对数据特性、统计假设和生态学问题有融会贯通的理解。从谨慎的数据预处理到选择合适的距离度量再到正确的统计检验和审慎的结果解读每一步都需要基于专业判断。掌握这套流程你就能将冰冷的物种列表转化为讲述生态系统空间格局、时间动态和环境影响机制的生动故事。

相关新闻

机器学习模型评估:查准率、查全率与F1分数的核心原理与应用

机器学习模型评估:查准率、查全率与F1分数的核心原理与应用

1. 项目概述:从“找对”到“找全”的平衡艺术在算法模型的世界里,我们常常面临一个灵魂拷问:这个模型到底好不好?尤其是在分类、检测、检索这类任务里,光看一个“准确率”往往是不够的。比如,你训练了一个模…

2026/10/20 9:50:41 阅读更多 →
大模型prompt工程Zero-Shot与Few-Shot以及json格式

大模型prompt工程Zero-Shot与Few-Shot以及json格式

笔记跟着黑马程序员大模型RAG与Agent智能体项目实战教程,基于主流的LangChain技术从大模型提示词到实战项目学习记录的一、前言提示词工程(Prompt Engineering)是大模型应用落地最基础、成本最低的优化手段,无需微调模型权重&…

2026/10/18 3:16:12 阅读更多 →
Java LangChain4j 实战搭建私有 RAG 知识库

Java LangChain4j 实战搭建私有 RAG 知识库

一个技术能不能用&#xff0c;先看依赖和代码量。下面是LangChain4j的Maven坐标和50行核心代码&#xff0c;直接跑通一个RAG&#xff08;检索增强生成&#xff09;知识库&#xff1a; <!-- pom.xml 核心依赖 --> <dependency><groupId>dev.langchain4j</…

2026/10/20 9:38:40 阅读更多 →

最新新闻

基于F28335的光伏逆变器控制软件架构与调试实战

基于F28335的光伏逆变器控制软件架构与调试实战

做光伏逆变器研发这些年&#xff0c;有一个感受越来越强烈&#xff1a;控制芯片的选择往往决定了整个软件架构的走向。这几年新出的MCU、DSP型号不少&#xff0c;ARM Cortex-M7、RISC-V、甚至国产的各类专用芯片都在往电力电子领域挤&#xff0c;但真到了工业逆变器产品车间里转…

2026/10/20 9:50:30 阅读更多 →
LLM如何介入移动端自动化测试?ARTEMIS双模式架构拆解

LLM如何介入移动端自动化测试?ARTEMIS双模式架构拆解

移动端自动化测试这件事&#xff0c;真正上手做过的人都清楚&#xff0c;它跟Web端完全不是一个难度量级。Web端你打开浏览器、定位元素、点击输入&#xff0c;一套流程跑下来行云流水&#xff1b;可一旦切到移动端&#xff0c;设备碎片化、系统权限、渲染机制差异、网络抖动、…

2026/10/20 9:50:30 阅读更多 →
pjsip编译实战:Linux与Windows构建避坑指南

pjsip编译实战:Linux与Windows构建避坑指南

1. 为什么值得花时间啃下 pjsip 的编译如果你正在做VoIP软电话、呼叫中心中间件、对讲系统或者任何需要SIP协议栈的产品&#xff0c;大概率绕不开pjsip这个库。它用C语言写成&#xff0c;体积小、依赖少、跨平台&#xff0c;从嵌入式设备到桌面客户端都能跑。但很多人第一次接触…

2026/10/20 9:50:30 阅读更多 →
MMDetection自定义Loss四层解耦与实战避坑指南

MMDetection自定义Loss四层解耦与实战避坑指南

1. 为什么在MMDetection里动Loss是“最危险也最有效”的改造点我第一次在某图像检测项目中尝试替换MMDetection的损失函数时&#xff0c;模型的mAP直接从38.2%掉到12.7%&#xff0c;训练曲线像心电图进了ICU——前50个epoch loss震荡幅度超过4.0&#xff0c;第127轮干脆NaN了。…

2026/10/20 9:50:30 阅读更多 →
嵌入式串行通信协议精讲:UART、SPI、I2C与RS-485实战指南

嵌入式串行通信协议精讲:UART、SPI、I2C与RS-485实战指南

1. 串行通信到底“串”在哪&#xff1a;它为什么是嵌入式系统里最常见的通信形态如果你做过单片机、物联网模组或者工控相关的开发&#xff0c;一定会发现一个现象&#xff1a;不管是调试串口、刷写固件&#xff0c;还是传感器上报数据&#xff0c;最终通信的物理形态几乎都是“…

2026/10/20 9:50:30 阅读更多 →
汇编课设代码实战:DOSBox+MASM环境下的四个经典程序拆解

汇编课设代码实战:DOSBox+MASM环境下的四个经典程序拆解

简介&#xff1a;一份面向北理工《汇编语言与接口技术》课程的汇编上机作业资料包&#xff0c;围绕大数相乘、Windows图形界面计算器、文本文件比对、贪吃蛇游戏四个典型任务展开。其中&#xff0c;大数相乘实现100位以上十进制大整数的乘法运算&#xff1b;计算器借助Windows界…

2026/10/20 9:49:24 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* 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:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* 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:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* 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:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →