# 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
🔥 HOT
🃏
斗地主
经典三人扑克游戏
棋牌
🏆 积分: 100
``` #### 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. 延迟加载非关键资源 */ /* 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 游戏卡片示例
🃏
斗地主
经典三人扑克游戏
``` ### 14.2 完整按钮组件 ```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 **状态**: 活跃