Files
nanocode/net-games/docs/UI_DESIGN_GUIDELINES.md
T
Ubuntu 32b43f85bd a
2026-07-03 16:58:28 +08:00

1675 lines
35 KiB
Markdown
Raw 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.
# Net-Games & Happy-Games UI 设计规范
> **设计风格**: 深色游戏风 (Dark Gaming Theme)
> **设计哲学**: 沉浸式游戏体验 + 清晰的信息层级
> **版本**: v1.0
> **更新日期**: 2026-04-09
---
## 1. 设计理念
### 1.1 核心设计原则
我们的游戏平台采用**深色游戏风格**,设计理念基于以下核心原则:
| 原则 | 说明 | 设计意图 |
|------|------|----------|
| **沉浸式体验** | 深色背景减少视觉疲劳,让玩家专注于游戏内容 | 长时间游戏不疲劳 |
| **清晰层级** | 通过颜色、大小、位置区分信息重要性 | 快速获取关键信息 |
| **即时反馈** | 所有交互元素都有明确的视觉反馈 | 增强操控感 |
| **品牌一致性** | 跨游戏保持统一的视觉语言 | 降低学习成本 |
| **响应式设计** | 适配从手机到桌面的各种设备 | 随时随地游戏 |
### 1.2 与 Neobrutalism 的对比
参考了 `personal-blog` 的新粗野主义设计,但游戏平台采用了不同的风格:
| 特性 | 博客 (Neobrutalism) | 游戏平台 (Dark Gaming) |
|------|---------------------|------------------------|
| 主背景 | `#FEF9E7` 奶油色 | `#0d2847` 深海蓝渐变 |
| 边框风格 | 2px 纯黑硬边框 | 1px 半透明边框 |
| 阴影效果 | 4px 硬阴影 | 柔和光晕 + 模糊 |
| 圆角 | 直角 (0px) | 圆角 (8-20px) |
| 交互反馈 | 点击位移 | 缩放 + 光晕 |
| 氛围 | 活泼、创意 | 沉浸、专注 |
### 1.3 参考来源
| 来源 | 参考内容 | 应用位置 |
|------|----------|----------|
| **QQ斗地主** | 牌桌布局、扑克牌样式、玩家位置布局 | happy-games/doudizhu |
| **Slither.io** | 深色主题、霓虹光效、简洁悬浮UI | happy-games/slither-io |
| **Poki.com** | 游戏卡片设计、响应式网格布局 | happy-games/index.html |
| **Steam** | 深色模式、信息层级、按钮样式 | 全局参考 |
| **Discord** | 状态指示器、用户头像样式 | net-games/client |
---
## 2. 色彩系统
### 2.1 CSS 变量定义
```css
:root {
/* ========== 背景色 ========== */
--bg-primary: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
--bg-game-table: linear-gradient(135deg, #0d2847 0%, #1a3a5c 50%, #0d2847 100%);
--bg-card: linear-gradient(145deg, #1e293b 0%, #0f172a 100%);
--bg-glass: rgba(0, 0, 0, 0.4);
--bg-glass-light: rgba(255, 255, 255, 0.1);
/* ========== 文字色 ========== */
--text-primary: #ffffff;
--text-secondary: rgba(255, 255, 255, 0.8);
--text-muted: #888888;
--text-gold: #ffd700;
/* ========== 强调色 ========== */
--accent-purple: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
--accent-pink: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
--accent-blue: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
--accent-gold: linear-gradient(135deg, #ffd700 0%, #ff8c00 100%);
--accent-green: linear-gradient(135deg, #2ecc71 0%, #27ae60 100%);
--accent-red: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%);
/* ========== 状态色 ========== */
--status-online: #2ecc71;
--status-offline: #e74c3c;
--status-connecting: #3498db;
--status-warning: #f1c40f;
/* ========== 边框 ========== */
--border-subtle: 1px solid rgba(255, 255, 255, 0.1);
--border-accent: 1px solid rgba(102, 126, 234, 0.5);
--border-gold: 1px solid rgba(255, 215, 0, 0.3);
}
```
### 2.2 使用规范
| 颜色变量 | 用途 | 设计意图 |
|----------|------|----------|
| `--bg-primary` | 页面背景 | 营造深海/夜空的沉浸感 |
| `--bg-game-table` | 牌桌/游戏区背景 | 突出游戏区域,模拟真实牌桌 |
| `--bg-card` | 卡片、面板背景 | 与背景区分,形成层级 |
| `--text-gold` | 积分、奖励、重要数字 | 金色代表价值和成就 |
| `--accent-purple` | 主按钮、主要操作 | 紫色传达神秘和高级感 |
| `--accent-pink` | 次要按钮、危险操作 | 醒目的对比色 |
| `--accent-blue` | 提示按钮、信息 | 冷静、可信赖 |
| `--accent-gold` | 开始游戏、重要CTA | 吸引注意力,激发行动 |
### 2.3 渐变设计原理
**为什么使用渐变?**
1. **增加深度感**: 单色背景显得扁平,渐变营造空间感
2. **引导视线**: 从左上到右下的渐变自然引导用户视线
3. **品牌识别**: 蓝紫渐变成为平台的视觉签名
**渐变方向规范**:
- 背景: `135deg` (从左上到右下)
- 按钮: `135deg` 或 `to right`
- 卡片: `145deg` (稍微偏移,增加变化)
---
## 3. 排版系统
### 3.1 字体选择
```css
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
'Helvetica Neue', Arial, sans-serif;
```
**选择理由**:
- 系统字体栈,无需加载外部字体
- 跨平台一致性
- 游戏场景下可读性好
### 3.2 字号规范
| 元素 | 桌面端 | 移动端 | 字重 | 用途 |
|------|--------|--------|------|------|
| 页面标题 | 2.5rem (40px) | 1.8rem (29px) | 700 | 游戏大厅标题 |
| 卡片标题 | 1rem (16px) | 0.9rem (14px) | 600 | 游戏卡片名称 |
| 正文 | 0.875rem (14px) | 0.8rem (13px) | 400 | 描述文字 |
| 小字/标签 | 0.75rem (12px) | 0.7rem (11px) | 500 | 状态、时间 |
| 按钮 | 0.875rem (14px) | 0.8rem (13px) | 700 | 按钮文字 |
| 积分数字 | 1.125rem (18px) | 1rem (16px) | 700 | 积分显示 |
### 3.3 文字样式规范
**标题样式**:
```css
.header h1 {
font-size: 2.5rem;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
text-shadow: 0 0 30px rgba(102, 126, 234, 0.3);
}
```
**设计意图**: 渐变色文字增加视觉吸引力,光晕效果营造游戏感
**积分高亮**:
```css
.score-value {
font-size: 16px;
font-weight: bold;
color: #ffd700;
text-shadow: 0 0 10px rgba(255, 215, 0, 0.5);
}
```
**设计意图**: 金色+发光效果强调积分的价值感
---
## 4. 阴影与光效系统
### 4.1 阴影定义
```css
/* 卡片悬停阴影 */
--shadow-card: 0 20px 40px rgba(102, 126, 234, 0.3);
/* 按钮阴影 */
--shadow-button: 0 4px 8px rgba(0, 0, 0, 0.3);
--shadow-button-hover: 0 6px 12px rgba(0, 0, 0, 0.4);
/* 光晕效果 */
--glow-gold: 0 0 10px rgba(255, 215, 0, 0.5);
--glow-purple: 0 0 20px rgba(102, 126, 234, 0.4);
/* 模态框阴影 */
--shadow-modal: 0 10px 40px rgba(0, 0, 0, 0.5);
```
### 4.2 使用场景
| 阴影类型 | 应用场景 | 设计意图 |
|----------|----------|----------|
| `--shadow-card` | 游戏卡片悬停 | 营造"浮起"感,吸引点击 |
| `--shadow-button` | 按钮默认状态 | 增加立体感 |
| `--glow-gold` | 积分、奖励 | 强调价值和重要性 |
| `--glow-purple` | 标题、品牌元素 | 强化品牌色 |
### 4.3 玻璃态效果 (Glassmorphism)
```css
.glass-panel {
background: rgba(0, 0, 0, 0.4);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.1);
}
```
**应用场景**:
- 顶部状态栏
- 玩家信息面板
- 弹窗背景
- 悬浮提示
**设计意图**: 玻璃态效果让UI层与游戏背景融合,不遮挡游戏内容的同时提供信息
---
## 5. 组件规范
### 5.1 按钮 (Button)
#### 5.1.1 基础样式
```css
.btn {
padding: 10px 25px;
border: none;
border-radius: 25px;
font-size: 14px;
font-weight: bold;
cursor: pointer;
transition: all 0.2s ease;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
color: white;
}
.btn:hover:not(:disabled) {
transform: translateY(-2px);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.4);
}
.btn:active:not(:disabled) {
transform: translateY(0);
}
.btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
```
#### 5.1.2 按钮变体
| 变体 | 背景 | 用途 | 设计意图 |
|------|------|------|----------|
| `.btn-primary` | `linear-gradient(135deg, #667eea, #764ba2)` | 主要操作 | 品牌色,最高优先级 |
| `.btn-secondary` | `linear-gradient(135deg, #f093fb, #f5576c)` | 次要操作 | 对比色,次要优先级 |
| `.btn-hint` | `linear-gradient(135deg, #4facfe, #00f2fe)` | 提示、帮助 | 冷静的蓝,信息类 |
| `.btn-start` | `linear-gradient(135deg, #ffd700, #ff8c00)` | 开始游戏 | 金色,吸引点击 |
| `.btn-danger` | `linear-gradient(135deg, #e74c3c, #c0392b)` | 危险操作 | 红色,警示作用 |
#### 5.1.3 尺寸变体
```css
.btn-small {
padding: 6px 15px;
font-size: 12px;
border-radius: 15px;
}
.btn-large {
padding: 15px 50px;
font-size: 20px;
border-radius: 30px;
}
```
#### 5.1.4 交互状态
```css
/* 悬停状态 */
.btn:hover {
transform: translateY(-2px);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.4);
}
/* 点击状态 */
.btn:active {
transform: translateY(0);
}
/* 禁用状态 */
.btn:disabled {
opacity: 0.5;
cursor: not-allowed;
transform: none;
}
```
**设计意图**:
- 圆角按钮更友好、现代
- 渐变背景增加视觉吸引力
- 悬停上浮提供即时反馈
- 禁用状态明确告知不可操作
### 5.2 游戏卡片 (Game Card)
#### 5.2.1 结构
```html
<div class="game-card" data-id="doudizhu" data-url="/doudizhu/">
<span class="hot-badge">🔥 HOT</span>
<div class="game-icon">🃏</div>
<div class="game-info">
<div class="game-title">斗地主</div>
<div class="game-desc">经典三人扑克游戏</div>
<span class="game-tag">棋牌</span>
<div class="game-score">🏆 积分: 100</div>
</div>
</div>
```
#### 5.2.2 样式定义
```css
.game-card {
position: relative;
background: linear-gradient(145deg, #1e293b 0%, #0f172a 100%);
border-radius: 16px;
overflow: hidden;
cursor: pointer;
transition: all 0.3s ease;
border: 1px solid rgba(255, 255, 255, 0.1);
aspect-ratio: 3/4;
display: flex;
flex-direction: column;
}
.game-card:hover {
transform: translateY(-8px) scale(1.02);
box-shadow: 0 20px 40px rgba(102, 126, 234, 0.3);
border-color: rgba(102, 126, 234, 0.5);
}
.game-card:active {
transform: translateY(-4px) scale(0.98);
}
.game-icon {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
font-size: 4rem;
background: linear-gradient(135deg, rgba(102, 126, 234, 0.2) 0%, rgba(118, 75, 162, 0.2) 100%);
position: relative;
overflow: hidden;
}
/* 闪光动画 */
.game-icon::before {
content: '';
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: radial-gradient(circle, rgba(255,255,255,0.1) 0%, transparent 60%);
animation: shimmer 3s infinite;
}
@keyframes shimmer {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.game-info {
padding: 15px;
background: rgba(0, 0, 0, 0.3);
}
.game-title {
font-size: 1rem;
font-weight: 600;
margin-bottom: 5px;
color: #fff;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.game-desc {
font-size: 0.75rem;
color: #888;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.game-tag {
display: inline-block;
padding: 3px 8px;
background: rgba(102, 126, 234, 0.3);
border-radius: 12px;
font-size: 0.7rem;
color: #a5b4fc;
margin-top: 8px;
}
.game-score {
display: inline-block;
padding: 3px 10px;
background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
border-radius: 12px;
font-size: 0.75rem;
color: #fff;
margin-top: 8px;
margin-left: 6px;
font-weight: 600;
}
```
#### 5.2.3 徽章设计
```css
.hot-badge {
position: absolute;
top: 10px;
right: 10px;
background: linear-gradient(135deg, #ff6b6b 0%, #ee5a5a 100%);
color: #fff;
padding: 4px 10px;
border-radius: 12px;
font-size: 0.7rem;
font-weight: 600;
z-index: 10;
box-shadow: 0 2px 8px rgba(255, 107, 107, 0.4);
}
.new-badge {
position: absolute;
top: 10px;
right: 10px;
background: linear-gradient(135deg, #4ade80 0%, #22c55e 100%);
color: #fff;
padding: 4px 10px;
border-radius: 12px;
font-size: 0.7rem;
font-weight: 600;
z-index: 10;
}
```
**设计意图**:
- 3:4 的宽高比适合展示游戏图标和信息
- 悬停时的上浮和光晕效果吸引点击
- 闪光动画增加活力感
- 徽章突出热门和新游戏
### 5.3 模态框 (Modal)
#### 5.3.1 基础样式
```css
.modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: rgba(0, 0, 0, 0.7);
display: flex;
align-items: center;
justify-content: center;
z-index: 9999;
}
.modal-content {
background: linear-gradient(135deg, #1a3a5c 0%, #0d2847 100%);
padding: 40px 60px;
border-radius: 20px;
border: 2px solid #4a7ab8;
text-align: center;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
max-width: 90vw;
max-height: 90vh;
overflow-y: auto;
}
.modal-title {
color: white;
margin-bottom: 25px;
font-size: 24px;
font-weight: bold;
}
.modal-buttons {
display: flex;
gap: 20px;
justify-content: center;
flex-wrap: wrap;
}
```
#### 5.3.2 游戏结束弹窗
```css
.game-result {
margin: 20px 0;
padding: 20px;
background: rgba(0, 0, 0, 0.3);
border-radius: 10px;
font-size: 18px;
}
.game-result .winner {
font-size: 22px;
font-weight: bold;
color: #ffd700;
margin-bottom: 8px;
}
.game-result .winner-identity {
font-size: 16px;
color: #aaa;
margin-bottom: 10px;
}
.score-changes {
margin-top: 20px;
padding-top: 15px;
border-top: 1px solid rgba(255, 255, 255, 0.2);
}
.score-title {
font-size: 16px;
font-weight: bold;
margin-bottom: 10px;
color: #4a7ab8;
}
.score-row {
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
padding: 5px 0;
}
.score-change {
font-weight: bold;
}
.score-up { color: #2ecc71; }
.score-down { color: #e74c3c; }
.score-zero { color: #888; }
```
**设计意图**:
- 深色半透明遮罩聚焦注意力
- 边框和渐变背景与整体风格一致
- 金色突出获胜者
- 积分变动用颜色区分正负
### 5.4 输入框 (Input)
```css
.input-field {
width: 100%;
padding: 12px 15px;
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 10px;
background: rgba(255, 255, 255, 0.1);
color: white;
font-size: 16px;
text-align: center;
transition: all 0.2s;
}
.input-field:focus {
outline: none;
border-color: #667eea;
background: rgba(255, 255, 255, 0.15);
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.2);
}
.input-field::placeholder {
color: rgba(255, 255, 255, 0.5);
}
```
**变体**:
```css
/* 小尺寸 */
.input-small {
padding: 8px 12px;
font-size: 14px;
border-radius: 6px;
}
/* 深色背景 */
.input-dark {
background: rgba(0, 0, 0, 0.3);
border-color: rgba(255, 255, 255, 0.1);
}
```
### 5.5 下拉选择 (Select)
```css
.select-field {
padding: 8px 15px;
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 8px;
background: rgba(0, 0, 0, 0.3);
color: white;
font-size: 14px;
cursor: pointer;
}
.select-field option {
background: #1a3a5c;
color: white;
}
```
---
## 6. 游戏界面布局
### 6.1 斗地主游戏布局
```
┌─────────────────────────────────────────────┐
│ [底牌区] [房间信息] │
│ 🂠 🂠 🂠 房间:ABC123 │
├─────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ │
│ │ 农民甲 │ │ 农民乙 │ │
│ │ [头像] │ [桌面区] │ [头像] │ │
│ │ 17张 │ 上家出牌 │ 17张 │ │
│ └─────────┘ └─────────┘ │
│ │
│ ┌───────────┐ │
│ │ │ │
│ │ 出牌区域 │ │
│ │ │ │
│ └───────────┘ │
│ │
├─────────────────────────────────────────────┤
│ [我 - 地主] │
│ 🃏🃏🃏🃏🃏🃏🃏🃏🃏🃏🃏🃏🃏🃏🃏🃏🃏🃏🃏🃏 │
│ │
│ [出牌] [不出] [提示] │
└─────────────────────────────────────────────┘
```
#### 6.1.1 玩家位置设计
```css
/* 左侧玩家 */
.player-left {
position: absolute;
left: 20px;
top: 50%;
transform: translateY(-50%);
display: flex;
align-items: center;
gap: 15px;
}
/* 右侧玩家 */
.player-right {
position: absolute;
right: 20px;
top: 50%;
transform: translateY(-50%);
display: flex;
align-items: center;
gap: 15px;
flex-direction: row-reverse;
}
/* 自己(底部) */
.player-self {
position: absolute;
bottom: 20px;
left: 50%;
transform: translateX(-50%);
display: flex;
flex-direction: column;
align-items: center;
gap: 15px;
}
```
**设计意图**:
- 三人呈三角形分布,模拟真实牌桌
- 自己始终在底部,符合操作习惯
- 头像+剩余牌数清晰展示对手状态
#### 6.1.2 头像组件
```css
.avatar {
display: flex;
flex-direction: column;
align-items: center;
gap: 5px;
}
.avatar-img {
width: 60px;
height: 60px;
border-radius: 50%;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
font-size: 18px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
border: 2px solid rgba(255, 255, 255, 0.2);
}
.avatar-img.me {
background: linear-gradient(135deg, #ffd700 0%, #ff8c00 100%);
color: #333;
}
.player-name {
font-size: 14px;
color: rgba(255, 255, 255, 0.9);
}
.player-role {
font-size: 12px;
padding: 2px 8px;
background: rgba(0, 0, 0, 0.5);
border-radius: 10px;
color: #ffd700;
}
```
### 6.2 扑克牌样式
```css
.card {
width: 80px;
height: 112px;
background: white;
border-radius: 8px;
border: 1px solid #ccc;
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 6px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
cursor: pointer;
transition: transform 0.2s, box-shadow 0.2s;
user-select: none;
position: relative;
overflow: hidden;
}
.card:hover {
transform: translateY(-5px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
}
.card.selected {
transform: translateY(-15px);
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.5);
}
/* 牌背 */
.card.back {
background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
border: 1px solid #4a7ab8;
}
.card.back::after {
content: '🎮';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 24px;
opacity: 0.5;
}
/* 小尺寸牌(用于显示剩余牌数) */
.card-small {
width: 40px;
height: 56px;
border-radius: 4px;
}
```
**设计意图**:
- 标准扑克牌比例 (80x112)
- 选中时上移15px,清晰显示选择状态
- 牌背使用品牌蓝,带logo增加识别度
---
## 7. 响应式设计
### 7.1 断点定义
| 断点 | 宽度 | 设备类型 | 布局变化 |
|------|------|----------|----------|
| `xs` | < 640px | 手机 | 单列,紧凑布局 |
| `sm` | 640px - 899px | 大屏手机/平板 | 2-3列 |
| `md` | 900px - 1199px | 小笔记本 | 4列 |
| `lg` | 1200px - 1599px | 桌面 | 5-6列 |
| `xl` | ≥ 1600px | 大屏 | 8列 |
### 7.2 游戏大厅响应式
```css
.games-grid {
display: grid;
gap: 20px;
/* 手机默认:每行2个 */
grid-template-columns: repeat(2, 1fr);
}
/* 平板:每行3个 */
@media (min-width: 640px) {
.games-grid { grid-template-columns: repeat(3, 1fr); }
}
/* 小屏幕电脑:每行4个 */
@media (min-width: 900px) {
.games-grid { grid-template-columns: repeat(4, 1fr); }
}
/* 中等屏幕:每行5-6个 */
@media (min-width: 1200px) {
.games-grid { grid-template-columns: repeat(5, 1fr); }
}
/* 大屏幕:每行8个 */
@media (min-width: 1600px) {
.games-grid { grid-template-columns: repeat(8, 1fr); }
}
```
### 7.3 斗地主游戏响应式
```css
/* 手机适配 */
@media (max-width: 768px) {
.game-container {
max-width: 100vw;
max-height: 100vh;
}
/* 缩小牌尺寸 */
.card {
width: 60px;
height: 84px;
}
/* 手牌重叠更多 */
.hand-cards .card {
margin-left: -40px;
}
/* 隐藏左右玩家的详细信息 */
.player-left .player-name,
.player-right .player-name {
display: none;
}
/* 头像缩小 */
.avatar-img {
width: 40px;
height: 40px;
font-size: 14px;
}
}
```
### 7.4 字体响应式
```css
html {
font-size: 16px;
}
@media (max-width: 768px) {
html { font-size: 14px; }
}
@media (max-width: 480px) {
html { font-size: 12px; }
}
```
**设计意图**:
- 移动优先:从手机布局开始,逐步增强
- 牌类游戏在手机上需要调整牌尺寸和重叠度
- 字体随屏幕缩小,保持可读性
---
## 8. 动效规范
### 8.1 过渡时间
| 类型 | 时长 | 缓动函数 | 应用场景 |
|------|------|----------|----------|
| 快速 | 150ms | ease | 按钮点击、状态切换 |
| 标准 | 200ms | ease | 悬停效果、小动画 |
| 慢速 | 300ms | ease-out | 卡片悬停、页面切换 |
| 特殊 | 500ms | cubic-bezier | 发牌动画、胜利庆祝 |
### 8.2 关键动画
#### 8.2.1 发牌动画
```css
@keyframes dealCard {
0% {
opacity: 0;
transform: translateY(-100px) scale(0.5);
}
50% {
opacity: 1;
}
100% {
transform: translateY(0) scale(1);
}
}
.card.dealing {
animation: dealCard 0.5s ease-out forwards;
}
```
#### 8.2.2 脉冲动画(连接状态)
```css
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
.status-connecting {
animation: pulse 1.5s infinite;
}
```
#### 8.2.3 抖动动画(错误提示)
```css
@keyframes shake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-10px); }
75% { transform: translateX(10px); }
}
.error-shake {
animation: shake 0.3s ease-in-out;
}
```
#### 8.2.4 闪光动画(卡片悬停)
```css
@keyframes shimmer {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.game-icon::before {
animation: shimmer 3s infinite linear;
}
```
### 8.3 性能优化
```css
/* 使用 will-change 优化动画性能 */
.game-card {
will-change: transform;
}
/* 使用 transform 而非 top/left */
.card:hover {
transform: translateY(-5px);
}
/* 避免动画引起的重排 */
.modal-overlay {
will-change: opacity;
}
```
---
## 9. 特殊组件
### 9.1 连接状态栏
```css
.connection-bar {
position: fixed;
top: 0;
left: 0;
right: 0;
height: 50px;
background: rgba(0, 0, 0, 0.5);
backdrop-filter: blur(10px);
display: flex;
align-items: center;
justify-content: center;
gap: 15px;
padding: 0 20px;
z-index: 10000;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.connection-status {
display: flex;
align-items: center;
gap: 8px;
padding: 5px 12px;
border-radius: 15px;
font-size: 14px;
font-weight: bold;
}
.connection-status.connected {
background: rgba(46, 204, 113, 0.2);
color: #2ecc71;
}
.connection-status.disconnected {
background: rgba(231, 76, 60, 0.2);
color: #e74c3c;
}
.connection-status.connecting {
background: rgba(52, 152, 219, 0.2);
color: #3498db;
animation: pulse 1.5s infinite;
}
.status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: currentColor;
}
```
**设计意图**:
- 固定在顶部,随时可见
- 颜色编码状态(绿=连接,红=断开,蓝=连接中)
- 毛玻璃效果与背景融合
### 9.2 用户积分显示
```css
.user-score-area {
margin: 15px 0;
padding: 12px 20px;
background: linear-gradient(135deg, rgba(245, 158, 11, 0.2) 0%, rgba(217, 119, 6, 0.2) 100%);
border: 1px solid rgba(245, 158, 11, 0.3);
border-radius: 25px;
display: inline-block;
}
.score-display {
display: flex;
align-items: center;
gap: 8px;
font-size: 15px;
}
.score-label {
color: #fbbf24;
}
.score-value {
font-weight: bold;
color: #f59e0b;
font-size: 18px;
}
```
**设计意图**:
- 金色系强调积分的价值
- 圆角胶囊形状,友好现代
- 半透明背景与页面融合
### 9.3 倒计时提示
```css
.countdown {
position: fixed;
top: 60px;
left: 50%;
transform: translateX(-50%);
background: rgba(231, 76, 60, 0.9);
color: white;
padding: 8px 20px;
border-radius: 20px;
font-size: 16px;
font-weight: bold;
z-index: 9998;
animation: pulse 1s infinite;
}
.countdown.warning {
background: rgba(241, 196, 15, 0.9);
color: #333;
}
.countdown.danger {
background: rgba(231, 76, 60, 0.9);
animation: pulse 0.5s infinite;
}
```
**设计意图**:
- 顶部中央位置,醒目但不遮挡游戏
- 颜色随时间变化(绿→黄→红)
- 脉冲动画增加紧迫感
### 9.4 操作按钮组
```css
.action-buttons {
display: flex;
gap: 15px;
justify-content: center;
flex-wrap: wrap;
}
.action-buttons .btn {
min-width: 100px;
}
```
**布局原则**:
- 主要操作在左侧(出牌、叫地主)
- 次要操作在右侧(不出、提示)
- 危险操作使用红色(退出、解散)
- 按钮间距15px,防止误触
---
## 10. 代码组织规范
### 10.1 文件结构
```
net-games/
├── client/
│ ├── index.html # 主页面
│ ├── style.css # 主样式文件
│ ├── game.js # 游戏逻辑
│ └── assets/
│ └── images/ # 图片资源
├── hub/
│ ├── index.html # 游戏大厅
│ └── style.css
└── docs/
└── UI_DESIGN_GUIDELINES.md # 本文档
happy-games/
├── index.html # 游戏大厅
├── games/
│ ├── doudizhu/
│ │ ├── index.html
│ │ ├── style.css
│ │ └── game.js
│ └── slither-io/
│ └── ...
```
### 10.2 CSS 命名规范
使用 BEM (Block Element Modifier) 命名法:
```css
/* Block */
.game-card { }
/* Element */
.game-card__icon { }
.game-card__title { }
/* Modifier */
.game-card--hot { }
.game-card--disabled { }
```
**实际项目中的简化**:
```css
/* 使用连字符命名 */
.game-card { }
.game-icon { }
.game-title { }
.game-card.hot { }
.game-card.disabled { }
```
### 10.3 样式组织顺序
```css
/* 1. CSS 变量 */
:root { }
/* 2. 重置和基础 */
* { }
body { }
/* 3. 工具类 */
.text-center { }
.hidden { }
/* 4. 布局组件 */
.header { }
.container { }
/* 5. UI 组件 */
.btn { }
.card { }
.modal { }
/* 6. 游戏特定 */
.card-poker { }
.player-avatar { }
/* 7. 动画 */
@keyframes { }
/* 8. 媒体查询 */
@media { }
```
---
## 11. 技术栈
### 11.1 前端技术
| 技术 | 版本 | 用途 | 选择理由 |
|------|------|------|----------|
| 原生 HTML | 5 | 页面结构 | 轻量,无需构建 |
| 原生 CSS | 3 | 样式 | 使用现代特性(变量、渐变、网格) |
| 原生 JavaScript | ES6+ | 交互逻辑 | 现代API支持,无需编译 |
| Socket.IO Client | 4.x | 实时通信 | WebSocket 封装,自动重连 |
### 11.2 不使用框架的理由
1. **轻量快速**: 无需构建步骤,直接部署
2. **游戏性能**: 原生 DOM 操作比框架更高效
3. **简单场景**: 游戏界面相对固定,不需要复杂的状态管理
4. **学习成本**: 团队成员都能直接维护
### 11.3 现代 CSS 特性使用
```css
/* CSS 变量 */
:root { --primary: #667eea; }
/* 网格布局 */
.games-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}
/* 弹性盒子 */
.flex-center {
display: flex;
justify-content: center;
align-items: center;
}
/* 渐变 */
.gradient-text {
background: linear-gradient(135deg, #667eea, #764ba2);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
/* backdrop-filter 毛玻璃 */
.glass {
backdrop-filter: blur(10px);
}
/* 过渡和动画 */
.animate {
transition: all 0.3s ease;
}
```
---
## 12. 最佳实践
### 12.1 性能优化
```css
/* 1. 使用 transform 代替 top/left */
/* 好 */
.card:hover { transform: translateY(-5px); }
/* 不好 */
.card:hover { top: -5px; }
/* 2. 使用 opacity 和 transform 做动画 */
/* 这些属性不会引起重排 */
.fade-in {
animation: fadeIn 0.3s ease;
}
/* 3. 延迟加载非关键资源 */
<img loading="lazy" src="...">
/* 4. 使用 will-change 谨慎 */
.game-card {
will-change: transform;
}
```
### 12.2 可访问性
```css
/* 焦点样式 */
button:focus-visible,
input:focus-visible {
outline: 2px solid #667eea;
outline-offset: 2px;
}
/* 减少动画 */
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
/* 颜色对比度 */
/* 确保文字与背景对比度至少 4.5:1 */
.text-on-dark {
color: rgba(255, 255, 255, 0.9);
}
```
### 12.3 移动端优化
```css
/* 禁用双击缩放 */
* {
touch-action: manipulation;
}
/* 禁用文本选择(游戏场景) */
.no-select {
user-select: none;
-webkit-user-select: none;
}
/* 优化滚动 */
.scrollable {
-webkit-overflow-scrolling: touch;
}
```
---
## 13. 扩展建议
### 13.1 短期优化
1. **暗色/亮色主题切换**
```css
[data-theme="light"] {
--bg-primary: #f5f5f5;
--text-primary: #333;
}
```
2. **更多动效**
- 胜利庆祝动画(彩花、闪光)
- 发牌音效配合视觉
- 手势操作支持
3. **无障碍增强**
- ARIA 标签
- 键盘导航支持
- 屏幕阅读器优化
### 13.2 长期规划
1. **设计系统组件库**
- 将常用组件抽取为可复用模块
- 组件文档和示例
- 设计令牌(Design Tokens)
2. **多主题支持**
- 节日主题(春节、圣诞)
- 用户自定义主题
- 品牌合作主题
3. **跨游戏组件共享**
- 统一的头像组件
- 通用的积分显示
- 共享的弹窗系统
---
## 14. 示例代码
### 14.1 完整游戏卡片组件
```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>游戏卡片示例</title>
<style>
:root {
--accent-purple: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
}
.game-card {
width: 200px;
background: linear-gradient(145deg, #1e293b 0%, #0f172a 100%);
border-radius: 16px;
overflow: hidden;
cursor: pointer;
transition: all 0.3s ease;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.game-card:hover {
transform: translateY(-8px) scale(1.02);
box-shadow: 0 20px 40px rgba(102, 126, 234, 0.3);
border-color: rgba(102, 126, 234, 0.5);
}
.game-icon {
height: 150px;
display: flex;
align-items: center;
justify-content: center;
font-size: 4rem;
background: linear-gradient(135deg, rgba(102, 126, 234, 0.2) 0%, rgba(118, 75, 162, 0.2) 100%);
}
.game-info {
padding: 15px;
}
.game-title {
font-size: 1rem;
font-weight: 600;
color: #fff;
margin-bottom: 5px;
}
.game-desc {
font-size: 0.75rem;
color: #888;
}
</style>
</head>
<body>
<div class="game-card">
<div class="game-icon">🃏</div>
<div class="game-info">
<div class="game-title">斗地主</div>
<div class="game-desc">经典三人扑克游戏</div>
</div>
</div>
</body>
</html>
```
### 14.2 完整按钮组件
```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<style>
body {
background: #0d2847;
display: flex;
gap: 20px;
padding: 50px;
flex-wrap: wrap;
}
.btn {
padding: 12px 30px;
border: none;
border-radius: 25px;
font-size: 14px;
font-weight: bold;
cursor: pointer;
transition: all 0.2s ease;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
color: white;
}
.btn:hover {
transform: translateY(-2px);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.4);
}
.btn-primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.btn-secondary {
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
}
.btn-start {
background: linear-gradient(135deg, #ffd700 0%, #ff8c00 100%);
color: #333;
padding: 15px 50px;
font-size: 18px;
}
.btn:disabled {
opacity: 0.5;
cursor: not-allowed;
transform: none;
}
</style>
</head>
<body>
<button class="btn btn-primary">主要按钮</button>
<button class="btn btn-secondary">次要按钮</button>
<button class="btn btn-start">开始游戏</button>
<button class="btn btn-primary" disabled>禁用状态</button>
</body>
</html>
```
---
## 15. 参考资源
### 15.1 设计灵感
| 资源 | 链接 | 参考内容 |
|------|------|----------|
| Dribbble | https://dribbble.com | 游戏UI设计灵感 |
| Behance | https://behance.net | 完整项目案例 |
| Mobbin | https://mobbin.com | 移动端设计模式 |
| Game UI Database | https://gameuidatabase.com | 游戏界面截图库 |
### 15.2 技术文档
| 资源 | 链接 | 用途 |
|------|------|------|
| MDN CSS | https://developer.mozilla.org/zh-CN/docs/Web/CSS | CSS 参考 |
| Can I Use | https://caniuse.com | 浏览器兼容性 |
| Tailwind CSS | https://tailwindcss.com | 工具类命名参考 |
### 15.3 游戏设计
| 资源 | 链接 | 参考内容 |
|------|------|----------|
| QQ斗地主 | 客户端 | 牌桌布局、交互 |
| Slither.io | https://slither.io | 深色主题、光效 |
| Poki.com | https://poki.com | 游戏大厅设计 |
---
## 16. 更新日志
| 日期 | 版本 | 变更内容 |
|------|------|----------|
| 2026-04-09 | v1.0 | 初始版本,整合 Happy-Games 和 Net-Games 设计规范 |
---
## 17. 附录
### 17.1 颜色速查表
| 名称 | 色值 | 用途 |
|------|------|------|
| 深海蓝 | `#0d2847` | 游戏背景 |
| 紫罗兰 | `#667eea` | 主品牌色 |
| 品红 | `#f093fb` | 次要按钮 |
| 金色 | `#ffd700` | 积分、奖励 |
| 成功绿 | `#2ecc71` | 在线状态 |
| 错误红 | `#e74c3c` | 错误、断开 |
| 警告黄 | `#f1c40f` | 倒计时警告 |
### 17.2 间距速查表
| 名称 | 值 | 用途 |
|------|-----|------|
| xs | 4px | 图标内边距 |
| sm | 8px | 紧凑间距 |
| md | 15px | 标准间距 |
| lg | 20px | 组件间距 |
| xl | 30px | 区块间距 |
| 2xl | 40px | 大区块间距 |
### 17.3 响应式断点速查
```css
/* 手机 */
@media (max-width: 639px) { }
/* 平板 */
@media (min-width: 640px) and (max-width: 899px) { }
/* 小桌面 */
@media (min-width: 900px) and (max-width: 1199px) { }
/* 桌面 */
@media (min-width: 1200px) and (max-width: 1599px) { }
/* 大屏 */
@media (min-width: 1600px) { }
```
---
*本文档由 AI 助手生成,作为 Net-Games 和 Happy-Games 项目的 UI 设计参考。*
**维护者**: 开发团队
**最后更新**: 2026-04-09
**状态**: 活跃