以下是为提供的 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 元素(默认为 `
`) | | `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()` 创建一个 `
` 作为根元素并赋值给 `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` 异步处理弹窗显示/关闭逻辑: - 若已有弹窗,则销毁; - 否则根据 `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