# itoolball
**Repository Path**: helloFF/itoolball
## Basic Information
- **Project Name**: itoolball
- **Description**: 一个快速在页面上创建操作球的工具
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-10-27
- **Last Updated**: 2025-10-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ToolBall 工具球组件
一个功能丰富的 JavaScript 组件,用于在网页中快速创建工具球和工具面板。
## ✨ 特性
- 🎯 **工具球**:40×40px 圆形,支持拖拽移动,始终吸附在页面右侧
- 📋 **工具面板**:200px 宽度,支持工具分组显示
- 🔧 **内置工具**:按钮、开关、下拉选择、滑块、文本框五种工具类型
- 🎨 **样式隔离**:使用 Shadow DOM 实现与主页面的样式隔离
- 📡 **事件系统**:完整的事件监听和触发机制
- 🎪 **动画效果**:100ms ease-out 滑入滑出效果
## 🚀 快速开始
### 1. 引入组件
**开发版本(源码)**:
```html
```
**生产版本(压缩)**:
```html
```
### 2. 初始化工具球
```javascript
const toolBall = initToolBall({
ball: {
name: '我的工具',
id: 'main-toolball',
theme: 'light'
},
panel: {
width: 250,
layout: 'list',
groups: true
}
});
```
### 3. 添加工具
```javascript
// 添加按钮工具
toolBall.addTool('button', {
id: 'btn-save',
name: '保存',
icon: '💾',
group: '常用工具',
onClick: async () => {
console.log('保存数据');
await new Promise(resolve => setTimeout(resolve, 1000));
alert('保存成功!');
}
});
// 添加开关工具
toolBall.addTool('switch', {
id: 'switch-auto-save',
name: '自动保存',
group: '设置',
defaultValue: true,
onChange: (value) => {
console.log('自动保存:', value ? '开启' : '关闭');
}
});
// 添加下拉选择工具
toolBall.addTool('select', {
id: 'select-theme',
name: '主题',
group: '设置',
options: [
{ value: 'light', label: '浅色主题' },
{ value: 'dark', label: '深色主题' }
],
defaultValue: 'light',
onChange: (value) => {
console.log('主题切换为:', value);
}
});
// 添加滑块工具
toolBall.addTool('slider', {
id: 'slider-volume',
name: '音量',
group: '设置',
min: 0,
max: 100,
defaultValue: 50,
onChange: (value) => {
console.log('音量设置为:', value);
}
});
```
## 📖 API 文档
### 初始化配置
```javascript
initToolBall({
ball: {
name: '工具球名称', // 工具球显示名称
id: 'unique-id', // 唯一标识符
theme: 'light' // 主题模式 'light'|'dark'
},
panel: {
width: 200, // 面板宽度(像素)
layout: 'list', // 布局模式 'list'|'grid'
groups: true // 是否启用分组
}
})
```
### 工具球实例方法
```javascript
// 显示/隐藏工具球
toolBall.show();
toolBall.hide();
// 添加工具
const tool = toolBall.addTool(type, config);
// 删除工具
toolBall.removeTool(toolId);
// 更新工具
toolBall.updateTool(toolId, updates);
// 获取工具
const tool = toolBall.getTool(toolId);
```
### 工具类型
#### 按钮工具 (button)
```javascript
const buttonTool = toolBall.addTool('button', {
id: 'btn-1',
name: '按钮名称',
icon: '🔧', // 图标(可选)
group: '分组名称', // 分组(可选)
onClick: async () => { // 点击回调
// 异步操作
}
});
// 触发点击
buttonTool.click();
// 设置启用/禁用
buttonTool.setEnabled(true);
```
#### 开关工具 (switch)
```javascript
const switchTool = toolBall.addTool('switch', {
id: 'switch-1',
name: '开关名称',
defaultValue: true, // 默认状态
onChange: (value) => { // 状态变化回调
console.log('状态:', value);
}
});
// 切换状态
switchTool.toggle();
// 设置状态
switchTool.setValue(true);
// 获取状态
const value = switchTool.getValue();
```
#### 下拉选择工具 (select)
```javascript
const selectTool = toolBall.addTool('select', {
id: 'select-1',
name: '选择名称',
options: [ // 选项列表
{ value: 'option1', label: '选项1' },
{ value: 'option2', label: '选项2' }
],
defaultValue: 'option1', // 默认值
onChange: (value) => { // 值变化回调
console.log('选择:', value);
}
});
// 设置值
selectTool.setValue('option2');
// 获取值
const value = selectTool.getValue();
```
#### 滑块工具 (slider)
```javascript
const sliderTool = toolBall.addTool('slider', {
id: 'slider-1',
name: '滑块名称',
min: 0, // 最小值
max: 100, // 最大值
step: 1, // 步长
defaultValue: 50, // 默认值
onChange: (value) => { // 值变化回调
console.log('值:', value);
}
});
// 设置值
sliderTool.setValue(75);
// 获取值
const value = sliderTool.getValue();
```
### 事件监听
```javascript
// 监听工具球事件
toolBall.on('show', () => console.log('工具球显示'));
toolBall.on('hide', () => console.log('工具球隐藏'));
toolBall.on('panel:show', () => console.log('面板打开'));
toolBall.on('panel:hide', () => console.log('面板关闭'));
toolBall.on('tool:added', (tool) => console.log('工具添加:', tool.name));
toolBall.on('tool:removed', (toolId) => console.log('工具删除:', toolId));
// 监听工具事件
tool.on('change', (value) => console.log('值变化:', value));
tool.on('click', () => console.log('工具点击'));
tool.on('error', (error) => console.error('工具错误:', error));
```
## 🎨 样式定制
组件使用 Shadow DOM 实现样式隔离,所有样式都通过 JavaScript 动态注入。如需自定义样式,可以修改 `TOOLBALL_STYLES` 常量中的 CSS 代码。
## 📁 文件结构
```
toolball/
├── src/
│ └── toolball.js # 主组件文件(包含所有功能)
├── dist/
│ └── toolball.min.js # 压缩后的生产版本
├── examples/
│ ├── demo.html # 使用示例
│ └── test-minified.html # 压缩版本测试
├── docs/
│ ├── ToolBall组件设计文档.md
│ └── 沟通记录.md
├── package.json # 项目配置
├── webpack.config.js # Webpack配置
├── BUILD.md # 构建说明
└── README.md
```
## 🔧 构建说明
### 安装依赖
```bash
npm install
```
### 构建生产版本
```bash
npm run build
```
### 构建开发版本
```bash
npm run build:dev
```
### 使用 Terser 压缩
```bash
npm run minify
```
### 文件大小对比
| 版本 | 文件大小 | 说明 |
|------|----------|------|
| 源码 | 38.7 KB | 原始源码 |
| 生产版本 | 20.3 KB | Webpack + Terser 压缩 |
| 压缩率 | 47% | 文件大小减少近一半 |
## 🌟 示例
查看 `examples/demo.html` 文件获取完整的使用示例。
## 🔧 技术实现
- **Shadow DOM**:实现样式隔离
- **Custom Elements**:使用 Web Components 标准
- **事件系统**:完整的事件发射器模式
- **拖拽交互**:原生鼠标事件处理
- **动画效果**:CSS transition 实现
## 📄 许可证
MIT License