news 2026/10/16 5:12:57

易语言大漠FindColor屏幕找色从原理到封装实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
易语言大漠FindColor屏幕找色从原理到封装实战

如果你写易语言程序,迟早会遇到一个需求:在屏幕上找一个指定颜色的点,然后根据它的位置去点击或执行后续逻辑。就拿我前阵子接的一个自动录入数据的小项目来说,界面上有一个绿色的“开始”按钮,程序要自己发现按钮出现并完成点击。最初我打算用截图比对,结果不同分辨率下按钮位置飘来飘去,截图方案根本扛不住。后来换成大漠插件的FindColor做屏幕找色,问题顺了很多。这个需求在易语言生态里几乎是绕不开的一课,很多新人卡住,不是因为命令不会抄,而是不理解颜色串、偏色、坐标体系这些底层概念,照着网上的片段代码拼进自己的工程,出了问题只能干瞪眼。

这篇内容适合两类人:一类是刚接触易语言自动化,想把界面自动化和数据录入做扎实的开发者;另一类是已经会调用大漠命令,但想自己动手封装成模块、把工具沉淀下来的朋友。我会从概念讲起,把FindColor的每个参数拆开揉碎,再带你完整走一遍模块制作流程,最后分享几个我实际踩过且花了不少时间才解决的坑。整个过程不依赖任何现成模块,全部用易语言基础语法完成,属于可以直接复现和扩展的实战思路。

1. 大漠FindColor在易语言自动化里的位置:为什么所有封装都从找色开始

1.1 找色的本质

屏幕找色,用一句话说就是:在指定区域内,从上到下、从左到右扫描每一个像素,找出颜色符合指定描述的第一个点,然后把坐标返回给你。大漠的FindColor就是干这件事的。它的优势非常明显:不依赖图片资源,不需要预先截图,只要颜色值准确,调用速度非常快,适合做实时判断。

为什么自动化程序需要它?因为大多数界面操作都可以拆成两步:先找到目标位置,再对它执行操作。而“找位置”这件事,用颜色是最直接的信号。比如一个软件的某个功能按钮在特定背景下会变成固定颜色,程序只需要扫描那一小片区域,发现目标颜色出现,就说明按钮出现了,坐标也有了,后续的鼠标点击、键盘输入就都有据可依。

找色的本质不是单纯的颜色匹配,而是把“视觉信号”转换为“可编程的坐标判断”。这个转换做得好不好,直接决定了自动化脚本的稳定性。我见过很多脚本后面越写越复杂,追根溯源都是因为找色这一步就埋了隐患,后面所有逻辑都跟着抖。

1.2 网上到处是现成封装,为什么还要自己动手做模块

易语言社区里,大漠模块的成品一抓一把,很多人第一反应是“直接用别人的模块不就行了”。确实,直接调别人封装好的命令,十几行代码就能跑起来。但问题是,一旦遇到找不到颜色、坐标错位、返回结果不对这类问题,你根本不知道从哪里下手排查,因为那些现成模块几十上百个命令堆在一起,内部实现对你来说是个黑盒。

自己封装模块的价值不在于“比别人写得好”,而在于你能完全掌控调用链路上的每一个细节:参数怎么传、坐标怎么回传、初始化在哪一步做、失败时返回什么。封装一次,你对大漠的了解程度会直接上一个台阶。而且模块一旦做好,就是你自己的一套工具库,以后建新工程直接引用,省掉重复造轮子的时间。

1.3 这个内容适合谁

写这篇内容之前,我默认读者具备最基础的易语言知识:知道什么是子程序、什么是参数、会写基本语法。如果你是完全没接触过易语言的新手,建议先花半天跑一遍易语言自带的入门教程,再回来看这篇。另外要强调一点:自动化脚本本身是合法工具,可以用来做办公流程自动化、软件测试、批量数据处理,但不要把它用在破坏性或者违反软件用户协议的场景里,技术本身没有立场,怎么用取决于使用者。

2. 动手封装前必须吃透的四个底层概念

2.1 RGB颜色、十六进制颜色串和取色工具

屏幕上的每一个像素,在程序底层都是由红、绿、蓝三个颜色通道叠加出来的,每个通道的强度范围是0到255,用十六进制表达就是00到FF。大漠的颜色串用的就是这种表达方式:六个十六进制字符,前两位是红色,中间两位是绿色,最后两位是蓝色。比如纯红色是FF0000,纯绿色是00FF00,纯蓝色是0000FF。

那么问题来了,你怎么知道屏幕上某个点的颜色值是什么?最稳妥的办法是使用取色工具。大漠安装包里通常自带取色工具,鼠标移到屏幕上任意位置,工具会实时显示当前像素的RGB值,点一下就能复制出类似“2B3C4D”这样的颜色串,直接放进你的代码里。这个过程看似简单,但很多人会在这里栽跟头:取色时没注意鼠标是否悬停在目标区域上,取到了边框、阴影或者反光部分的颜色,导致后面调用时怎么都匹配不上。

我的建议是:取色时尽量取目标区域的中间位置,避开边缘的渐变和文字的笔画。如果目标区域本身有纹理或渐变,就多取几个点,用后面要讲的多色组合来覆盖,而不是指望单色匹配搞定一切。

2.2 偏色机制:它解决的其实是“容差”问题

屏幕上的颜色不是恒定不变的。同一块按钮,因为显卡渲染差异、窗口阴影、背景半透明效果,甚至显示器色温不同,实际像素的RGB值可能和取色拿到的值差上三五分,有时差上十几二十分。如果你把颜色串写死,稍微一点环境变化就找不到目标,脚本就废了。

所以大漠引入了偏色概念。偏色写在颜色串后面,用减号连接,格式是三组十六进制数,对应红色、绿色、蓝色三个通道各自允许的容差。举个例子,“FF0000-101010”的意思是:匹配时允许红色分量在255-16到255之间,绿色分量和蓝色分量在0到16之间。只要目标像素的三个通道分别落在这个容差范围内,就算匹配成功。

用生活里的类比来说,找颜色就像认人,偏色就是允许对方“今天换了不同深浅的衣服”。完全没有偏色,对方衣服颜色稍微变一点你就不认识了;偏色给太大,又会把穿差不多颜色衣服的路人也认成目标。如何把握这个度,我后面会专门讲。

2.3 颜色描述串的三种常见写法

大漠的颜色串不是只有单一格式,理解清楚能省很多事。最基础的是单色,直接写六个字符,比如“FF0000”。第二种是单色加偏色,像我刚才说的“FF0000-101010”。第三种是多色组合,用竖线“|”把多个颜色串连接起来,比如“FF0000-101010|00FF00-101010”,表示在区域里搜索任意一个符合其中任一颜色描述的点,谁先命中就返回谁。

多色组合的用处很大,比如目标按钮的文字颜色有红有绿,你想找到按钮区域内的任意一个特征色,就可以把这几个颜色都写进描述串里,一次扫描就能命中。但要注意,多色组合会导致匹配点变多,如果你需要的是某个特定位置的颜色,尽量把检索区域缩小,让命中点落在有效范围内。

2.4 坐标体系:屏幕坐标、窗口坐标与DPI缩放

这是最容易出错,也最容易被忽略的一环。大漠在未绑定窗口的时候,FindColor的检索区域和返回坐标用的都是屏幕坐标,也就是以屏幕左上角为原点,x轴向右,y轴向下。而一旦调用BindWindow把窗口绑定到大漠上,坐标参照就变成窗口客户区的左上角,检索区域不再包含标题栏和窗口边框。

很多人犯的错是:绑定窗口之后,还在用屏幕坐标的数值去填检索区域,结果区域落在窗口外面或者完全错位,自然找不到目标颜色。正确的做法是先明确当前处于哪一种坐标状态,再决定区域参数。如果不确定,可以先用大漠的窗口命令获取客户区在屏幕上的实际位置,然后通过简单换算把目标区域转成当前坐标体系下的数值。

DPI缩放的问题更加隐蔽。Windows默认情况下,如果系统显示缩放设置是125%或150%,GDI坐标和物理像素之间的比例就不再是1比1。易语言编写的程序如果没有做高DPI适配,取到的屏幕坐标会被系统按缩放比例拉伸或压缩,导致FindColor的检索区域和实际像素位置对不上。这个坑在“开发机上正常,部署到客户机器上就找不到颜色”的案例里占了相当大比例。

3. FindColor参数逐项拆解:每一个参数都有讲究

3.1 检索区域x1,y1,x2,y2:区域越小,性能越好

FindColor的前四个参数是检索区域的左上角和右下角坐标。这个区域定义了两个事情:扫描范围有多大,以及性能开销有多高。屏幕越大,扫描像素越多,耗时越长。很多人习惯直接填0,0,1920,1080,把整个屏幕交给FindColor,这是非常不推荐的写法。

正确的做法是:先确定目标控件所在的窗口,再把这个窗口的客户区范围作为检索区域。如果你的目标只在窗口内的某个固定板块,比如左上角那块状态栏,就把区域继续缩小到那一块。举个例子,一个窗口客户区左上角是(200,150),右下角是(1200,800),而按钮只出现在客户区左半边,那检索区域可以进一步缩小到(200,150,700,800),扫描量直接减少一半以上。

3.2 相似度sim:0.9是推荐起点

FindColor的sim参数表示相似度,取值范围是0到1之间的小数。数值越接近1,匹配越严格;数值越小,匹配越宽松。很多人不理解这个参数和偏色之间的分工,其实两者是可以配合使用的:偏色定义了三个颜色通道各自的容差区间,相似度相当于在偏色过滤之后的二次门槛。

根据我的经验,sim取0.9是一个比较稳妥的起点,既能容忍轻微颜色波动,又不容易把相近颜色误判成目标。如果颜色环境比较稳定,比如取色的目标是一个从不变化的纯色区域,可以调到0.95甚至1.0。但如果你把sim降到0.8以下,误匹配率会急剧上升,屏幕上所有看起来“差不多”的颜色都会成为目标,后续逻辑会被扰得一团糟。

3.3 查找方向dir:影响返回的命中点

当检索区域内存在多个符合颜色描述的点时,FindColor返回哪一个,由dir参数决定。不同的方向值对应不同的扫描起点和扫描顺序:有的从左上往右下扫,第一个命中点就是区域最左上方的那个;有的从区域中心开始向四周扩散,优先返回中心附近的命中点;还有的从右下往左上扫,返回的是区域最右下方的那个点。

方向值的选择要看实际需求。例如你要点一排图标中的第一个,方向选从左往右从上往下,返回的就是最左上角的图标;如果你要判断一个弹出窗口中央是否有目标元素,选从中心扩散的方向更合适。需要提醒的是,不同版本的大漠对方向值的定义可能有细微差别,动手前花两分钟核对一下对应版本的文档,能省下后面一大段时间。

3.4 返回值与intX,intY:传址是拿坐标的关键

FindColor的返回值表示执行结果:1表示找到,0表示没找到,-1通常表示调用失败,比如大漠未注册、对象未创建等。真正有用的命中坐标,是通过最后两个参数intX和intY返回的。在易语言里,这两个参数必须声明为整数型,并且勾选“传址”,否则你只能得到“找到或没找到”这个结论,坐标永远是0。

这里有个新手极其容易踩的坑:封装模块时,对外公开的“查找颜色”子程序参数如果不勾选传址,内部即使拿到了坐标,外部调用者也拿不到。所以封装命令时,需要仔细核对每一个输出型参数的传址属性,这是模块能不能正常工作的关键细节之一,后面封装到第4章时我会再次强调。

4. 从零封装一个易语言大漠找色模块

4.1 环境准备:大漠DLL、注册与路径

开始写代码之前,先把环境准备好。第一步是获取大漠插件DLL,放到一个固定的目录,我习惯放在“取运行目录()\dm”下,这样模块移植到其他电脑时不会因为绝对路径写死而失效。第二步是把这个DLL注册成COM组件,注册方式是在运行框或者命令行里执行:

regsvr32 完整路径\dm.dll

执行成功会弹出注册成功的提示。如果这一步不做,后面创建对象时会直接失败。第三步是准备注册码。大漠的核心命令是需要注册才能使用的,没有注册码的话FindColor这类命令通常会返回异常值。注册码激活动作一般在程序启动时调用Reg命令完成,和创建对象放在一起。

4.2 在易语言里创建大漠对象并连通

易语言操作COM组件,一般用“对象”这个数据类型。创建方式很直接,用“创建自Com”方法,传入大漠的程序标识符“dm.dmsoft”。对象创建成功之后,再依次调用置路径和Reg完成初始化。

这里有一个细节:如果你的易语言版本是较老的精简版,可能不支持部分COM操作语法,建议使用较新的版本或者安装官方扩展支持库。创建对象时,程序集变量要定义为“对象”类型,在整个程序的运行周期内只创建一次,不要每次找色都重新创建,否则资源消耗会很大。

4.3 把FindColor封装成易语言模块公开命令

新建一个易语言模块工程,在模块内部定义一个程序集变量作为全局大漠对象,然后对外暴露三个核心命令:初始化、查找颜色、销毁对象。下面是一段示意代码,重点看参数设计和传址写法:

.版本 2 .程序集 大漠封装 .程序集变量 全局大漠, 对象 .子程序 大漠初始化, 逻辑型, 公开 .参数 注册码, 文本型 .参数 路径, 文本型 如果真 (全局大漠.创建自Com ("dm.dmsoft", )) 全局大漠.置路径 (路径) 如果 (全局大漠.数值方法 ("Reg", 注册码, "") = 1) 返回 (真) 否则 返回 (假) 如果结束 否则 返回 (假) 如果真结束 .子程序 大漠查找颜色, 整数型, 公开 .参数 左上X, 整数型 .参数 左上Y, 整数型 .参数 右下X, 整数型 .参数 右下Y, 整数型 .参数 颜色描述, 文本型 .参数 相似度, 双精度小数型 .参数 查找方向, 整数型 .参数 返回X, 整数型, 传址 .参数 返回Y, 整数型, 传址 返回 (全局大漠.数值方法 ("FindColor", 左上X, 左上Y, 右下X, 右下Y, 颜色描述, 相似度, 查找方向, 返回X, 返回Y)) .子程序 大漠销毁, 无返回值, 公开 全局大漠.清除 ()

需要特别说明的是:不同易语言版本中,对象方法调用的具体写法可能有差别,有人习惯用“对象.方法”,有人用“对象.数值方法”,本质都是调用COM对象的方法。我这里的“数值方法”是易语言对象类型调用返回数值方法的常见写法,如果你手里的版本不识别,请参考易语言自带的COM示例修正,代码的核心逻辑不变。

封装命令时,我强烈建议把“返回X”和“返回Y”这样的输出参数统一放在参数列表末尾,并且明确注释“传址”。这样可以避免外部调用者漏看参数顺序,也方便以后维护。

4.4 完整调用示例:从初始化到命中坐标

模块编译成.ec文件之后,新建一个易语言窗口程序,通过“工具→模块引用”引入,然后就可以直接调用。一个完整的调用流程如下:

.局部变量 x, 整数型 .局部变量 y, 整数型 .局部变量 结果, 整数型 如果 (大漠初始化 ("你的注册码", 取运行目录 () + "\dm") = 假) 信息框 (“大漠初始化失败,请检查DLL路径和注册码”) 返回 如果结束 结果 = 大漠查找颜色 (100, 100, 900, 600, "1A2B3C-101010", 0.9, 0, x, y) 如果 (结果 = 1) 调试输出 (“命中坐标:”, x, y) ' 这里可以继续调用大漠的鼠标移动、鼠标点击等命令 否则 调试输出 (“未找到目标颜色”) 如果结束 大漠销毁 ()

注意到一个小细节:我把检索区域填成了(100,100,900,600),而不是(0,0,1920,1080)。因为调用前我已经通过窗口客户区位置算出了目标板块的实际坐标范围,这样可以避免全屏扫描带来的性能浪费。对于新手,这里最大的教训是:区域宁可多算一步,也不要无脑全屏。

5. 找色失败与不稳定的排查路径:按这个顺序排查

5.1 第一步:确认颜色串和偏色是否正确

找色失败,先把取色工具重新打开,把鼠标移到目标区域,确认你取到的颜色值和代码里写的完全一致。常见问题是颜色串少写一位、多了一个空格、或者把取色工具显示的带井号的格式“#FF0000”直接复制进来。大漠的颜色串不要带井号,直接六个十六进制字符。

偏色设置也要检查。如果目标环境颜色波动较大,而你的偏色写的是“000000”也就是完全无容差,一旦显卡色彩偏移,匹配就会失败。我一般建议从“101010”起步,实测不够再放大到“202020”,一般到“303030”时误匹配率已经很高了,除非万不得已不要再放大。

5.2 第二步:确认坐标参考系是否一致

这是我接手过的排错案例里出现频率最高的原因。绑定窗口前后,坐标参考系会从屏幕坐标切换成窗口客户区坐标,很多脚本在绑定完成后仍然写着一组屏幕坐标区域,结果检索区域根本不在窗口内。另外还有一些命令,比如获取窗口位置、移动窗口位置,返回的坐标和客户区坐标也不相同。

排查方法很简单:在调用FindColor之前,故意往两个坐标参数里填入窗口客户区范围内一个肉眼能看到颜色的点,看看返回结果是否等于那个点的实际位置。如果不一致,说明你当前使用的坐标参考系和你的预期有偏差,先解决参考系问题再继续。

5.3 第三步:DPI缩放和分辨率变化

开发机上测试正常,部署到另一台电脑上就找不到颜色,优先怀疑DPI缩放。如果你的目标电脑把显示缩放设置成了125%或150%,而你的易语言程序和脚本没有做高DPI适配,屏幕上坐标就会系统性错位。解决方法有三种:一是在程序启动时调用系统API声明进程DPI感知,让坐标使用物理像素;二是在程序兼容性设置里勾选“替代高DPI缩放行为”;三是在测试阶段先把目标电脑的显示缩放临时调整为100%。

不要忽略这个方法,也不要觉得它只是“环境问题”就放着不管。实际项目里,因为部署环境DPI设置不同导致整个找色全部失效的例子非常多,提前处理能省下大量现场调试时间。

5.4 第四步:性能和稳定性调优

有时候不是找不到,而是时灵时不灵。这种情况往往和性能或调用频率有关。如果程序频繁地在超大区域内找色,CPU占用会很高,系统调度不稳定时屏幕刷新或窗口遮挡就会导致找色结果波动。优化手段包括:缩小检索范围、把固定的检索区域根据窗口位置动态计算、在多次连续找色之间加入几十毫秒的延时、以及采用多色组合降低误匹配概率。

找色问题排查表

现象可能原因处理方式
返回结果一直是-1大漠未初始化或注册码无效检查创建对象和Reg返回值
返回0,但颜色肉眼可见颜色串格式错误或偏色太小重新取色,放大偏色
能找到,但坐标不对坐标参考系或DPI缩放问题确认绑定状态,做DPI适配
时灵时不灵检索区域过大或调用过于频繁缩小区域,加入延时
误匹配点太多相似度太低或偏色过大提高sim,缩小偏色区间

6. 再往前走一步:从FindColor到FindMultiColor的组合思路

6.1 单色找色的局限

FindColor在纯色目标面前非常好用,但真实界面不会总给你一个干净的纯色点。比如一块纯白面板上有一个白色按钮,你拿FindColor找白色,结果会是整块面板上几十上百个命中点,脚本根本不知道该点哪个。再比如按钮上有半透明悬浮效果,颜色上下渐变,单色匹配也很难稳定命中。

单色找色的核心局限在于:它只验证“一个点”的颜色对不对,不验证“点的周围环境”对不对。解决这个问题的思路是多点约束——目标位置的特征不是单独一个像素,而是由多个相对位置确定的颜色组合。只有所有关键点的颜色都匹配,才认为找到了目标。

6.2 FindMultiColor的组合描述串构造思路

大漠提供了FindMultiColor命令来实现多点找色。它的基本逻辑是:先在区域内找到一个符合第一颜色描述的点,然后以这个点作为基准,按照预设的相对偏移检查周围若干位置的颜色是否也符合描述。如果全部符合才算命中,并返回基准点的坐标。

组合描述串的大致格式可以这样理解:第一个颜色串是基准色,后面跟着若干组“偏移量|颜色”的描述,偏移量是相对于第一个命中点的x、y距离,颜色描述串的写法和偏色规则与FindColor一致。构造的时候最实用的办法是:先用FindColor分别确认每个特征点的颜色,再手工计算相对坐标差,最后组装成组合串。为了保证说明准确,具体到某个版本时最好还是核对官方文档里的格式定义,因为插件版本更新时,分隔符或参数顺序可能发生变化。

从模块封装的角度来说,FindMultiColor和FindColor的封装方法几乎一样,就是把命令名换掉、参数换一下,传址逻辑和初始化流程完全复用。我建议在封装模块时直接把这两个命令一起封装,因为实际使用中它们经常配合出现:先用FindColor做初步定位,再用FindMultiColor做精确验证。

6.3 封装过程中积累的几条经验与细节

第一,颜色值维护成常量。不要在每个调用位置裸写“1A2B3C-101010”这种字符串,把它们统一放在常量区或者配置项里,需要调整时只改一个地方,否则项目大了以后,你根本不知道哪个颜色串对应屏幕上的哪个位置。

第二,调试时先打印坐标,再执行点击。我看见过不少人在找色后立刻点击,结果没有命中也不打印,分不清是找色问题还是点击问题。建议先输出命中坐标观察一两轮,确认坐标稳定之后再让后续操作生效。

第三,模块的初始化命令最好支持重复调用。脚本运行过程中,窗口可能被关闭重建,大漠对象可能需要重新创建。把初始化逻辑设计成幂等操作,重复调用不会出错,会让模块健壮很多。

第四,也是很重要的一点:找色这十个问题里有八个出在偏色和DPI上,而不是命令本身。遇到问题先冷静,按固定顺序排查,往往比反复改代码有效得多。

大漠的FindColor只是整个自动化的起点,但把这个起点踩实了,后面无论扩展多点找色、找图还是键鼠模拟,你都会有一种“底层逻辑都在自己手里”的踏实感。这套模块我在几个自动化脚本里跑了挺长时间,最稳的组合是偏色带上一两个通道、相似度保持在0.9、检索区域精确到目标所在板块,宁可慢那么几毫秒,也不要把误匹配放进后续逻辑里。

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

Apollo-11 制导计算机源码解析:资源约束下的实时系统设计智慧

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

作者头像 李华
网站建设 2026/10/16 5:12:34

人机协作可验证性:不靠透明靠交互的AI决策新范式

1. 这不是“人机辩论”,而是一场可验证的协作证明“Human-LLM Deliberation as Interactive Proof: Conditions for Verifiability Without Transparency”——这个标题乍看像一篇纯理论计算机科学论文,但如果你在AI系统设计、可信AI评估、或人机协同决策…

作者头像 李华
网站建设 2026/10/16 5:11:27

Excel数据分析基础技能:从表格规范到透视表与图表实战

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

作者头像 李华
网站建设 2026/10/16 5:11:10

2S电池主动均衡方案:MP2642GR-Z与PIC24FJ的储能实践

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

作者头像 李华
网站建设 2026/10/16 5:11:06

经纬度多边形面积计算:球面鞋带公式与工程实践避坑指南

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

作者头像 李华
网站建设 2026/10/16 5:10:13

小程序HTML转换原理与安全实践指南

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

作者头像 李华