Files
lc_frontend/README_DIGIT_SPLIT.md
2025-10-17 10:31:13 +08:00

186 lines
5.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 数字分割显示功能说明
## 功能概述
实现了将数字如23897分割成单个数字并分别显示在容器中的功能。每个数字都有独立的样式容器可以单独设置样式。**新增了丰富的动画效果,让数字动起来!**
## 实现原理
使用Vue 3的`computed`计算属性,将数字转换为字符串后分割成数组,然后通过`v-for`循环渲染每个数字。
## 主要特性
### 1. 总计数量显示
- 初始值23897
- 显示效果:每个数字独立显示在紫色背景的容器中
- 动态更新支持通过API调用更新数据
- **动画效果**:数字滚动动画、发光效果、悬停缩放
### 2. 员工类型数量显示
- 正式员工123人
- 外协人员45人
- 访客678人
- 每个数字类型都有独立的计算属性和更新方法
- **动画效果**:脉冲动画、悬停效果、颜色变化
### 3. 响应式更新
- 所有数字都支持动态更新
- 数字变化时,显示会自动重新计算和渲染
- **动画效果**:平滑的数字滚动、更新完成后的闪烁提示
### 4. 🎬 新增动画功能
- **数字滚动动画**:数字从当前值平滑滚动到目标值
- **缓动效果**:使用缓动函数让动画更自然流畅
- **视觉反馈**:数字更新完成后的闪烁效果
- **悬停交互**:鼠标悬停时的缩放和发光效果
- **周期性更新**:可设置定时自动更新数据
## 代码结构
### 响应式数据
```typescript
const totalCount = ref<number>(23897)
const formalEmployeeCount = ref<number>(123)
const externalStaffCount = ref<number>(45)
const visitorCount = ref<number>(678)
// 动画相关的状态
const isAnimating = ref<boolean>(false)
const animationDuration = 2000 // 动画持续时间(毫秒)
```
### 计算属性
```typescript
const totalCountDigits = computed(() => {
return String(totalCount.value).split('').map(Number)
})
```
### 动画方法
```typescript
// 数字滚动动画方法
const animateNumber = (startValue: number, endValue: number, duration: number, callback: (value: number) => void)
// 批量更新所有数字的方法
const updateAllCounts = (counts: { total?: number, formal?: number, external?: number, visitor?: number })
// 测试动画方法
const testAnimation = () => { /* 生成随机数据并触发动画 */ }
// 重置到原始数据
const resetToOriginal = () => { /* 重置所有数据到初始值 */ }
```
## 使用方法
### 1. 更新总计数量
```typescript
updateTotalCount(25678) // 会显示为 2 5 6 7 8带动画效果
```
### 2. 更新员工数量
```typescript
updateFormalEmployeeCount(156) // 正式员工1 5 6
updateExternalStaffCount(52) // 外协人员5 2
updateVisitorCount(789) // 访客7 8 9
```
### 3. 批量更新所有数据
```typescript
updateAllCounts({
total: 25678,
formal: 156,
external: 52,
visitor: 789
})
```
### 4. 从API获取数据
```typescript
// 示例从API获取数据后更新显示
const fetchData = async () => {
const response = await api.getEmployeeCount()
updateAllCounts({
total: response.totalCount,
formal: response.formalCount,
external: response.externalCount,
visitor: response.visitorCount
})
}
```
### 5. 测试动画效果
- 点击"测试动画"按钮:生成随机数据并触发动画
- 点击"重置数据"按钮:恢复到初始数据
- 动画进行中按钮会被禁用,防止重复触发
## 样式说明
### 总计数量样式
- 容器类:`.number-wrapper`
- 数字样式:`.total-number`
- 背景色:紫色 (rgb(177 74 201 / 100%))
- 尺寸26px × 50px
- **动画效果**
- 持续发光效果 (`numberGlow`)
- 悬停缩放 (1.1倍)
- 更新完成闪烁效果 (`flashEffect`)
### 员工类型数字样式
- 容器类:`.type-number-wrapper`
- 数字样式:`.type-number`
- 背景色:绿色 (#1afb8f)
- 尺寸14px × 25px
- **动画效果**
- 脉冲动画 (`typeNumberPulse`)
- 悬停缩放 (1.2倍) 和颜色变化
- 更新完成闪烁效果 (`typeFlashEffect`)
### 测试按钮样式
- 渐变背景:蓝紫色渐变
- 悬停效果:上移和阴影增强
- 禁用状态:半透明和禁用光标
## 动画特性详解
### 1. 数字滚动动画
- **持续时间**2秒可配置
- **缓动函数**easeOutQuart让动画更自然
- **性能优化**使用requestAnimationFrame确保流畅
### 2. 视觉反馈动画
- **发光效果**:数字容器持续发光,吸引注意力
- **悬停交互**:鼠标悬停时的缩放和阴影变化
- **闪烁提示**:数据更新完成后的白色闪烁效果
### 3. 动画状态管理
- **防重复触发**:动画进行中禁止新的动画
- **批量更新**:支持同时更新多个数字
- **完成回调**:动画完成后的闪烁效果
## 注意事项
1. **数字长度自适应**:容器会根据数字的位数自动调整显示
2. **性能优化**:使用计算属性确保只在数据变化时重新计算
3. **类型安全**使用TypeScript确保数据类型安全
4. **响应式设计**:支持不同屏幕尺寸的适配
5. **动画性能**使用CSS动画和requestAnimationFrame确保流畅
6. **防抖处理**:动画进行中防止重复触发
## 扩展功能
可以基于此功能扩展:
- **更多动画类型**:弹跳、旋转、淡入淡出等
- **数据可视化**:图表动画、进度条动画
- **交互增强**:拖拽、点击、手势等
- **主题切换**:不同主题下的动画效果
- **性能监控**:动画性能统计和优化建议
- **无障碍支持**:动画开关、减少动画等辅助功能
## 演示效果
- **页面加载**5秒后自动更新到新数据
- **周期性更新**每15秒自动生成随机数据并触发动画
- **手动测试**:点击测试按钮立即体验动画效果
- **数据重置**:一键恢复到初始状态
现在你的数字不仅能够分割显示,还能生动地动起来!🎉