CKEditor 4 floatpanel 渲染回归测试解析:从列表项右键菜单被裁剪(13756)看浮动面板的视口适配原理
前端UI组件【免费下载链接】ckeditor4The best enterprise-grade WYSIWYG editor. Fully customizable with countless features and plugins.项目地址https://gitcode.com/gh_mirrors/ck/ckeditor4点击查看免费下载本篇技术指南围绕 CKEditor 4 仓库中的一条手动测试用例 tests/plugins/floatpanel/manual/rendering.md 展开逐项拆解其测试目标回归 ticket #13756Edge 浏览器中上下文菜单被裁剪、复现步骤以及其背后floatpanel插件“智能适配视口”的定位渲染原理。读完本文你将掌握如何运行和编写此类 Bender 手动回归测试并能从源码层面理解浮动面板上下文菜单、下拉面板等为何以及如何被重新定位、如何按视口剩余空间翻转与对齐。测试用例定位与背景该手动测试位于 tests/plugins/floatpanel/manual/rendering.md配套的页面骨架是同一目录下的 rendering.html。文件头部的 Bender 指令给出了它的全部元信息bender-tags: bug, 4.5.8, trac13756 bender-ui: collapsed bender-ckeditor-plugins: wysiwygarea,toolbar,elementspath,list,liststyle,basicstyles,contextmenu逐项解读bender-tags: bug, 4.5.8, trac13756这是一条bug 回归测试与 CKEditor 4.5.8 版本相关追踪的是 Trac 工单#13756。对应的修复记录可以在仓库根目录 CHANGES.md 的 4.5.8 “Fixed Issues” 一节找到#13756[Edge] Fixed: Context menus are cut-off.Edge 浏览器中上下文菜单被裁剪bender-ui: collapsed手动测试以折叠 UI 呈现页面会自动折叠到便于观察的最小形态。bender-ckeditor-plugins测试页面只加载与场景强相关的插件集合——wysiwygarea编辑区、toolbar工具栏、elementspath元素路径条、list与liststyle列表及其样式、basicstyles基本样式、contextmenu上下文菜单。其中contextmenu插件声明requires: menu见 plugins/contextmenu/plugin.js而menu又依赖floatpanel因此这个精简的插件集合恰好覆盖了“在列表项上弹出上下文菜单”这一完整调用链。渲染页面 rendering.html 的正文非常简单一个包含foo/bar/baz三个列表项的textarea随后执行CKEDITOR.replace( editor1 )将其初始化为经典classic编辑器列表内容作为初始 HTML 出现在编辑区中。复现步骤与预期结果测试文档给出的操作只有一步Open context menu inside any of list items (e.g. with a right mouse click). 在任意列表项内部打开上下文菜单例如通过鼠标右键。Expected预期面板布局正确The panel layout is correct。Unexpected非预期面板被裁剪Panel is cropped。这里的“面板”即floatpanel渲染出的浮动面板。之所以选择列表项作为触发点是因为 #13756 的裁剪问题与列表项菜单的尺寸、层级level以及 Edge 浏览器对 iframe 与绝对定位元素的处理方式密切相关——菜单弹出位置靠近编辑区边缘时如果面板只按初始坐标摆放而不考虑视口剩余空间就会出现右侧或底部被裁掉的现象。这条用例的价值在于它是一条完全人工判定的视觉回归测试自动化断言难以覆盖“是否被裁剪”这类渲染细节因此以 Bender 手动测试的形式固化确保任何改动都不会让 #13756 的修复回退。底层原理floatpanel 的渲染与视口智能定位要理解“面板被裁剪”为什么会发生、又是如何被修复的需要进入浮动面板的源码实现。floatpanel插件本体在 plugins/floatpanel/plugin.js 中依赖panel插件plugins/panel/plugin.js。面板实例的生成与缓存getPanel 函数 以docId-eleId-skinName-langDir[-uiColor][-CSSs][-level]为键生成面板唯一标识同键面板在全局panels对象中复用。面板 HTML 由CKEDITOR.ui.panel#render生成其模板结构为plugins/panel/plugin.jsdiv.cke_panel └── iframe.cke_panel_frame └── html.cke_panel_container └── body └── div.cke_panel_block关键点在于 CKEDITOR.ui.floatPanel 构造函数 中强制definition.forceIFrame 1浮动面板始终以 iframe 承载内容。这样一来面板内容与主文档隔离样式互不污染也让baseFloatZIndex的层级控制成为可能——面板外层 div 的z-index取editor.config.baseFloatZIndex 1plugins/panel/plugin.js而baseFloatZIndex的默认值为10000可在 core/config.js 中调整。showBlock定位的核心流程打开面板的核心方法是 showBlock。其定位算法大致分三步计算初始坐标以offsetParent的文档坐标为基础减去“定位祖先”positioned ancestor的坐标再叠加offsetX/offsetY与corner校正。隐藏面板、按内容自适应尺寸先setOpacity( 0 )让面板不可见但可测量随后清除旧宽度若block.autoSize为真则按内容scrollWidth/scrollHeight设置面板宽高并处理 IE quirks 盒模型误差与额外 10px 的视觉余量。智能适配视口smartly fit the viewport size利用getBoundingClientRect()与视口尺寸panelWindow.getViewPaneSize()比较面板四周的剩余空间决定是否翻转或贴边对齐。其中第三步正是“面板被裁剪”问题的直接对策源码注释也明确写着/* panel layout smartly fit the viewport size. */plugins/floatpanel/plugin.js。其横向分支逻辑为默认方向下若面板右侧空间不足spaceAfter rectWidth若左侧空间足够则向左翻转整个面板left - rectWidth否则若视口比面板宽则右对齐到窗口边缘left left - rect.right viewportSize.width否则贴左对齐保证“绝不从左侧裁掉面板”。纵向同理底部空间不足时优先向上翻转其次贴底对齐、再其次贴顶对齐保证“绝不从顶部裁掉面板”。这套算法同时考虑了 RTL从右到左方向下的镜像逻辑以及 IE 在 RTL 绝对定位下的滚动条修正plugins/floatpanel/plugin.js。也就是说“面板布局正确”并不只是恰好放在鼠标位置而是保证面板整体落在视口内——这正是回归用例 Expected 一栏背后真正被验证的机制。corner 参数语义showBlock的corner参数决定面板锚定在offsetParent的哪个角LTR 与 RTL 下语义互为镜像plugins/floatpanel/plugin.jscornerLTR 编辑器RTL 编辑器1左上角右上角2右上角左上角3右下角左下角4左下角右下角上下文菜单在 menu 插件的 show 方法 中默认取corner editor.lang.dir rtl ? 2 : 1并创建block.autoSize true的自动尺寸面板子菜单则通过showAsChild作为父面板的 child 显示plugins/menu/plugin.js。contextmenu插件在此基础上提供了面板定义className: cke_menu_panel与aria-label并允许通过config.contextmenu_contentsCss追加自定义 CSSplugins/contextmenu/plugin.js。生命周期与 resize 行为面板并非常驻可见其显隐由一系列事件驱动编辑器mode切换或resize时自动隐藏plugins/floatpanel/plugin.js窗口resize时调用 reposition4.5.4 起新增对应 #11724用上次showBlock的参数重新隐藏并展示从而在视口变化后保持面板位置正确所有编辑器实例销毁时若为最后一个实例则销毁全部面板否则仅隐藏plugins/floatpanel/plugin.js。回归历史的印证CHANGES.md 中与该浮动面板渲染相关的修复不止 #13756 一处可作为理解演进脉络的索引4.5.8#13756[Edge] 上下文菜单被裁剪——即本手动测试守护的修复4.5.4#11724引入了reposition窗口尺寸变化时面板应重新定位而不是在 Android/iOS 上被意外隐藏源码注释与reposition的since 4.5.4标记互相印证plugins/floatpanel/plugin.js。此外同一目录下的另一条手动测试 tests/plugins/floatpanel/manual/resize.md 专门验证 resize 场景移动设备上软键盘弹出/收起、桌面端缩放浏览器窗口时段落格式下拉应隐藏或重新定位——它守护的正是 #11724 的修复与rendering.md形成“定位正确性”与“resize 响应性”两个互补维度。配套单元测试把渲染行为固化为断言除手动测试外floatpanel 还有对应的自动化单元测试 tests/plugins/floatpanel/floatpanel.js其中若干用例与本文主题直接相关test block panel openinghiding通过panel.showBlock( testBlock1, editor.editable(), 1 )在编辑区左上角打开面板断言panel.visible与panel.element.isVisible()的状态切换test panel hide on mode switch/test panel hide on editor resize验证编辑器切模式setMode( source )与editor.resize()都会触发面板隐藏test panel reposition on window resize用sinon.spy断言窗口 resize 事件触发后reposition被调用一次、showBlock被以相同参数调用第二次test second panel hide on resize验证 #9800 场景——打开第二个面板后编辑器被 resize第二个面板也应被关闭。这些单元测试从“状态与事件”层面约束面板行为而rendering.md这类手动测试则从“视觉呈现”层面兜底两者互补。如何运行与扩展此类测试Bender 手动测试的入口约定是“同名.html.md”成对出现.html提供可运行页面.md提供步骤与预期。运行时参照仓库根目录 bender.js 中的配置其中manualBrowsers、manualTestTimeout等参数定义了接受手动测试的浏览器与超时安装benderjs依赖见 package.json 的devDependencies启动 Bender 服务并进入 manual 测试列表选择floatpanel/manual/rendering按文档步骤在列表项上右键打开上下文菜单观察面板是否完整落入视口、有无被裁剪据此勾选通过或失败。若要在后续改动中扩展覆盖可以在同一目录下新增.html/.md对并沿用bender-tags标记关联 ticket 与版本与bender-ckeditor-plugins裁剪到最小必要插件集的约定让每一条回归都有明确的触发场景与预期。小结从一条看似只有四五行的手动测试用例出发可以完整还原 CKEditor 4 浮动面板的渲染链路contextmenu依赖menu→CKEDITOR.ui.floatPanel强制 iframe→showBlock的“测量 → 自适应尺寸 → 视口智能适配”三步定位法。rendering.md所守护的 #13756Edge 下上下文菜单被裁剪正是视口适配逻辑失效的典型案例而 4.5.8 的修复与 4.5.4 的reposition机制共同保证了无论面板在列表项、段落还是任意元素上弹出无论视口如何变化面板都能完整、正确地呈现在用户视线之内。赞分享前端UI组件【免费下载链接】ckeditor4The best enterprise-grade WYSIWYG editor. Fully customizable with countless features and plugins.项目地址https://gitcode.com/gh_mirrors/ck/ckeditor4点击查看免费下载相关推荐CKEditor 4 Mentions 面板视口内智能定位手动测试用例、源码原理与回归验证CKEditor 4 Mentions 面板视口内智能定位手动测试用例、源码原理与回归验证 CKEditor 4 的 Mentions提及插件让用户通过输前端UI组件CKEditor 4 列表删除回归测试深度解析Bender 手动测试 removelistatoffset 与 5068 修复原理CKEditor 4 列表删除回归测试深度解析Bender 手动测试 removelistatoffset 与 5068 修复原理 导读 本文围绕 CKEdi前端UI组件PR Agent /generate_labels 工具完全指南基于 AI 的 PR 自定义标签自动生成与配置实战PR Agent /generate_labels 工具完全指南基于 AI 的 PR 自定义标签自动生成与配置实战 导读 /generate_labels 是前端UI组件上一篇GitHub中文界面解决方案5分钟消除语言障碍的终极指南下一篇GitHub汉化插件3分钟让英文GitHub变成中文界面新手必备神器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

PDF中文变方块或换台电脑就缺字?用PDF补丁丁做字体嵌入一次搞定

PDF中文变方块或换台电脑就缺字?用PDF补丁丁做字体嵌入一次搞定

PDF中文变方块或换台电脑就缺字?用PDF补丁丁做字体嵌入一次搞定 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱,可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档,探查文档结构,提取图片、转成图片等等 项目地址: h…

2026/10/16 1:48:42 阅读更多 →
C语言OpenSSL EVP实现AES-256-ECB加密与Base64编解码实战

C语言OpenSSL EVP实现AES-256-ECB加密与Base64编解码实战

/* 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 1:48:42 阅读更多 →
Python进阶刷题实战:五类高频题型的函数封装与边界条件处理

Python进阶刷题实战:五类高频题型的函数封装与边界条件处理

/* 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 1:48:42 阅读更多 →

最新新闻

React Native鸿蒙适配实战:状态管理与筛选排序的设计排坑

React Native鸿蒙适配实战:状态管理与筛选排序的设计排坑

跨平台这个口号喊了好多年,我现在听到的第一反应已经不是兴奋,而是翻需求文档。原因很简单:框架能不能跑,和业务能不能顺畅地跑,是两码事。只要项目涉及多平台,尤其是国内环境里绕不开的鸿蒙,你…

2026/10/16 2:28:53 阅读更多 →
SSM电商实战:2000行代码跑通全链路Java Web系统

SSM电商实战:2000行代码跑通全链路Java Web系统

简介:本资源是一套完整的Java Web电子商城课程设计大作业,面向高校计算机专业学生及Java初学者,用于软件工程实践、毕业设计参考或Web开发入门训练。内容覆盖从需求分析、概要设计、详细设计到系统实现与文档编写的全流程,技术栈基…

2026/10/16 2:28:53 阅读更多 →
MASM for Windows集成实验环境:从汇编编写到调试验证的完整闭环

MASM for Windows集成实验环境:从汇编编写到调试验证的完整闭环

简介:本资源是一套开箱即用的Windows平台汇编语言集成实验环境,专为汇编初学者、高校计算机组成原理/汇编语言课程学习者及底层开发入门者设计,有效解决传统DOS环境下MASM配置复杂、兼容性差、调试不便等痛点。压缩包共25个文件,含…

2026/10/16 2:28:53 阅读更多 →
Linux桌面热键唤醒xterm:sxhkd+xdotool实战

Linux桌面热键唤醒xterm:sxhkd+xdotool实战

1. 先还原我的使用场景:为什么需要把 xterm 做成"可唤醒终端"1.1 痛点:找终端窗口所花的几秒钟我每天大部分时间都泡在浏览器、编辑器、聊天窗口之间,突然想跑一条命令的频率特别高。传统习惯是去任务栏或者工作区里找终端窗口&…

2026/10/16 2:28:53 阅读更多 →
Qt/C++网络请求封装:QNetworkAccessManager统一管理与避坑指南

Qt/C++网络请求封装:QNetworkAccessManager统一管理与避坑指南

简介:一套基于Qt框架的网络请求模块封装方案,面向需要将HTTP通信与业务逻辑解耦的C/Qt开发者,可快速解决网络层重复开发、调试不便、缺少请求日志等常见问题。资源共22个文件,以cpp/h源码为主,另含ui界面、Visual Stud…

2026/10/16 2:28:53 阅读更多 →
移动电源新国标|详解异常温度记录功能实现方案

移动电源新国标|详解异常温度记录功能实现方案

简介移动电源新国标今年4月1号发布,号称历史最强标准,对行业的公司来说试一次考验。过渡期12个月,2027年4月1号将会强制实施新国标标准。新国标中有一项异常温度记录的要求,今天我们来解读一下什么意思?电量计怎么做才…

2026/10/16 2:27:53 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* 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 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →