499 lines
12 KiB
Markdown
499 lines
12 KiB
Markdown
以下是为提供的 JavaScript 代码编写的 **Markdown 格式技术文档**,涵盖了核心类结构、继承关系、属性、方法和使用说明。
|
||
|
||
---
|
||
|
||
# Bricks UI 组件库技术文档
|
||
|
||
`bricks.JsWidget` 是 Bricks 框架中的基础 UI 组件类,提供通用的 DOM 管理、样式设置、事件绑定、弹窗支持等功能。其他文本类组件(如 `Text`, `Title`, `Tooltip` 等)均继承自该基类或其子类。
|
||
|
||
---
|
||
|
||
## 目录
|
||
|
||
- [1. 基础结构](#1-基础结构)
|
||
- [2. `JsWidget` 类](#2-jswidget-类)
|
||
- [构造函数](#构造函数)
|
||
- [实例属性](#实例属性)
|
||
- [公共方法](#公共方法)
|
||
- [DOM 操作](#dom-操作)
|
||
- [样式与 CSS](#样式与-css)
|
||
- [事件处理](#事件处理)
|
||
- [尺寸与布局](#尺寸与布局)
|
||
- [弹窗功能](#弹窗功能)
|
||
- [全屏控制](#全屏控制)
|
||
- [显示/隐藏控制](#显示隐藏控制)
|
||
- [ID 与属性管理](#id-与属性管理)
|
||
- [3. `TextBase` 类](#3-textbase-类)
|
||
- [4. 文本组件系列](#4-文本组件系列)
|
||
- [`Text`](#text)
|
||
- [`KeyinText`](#keyintext)
|
||
- [`Title1` ~ `Title6`](#title1--title6)
|
||
- [5. Tooltip 组件](#5-tooltip-组件)
|
||
- [6. 工厂注册](#6-工厂注册)
|
||
- [7. 使用示例](#7-使用示例)
|
||
|
||
---
|
||
|
||
## 1. 基础结构
|
||
|
||
```js
|
||
var bricks = window.bricks || {};
|
||
```
|
||
|
||
确保 `bricks` 全局命名空间存在,并在此基础上定义各类组件。
|
||
|
||
所有组件以 ES6 Class 形式实现,支持继承和模块化扩展。
|
||
|
||
---
|
||
|
||
## 2. `JsWidget` 类
|
||
|
||
> 基础 UI 组件类,封装了 DOM 创建、样式设置、事件监听、动态尺寸调整等通用能力。
|
||
|
||
### 构造函数
|
||
|
||
```js
|
||
constructor(options)
|
||
```
|
||
|
||
#### 参数:
|
||
| 参数名 | 类型 | 说明 |
|
||
|-------|------|------|
|
||
| `options` | Object | 配置选项对象,可选 |
|
||
|
||
#### 支持的配置项:
|
||
|
||
| 属性 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `baseURI` | String | 基础资源路径 |
|
||
| `css` | String | 添加到元素的 CSS 类名(空格分隔) |
|
||
| `csses` | String | 同 `css`,兼容旧写法 |
|
||
| `tip` | String | 鼠标悬停提示文字(自动绑定 tooltip) |
|
||
| `popup` | Object | 弹窗配置对象 |
|
||
| `.popup_event` | String | 触发弹窗的事件类型(如 `'click'`) |
|
||
| `.popup_desc` | WidgetDesc | 弹窗内容描述(用于构建内部组件) |
|
||
| `.popupwindow` | Boolean | 是否使用独立窗口模式弹窗 |
|
||
| `.options` | Object | 传递给 Popup/PoupWindow 的参数 |
|
||
| `bgimage` | String (URL) | 背景图片 URL |
|
||
| `width`, `height` | String/Number | 宽高(支持像素或字符串如 `'100%'`) |
|
||
| `x`, `y` | Number | X/Y 偏移(暂未实际定位) |
|
||
| `dynsize` | Boolean | 启用字符单位动态缩放 |
|
||
| `cwidth`, `cheight` | Number | 字符宽度/高度单位(乘以 `charsize` 得到真实 px) |
|
||
| `cfontsize` | Number | 字体大小(相对于字符单位) |
|
||
| `color`, `bgcolor` | String | 文字颜色 / 背景色(`bgcolor` 映射为 `backgroundColor`) |
|
||
| `align`, `textAlign` | String | 对齐方式 |
|
||
| `margin`, `padding` 等 | Any | 支持多种标准 CSS 属性直接传入 |
|
||
|
||
> ⚠️ 注意:`opts_set_style()` 方法会将匹配的 `options` 键自动映射到 DOM 样式上。
|
||
|
||
---
|
||
|
||
### 实例属性
|
||
|
||
| 属性 | 类型 | 描述 |
|
||
|------|------|------|
|
||
| `dom_element` | HTMLElement | 关联的 DOM 元素(默认为 `<div>`) |
|
||
| `id` | String | 自动生成的唯一 ID(通过 `bricks.uuid()`) |
|
||
| `baseURI` | String | 当前组件的基础 URI |
|
||
| `opts` | Object | 传入的原始配置对象 |
|
||
| `parent` | JsWidget | 父级组件(尚未在代码中赋值) |
|
||
| `_container` | Boolean | 是否为容器组件(默认 `false`) |
|
||
| `sizable_elements` | Array | 参与字体缩放的子元素列表 |
|
||
| `user_data` | Any | 用户自定义数据存储 |
|
||
| `popup_widget` | Popup \| PopupWindow | 当前打开的弹窗实例(延迟创建) |
|
||
|
||
---
|
||
|
||
### 公共方法
|
||
|
||
#### DOM 操作
|
||
|
||
##### `.create()`
|
||
创建一个 `<div>` 作为根元素并赋值给 `this.dom_element`。
|
||
|
||
##### `.is_in_dom() → Boolean`
|
||
检查当前组件是否已插入文档树中。
|
||
|
||
##### `.showRectage() → DOMRect`
|
||
返回组件的边界矩形(调用 `getBoundingClientRect()`)。
|
||
|
||
---
|
||
|
||
#### 样式与 CSS
|
||
|
||
##### `.set_style(key, value)`
|
||
设置单个 CSS 样式属性。
|
||
|
||
```js
|
||
widget.set_style('color', 'red');
|
||
```
|
||
|
||
##### `.set_css(css, remove_flg)`
|
||
添加或移除 CSS 类名(支持多个类名空格分隔)。
|
||
|
||
```js
|
||
widget.set_css('btn primary'); // 添加类
|
||
widget.set_css('hidden', true); // 移除类
|
||
```
|
||
|
||
##### `.set_csses(csses, remove_flg)`
|
||
同 `.set_css()`,保留向后兼容。
|
||
|
||
##### `.unset_css(css)`
|
||
移除指定 CSS 类。
|
||
|
||
##### `.set_cssObject(cssobj)`
|
||
批量设置内联样式对象(通过 `bricks.extend` 扩展)。
|
||
|
||
##### `.opts_set_style()`
|
||
根据 `options` 中的键值自动设置对应样式,支持别名映射(如 `bgcolor → backgroundColor`),并处理 `cwidth`/`cheight` 字符单位转换。
|
||
|
||
##### `.charsize_sizing()`
|
||
响应全局 `charsize` 变化的回调函数,重新计算基于字符单位的宽高和字体大小。
|
||
|
||
> 自动绑定于 `dynsize: true` 时。
|
||
|
||
##### `.set_bg_image(url)`
|
||
设置背景图,应用以下样式:
|
||
- `background-size: cover`
|
||
- `background-position: center`
|
||
- `background-repeat: no-repeat`
|
||
|
||
---
|
||
|
||
#### 事件处理
|
||
|
||
##### `.bind(eventname, handler)`
|
||
绑定 DOM 事件。
|
||
|
||
```js
|
||
widget.bind('click', () => console.log('clicked'));
|
||
```
|
||
|
||
##### `.unbind(eventname, handler)`
|
||
解绑事件。
|
||
|
||
##### `.dispatch(eventname, params)`
|
||
派发自定义事件,携带 `params` 数据。
|
||
|
||
```js
|
||
widget.dispatch('changed', { data: 'new value' });
|
||
```
|
||
|
||
> 注:`params` 会挂载在事件对象的 `.params` 属性上。
|
||
|
||
---
|
||
|
||
#### 尺寸与布局
|
||
|
||
##### `.get_width() → Number`
|
||
返回客户端宽度(`clientWidth`)。
|
||
|
||
##### `.get_height() → Number`
|
||
返回客户端高度(`clientHeight`)。
|
||
|
||
##### `.set_width(width)`
|
||
设置宽度,若传入数字则自动加 `'px'`。
|
||
|
||
##### `.set_height(height)`
|
||
同上,设置高度。
|
||
|
||
##### `.h_center()`, `.h_left()`, `.h_right()`
|
||
水平对齐:
|
||
- `h_center`: `margin: auto`
|
||
- `h_left`: `marginLeft: 0`
|
||
- `h_right`: `marginRight: 0`
|
||
|
||
##### `.ht_center()`, `.ht_left()`, `.ht_right()`
|
||
文本对齐:
|
||
- 设置 `textAlign` 样式。
|
||
|
||
---
|
||
|
||
#### 弹窗功能
|
||
|
||
##### `.popup_action() → Promise<void>`
|
||
异步处理弹窗显示/关闭逻辑:
|
||
- 若已有弹窗,则销毁;
|
||
- 否则根据 `popup.popupwindow` 决定创建 `PopupWindow` 或 `Popup`;
|
||
- 使用 `bricks.widgetBuild(popup_desc, parent, userData)` 动态构建内容;
|
||
- 显示并定位弹窗。
|
||
|
||
##### `.destroy_popup()`
|
||
销毁当前弹窗实例,清空引用。
|
||
|
||
> 绑定在弹窗的 `'dismissed'` 事件上。
|
||
|
||
> 💡 提示:`popup_desc` 应符合框架的组件描述格式。
|
||
|
||
---
|
||
|
||
#### 全屏控制
|
||
|
||
##### `.enter_fullscreen()`
|
||
请求进入全屏模式,兼容各浏览器 API(Fullscreen API)。
|
||
|
||
##### `.exit_fullscreen()`
|
||
退出全屏模式(调用 `document.exitFullscreen()`)。
|
||
|
||
---
|
||
|
||
#### 显示/隐藏控制
|
||
|
||
##### `.show()`
|
||
显示组件(`display = ''`)。
|
||
|
||
##### `.hide()`
|
||
隐藏组件(`display = 'none'`)。
|
||
|
||
##### `.toggle_hide()`
|
||
切换显隐状态。
|
||
|
||
##### `.is_hide() → Boolean`
|
||
判断是否处于隐藏状态。
|
||
|
||
---
|
||
|
||
#### ID 与属性管理
|
||
|
||
##### `.set_id(id)`
|
||
设置组件 ID,并同步到 DOM。
|
||
|
||
##### `.set_baseURI(uri)`
|
||
更新 `baseURI`,若为容器则递归通知子组件更新。
|
||
|
||
##### `.set_attribute(attr, value)`
|
||
设置 DOM 属性。
|
||
|
||
##### `.get_attribute(attr) → String`
|
||
获取 DOM 属性(⚠️ 当前实现有误,缺少 `return`)。
|
||
|
||
> ❌ 修正建议:
|
||
```js
|
||
get_attribute(attr) {
|
||
return this.dom_element.getAttribute(attr);
|
||
}
|
||
```
|
||
|
||
##### `.selected(flag)`
|
||
添加或移除 `selected` CSS 类。
|
||
|
||
---
|
||
|
||
#### 辅助方法
|
||
|
||
##### `.observable(name, value)`
|
||
创建一个可观察对象(绑定到当前组件),用于响应式数据管理。
|
||
|
||
##### `.disabled(flag)`
|
||
启用/禁用交互(通过 `pointerEvents: none/auto` 控制)。
|
||
|
||
##### `.getUserData() → Any`
|
||
获取用户数据。
|
||
|
||
##### `.setUserData(v)`
|
||
设置用户数据。
|
||
|
||
---
|
||
|
||
## 3. `TextBase` 类
|
||
|
||
> 文本组件基类,继承自 `JsWidget`,支持国际化(i18n)、文本渲染、字体缩放。
|
||
|
||
### 构造函数
|
||
|
||
```js
|
||
constructor(options)
|
||
```
|
||
|
||
#### 特有配置项:
|
||
|
||
| 属性 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| `text` | String | 初始文本内容 |
|
||
| `otext` | String | 原始文本(用于 i18n 查找) |
|
||
| `i18n` | Boolean | 是否启用国际化 |
|
||
| `rate` | Number | 字体缩放系数(默认 1) |
|
||
| `halign`, `valign` | String | 水平/垂直对齐(未在代码中使用) |
|
||
| `color`, `bgtcolor` | String | 文字/背景色(后者未使用) |
|
||
|
||
### 方法
|
||
|
||
##### `.set_attrs()`
|
||
初始化文本内容:
|
||
- 优先使用 `text`
|
||
- 若提供 `otext` 和 `i18n`,则通过 `I18n._()` 转换
|
||
- 设置 `innerHTML`
|
||
|
||
##### `.set_text(text)`
|
||
更新文本内容(同时更新 `this.text` 和 DOM)。
|
||
|
||
##### `.set_otext(otxt)`
|
||
更新原始文本,并重新国际化渲染。
|
||
|
||
##### `.set_i18n_text()`
|
||
触发国际化文本刷新(通常由语言变更事件驱动)。
|
||
|
||
---
|
||
|
||
## 4. 文本组件系列
|
||
|
||
### `Text`
|
||
|
||
> 普通文本组件,字体大小为 `1 × charsize`。
|
||
|
||
```js
|
||
new bricks.Text({ text: "Hello" })
|
||
```
|
||
|
||
- 继承 `TextBase`
|
||
- 默认 `cfontsize = 1`
|
||
- 自动调用 `charsize_sizing()`
|
||
|
||
---
|
||
|
||
### `KeyinText`
|
||
|
||
> 可输入文本组件,模拟键盘输入行为。
|
||
|
||
#### 功能:
|
||
- 监听全局 `keydown` 事件(绑定至 `bricks.app`)
|
||
- 支持:
|
||
- 输入单字符
|
||
- Backspace 删除末尾字符
|
||
- Delete 清空内容
|
||
- 每次变更后派发 `changed` 事件,携带 `{ name: text }` 数据
|
||
- 默认 `name = 'data'`
|
||
|
||
#### 方法:
|
||
- `dispatch_changed()`:封装事件派发逻辑
|
||
|
||
> 📝 示例用途:简易输入框、密码输入、命令行模拟。
|
||
|
||
---
|
||
|
||
### `Title1` ~ `Title6`
|
||
|
||
> 六级标题组件,字体加粗,字号逐级递减。
|
||
|
||
| 组件 | `cfontsize` |
|
||
|------|------------|
|
||
| `Title1` | 1.96 |
|
||
| `Title2` | 1.80 |
|
||
| `Title3` | 1.64 |
|
||
| `Title4` | 1.48 |
|
||
| `Title5` | 1.32 |
|
||
| `Title6` | 1.16 |
|
||
|
||
均设置 `fontWeight: bold`,并自动适配字符尺寸。
|
||
|
||
---
|
||
|
||
## 5. Tooltip 组件
|
||
|
||
> 工具提示组件,继承自 `Text`,预设样式。
|
||
|
||
### 构造选项
|
||
- `rate: 0.8`:较小字体
|
||
- `tip: null`:避免递归绑定提示
|
||
- 添加 `modal` CSS 类
|
||
- 最小宽度 `90px`
|
||
- 自动隐藏任务调度器(`auto_task`)
|
||
|
||
### 方法
|
||
|
||
##### `.show(otext, event)`
|
||
显示提示框:
|
||
- 设置文本
|
||
- 设为可见且高 `zIndex`
|
||
- 定位到鼠标事件位置(`bricks.relocate_by_eventpos`)
|
||
- 启动 6 秒后自动隐藏(可取消)
|
||
|
||
##### `.hide()`
|
||
隐藏提示框,清除定时任务。
|
||
|
||
> ✅ 支持防抖和重复触发清理。
|
||
|
||
---
|
||
|
||
## 6. 工厂注册
|
||
|
||
所有组件通过 `bricks.Factory.register` 注册,便于动态创建:
|
||
|
||
```js
|
||
bricks.Factory.register('Tooltip', bricks.Tooltip);
|
||
bricks.Factory.register('Text', bricks.Text);
|
||
// ... 其他组件
|
||
```
|
||
|
||
支持通过名称字符串动态实例化组件。
|
||
|
||
---
|
||
|
||
## 7. 使用示例
|
||
|
||
### 创建普通文本
|
||
```js
|
||
const text = new bricks.Text({
|
||
text: 'Welcome!',
|
||
css: 'text-primary bold',
|
||
width: 200,
|
||
tip: 'This is a welcome message'
|
||
});
|
||
document.body.appendChild(text.dom_element);
|
||
```
|
||
|
||
### 创建可输入文本
|
||
```js
|
||
const input = new bricks.KeyinText({
|
||
name: 'username',
|
||
cwidth: 20
|
||
});
|
||
input.bind('changed', e => {
|
||
console.log('Input changed:', e.params);
|
||
});
|
||
```
|
||
|
||
### 创建标题
|
||
```js
|
||
const title = new bricks.Title1({
|
||
otext: 'Main Title',
|
||
i18n: true
|
||
});
|
||
```
|
||
|
||
### 创建带弹窗的按钮(假设)
|
||
```js
|
||
const btn = new bricks.Text({
|
||
text: 'Click Me',
|
||
popup: {
|
||
popup_event: 'click',
|
||
popup_desc: { type: 'Panel', children: [...] },
|
||
popupwindow: false
|
||
}
|
||
});
|
||
```
|
||
|
||
### 设置背景图
|
||
```js
|
||
widget.set_bg_image('/images/bg.jpg');
|
||
```
|
||
|
||
---
|
||
|
||
## 总结
|
||
|
||
`bricks.JsWidget` 提供了一个灵活、可扩展的前端组件基类,具备以下优势:
|
||
|
||
✅ 模块化设计
|
||
✅ 支持动态尺寸(字符单位)
|
||
✅ 内建弹窗、tooltip、国际化支持
|
||
✅ 易于继承和定制
|
||
✅ 与 Bricks 框架深度集成(event bus, factory, resize observer)
|
||
|
||
适用于构建响应式、多语言、高交互性的 Web 应用界面。
|
||
|
||
---
|
||
|
||
> 📚 *文档版本:v1.0*
|
||
> © 2025 Bricks Framework Team |