本文详解在 twincat 3 hmi 中通过 javascript 实现按钮驱动的页面内平滑滚动至顶部或底部,支持自定义目标页面元素,无需手动拖拽滚动条。
本文详解在 twincat 3 hmi 中通过 javascript 实现按钮驱动的页面内平滑滚动至顶部或底部,支持自定义目标页面元素,无需手动拖拽滚动条。
在 TwinCAT 3 HMI 开发中,当 HMI 页面内容较长(如设备参数列表、历史报警记录等)时,用户频繁手动滚动体验较差。为提升操作效率,可通过添加功能按钮,一键跳转至页面指定位置(如顶部或底部)。该方案基于浏览器原生 scrollIntoView() API,完全兼容 TwinCAT HMI 的 Web-based 运行时环境(基于 Chromium 内核)。
✅ 实现步骤
在图形编辑器中添加按钮
在 HMI 项目设计器中,于工具栏或页面任意区域插入一个标准 Button 控件(如 TcHmi.Controls.System.Button)。绑定 OnPressed 事件
选中按钮 → 切换到「Events」选项卡 → 点击 OnPressed 事件右侧的编辑图标(铅笔图标)→ 在弹出的脚本编辑器中输入以下 JavaScript 代码:
// 滚动至页面顶部(假设当前页根容器 ID 为 "Page1")
document.getElementById("Page1").scrollIntoView({ behavior: "smooth", block: "start" });
// 或滚动至页面底部(需确保容器高度超出视口,且内容可滚动)
document.getElementById("Page1").scrollIntoView({ behavior: "smooth", block: "end" });? 关键说明:"Page1" 是 TwinCAT HMI 中页面(Page)默认生成的 DOM 元素 ID。你可在浏览器开发者工具(F12 → Elements 面板)中验证实际 ID —— 通常与页面名称一致,但建议以 document.querySelector("[data-tchmi-page-name='YourPageName']") 更健壮地定位。
-
进阶:动态获取当前页面 ID(推荐)
若项目含多个页面且需复用按钮逻辑,避免硬编码 ID,可使用以下方式自动识别当前活跃页面:
const currentPage = TcHmi.Page.getCurrent();
if (currentPage && currentPage.id) {
const pageElement = document.getElementById(currentPage.id);
if (pageElement) {
pageElement.scrollIntoView({ behavior: "smooth", block: "start" });
}
}⚠️ 注意事项
- scrollIntoView() 仅对具有明确高度和 overflow: auto/scroll 样式的容器生效;若页面未启用垂直滚动,请检查 CSS 或 HMI 容器属性(如 HeightMode="Auto" 与 VerticalScroll="True")。
- TwinCAT 3.1+ 版本默认启用 behavior: "smooth",旧版本可能需配合 CSS scroll-behavior: smooth(在全局样式中设置)。
- 不要在 OnReleased 或 OnClick 中调用 —— OnPressed 确保用户点击瞬间触发,响应更及时。
- 避免在 scrollIntoView() 前执行耗时同步操作(如大量数据计算),否则可能导致滚动延迟或卡顿。
✅ 总结
通过简单几行 JavaScript,即可在 TwinCAT 3 HMI 中实现专业级页面导航体验。核心在于精准定位页面 DOM 元素并调用标准化滚动 API。该方法轻量、可靠、无需额外控件或 PLC 交互,是 HMI 人机交互优化的典型实践。建议在实际项目中结合 TcHmi.Page API 动态适配多页面场景,提升可维护性与扩展性。

















