8.6 KiB
8.6 KiB
bricks.IconBar 及相关组件技术文档
概述
bricks.IconBar 是一个基于 bricks.HBox 的 UI 组件类,用于创建水平排列的图标工具栏。它支持动态图标、点击事件分发、响应式尺寸调整等功能。该模块还包含多个扩展类:
bricks.IconTextBar:带文本标签的图标栏。bricks.FloatIconBar:浮动式图标栏,鼠标悬停时显示完整图标组。bricks.FloatIconTextBar:结合浮动与图文混合的增强型工具栏。
这些组件常用于构建轻量级、可定制的工具栏或操作面板。
基础结构
var bricks = window.bricks || {};
确保 bricks 全局命名空间存在,避免覆盖已有内容。
1. bricks.IconBar
类继承关系
class extends bricks.HBox
继承自 HBox(水平布局容器),实现横向排列子控件。
配置参数 (opts)
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
cheight |
Number | 2 |
子项高度倍率(相对于字符单位) |
rate |
Number | 1 |
缩放比例因子 |
margin |
String | '10px' |
图标之间的左右边距 |
tools |
Array | [] |
工具定义数组,每个元素为一个工具描述对象 |
tools 数组项结构
| 属性 | 类型 | 是否必需 | 说明 |
|---|---|---|---|
name |
String | 否 | 图标的唯一标识名称(用于事件分发和 DOM ID) |
icon |
String | 是(非 blankicon) | SVG 图标 URL 或资源路径 |
rate |
Number | 否 | 单独设置该图标的缩放比例(优先于全局 rate) |
dynsize |
Boolean | 否 | 是否启用动态尺寸调整 |
tip |
String | 否 | 提示文本(暂未在 IconBar 中直接使用) |
特殊情况:若
name === 'blankicon',则生成空白占位符图标。
构造函数行为
constructor(opts)
-
默认值填充:
- 若未指定
cheight,默认设为2 - 若未指定
rate,默认设为1
- 若未指定
-
调用父类构造器:
super(opts); -
样式设置:
- 添加 CSS 类名
'childrensize' - 设置主轴对齐方式为居中(
alignItems: center)
- 添加 CSS 类名
-
遍历
tools创建子控件:- 复制每个工具配置并补充通用属性(如
cheight,cwidth,dynsize) - 调用
build_item(opts)创建具体控件 - 设置左右 margin 和 cursor 样式为 pointer
- 若有
name,设置对应 widget 的 ID - 绑定点击事件并通过
regen_event分发事件 - 将控件加入容器
- 复制每个工具配置并补充通用属性(如
-
内部高度记录:
- 使用
this.height_int记录所有子控件中的最大高度(像素值),便于外部布局参考。
- 使用
方法详解
build_item(opts) → Widget
根据配置创建单个图标控件。
行为逻辑:
- 计算实际高度:
h = bricks.app.charsize * rate * opts.cheight - 更新
this.height_int以保持最大高度 - 判断是否为
blankicon:- 是 → 返回
new bricks.BlankIcon({...}) - 否 → 使用
opts.icon作为url创建bricks.Svg实例
- 是 → 返回
- 绑定点击事件到
regen_event(desc, event) - 返回创建的控件
regen_event(desc, event)
处理图标点击事件,并触发两个事件:
this.dispatch(desc.name, desc); // 以 name 为事件类型分发
this.dispatch('command', desc); // 统一命令事件
同时阻止事件冒泡和默认行为:
event.preventDefault();
event.stopPropagation();
此设计适用于菜单/按钮点击后不希望影响页面其他部分的操作场景。
2. bricks.IconTextBar(图文混合图标栏)
类继承关系
class extends bricks.IconBar
重写了 build_item 方法以支持图标+文字组合。
build_item(opts) 实现细节
返回一个 HBox 容器,内含:
-
SVG 图标(可选)
- 来源:
opts.icon - 属性包括
rate,dynsize
- 来源:
-
文本标签(可选)
- 使用
bricks.Text显示opts.label - 支持国际化(
i18n: true)、自动换行(wrap: true)、左对齐(haligh: 'left')
- 使用
-
整体包装
- 包裹在一个
HBox中,宽度自适应,高度自动计算 - 绑定点击事件至
regen_event(opts) - 更新
height_int(基于charsize * rate)
- 包裹在一个
⚠️ 注意:图标与文本共存时垂直居中对齐由外层 HBox 控制。
3. bricks.FloatIconBar(浮动图标栏)
类继承关系
class extends bricks.HBox
实现“仅显示浮出按钮,悬停时展开全部图标”的交互模式。
配置参数 (opts)
同 IconBar,但只显示一个小浮点按钮,其余图标隐藏。
构造函数逻辑
-
创建浮出按钮:
this.float_w = new bricks.Svg({ url: bricks_resource('imgs/float-out.png') });- 绑定
mousemove事件显示图标栏 - 添加到容器
- 绑定
-
创建图标主体:
this.icons_box = this.build_bar(opts);- 默认调用
new bricks.IconBar(opts) - 初始隐藏(
display: none)
- 默认调用
-
设置容器高度等于
icons_box.height_int -
绑定全局点击事件隐藏图标栏(通过
Body.click)
方法说明
| 方法 | 功能 |
|---|---|
build_bar(opts) |
工厂方法,创建内部图标栏实例(可被子类重写) |
show_icons() |
显示图标栏(display: flex) |
hide_icons() |
隐藏图标栏(display: none) |
📌 交互逻辑:鼠标移上浮点按钮 → 显示图标;点击任意空白区域 → 隐藏图标。
4. bricks.FloatIconTextBar(浮动图文栏)
类继承关系
class extends bricks.FloatIconBar
扩展 FloatIconBar,使其内部使用 IconTextBar 替代 IconBar。
核心重写方法
build_bar(opts) {
return new bricks.IconTextBar(opts);
}
✅ 效果:浮出后显示带文字说明的图标按钮组,适合需要语义化提示的场景。
工厂注册
以下语句将各组件注册到 bricks.Factory,支持通过字符串名称动态创建实例:
bricks.Factory.register('IconBar', bricks.IconBar);
bricks.Factory.register('IconTextBar', bricks.IconTextBar);
bricks.Factory.register('FloatIconBar', bricks.FloatIconBar);
bricks.Factory.register('FloatIconTextBar', bricks.FloatIconTextBar);
使用示例(工厂方式)
var bar = bricks.Factory.create('IconTextBar', {
tools: [
{ name: 'save', icon: '/icons/save.svg', label: 'Save File' },
{ name: 'print', icon: '/icons/print.svg', label: 'Print' }
],
margin: '8px',
rate: 1.2
});
示例配置
简单图标栏
new bricks.IconBar({
cheight: 2,
rate: 1,
margin: '12px',
tools: [
{ name: 'home', icon: '/icons/home.svg', tip: 'Go Home' },
{ name: 'settings', icon: '/icons/settings.svg' },
{ name: 'blankicon' }, // 占位符
{ name: 'logout', icon: '/icons/logout.svg' }
]
});
图文混合栏
new bricks.IconTextBar({
rate: 1.1,
tools: [
{ name: 'new', icon: '/icons/new.svg', label: 'New', tip: 'Create new file' },
{ name: 'open', icon: '/icons/open.svg', label: 'Open' },
{ name: 'help', label: 'Help', icon: '/icons/help.svg' }
]
});
浮动图文工具栏
new bricks.FloatIconTextBar({
tools: [
{ name: 'cut', icon: '/icons/cut.svg', label: 'Cut' },
{ name: 'copy', icon: '/icons/copy.svg', label: 'Copy' },
{ name: 'paste', icon: '/icons/paste.svg', label: 'Paste' }
],
rate: 1
});
设计特点总结
| 特性 | 描述 |
|---|---|
| 🔧 模块化设计 | 所有功能拆分为可复用类,便于扩展 |
| 🖱️ 交互友好 | 支持点击、悬停展开、事件拦截 |
| 📏 响应式尺寸 | 基于 charsize 和 rate 实现相对缩放 |
| 🔔 事件驱动 | 通过 dispatch 发送命名事件,解耦 UI 与业务逻辑 |
| 🧩 工厂模式支持 | 可通过字符串动态创建组件 |
注意事项
-
依赖前提:
- 必须已加载
bricks.HBox,bricks.Svg,bricks.Text,bricks.BlankIcon,bricks.Body bricks.app.charsize需已初始化bricks_resource()函数需可用(用于资源路径解析)
- 必须已加载
-
性能建议:
- 工具数量较多时建议使用
FloatIconBar减少视觉干扰 - 避免频繁重建整个
IconBar,应缓存实例
- 工具数量较多时建议使用
-
样式定制:
- 推荐通过
set_style()或外部 CSS 修改外观 - 不推荐直接修改内部 DOM 结构
- 推荐通过
版本信息
- 作者:Bricks Framework Team
- 版本:1.0
- 最后更新:2025年4月5日
📌 文档结束