Appearance
技术实现思路
技术栈推荐
核心框架
- Vue 3(推荐)或 React 18
- Vue 3 组合式 API 适合复杂状态管理
- 良好的生态系统(动画库、UI 组件库)
- 移动端性能优化良好
动画库
- GSAP (GreenSock Animation Platform)
- 强大的动画编排能力
- 高性能(GPU 加速)
- 支持复杂时序控制
或
- CSS Transitions + Vue Transition
- 轻量级方案
- 适合简单动效
- 内置于 Vue 生态
状态管理
- Pinia(Vue 3 推荐)或 Zustand(React)
- 轻量级、类型友好
- 适合中大型状态管理
UI 框架(可选)
- Vant(Vue)或 Ant Design Mobile(React)
- 移动端组件库
- 提供基础交互组件
关键技术难点与解决方案
1. 动效性能优化
难点:多个卡片同时移动、状态切换,易导致卡顿
解决方案:
- 使用 CSS
transform和opacity进行动画(触发 GPU 加速) - 避免使用
top/left、width/height等触发重排的属性 - 使用
requestAnimationFrame优化动画帧率 - 动效分层:将静态层和动画层分离,减少重绘范围
代码示例(GSAP):
javascript
// Pick 动效:卡片飞入对阵面板
gsap.to(cardElement, {
x: targetPosition.x,
y: targetPosition.y,
scale: 0.8,
duration: 0.5,
ease: "power2.out"
});2. 状态管理设计
难点:Ban/Pick 阶段切换、轮次判断、撤销逻辑
状态结构设计:
javascript
{
phase: 'ban' | 'pick', // 当前阶段
currentTeam: 'A' | 'B', // 当前操作队伍
turnOrder: ['A', 'B', 'B', 'A'], // 选择顺序
turnIndex: 0, // 当前轮次索引
teamA: {
bans: [], // 已 Ban 的资源 ID
picks: [] // 已 Pick 的资源 ID
},
teamB: {
bans: [],
picks: []
},
allResources: [...], // 所有可用资源
history: [] // 历史操作(用于撤销)
}关键逻辑:
javascript
// 选择资源
function selectResource(resourceId) {
const currentTeam = state.currentTeam;
const isBan = state.phase === 'ban';
// 记录历史
state.history.push(JSON.parse(JSON.stringify(state)));
// 更新状态
if (isBan) {
state[`${currentTeam}Team`].bans.push(resourceId);
} else {
state[`${currentTeam}Team`].picks.push(resourceId);
}
// 切换轮次
state.turnIndex++;
state.currentTeam = state.turnOrder[state.turnIndex % state.turnOrder.length];
// 检查阶段切换
if (state.turnIndex >= state.turnOrder.length) {
state.phase = state.phase === 'ban' ? 'pick' : 'completed';
}
}
// 撤销操作
function undo() {
const previousState = state.history.pop();
if (previousState) {
Object.assign(state, previousState);
}
}3. 响应式布局适配
难点:横竖屏切换时布局重新排列
解决方案:
- 使用 CSS Grid 或 Flexbox 实现自适应布局
- 媒体查询检测屏幕方向
- CSS 动画平滑过渡布局变化
布局方案:
css
/* 竖屏模式 */
@media (orientation: portrait) {
.container {
flex-direction: column;
}
.team-panel {
width: 100%;
height: 200px;
}
}
/* 横屏模式 */
@media (orientation: landscape) {
.container {
flex-direction: row;
}
.team-panel {
width: 30%;
height: 100%;
}
}4. 并发控制(未来扩展)
难点:多个用户同时选择同一资源
解决方案:
- 乐观 UI:前端先更新,后端验证
- WebSocket 实时广播:所有客户端同步最新状态
- 锁机制:资源被选择后立即锁定,防止重复选择
数据结构设计
资源数据格式
javascript
// 球队数据示例
{
id: "team-001",
name: "巴塞罗那",
type: "team",
image: "/assets/teams/barcelona.png",
stats: {
attack: 90,
defense: 85,
speed: 88
}
}
// 球员数据示例
{
id: "player-001",
name: "梅西",
type: "player",
image: "/assets/players/messi.png",
position: "FW",
team: "巴塞罗那",
stats: {
overall: 93,
shooting: 95,
passing: 92
}
}开发工具链
- 构建工具:Vite(快速开发体验)
- 代码规范:ESLint + Prettier
- 版本控制:Git
- 部署:静态资源部署(CDN)
性能指标
- 首屏加载:< 2s
- 动画帧率:稳定 60fps
- 内存占用:< 100MB
- 包体积:< 500KB(gzip 后)