XIAO ESP32-C5 Zigbee开发实战:从环境搭建到双核通信全解析
1. 从ESP32-C5到Zigbee为什么是它如果你最近在关注物联网开发板尤其是那些主打无线连接和低功耗的那么Seeed Studio的XIAO ESP32-C5这个名字大概率已经出现在你的视野里了。它最吸引人的地方就是把一颗支持Wi-Fi 6和蓝牙5.0的ESP32-C5芯片与一颗支持Zigbee 3.0的EFR32MG24无线协处理器塞进了一个只有拇指指甲盖大小的PCB上。这听起来就像把一辆家用轿车和一辆越野车合并成了一辆全能战车体积没变但能去的地方一下子多了好几倍。我拿到这块板子的时候第一反应是这玩意儿能干啥答案其实就藏在“Zigbee”这个关键词里。在智能家居领域Zigbee和蓝牙Mesh、Wi-Fi形成了三足鼎立的局面。Wi-Fi负责高速、高带宽的数据传输比如视频流蓝牙Mesh在手机直连和音频设备上优势明显而Zigbee则以其超低功耗、自组网能力和高可靠性牢牢占据了传感器网络、智能开关、窗帘电机这类需要长时间待机、频繁小数据包通信的设备市场。以前如果你想做一个同时连接互联网通过Wi-Fi和控制本地Zigbee传感器网络的网关设备你可能需要两块甚至三块开发板通过UART或者SPI互相通信电路复杂功耗也难控制。XIAO ESP32-C5的出现相当于官方帮你把这套“Wi-Fi主控 Zigbee协处理器”的方案做成了标准产品开箱即用。所以这个“快速入门指南”的核心价值就是帮你跨过从“拿到板子”到“让Zigbee功能跑起来”的第一道门槛。网上关于ESP-IDF开发ESP32的教程很多关于Zigbee协议栈开发的资料也不少但将两者结合特别是针对这块高度集成板子的实操记录却非常零散。很多人卡在环境配置、固件编译和最基本的点灯测试上。接下来我会以ESP-IDF v5.1为例带你走通整个流程过程中我会重点分享那些官方文档一笔带过但实际操作中一定会遇到的“坑”。2. 搭建开发环境ESP-IDF与工具链的“正确”安装姿势万事开头难而嵌入式开发的开头十有八九是环境配置。对于XIAO ESP32-C5我们需要准备两套环境一套用于ESP32-C5主控的ESP-IDF另一套用于EFR32MG24 Zigbee协处理器的Simplicity Commander用于烧录Zigbee固件。我们先搞定ESP-IDF。2.1 安装ESP-IDF v5.1官方推荐使用ESP-IDF的离线安装器这确实是最省事的方法尤其在国内网络环境下。但这里有个关键选择安装路径千万不要包含中文或空格。我习惯在C:\esp或者D:\Espressif这样的纯英文路径下安装。安装过程中它会让你选择下载的芯片支持包务必勾选ESP32-C5。安装完成后你会得到一个ESP-IDF Command Prompt (cmd.exe)或ESP-IDF PowerShell的快捷方式。注意虽然也有VSCode的ESP-IDF插件方案但对于初次接触和稳定性考虑我强烈建议先使用官方的命令行环境ESP-IDF CMD走通流程。图形化界面有时会隐藏一些细节当出现问题时不便于排查。打开ESP-IDF命令行首先验证安装是否成功idf.py --version这条命令应该能正确输出ESP-IDF的版本信息。接下来我们需要设置目标芯片idf.py set-target esp32c5这个步骤非常重要它决定了后续编译的底层库和工具链是针对ESP32-C5优化的。如果你忘记设置或者设置成了esp32编译可能不会报错但生成的固件无法在C5上运行你会得到一个神秘的“无法连接”或“芯片类型不匹配”的错误。2.2 获取XIAO ESP32-C5的示例项目Seeed Studio通常会在GitHub上维护其产品对应的示例代码库。对于XIAO系列这个仓库通常是Seeed-Studio/Seeed_Arduino_XIAO或类似的名称。但请注意我们用的是ESP-IDF而非Arduino框架。更直接的方法是使用Espressif官方的esp-idf仓库中的示例但XIAO的板级支持包BSP和引脚定义可能需要额外配置。一个更稳妥的起点是使用Seeed提供的ESP-IDF项目模板。我们可以通过idf.py命令从GitHub直接创建# 进入你的工作目录例如 D:\projects cd D:\projects # 克隆Seeed为XIAO ESP32-C5准备的基础项目模板 git clone https://github.com/Seeed-Studio/seeed-esp32c5-zigbee-idf-template.git xiao_esp32c5_zigbee_demo cd xiao_esp32c5_zigbee_demo这个模板项目通常已经包含了正确的CMakeLists.txt、sdkconfig.defaults默认配置以及最重要的对EFR32MG24协处理器进行初始化和通信的驱动代码。如果这个仓库不存在或已过时备用方案是手动创建一个ESP-IDF项目然后根据Seeed的Wiki文档手动添加Zigbee协处理器的驱动文件。2.3 安装Zigbee协处理器烧录工具Simplicity CommanderESP32-C5的固件我们用idf.py flash来烧录但EFR32MG24这颗芯片的固件需要Silicon Labs芯科科技自家的工具。我们需要下载并安装Simplicity Commander。它是一个命令行工具同时也带有图形界面。访问Silicon Labs官网在开发工具页面找到Simplicity Commander并下载。安装过程很简单一路下一步即可。安装后我们需要将它的路径添加到系统的环境变量PATH中以便在命令行中直接调用commander命令。通常它的安装路径类似于C:\SiliconLabs\SimplicityCommander。验证安装打开一个新的命令行窗口不是ESP-IDF CMD输入commander --version如果能正确输出版本号说明环境变量配置成功。至此软件开发环境就准备就绪了。接下来我们要理解这两个芯片是如何协同工作的。3. 双核通信原理与项目结构解析在开始编译和烧录前花几分钟理解XIAO ESP32-C5的架构能让你在后续调试时事半功倍。这块板子不是简单的“ESP32旁边焊了个Zigbee芯片”。EFR32MG24通过SPI接口与ESP32-C5相连并且在硬件设计上EFR32MG24的复位引脚RST和引导模式引脚BOOT也接到了ESP32-C5的GPIO上。这意味着ESP32-C5可以完全控制EFR32MG24的启动流程。在软件层面典型的项目结构如下xiao_esp32c5_zigbee_demo/ ├── main/ │ ├── CMakeLists.txt │ ├── component.mk # (如果使用Make) │ └── main.c # 你的主应用程序 ├── components/ │ └── zigbee_bridge/ # 关键Zigbee协处理器驱动组件 │ ├── include/ │ ├── src/ │ └── CMakeLists.txt ├── zigbee_firmware/ # 存放EFR32MG24要运行的Zigbee固件(.gbl文件) ├── CMakeLists.txt └── sdkconfigmain.c这是ESP32-C5主程序入口。它的任务包括初始化SPI总线、初始化Zigbee桥接驱动、通过SPI向EFR32MG24发送命令如启动Zigbee网络、发送数据、接收来自EFR32MG24的数据如传感器读数并通过Wi-Fi上报。components/zigbee_bridge/这是核心驱动组件。它封装了与EFR32MG24通信的所有底层细节SPI通信协议定义数据帧格式、命令字、校验方式。固件加载包含通过SPI将.gbl固件文件“烧录”到EFR32MG24闪存中的逻辑。注意这里不是用JTAG/SWD烧录而是ESP32-C5通过SPI模拟编程器将固件数据块写入协处理器的存储区。这是最易出错的一环。命令解析提供上层应用调用的API如zb_bridge_send_data()将应用层数据打包成EFR32MG24能理解的协议帧。zigbee_firmware/这个目录存放着编译好的EFR32MG24固件文件通常是.gbl或.s37格式。这个固件决定了EFR32MG24的角色——是作为Zigbee协调器Coordinator、路由器Router还是终端设备End Device。对于网关应用我们通常使用协调器固件。通信流程简化来说就是ESP32-C5上电 → 检查EFR32MG24是否已有有效固件 → 若无则通过SPI加载固件 → 发送“启动网络”命令 → EFR32MG24开始广播组建Zigbee网络 → ESP32-C5和EFR32MG24通过SPI进行双向数据交换。4. 编译、烧录与首次上电测试理解了架构我们就可以动手让板子跑起来了。4.1 配置项目参数进入项目目录首先进行菜单配置idf.py menuconfig这里有几个关键配置项需要检查Serial flasher config Flash Size确认设置为正确的闪存大小XIAO ESP32-C5通常是4MB或8MB。Component config ESP32C5-specific检查CPU频率等设置是否合理。最重要的找到与Zigbee Bridge或Seeed XIAO相关的配置菜单这取决于模板项目如何命名。在这里你需要配置与EFR32MG24连接的SPI引脚号、复位引脚和引导引脚。这些引脚定义必须与XIAO ESP32-C5的原理图完全一致否则通信会失败。通常模板项目已经预设好但务必核对。如果你打算启用Wi-Fi需要在Component config Wi-Fi下配置SSID和密码。配置完成后保存退出。4.2 获取并放置Zigbee协处理器固件这是新手最容易卡住的一步。EFR32MG24不能运行ESP32的代码它需要专门的Zigbee协议栈固件。这个固件通常由Silicon Labs提供或者由Seeed预编译好。寻找固件查看Seeed提供的项目模板的README.md或zigbee_firmware目录看是否已经包含了固件文件如zigbee_coordinator.gbl。如果没有你需要去Seeed的Wiki或论坛查找下载链接或者使用Silicon Labs的Simplicity Studio软件为EFR32MG24编译一个Zigbee协调器固件这又是一个复杂的流程如果Seeed提供强烈建议直接用现成的。放置固件将下载好的.gbl文件复制到项目根目录的zigbee_firmware文件夹内。驱动代码在初始化时会读取这个文件并将其通过SPI写入EFR32MG24。4.3 编译与烧录ESP32-C5固件确保你仍在项目目录下且目标已设置为esp32c5idf.py build如果一切顺利你会看到编译成功的信息并在build目录下生成xiao_zigbee_demo.bin等文件。接下来连接硬件。用USB-C线将XIAO ESP32-C5连接到电脑。在ESP-IDF CMD中执行烧录idf.py -p COMx flash monitor将COMx替换为你的板子对应的串口号在Windows设备管理器的“端口”中查看。flash命令会编译并烧录monitor会同时打开串口监视器。关键技巧第一次烧录时建议仔细观察串口监视器的日志。一个正常的启动日志应该包括ESP32-C5的CPU信息、闪存初始化。检测到Zigbee协处理器。尝试与协处理器通信或加载固件。如果协处理器固件加载成功会看到“Zigbee firmware updated successfully”或类似信息。最后Zigbee协调器开始初始化并尝试组建网络。如果在这里卡住比如日志停在“Waiting for Zigbee bridge...”或者报错“SPI communication error”那么就需要进入排查环节。5. 常见问题排查与实战心得即使按照指南操作第一次就成功也需一点运气。下面是我在多次实践中总结的几个高频问题点和解决方法。5.1 问题一ESP-IDF编译错误 “undefined reference to …”这通常意味着编译系统没有找到zigbee_bridge这个组件。在ESP-IDF中自定义组件需要正确的CMakeLists.txt或component.mk文件。检查确保components/zigbee_bridge目录下有CMakeLists.txt文件并且主项目的CMakeLists.txt中通过add_subdirectory(components/zigbee_bridge)或register_component()包含了它。解决有时需要手动执行idf.py reconfigure来让CMake重新扫描组件。更彻底的方法是删除build和sdkconfig文件然后重新执行idf.py set-target esp32c5和idf.py build。5.2 问题二串口日志显示Zigbee固件加载失败这是最经典的问题。日志可能显示“Failed to program Zigbee chip”或“Checksum error”。原因分析引脚配置错误menuconfig中配置的SPI引脚、RST引脚、BOOT引脚与硬件实际连接不符。必须对照XIAO ESP32-C5的原理图核对。固件文件问题.gbl文件损坏或者不是针对EFR32MG24芯片的正确固件。协调器、路由器、终端设备的固件不通用。电源问题在加载固件时EFR32MG24需要较大的电流。如果USB供电不足比如使用了很长的劣质数据线可能导致编程过程不稳定。时序问题驱动代码中的复位、引导引脚时序可能对某些批次的芯片不兼容。排查步骤核对引脚这是第一步也是最重要的一步。找到官方引脚定义图逐一对齐。验证固件尝试使用一个已知良好的、最简单的“点灯”测试固件如果存在来验证SPI通信链路本身是否通畅。检查电源换一个短的、质量好的USB线并直接连接到电脑后置USB口避免使用集线器。查看驱动代码打开zigbee_bridge组件中固件加载的源代码看是否有调试日志可以开启。有时需要修改spi_device_interface_config_t中的clock_speed_hz降低SPI时钟频率试试例如从10MHz降到1MHz高速SPI对布线敏感。手动烧录测试作为终极验证手段你可以尝试使用一个独立的J-Link或Silicon Labs的调试器通过SWD接口直接给EFR32MG24烧录同一个.gbl固件。如果这样能成功但通过ESP32-C5的SPI烧录失败那就100%是SPI通信或驱动代码的问题。5.3 问题三Zigbee网络组建成功但无法发现或控制子设备假设固件加载成功日志显示“Zigbee network started”但用手机APP或其他控制器搜不到Zigbee网络或者无法加入设备。信道冲突Zigbee和Wi-Fi特别是2.4GHz Wi-Fi都工作在2.4GHz频段。如果它们信道重叠会产生严重干扰。Zigbee协调器固件通常默认使用某个信道如信道11。你需要确保你的Wi-Fi路由器没有使用重叠信道Zigbee信道11对应Wi-Fi信道1有一定间隔但仍有干扰最佳是让Wi-Fi使用信道6或以上远离Zigbee常用信道。权限问题Zigbee协调器固件是否允许新设备加入有些固件默认关闭了“允许加入”的窗口或者需要特定触发条件如短按某个按键。你需要查看固件的说明或通过ESP32-C5发送“允许加入”的命令。距离与障碍物Zigbee的初始测试最好在无障碍、近距离1-2米内进行。金属物体、承重墙会极大削弱信号。5.4 个人实战心得日志是你的最佳朋友ESP-IDF的日志系统非常强大。在开发初期将日志级别设置为DEBUG在menuconfig的Component config Log output中设置你能看到每一个函数调用、每一次SPI数据传输的细节这对定位问题有奇效。项目稳定后再调回INFO级别以提升性能。版本锁定ESP-IDF、工具链、编译器、甚至Python包的版本都可能引入兼容性问题。记录下你成功时的环境版本号idf.py --versionpython --version如果未来更新后出现问题可以快速回退。对于生产项目考虑使用esp-idf的某个稳定release tag而不是最新的master分支。理解“烧录”的两层含义对于XIAO ESP32-C5你需要时刻清楚你在操作哪颗芯片。idf.py flash烧录的是ESP32-C5的应用程序。而Zigbee固件是通过ESP32-C5的应用程序在运行时动态“烧录”到EFR32MG24的闪存中的。后者的成功与否取决于前者的代码是否正确以及硬件连接是否可靠。从最简示例开始不要一上来就想做一个完整的智能网关。先确保你能编译、烧录模板项目并在串口看到Zigbee协处理器初始化的成功日志。然后尝试修改主程序只是让ESP32-C5通过Zigbee桥接驱动发送一个简单的“读属性”命令或者控制一个Zigbee灯泡开关。把这个最小闭环跑通再逐步增加功能如Wi-Fi连接、MQTT上报、Web配置页面等。最后拿到XIAO ESP32-C5并成功运行Zigbee功能只是打开了物联网混合网络的大门。接下来你可以探索如何编写更复杂的Zigbee集群逻辑如何优化双核间的通信效率如何实现低功耗管理以及如何将其部署到一个真正的产品原型中。这块小板子提供的可能性远比一个简单的点灯实验要丰富得多。

相关新闻

OBS Studio色彩校正终极指南:3个步骤打造专业直播画面

OBS Studio色彩校正终极指南:3个步骤打造专业直播画面

OBS Studio色彩校正终极指南:3个步骤打造专业直播画面 【免费下载链接】obs-studio OBS Studio - Free and open source software for live streaming and screen recording 项目地址: https://gitcode.com/GitHub_Trending/ob/obs-studio 你是否曾经疑惑&am…

2026/10/5 8:54:44 阅读更多 →
顶尖科研团队人才选拔逻辑:从三维视觉到机器人感知的跨学科能力匹配

顶尖科研团队人才选拔逻辑:从三维视觉到机器人感知的跨学科能力匹配

1. 从一则招聘启事看顶尖科研团队的“选人”逻辑最近在浏览学术圈的信息时,看到北京大学前沿计算研究中心王亦洲教授课题组发布的“博雅博士后”招聘启事。这则看似简单的招聘,背后其实蕴含了顶尖科研团队在选拔青年人才时的一套完整、严密的逻辑。对于有…

2026/10/12 21:04:59 阅读更多 →
响应式编程:异步非阻塞的“流水线工厂“

响应式编程:异步非阻塞的“流水线工厂“

【735】响应式编程:异步非阻塞的"流水线工厂" 想象你在工厂流水线上工作。 传统模式(同步阻塞): 步骤1:取材料(等工人送来) ← 停工等待 步骤2:加工(5分钟) ← 占用机器 步骤3:包装(等加工完成) ← 停工等待一个人干活,剩下两个机…

2026/10/13 17:28:07 阅读更多 →

最新新闻

乐企增值税抵扣勾选V3.010实战:从发票池到申报表的全链路对接指南

乐企增值税抵扣勾选V3.010实战:从发票池到申报表的全链路对接指南

简介:乐企增值税抵扣勾选能力说明文档V3.010面向企业财税人员、发票管理岗及对接乐企开放平台的开发与测试人员,围绕增值税抵扣勾选这一税务合规关键环节,系统梳理接口调用与业务场景处理逻辑。资源包内含1个docx文档,大小约10.67…

2026/10/14 19:14:23 阅读更多 →
你的论文在AI检测面前“裸奔”了多久?——云智变AI降重降AIGC功能一次说透|云智变AI官网www.yunzhibian.cn 微信公众号搜一搜云智变ai学术

你的论文在AI检测面前“裸奔”了多久?——云智变AI降重降AIGC功能一次说透|云智变AI官网www.yunzhibian.cn 微信公众号搜一搜云智变ai学术

你有没有经历过这种荒诞感:论文明明是自己一个字一个字敲出来的,查重率只有8%,提交系统后却收到一条通知——“AIGC疑似率67%,请整改后重新送审。” 这不是段子。2026年,知网、维普、万方三大平台全部上线了AIGC检测模…

2026/10/14 19:14:23 阅读更多 →
宏翔上位机定制开发助力工厂数据化升级实战

宏翔上位机定制开发助力工厂数据化升级实战

在不少传统制造车间里,设备轰鸣作响,但数据却像被锁在了一个个独立的黑盒子里。注塑机、冲压机、装配线各自为政,操作员每天要往返于不同的控制台记录参数,质检员对着纸质报表核对批次,管理层想要看实时的产能状况&…

2026/10/14 19:14:23 阅读更多 →
光学工程师笔试高频考点精解:图解法、入瞳渐晕与系统建模

光学工程师笔试高频考点精解:图解法、入瞳渐晕与系统建模

简介:本资源是面向光学工程领域求职者与在校学生的专业笔试备考资料,聚焦光学系统设计、成像分析与工程计算三大核心能力训练。内容涵盖图解法求像(含基点定位与成像方向判断)、光学基础填空(照明/转像系统、近视镜焦距…

2026/10/14 19:14:23 阅读更多 →
FastAdmin列表操作按钮开发指南:渲染原理与实战避坑

FastAdmin列表操作按钮开发指南:渲染原理与实战避坑

给FastAdmin列表加个操作按钮,听起来是个再基础不过的需求,真做起来却经常让人抓狂:代码写完不到十分钟,按钮却怎么都不显示;权限开了半天,别人还是看不到;好不容易出来了,点击又没反…

2026/10/14 19:14:23 阅读更多 →
CPR 1.3.0 C++ HTTP库构建与链接避坑指南

CPR 1.3.0 C++ HTTP库构建与链接避坑指南

简介:本资源为C开发者快速集成HTTP客户端功能提供的预编译cpr库(1.3.0版本),面向使用Visual Studio 2015进行Windows平台C开发的中初级工程师及学习者,有效规避源码编译依赖复杂、环境配置繁琐等常见痛点。压缩包共27个…

2026/10/14 19:13:23 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →