下篇・换墨|主题/多语言/移动端,一套组件全覆盖

By | 2026年9月7日

前两篇,我们讲清了 HT UI 高性能的根基(Canvas 绘制),以及完整的组件储备与统一数据体系(组件+DataModel)。

本篇作为系列收官,聊聊评判一套界面框架成熟度的核心标准 —— 灵活适配各类变化

同一套业务代码,能否一键切换明暗主题、快速适配多语言、移动端展示不畸变?

一支有底蕴的画笔,从不止一种墨色;即便更换墨色,落笔依旧从容。今天我们分三回细说换墨。

01 换肤:明暗一行代码切换

做项目久了迟早会撞上的宿命:任何成型的可视化界面,早晚都要配套深色模式。

运维控制台需要长时间值守,纯白界面极易造成视觉疲劳;而白天展厅、办公明亮场景下,亮色主题展示效果更佳。如今深色模式早已不是加分功能,而是用户普遍刚需,缺失会直接收到反馈。

不少前端框架新增深色模式开发成本极高:全项目色值逐一改写、补齐各类 CSS 变量,调整完成后还要逐页面核对,极易遗漏边角样式。

HT UI 将明暗切换简化为两行调用:

// 切换深色模式
ht.ui.Default.setColorMode('dark');
ht.ui.Default.invalidateUIStyles();   // 全局刷新界面样式

// 切回默认亮色模式
ht.ui.Default.setColorMode('default');
ht.ui.Default.invalidateUIStyles();

执行后,页面内所有内置组件统一切换样式

无需修改单个组件、不用改动业务代码 —— 框架内置组件预先配套明暗两套绘制逻辑,切换操作本质只是更换一套全局色彩配置规则。

基于 HT UI 搭建的 AI 聊天窗口:深色风格 + 自定义主题色,同一套组件换墨即换装。

若不需要全局统一切换,也能精准控制单个容器组件:

// 仅当前布局容器及其内部子组件切换深色,页面其余区域保持原样
hBoxLayout.setColorMode('dark');
ht.ui.Default.invalidateUIStyles();

想要侧边栏深色、主内容区亮色的混搭后台布局?只需给对应容器单独调用 setColorMode 即可快速实现。

02 调色:自定义主色,全局统一

明暗模式解决界面明度区分,每个产品还拥有专属品牌主色调。框架默认淡蓝简洁清爽,但如果产品主色为科技绿、活力橙、商务紫,该如何快速替换?

主题色支持全局统一配置,最简方案是在引入库脚本前预先定义 htconfig:

<script>
    htconfig = {
        uiTheme: {
            basePrimary: '#42BAAB',   // 全局替换主题主色为绿色
            // font:      '14px Arial',  // 同步统一全局字体
            // textColor: '#333',        // 统一全局文字颜色
            // baseBorderColor: '#ddd',  // 统一所有组件默认边框色
        }
    };
</script>
<!-- 注意:htconfig 配置必须放在库脚本引入之前 -->
<script src="ht.js"></script>
<script src="ht-ui.js"></script>

basePrimary 作用覆盖范围极广:单选框、复选框、开关的选中状态、基础按钮文字与边框、文本框文字选中背景等,一处配置,全组件同步更新。

font、textColor、baseBorderColor 同理,均为全局统一配置项,不必在项目各处零散修改颜色样式代码。

同时也支持运行时通过 JS 动态修改,明暗模式搭配自定义主题色,就能覆盖绝大多数界面换肤需求。这也印证了中篇提到的设计思路:界面仅为数据的可视化载体,样式与业务逻辑完全解耦 ——外观由配置控制,而非硬编码,因此切换成本极低。

03 内置国际化,自动适配多语种

产品出海布局,国际化(i18n)是绕不开的开发环节。HT UI 原生内置国际化能力,内置组件自带中英文两套文案,开箱即用:

ht.ui.Default.setLocale('en_US');        // 原生预置 en_US、zh_CN 两套语言包
ht.ui.Default.invalidateLocales();

两行代码执行后,所有内置组件自带中文文案(右键菜单、日期选择器 “确定 / 取消” 等)自动切换为英文。业务自定义文案也能接入同一套国际化体系,无需单独搭建翻译逻辑:

// 注册业务翻译文案(demo为自定义分类标识,可自由命名)
ht.ui.Default.setLocaleCategory('zh_CN', 'demo', { search: '查询', id: '编号' });
ht.ui.Default.setLocaleCategory('en_US', 'demo', { search: 'Search', id: 'ID' });

// 通过S()方法读取翻译文本,入参格式为「分类.字段名」
button.setText(ht.ui.Default.S('demo.search'));

后续仅切换 setLocale 参数,内置组件与业务自定义控件同步切换语种,不用在代码中堆砌大量 if (lang === ‘en’) 多分支判断。

如需拓展繁体、日文、阿拉伯文等语种,先注册语言标识,再按上述方式录入翻译文案即可:

ht.ui.Default.registerLocale('zh_HK');   // 注册中国香港繁体语种
// 后续调用 setLocaleCategory 录入对应文案,再切换 setLocale('zh_HK') 生效

框架不限制语种数量,业务需要多少种语言,就能拓展适配多少种。

04 同一套逻辑,适配移动端屏幕

最后聊聊移动端适配。

桌面端整套核心能力在移动端完全复用:Canvas 绘制、DataModel 数据体系、触摸交互全部兼容。

除此之外,HT UI 配套专属移动端组件,典型代表是仿 iOS 滚轮样式的选择器 ItemList

var list = new ht.ui.ItemList();
list.setDatas(['北京', '上海', '广州', '深圳']);   // 直接传入选项数据即可使用

移动端高频交互场景均已封装完成:

  • 二维数组
    实现省市区多列并列滚轮级联选择
list.setDatas([['北京', '上海'], ['朝阳区', '浦东新区']]);
  • 配置 children 字段
    实现联动级联,选择省份自动刷新对应城市;
  • 搭配 Popup 弹窗
    从屏幕底部弹出选择面板,操作完成自动收起;

外层简单封装,即可直接使用开箱即用的日期 / 时间选择器。

可以发现,移动端组件的数据填充方式 datas,和前两篇 “万物皆 Data” 的底层逻辑完全统一  —— 桌面端、移动端共享同一套开发思维,并非两套割裂独立的组件体系。

掌握桌面端开发后,上手移动端几乎无学习成本,这正是整套框架 “一支笔” 连贯统一的设计体现。

05 多维度适配能力梳理

本篇围绕界面 “灵活适配” 整理四大核心能力:

  • 换肤
    调用 setColorMode 一键切换明暗主题,支持全局或单组件独立配置,深色模式开发零负担。
  • 调色
    通过 htconfig.uiTheme.basePrimary 统一配置品牌主色,全组件同步生效。
  • 换语言
    依托 setLocale 与 S() 翻译方法,内置文案自带双语,业务文案统一接入,出海适配便捷。
  • 移动端适配
    完整移动端组件体系,数据操作逻辑与桌面端完全互通。

回顾整套三篇系列内容

  • 上篇《执笔
    HT UI 采用 Canvas 渲染界面,应对高密度复杂场景,性能更高效;
  • 中篇《运笔
    组件种类丰富,底层统一依托 DataModel,整体架构规整统一,同时支持界面序列化导出复用;
  • 下篇《换墨》
    支持切换主题、自定义品牌色、多语言、移动端兼容,适配各类业务场景,拓展性更灵活。

高效、规整、灵活 —— 一套成熟的界面绘制框架理应具备这三大特质:

上手简单易操作,界面架构规整统一,更换业务场景也能无缝复用。

框架优劣单凭文字描述难以体会。

图扑软件 HT UI 是面向海量控件、高频交互的专业可视化场景打磨而成的组件库。

实际落地开发测试,才能直观感受真实使用效果。