悬停样式回归测试指南:以 Kama 皮肤桌面端手动测试为例)
前端UI组件【免费下载链接】ckeditor4The best enterprise-grade WYSIWYG editor. Fully customizable with countless features and plugins.项目地址https://gitcode.com/gh_mirrors/ck/ckeditor4点击查看免费下载在 CKEditor 4 中工具栏的「富组合框」Rich Combo即 Styles、Format、Font 等下拉选择控件依赖皮肤 CSS 呈现悬停hover、聚焦focus与激活active等交互状态。本文将围绕仓库中的手动测试文档 desktoprichcombokama.md 展开完整说明该用例的测试目的、执行步骤、预期结果并结合 Kama 皮肤样式源码、richcombo 插件实现 与 Bender 测试基础设施深入剖析悬停样式的底层机制、移动端回归修复#4611以及如何复现与排查同类问题。读完本文你将掌握 CKEditor 4 皮肤交互状态的源码级验证方法并能在本地手动复现该回归测试。1. 用例定位这是一份「手动测试」文档该文档位于 tests/plugins/toolbar/manual/hover/desktoprichcombokama.md是 CKEditor 4 Bender 测试体系中「手动测试manual test」类型的用例。它通过一段 Markdown 描述测试步骤与预期结果配合同目录下的template.html 提供可交互的编辑器页面。1.1 元数据头标签即测试配置文档开头的几行bender-*标签是 Bender 识别与执行该用例的关键标签取值含义bender-tags4.16.1, 4611, bug关联版本 4.16.1、GitHub issue 编号 4611、用例类型为 bug 回归bender-uicollapsed手动测试以折叠的 UI 模式呈现bender-ckeditor-pluginswysiwygarea, toolbar, stylescombo, format测试页面需加载的插件集合值得注意bender-tags中的4611对应 CHANGES.md 中记录的修复条目——#4611[Android, iOS] Fixed: Incorrect hover styles for buttons in the toolbar on mobile devices。也就是说这份「检查 Kama 皮肤富组合框是否有悬停样式」的手动测试正是为了回归验证 4.16.1 中针对移动端悬停样式错误的修复是否引入桌面端回归。1.2 同族用例矩阵一套用例覆盖多种环境与皮肤该 hover 目录下共 18 个 Markdown 用例构成完整的覆盖矩阵环境维度android/ios/desktop控件维度button普通按钮/richcombo富组合框皮肤维度kama/moono/moono-lisa文件名不带皮肤后缀时模板 默认回退到moono-lisa本文主角desktoprichcombokama.md恰好位于矩阵的「桌面端 富组合框 Kama 皮肤」一格。与之对照的还有 desktoprichcombo.mdMoono-Lisa、desktoprichcombomoono.mdMoono、desktopbuttonkama.md普通按钮版等便于横向比对不同皮肤的状态定义差异。2. 测试页面模板如何驱动两个编辑器实例执行该手动测试时Bender 会用同目录的__template__.html渲染页面。模板的核心逻辑见template.html包括按文件名推断测试环境与皮肤通过正则/(android|ios|desktop)(?:button|richcombo)(moono|kama)?/i匹配当前 URL 路径解析出期望的环境expectedEnv与皮肤名skin缺省为moono-lisa。环境不匹配时自动忽略isIgnoredEnv()通过解析navigator.userAgent判断当前设备类型iOS / Android / 桌面与文件名期望的环境不一致时调用bender.ignore()跳过该用例——这正是desktop*系列用例在手机浏览器上不会误跑的原因。该逻辑与 CKEditor 4 自身的环境嗅探器 core/env.js 的思路一致只是模板刻意在 CKEDITOR.env 尚未就绪时提前执行。创建两个编辑器实例iframe-editor标准 iframe 型编辑器CKEDITOR.replace( iframe-editor, { skin: skin } )div-editor基于 divarea 的 div 型编辑器配置extraPlugins: divarea且同样指定skin: skin。CKEDITOR.replace( iframe-editor, { skin: skin } ); CKEDITOR.replace( div-editor, { extraPlugins: divarea, skin: skin } );两个编辑器都要检查原因在于 iframe 型与 div 型编辑器渲染工具栏的宿主文档不同皮肤 CSS 的加载与选择器生效环境也有差异可以更全面地暴露样式问题。3. 完整测试步骤Kama 皮肤按 desktoprichcombokama.md 原文测试步骤如下已结合源码补充说明步骤 1检查富组合框是否具有悬停样式浅蓝色背景在 Kama 皮肤下将鼠标悬停到工具栏的富组合框如 Styles 组合框上确认其背景变为浅蓝色。预期结果存在悬停样式组合框按钮呈现浅蓝色背景。非预期结果不存在悬停样式悬停时背景无任何变化。步骤 2在第二个编辑器上重复上述操作将同样的检查流程应用于页面中的第二个编辑器div 型编辑器确认两种编辑器形态下行为一致。3.1 为什么是「浅蓝色」Kama 皮肤源码中的悬停定义「浅蓝色背景」并非凭感觉描述而是 Kama 皮肤样式表中的真实取值。在 skins/kama/richcombo.css 中.cke_combo_off .cke_combo_button:hover, .cke_combo_off .cke_combo_button:focus, .cke_combo_off .cke_combo_button:active { background: #DFF1FF; outline: none; }#DFF1FF正是浅蓝色light-blue。同时悬停时组合框的内联标签.cke_combo_inlinelabel如“Styles”字样的透明度会从默认的 0.70 恢复到 1见 skins/kama/richcombo.css保证文本在悬停状态下清晰可读。对照参考同目录 desktoprichcombo.md 面向 Moono-Lisa 皮肤其悬停定义为「更深的背景」darker backgrounddesktoprichcombomoono.md 面向 Moono 皮肤悬停为渐变灰底且额外验证「按下/激活」与「激活后悬停」两个状态。不同皮肤对状态的视觉编码不同但测试方法论一致。4. 原理剖析Rich Combo 的三态模型与样式作用域要真正理解该手动测试在验证什么需要回到富组合框的实现机制。4.1 richcombo 插件UI 渲染与状态切换富组合框由 plugins/richcombo/plugin.js 实现依赖floatpanel、listblock、button三个插件。其 DOM 结构由模板生成plugins/richcombo/plugin.jsspan id{id} classcke_combo cke_combo__{name} {cls} rolepresentation span id{id}_label classcke_combo_label{label}/span a classcke_combo_button rolebutton aria-haspopuplistbox ... span id{id}_text classcke_combo_text cke_combo_inlinelabel{label}/span span classcke_combo_open span classcke_combo_arrow/span /span /a /span对应样式文件头部注释中的结构图skins/kama/richcombo.css.cke_combo整体容器含可选的.cke_combo_label→.cke_combo_button可点击区域含.cke_combo_text与.cke_combo_open/.cke_combo_arrow。组合框的状态通过setState()管理plugins/richcombo/plugin.js使用 CKEditor 的TRISTATE_OFF/TRISTATE_ON/TRISTATE_DISABLED三态setState: function( state ) { if ( this._.state state ) return; var el this.document.getById( cke_ this.id ), linkEl el.getElementsByTag( a ).getItem( 0 ); el.setState( state, cke_combo ); // 在根元素上追加 cke_combo_on / cke_combo_off / cke_combo_disabled state CKEDITOR.TRISTATE_DISABLED ? el.setAttribute( aria-disabled, true ) : el.removeAttribute( aria-disabled ); if ( linkEl ) { linkEl.setAttribute( aria-expanded, state CKEDITOR.TRISTATE_ON ); } this._.state state; }el.setState( state, cke_combo )会在容器上追加cke_combo_on面板打开TRISTATE_ON或cke_combo_off默认TRISTATE_OFF等类名而皮肤样式正是以这两个类名作为「状态作用域」来编写选择器的——例如 Kama 皮肤中只有.cke_combo_off .cke_combo_button:hover才应用浅蓝色背景。面板打开on时aria-expandedtrue同时该用例并未覆盖 Kama 面板打开态Kama 皮肤中.cke_combo_on组合框的视觉状态与 off 态差异不大因此步骤只验证 off 态悬停。4.2 状态选择器与键盘可达性注意 Kama 皮肤的悬停规则同时包含:hover、:focus与:active三个伪类这保证了键盘用户通过 Tab 聚焦组合框、以及鼠标按下时也能获得一致的浅蓝色反馈而不只是鼠标悬停——这也解释了为什么手动测试步骤虽只写“hover”但在源码层面验证的是整套交互状态的一致性。5. 移动端回归修复#4611为什么手动测试必须分平台这是理解整套 hover 用例的关键背景。4.16.1 修复的 issue #4611 指出在 Android、iOS 等触屏设备上工具栏按钮/组合框会错误地显示悬停样式——因为触屏设备没有真正的 hover 能力:hover样式常会在点击后“粘住”不消失造成视觉误导。修复方式是在三套皮肤kama / moono / moono-lisa的样式表中统一引入 CSS 媒体查询在设备不支持悬停时关闭 hover 样式/* Disable hover styles on mobile devices (#4611). */ media screen and ( hover: none ) { .cke_combo_off .cke_combo_button:hover { background: url(images/sprites.png) 0 -100px repeat-x; /* 恢复默认渐变 */ background: linear-gradient(to top, #fff, #d3d3d3 100px); } /* We need to restore :active styles. */ .cke_combo_off .cke_combo_button:active { background: #DFF1FF; outline: none; } }原文见 skins/kama/richcombo.css同样模式出现在 skins/moono/richcombo.css 与 skins/moono-lisa/richcombo.css 以及三套皮肤的 toolbar.css 中如 skins/kama/toolbar.css。该媒体查询利用了 CSShover媒体特性触屏设备或混合设备处于触屏模式命中hover: none此时:hover样式被还原为默认背景避免“点击后粘滞”的假悬停:active样式被保留确保点击瞬间仍有按压反馈Kama 皮肤下仍为浅蓝色。因此修复后同一套样式在桌面端与移动端表现出不同的合法行为桌面端必须有 hover 样式移动端则必须没有。这正是 hover 目录下用例按android/ios/desktop三组拆分、并由模板脚本按 UA 自动跳过不匹配环境的原因——desktoprichcombokama.md只负责在桌面端验证「Kama 皮肤组合框仍有 hover 样式」防止 4.16.1 的移动端修复误伤了桌面端的正常交互。6. 本地执行与复现方法6.1 前置条件执行手动测试需要 CKEditor 4 的 Bender 测试环境相关依赖与配置见 package.jsonbenderjs、benderjs-yui、benderjs-sinon等 devDependencies与 bender.jsBender 主配置以及 bender-runner.config.json本地启动端口 9001/9002 等。仓库根目录的 bender.ci.js 用于 CI 场景。6.2 手动测试的执行方式按 Bender 惯例启动测试服务并打开手动测试页面具体以项目 README 或 CI 脚本为准在桌面浏览器中访问tests/plugins/toolbar/manual/hover/desktoprichcombokama.html对应的测试页Bender 会依据同名的.md与.html模板生成可交互页面按第 3 节的步骤逐一操作并记录「预期 / 非预期」结果测试页面会自动加载wysiwygarea, toolbar, stylescombo, format插件工具栏中会出现 Styles样式与 Format格式两个富组合框可供悬停验证。提示若在 Android/iOS 浏览器中打开本用例模板脚本会因isIgnoredEnv(desktop)返回 true 而调用bender.ignore()自动跳过页面不会执行实际断言——这是设计使然对应平台请使用androidrichcombokama.md等移动端用例。6.3 一个有用的调试技巧临时改皮肤验证选择器仓库是只读的但你可以通过修改测试 URL 或复制模板调试的方式观察皮肤差异模板中的skin变量由文件名正则推断因此同目录的desktoprichcombo.mdMoono-Lisa与desktoprichcombomoono.mdMoono本质上复用了同一模板、不同皮肤。若在本地临时新建文件名含kama的副本并调整期望环境正则即可在不改动仓库文件的前提下对照观察三种皮肤在 hover / active / on 三态下的视觉差异此为调试建议非仓库自带功能。7. 排查指南当「非预期结果」出现时若手动测试中出现「没有悬停样式」的非预期结果可按以下顺序定位确认皮肤加载检查页面中是否确实注入了目标皮肤的editor.cssKama 皮肤的富组合框样式位于 skins/kama/richcombo.css它是 editor.css 的组成部分。若皮肤配置缺失.cke_combo_off .cke_combo_button:hover规则根本不会存在。检查状态类名在 DevTools 中确认组合框根元素上是否有cke_combo_off类。若误处于cke_combo_on或cke_combo_disabled状态悬停样式选择器将不匹配disabled 态下 skins/kama/richcombo.css 会以 0.3 透明度弱化整个组合框。排查hover: none媒体查询在触屏设备或 DevTools 的设备模拟模式下media screen and ( hover: none )会命中并还原 hover 样式——这是 4.16.1 的预期行为而非 bug。可临时关闭设备模拟或改用真实鼠标验证桌面端行为。检查内联标签透明度悬停后文字“变淡”也属于样式问题对应 skins/kama/richcombo.css 的.cke_combo_inlinelabel透明度规则是否被覆盖。对照其他皮肤运行desktoprichcombo.md与desktoprichcombomoono.md确认问题是否仅存在于 Kama从而缩小到皮肤 CSS 层而非插件层。8. 小结desktoprichcombokama.md虽只有十余行却是 CKEditor 4 4.16.1 移动端悬停修复#4611的桌面端回归防线。它验证了三件事Kama 皮肤富组合框的悬停浅蓝#DFF1FF样式在桌面端依然生效该行为在 iframe 型与 div 型两种编辑器上保持一致移动端hover: none的样式屏蔽没有波及桌面端。理解这份用例等于同时理解了 richcombo 插件的三态模型plugins/richcombo/plugin.js、皮肤状态选择器的组织方式skins/kama/richcombo.css以及 Bender 手动测试「按环境自动跳过」的模板机制template.html。当你在自定义皮肤或派生插件中需要处理工具栏交互状态时这套「标签声明 模板驱动 分环境用例矩阵 状态类名 媒体查询」的组合拳就是最直接的参考范式。赞分享前端UI组件【免费下载链接】ckeditor4The best enterprise-grade WYSIWYG editor. Fully customizable with countless features and plugins.项目地址https://gitcode.com/gh_mirrors/ck/ckeditor4点击查看免费下载相关推荐CKEditor 4 皮肤工具栏箭头定位测试指南以 kama 皮肤按钮箭头回归用例为例CKEditor 4 皮肤工具栏箭头定位测试指南以 kama 皮肤按钮箭头回归用例为例 导读 本文围绕 CKEditor 4 仓库中 tests/core/s前端UI组件OpenMMO开发日志阅读指南20篇Devlog中的关键设计决策OpenMMO开发日志阅读指南20篇Devlog中的关键设计决策 OpenMMO是一款开源多人在线角色扮演游戏MMO其开发日志Devlog记录了从前端UI组件CKEditor 4 Balloon Toolbar 皮肤机制剖析以 kama 手动测试为入口验证工具栏外观一致性CKEditor 4 Balloon Toolbar 皮肤机制剖析以 kama 手动测试为入口验证工具栏外观一致性 Balloon Toolbar气泡工具栏前端UI组件上一篇Node-sqlite3数据库迁移版本控制与Schema管理最佳实践下一篇新手使用gh-stack最容易踩的3个坑来自实践的经验总结创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考