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