diff --git a/.claude/settings.local.json b/.claude/settings.local.json index efb176a7..39492ce7 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -4,7 +4,13 @@ "mcp__promptx__remember", "mcp__playwright__browser_network_requests", "Bash(git add:*)", - "Bash(git commit:*)" + "Bash(git commit:*)", + "Bash(open:*)", + "mcp__playwright__browser_navigate", + "mcp__playwright__browser_take_screenshot", + "mcp__serena__read_memory", + "WebSearch", + "WebFetch(domain:unsplash.com)" ], "deny": [], "ask": [], diff --git a/.playwright-mcp/hero-cards-before.png b/.playwright-mcp/hero-cards-before.png new file mode 100644 index 00000000..7becea40 Binary files /dev/null and b/.playwright-mcp/hero-cards-before.png differ diff --git a/.serena/memories/visual-design-layout-issues.md b/.serena/memories/visual-design-layout-issues.md new file mode 100644 index 00000000..24f92cd0 --- /dev/null +++ b/.serena/memories/visual-design-layout-issues.md @@ -0,0 +1,36 @@ +# 视觉设计订单班布局问题记录 + +## 2025-10-09: 项目成果总结布局问题 + +### 问题描述 +- **位置**: index.html Footer区域 - 项目成果总结 (Section 5) +- **当前问题**: 使用grid-3类名,但实际CSS定义为`grid-template-columns: repeat(2, 1fr)`,导致3个内容块换行显示,布局不美观 +- **用户反馈**: "项目成果的布局太丑了,单个换行,如果3个内容最好就做成3列" + +### 根本原因 +在styles.css中,`.grid-3`类的定义错误: +```css +.grid-3 { + grid-template-columns: repeat(2, 1fr); /* 错误:应该是3列 */ +} +``` + +### 解决方案 +修改`.grid-3`为真正的3列布局: +```css +.grid-3 { + grid-template-columns: repeat(3, 1fr); /* 正确:3列 */ +} +``` + +### 影响范围 +- Footer区域的3个卡片(核心亮点、制作数据、应用价值) +- 任何使用grid-3类的其他位置 + +### 修复时间 +2025-10-09 + +### 经验教训 +- 类名应该准确反映其功能(grid-3应该是3列,不是2列) +- 在大屏幕优化时要确保网格定义与实际需求一致 +- 响应式设计时,桌面端应优先考虑内容的最佳展示方式 diff --git a/.serena/memories/web-layout-patterns-ascii.md b/.serena/memories/web-layout-patterns-ascii.md new file mode 100644 index 00000000..a6b616b2 --- /dev/null +++ b/.serena/memories/web-layout-patterns-ascii.md @@ -0,0 +1,1687 @@ +# 网页布局排版方法总结 - ASCII可视化指南(完整增强版) + +## 目录 +1. [Grid网格布局模式](#一grid网格布局模式) +2. [Flexbox布局模式](#二flexbox布局模式) +3. [图层叠加与定位模式](#三图层叠加与定位模式) +4. [响应式布局转换](#四响应式布局转换) +5. [间距系统对比](#五间距系统对比) +6. [排版层次结构](#六排版层次结构) +7. [实用布局组合示例](#七实用布局组合示例) +8. [Hero区域布局模式](#八hero区域布局模式) ⭐ 新增 +9. [导航栏布局模式](#九导航栏布局模式) ⭐ 新增 +10. [Agent头像区布局](#十agent头像区布局) ⭐ 新增 +11. [Stats统计数据布局](#十一stats统计数据布局) ⭐ 新增 +12. [Footer总结区布局](#十二footer总结区布局) ⭐ 新增 +13. [关键CSS属性速查表](#十三关键css属性速查表) +14. [常见问题解决方案](#十四常见问题解决方案) +15. [最佳实践总结](#十五最佳实践总结) + +--- + +## 一、Grid网格布局模式 + +### 1. Grid-2 布局(2列并排) +``` +┌─────────────────────────────────────────────────────────────┐ +│ 容器 (.grid-2) │ +│ grid-template-columns: repeat(2, 1fr) │ +├─────────────────────────────┬───────────────────────────────┤ +│ │ │ +│ 卡片 1 │ 卡片 2 │ +│ (50% 宽度) │ (50% 宽度) │ +│ │ │ +│ ┌─────────────┐ │ ┌─────────────┐ │ +│ │ 图片 │ │ │ 图片 │ │ +│ │ 16:9 比例 │ │ │ 16:9 比例 │ │ +│ └─────────────┘ │ └─────────────┘ │ +│ ┌─────────────┐ │ ┌─────────────┐ │ +│ │ 标题 │ │ │ 标题 │ │ +│ ├─────────────┤ │ ├─────────────┤ │ +│ │ 内容 │ │ │ 内容 │ │ +│ └─────────────┘ │ └─────────────┘ │ +│ │ │ +└─────────────────────────────┴───────────────────────────────┘ + +CSS 代码: +.grid-2 { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: var(--spacing-2xl); +} + +适用场景: +- 对比展示(如:功能对比、前后对比) +- 大尺寸内容展示 +- 左右分栏布局 +``` + +### 2. Grid-3 布局(3列并排) +``` +┌───────────────────────────────────────────────────────────────────────────┐ +│ 容器 (.grid-3) │ +│ grid-template-columns: repeat(3, 1fr) │ +├───────────────────────┬───────────────────────┬───────────────────────────┤ +│ │ │ │ +│ 卡片 1 │ 卡片 2 │ 卡片 3 │ +│ (33.33% 宽度) │ (33.33% 宽度) │ (33.33% 宽度) │ +│ │ │ │ +│ ┌─────────┐ │ ┌─────────┐ │ ┌─────────┐ │ +│ │ 图片 │ │ │ 图片 │ │ │ 图片 │ │ +│ │ 16:9 │ │ │ 16:9 │ │ │ 16:9 │ │ +│ └─────────┘ │ └─────────┘ │ └─────────┘ │ +│ ┌─────────┐ │ ┌─────────┐ │ ┌─────────┐ │ +│ │ 标题 │ │ │ 标题 │ │ │ 标题 │ │ +│ ├─────────┤ │ ├─────────┤ │ ├─────────┤ │ +│ │ 内容 │ │ │ 内容 │ │ │ 内容 │ │ +│ └─────────┘ │ └─────────┘ │ └─────────┘ │ +│ │ │ │ +└───────────────────────┴───────────────────────┴───────────────────────────┘ + +CSS 代码: +.grid-3 { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: var(--spacing-2xl); +} + +适用场景: +- 三要素展示(如:特点、优势、功能) +- 项目案例展示 +- 服务项目列表 +- 成果展示区 +``` + +### 3. Grid-4 布局(4列并排) +``` +┌─────────────────────────────────────────────────────────────────────────────────────────┐ +│ 容器 (.grid-4) │ +│ grid-template-columns: repeat(4, 1fr) │ +├──────────────────┬──────────────────┬──────────────────┬──────────────────────────────┤ +│ │ │ │ │ +│ 卡片 1 │ 卡片 2 │ 卡片 3 │ 卡片 4 │ +│ (25% 宽度) │ (25% 宽度) │ (25% 宽度) │ (25% 宽度) │ +│ │ │ │ │ +│ ┌────────┐ │ ┌────────┐ │ ┌────────┐ │ ┌────────┐ │ +│ │ 图片 │ │ │ 图片 │ │ │ 图片 │ │ │ 图片 │ │ +│ │ 3:2 │ │ │ 3:2 │ │ │ 3:2 │ │ │ 3:2 │ │ +│ └────────┘ │ └────────┘ │ └────────┘ │ └────────┘ │ +│ ┌────────┐ │ ┌────────┐ │ ┌────────┐ │ ┌────────┐ │ +│ │ 标题 │ │ │ 标题 │ │ │ 标题 │ │ │ 标题 │ │ +│ └────────┘ │ └────────┘ │ └────────┘ │ └────────┘ │ +│ │ │ │ │ +└──────────────────┴──────────────────┴──────────────────┴──────────────────────────────┘ + +CSS 代码: +.grid-4 { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: var(--spacing-xl); +} + +适用场景: +- 数据统计展示 +- 产品特性列表 +- 设计原则说明 +- 快速功能预览 + +⚠️ 注意:避免3+1布局(3个一行,1个换行) +❌ 错误: +┌─────┬─────┬─────┐ +│ 1 │ 2 │ 3 │ +└─────┴─────┴─────┘ +┌─────┐ +│ 4 │ ← 单独换行很丑 +└─────┘ + +✅ 正确: +┌────┬────┬────┬────┐ +│ 1 │ 2 │ 3 │ 4 │ +└────┴────┴────┴────┘ +``` + +### 4. 食品紧凑版Grid优化(减少列数,增大单元格) +``` +标准版 Grid-3: 食品紧凑版 Grid-3: +┌────┬────┬────┐ ┌──────────┬──────────┐ +│ 1 │ 2 │ 3 │ │ 1 │ 2 │ +└────┴────┴────┘ └──────────┴──────────┘ + ┌──────────┐ + │ 3 │ + └──────────┘ + +grid-3 { grid-3 { + columns: repeat(3, 1fr) columns: repeat(2, 1fr) ← 改为2列 +} } + +优势: +- 图片更大,内容更突出 +- 减少拥挤感 +- 提升视觉层次 +``` + +--- + +## 二、Flexbox布局模式 + +### 1. Hero浮动卡片(强制并排) +``` +┌──────────────────────────────────────────────────────────────┐ +│ Hero 内容区域 │ +│ │ +│ ┌──────────────┐ │ +│ │ 主标题 │ │ +│ │ 副标题 │ │ +│ └──────────────┘ │ +│ │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ 3600片 │ │ 99.7% │ │ ±0.02mm │ │ 300ms │ │ +│ │ /小时 │ │ 检出率 │ │ 精度 │ │ 时间 │ │ +│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ +│ ← flex-wrap: nowrap 强制并排,不换行 │ +└──────────────────────────────────────────────────────────────┘ + +CSS 代码: +.hero-floating-cards { + display: flex; + gap: var(--spacing-md); /* 紧凑间距 */ + justify-content: center; + flex-wrap: nowrap; /* 关键:强制并排 */ +} + +.hero-card { + padding: var(--spacing-sm) var(--spacing-md); /* 紧凑内边距 */ + min-width: 100px; /* 小尺寸 */ + border-radius: var(--radius-md); /* 适中圆角 */ +} + +关键技术点: +✅ flex-wrap: nowrap → 强制单行显示 +✅ gap 使用 md 而非 lg → 节省空间 +✅ min-width 100px → 保持紧凑 +❌ flex-wrap: wrap → 会导致换行 +``` + +### 2. 卡片内部Flexbox Order布局 +``` +传统布局(标题在上): Order重排布局(图片优先): +┌─────────────────┐ ┌─────────────────┐ +│ .card-header │ ← order: 1 │ .image │ ← order: 1 +│ 标题区域 │ │ ┌───────────┐ │ +├─────────────────┤ │ │ 图片 │ │ +│ .image │ ← order: 2 │ │ 16:9比例 │ │ +│ ┌───────────┐ │ │ └───────────┘ │ +│ │ 图片 │ │ ├─────────────────┤ +│ └───────────┘ │ │ .card-header │ ← order: 2 +├─────────────────┤ │ 标题区域 │ +│ .card-body │ ← order: 3 ├─────────────────┤ +│ 内容区域 │ │ .card-body │ ← order: 3 +└─────────────────┘ │ 内容区域 │ + └─────────────────┘ + +CSS 代码: +.card { + display: flex; + flex-direction: column; + padding: 0; /* 移除内边距,让图片占满 */ +} + +.image-container { + order: 1; /* 图片最前 */ + aspect-ratio: 16/9; + margin-bottom: 0; /* 无间距 */ + border-radius: 0; /* 卡片内无圆角 */ +} + +.card-header { + order: 2; /* 标题居中 */ + padding: var(--spacing-xl); +} + +.card-body { + order: 3; /* 内容最后 */ + padding: var(--spacing-xl); + flex: 1; /* 占据剩余空间 */ +} + +优势: +- 视觉冲击力强 +- 图片优先展示 +- 灵活调整顺序 +- 响应式友好 +``` + +### 3. 图片容器Aspect Ratio控制 +``` +16:9 宽屏比例(食品/能源页面常用): +┌────────────────────────────────────┐ +│ │ +│ ┌──────────────┐ │ +│ │ │ │ ← height: 自动计算 +│ │ 16:9 │ │ (width / 16 * 9) +│ │ │ │ +│ └──────────────┘ │ +│ │ +└────────────────────────────────────┘ + width: 100% + +3:2 标准比例(产品展示): +┌──────────────────────┐ +│ │ +│ ┌──────────┐ │ +│ │ │ │ ← height: 自动计算 +│ │ 3:2 │ │ (width / 3 * 2) +│ │ │ │ +│ └──────────┘ │ +│ │ +└──────────────────────┘ + width: 100% + +4:3 传统比例(时间线图片): +┌─────────────────┐ +│ │ +│ ┌─────────┐ │ +│ │ │ │ ← height: 自动计算 +│ │ 4:3 │ │ (width / 4 * 3) +│ │ │ │ +│ └─────────┘ │ +│ │ +└─────────────────┘ + width: 100% + +CSS 代码: +/* 16:9 宽屏 - 紧凑现代 */ +.image-container { + aspect-ratio: 16/9; + width: 100%; + object-fit: cover; +} + +/* 3:2 标准 - 产品展示 */ +.product-image { + aspect-ratio: 3/2; + width: 100%; +} + +/* 4:3 传统 - 时间线 */ +.timeline-image { + aspect-ratio: 4/3; + flex: 0 0 300px; +} + +关键点: +✅ aspect-ratio 自动计算高度 +✅ object-fit: cover 裁剪适应 +✅ 无需手动设置 height +``` + +--- + +## 三、图层叠加与定位模式 + +### 1. 背景图片+渐变叠加 +``` +┌─────────────────────────────────────────┐ +│ 卡片标题区域 (.card-header) │ +├─────────────────────────────────────────┤ +│ ┌─────────────────────────────────────┐ │ ← position: relative +│ │ 【Layer 3 - 最上层】 │ │ (容器定位上下文) +│ │

标题文字

│ │ +│ │ z-index: 1 │ │ +│ │ color: white │ │ +│ │ text-shadow: 0 2px 8px rgba(...) │ │ +│ ├─────────────────────────────────────┤ │ +│ │ 【Layer 2 - 中间层】 │ │ +│ │ 渐变遮罩层
│ │ +│ │ position: absolute │ │ +│ │ inset: 0 │ │ +│ │ background: linear-gradient( │ │ +│ │ 135deg, │ │ +│ │ rgba(13, 71, 161, 0.92) 0%, │ │ ← 半透明渐变 +│ │ rgba(25, 118, 210, 0.88) 100% │ │ 保证文字可读性 +│ │ ) │ │ +│ │ z-index: 0 │ │ +│ ├─────────────────────────────────────┤ │ +│ │ 【Layer 1 - 底层】 │ │ +│ │ 背景图片 │ │ +│ │ background-image: │ │ +│ │ url('unsplash.com/...') │ │ ← 实际图片 +│ │ background-size: cover │ │ +│ │ background-position: center │ │ +│ └─────────────────────────────────────┘ │ +└─────────────────────────────────────────┘ + +HTML 结构: +
+ +
+
+ +

+ 标题文字 +

+
+ +z-index 层级说明: +━━━━━━━━━━━━━━━━━━━ + 标题文字 (z: 1) ← 最上层,清晰可读 +━━━━━━━━━━━━━━━━━━━ + 渐变遮罩 (z: 0) ← 中间层,半透明 +━━━━━━━━━━━━━━━━━━━ + 背景图片 ← 底层,装饰作用 +━━━━━━━━━━━━━━━━━━━ +``` + +### 2. Glassmorphism玻璃态效果 +``` +┌─────────────────────────────────────────────────────┐ +│ 背景层(模糊背景图片或渐变) │ +│ │ +│ ┌─────────────────────────────────────┐ │ +│ │ 【玻璃态卡片】 │ │ +│ │ ┌─────────────────────────────────┐ │ │ +│ │ │ 半透明背景 + 模糊效果 │ │ │ +│ │ │ background: rgba(255,255,255,0.9)│ │ ← 90%透明度白色 +│ │ │ backdrop-filter: blur(15px) │ │ ← 15px背景模糊 +│ │ │ border: 2px solid rgba(...,0.2) │ │ ← 20%透明度边框 +│ │ │ box-shadow: 0 8px 32px rgba(...) │ │ ← 柔和阴影 +│ │ │ │ │ +│ │ │ ┌────────────────────┐ │ │ +│ │ │ │ 内容文字 │ │ │ ← 深色文字清晰可读 +│ │ │ │ 清晰易读 │ │ │ +│ │ │ └────────────────────┘ │ │ +│ │ └─────────────────────────────────┘ │ +│ └─────────────────────────────────────┘ +│ │ +└─────────────────────────────────────────────────────┘ + +CSS 代码: +.card { + background: var(--bg-card); /* rgba(255,255,255,0.9) */ + backdrop-filter: blur(15px); /* 背景模糊 */ + -webkit-backdrop-filter: blur(15px); /* Safari支持 */ + border: 2px solid var(--border-light); /* rgba(..., 0.2) */ + border-radius: var(--radius-2xl); /* 1.5rem */ + box-shadow: var(--shadow-md); /* 柔和阴影 */ +} + +.nav { + background: var(--bg-semi-dark); /* rgba(255,255,255,0.95) */ + backdrop-filter: blur(20px); /* 更强模糊 */ +} + +深色主题变体: +body.dark-theme { + --bg-card: rgba(18, 35, 24, 0.9); /* 深绿半透明 */ + --bg-semi-dark: rgba(10, 26, 15, 0.95); /* 深邃绿半透明 */ +} + +效果特点: +✨ 透过效果 - 能看到背景元素 +✨ 模糊效果 - backdrop-filter: blur() +✨ 层次感强 - 阴影+边框+透明度 +✨ 现代时尚 - iOS/macOS风格 +``` + +--- + +## 四、响应式布局转换 + +### 1. Grid → 单列响应式 +``` +桌面端(>768px): 移动端(≤768px): +┌─────┬─────┬─────┐ ┌───────────┐ +│ 1 │ 2 │ 3 │ │ 1 │ +└─────┴─────┴─────┘ ├───────────┤ +grid-3: repeat(3, 1fr) │ 2 │ + ├───────────┤ + │ 3 │ + └───────────┘ + grid-3: 1fr + +CSS 代码: +@media (max-width: 768px) { + .grid-2, + .grid-3, + .grid-4 { + grid-template-columns: 1fr; /* 全部改为单列 */ + } +} +``` + +### 2. Flexbox → 垂直堆叠 +``` +桌面端(>768px): +┌──────────────────────────────────────────┐ +│ .alternating-layout (flex-direction: row)│ +├─────────────────────┬────────────────────┤ +│ 图片 (flex:1) │ 内容 (flex:1) │ +│ ┌───────────────┐ │ 标题 │ +│ │ │ │ 段落内容... │ +│ │ 4:3比例 │ │ │ +│ └───────────────┘ │ │ +└─────────────────────┴────────────────────┘ + +移动端(≤768px): +┌──────────────────────────────────────────┐ +│ .alternating-layout (flex-direction: col)│ +├──────────────────────────────────────────┤ +│ ┌────────────────────────────────────┐ │ +│ │ 图片 │ │ +│ │ 4:3比例 │ │ +│ └────────────────────────────────────┘ │ +├──────────────────────────────────────────┤ +│ 标题 │ +│ 段落内容... │ +│ │ +└──────────────────────────────────────────┘ + +CSS 代码: +.alternating-layout { + display: flex; + gap: var(--spacing-2xl); + align-items: center; +} + +@media (max-width: 768px) { + .alternating-layout { + flex-direction: column; /* 改为垂直堆叠 */ + } +} +``` + +--- + +## 五、间距系统对比 + +### 标准间距 vs 紧凑间距 +``` +┌─────────────────────────────────────────────────────────────────┐ +│ 间距对比示意图 │ +├─────────────────────────────────────────────────────────────────┤ +│ │ +│ 标准版能源页面: │ +│ ┌───────────────┐ ← --spacing-xl: 64px │ +│ │ 卡片1 │ │ +│ └───────────────┘ │ +│ ↕ 96px (--spacing-2xl) │ +│ ┌───────────────┐ │ +│ │ 卡片2 │ │ +│ └───────────────┘ │ +│ │ +│ 紧凑版食品页面: │ +│ ┌───────────────┐ ← --spacing-xl: 40px (-37.5%) │ +│ │ 卡片1 │ │ +│ └───────────────┘ │ +│ ↕ 48px (--spacing-2xl, -50%) │ +│ ┌───────────────┐ │ +│ │ 卡片2 │ │ +│ └───────────────┘ │ +│ │ +└─────────────────────────────────────────────────────────────────┘ + +数值对比表: +╔═══════════════╦═══════════════╦═══════════════╦═══════════╗ +║ 间距变量 ║ 标准版 ║ 紧凑版 ║ 减少比例 ║ +╠═══════════════╬═══════════════╬═══════════════╬═══════════╣ +║ --spacing-xs ║ 12px ║ 8px ║ -33% ║ +║ --spacing-sm ║ 20px ║ 12px ║ -40% ║ +║ --spacing-md ║ 32px ║ 20px ║ -37.5% ║ +║ --spacing-lg ║ 48px ║ 32px ║ -33% ║ +║ --spacing-xl ║ 64px ║ 40px ║ -37.5% ║ +║ --spacing-2xl ║ 96px ║ 48px ║ -50% ║ +║ --spacing-3xl ║ 128px ║ 64px ║ -50% ║ +╚═══════════════╩═══════════════╩═══════════════╩═══════════╝ + +使用建议: +✅ 标准间距:适合内容较少、需要呼吸感的页面 +✅ 紧凑间距:适合内容丰富、需要展示更多信息的页面 +``` + +--- + +## 六、排版层次结构 + +### 文字层次金字塔 +``` + ┌──────────────┐ + │ Hero Title │ ← text-5xl: 64px + │ 最大标题 │ font-bold: 700 + └──────────────┘ 特殊场合使用 + │ + ┌──────────────┐ + │ Section Title │ ← text-4xl: 48px + │ 区块标题 │ font-bold: 700 + └──────────────┘ 页面主要标题 + │ + ┌──────────────┐ + │ Card Title │ ← text-2xl: 32px + │ 卡片标题 │ font-semibold: 600 + └──────────────┘ 卡片/组件标题 + │ + ┌────────────┴────────────┐ + ┌──────────┐ ┌──────────┐ + │ Subtitle │ │ Body │ ← text-lg: 22px + │ 副标题 │ │ 正文 │ font-normal: 400 + └──────────┘ └──────────┘ 主要内容 + │ │ + ┌──────────┐ ┌──────────┐ + │ Caption │ │ Small │ ← text-sm: 16px + │ 说明文字 │ │ 辅助文字 │ font-normal: 400 + └──────────┘ └──────────┘ 次要信息 + │ │ + ┌──────────┐ ┌──────────┐ + │ Label │ │ Meta │ ← text-xs: 14px + │ 标签 │ │ 元信息 │ font-medium: 500 + └──────────┘ └──────────┘ 最小文字 + +行高配置: +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +标题类 (h1-h3): line-height: 1.1-1.2 ← 紧凑,强调力度 +正文类 (p): line-height: 1.6-1.8 ← 宽松,易读性强 +说明类 (small): line-height: 1.4 ← 适中 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +字间距配置: +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +超大标题: letter-spacing: -0.02em ← 视觉紧凑 +标签/按钮: letter-spacing: 0.1em ← 增强辨识度 +正文: letter-spacing: 0 ← 标准间距 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +``` + +--- + +## 七、实用布局组合示例 + +### 1. 时间线布局 +``` +┌────────────────────────────────────────────────────────────┐ +│ 时间线布局 │ +├────────────────────────────────────────────────────────────┤ +│ ●───────────────────────────────────────────────────────┐ │ +│ ┃ ┌──────────────────┐ ┌──────────────────┐ │ │ +│ ┃ │ 时间线图片 │ │ 时间线内容 │ │ │ +│ ┃ │ (300px fixed) │ │ (flex: 1) │ │ │ +│ ┃ │ aspect: 4/3 │ │ │ │ │ +│ ┃ │ │ │

标题 │ │ │ +│ ┃ └──────────────────┘ │

描述内容... │ │ │ +│ ┃ └──────────────────┘ │ │ +│ ●───────────────────────────────────────────────────────┘ │ +│ ┃ │ +│ ●───────────────────────────────────────────────────────┐ │ +│ ┃ ┌──────────────────┐ ┌──────────────────┐ │ │ +│ ┃ │ 时间线图片 │ │ 时间线内容 │ │ │ +│ ┃ └──────────────────┘ └──────────────────┘ │ │ +│ ●───────────────────────────────────────────────────────┘ │ +│ │ +└────────────────────────────────────────────────────────────┘ + ← 3px渐变线条 + +CSS 关键点: +.timeline-layout::before { + position: absolute; + left: 0; + width: 3px; + background: linear-gradient( + to bottom, + var(--primary-green), + var(--accent-gold) + ); +} + +.timeline-dot { + position: absolute; + left: calc(-1 * var(--spacing-2xl) - 8px); + width: 20px; + height: 20px; + border-radius: 50%; +} +``` + +### 2. Featured Grid(高亮第一项) +``` +┌─────────────────────────────────────────────────────────┐ +│ Featured Grid 布局 │ +├─────────────────────────────────────────────────────────┤ +│ ┌─────────────────┐ ┌─────────┐ ┌─────────┐ │ +│ │ │ │ │ │ │ │ +│ │ │ │ Item2 │ │ Item3 │ │ +│ │ Featured │ │ │ │ │ │ +│ │ Item 1 │ │ 3:2 │ │ 3:2 │ │ +│ │ (grid-row: │ └─────────┘ └─────────┘ │ +│ │ 1/3) │ │ +│ │ 3/4 比例 │ ┌─────────┐ ┌─────────┐ │ +│ │ │ │ │ │ │ │ +│ │ │ │ Item4 │ │ Item5 │ │ +│ │ │ │ │ │ │ │ +│ └─────────────────┘ └─────────┘ └─────────┘ │ +│ ← span 2 rows │ +└─────────────────────────────────────────────────────────┘ + +CSS 代码: +.featured-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); +} + +.featured-item:first-child { + grid-column: 1 / 2; /* 占第1列 */ + grid-row: 1 / 3; /* 跨2行 */ +} + +.featured-item:first-child .featured-image { + aspect-ratio: 3/4; /* 竖向比例 */ +} +``` + +--- + +## 八、Hero区域布局模式 ⭐ + +### 1. 标准Hero布局 +``` +┌────────────────────────────────────────────────────────────────┐ +│ Hero Section │ +│ (min-height: 60vh) │ +│ │ +│ ┌──────────────────────┐ │ +│ │ 🔬 化工订单班 │ ← Badge徽章 │ +│ └──────────────────────┘ │ +│ │ +│ ┌──────────────────────────────────────┐ │ +│ │ 半导体AI综合检测项目 │ ← 主标题 │ +│ │ (text-5xl, font-bold) │ │ +│ └──────────────────────────────────────┘ │ +│ │ +│ ┌──────────────────────────────────────┐ │ +│ │ 300mm硅晶圆 + SiO₂薄膜智能质检 │ ← 副标题 │ +│ │ (text-2xl, font-normal) │ │ +│ └──────────────────────────────────────┘ │ +│ │ +│ ┌─────────────────────┐ │ +│ │ 🤖 AI驱动全流程 │ ← 描述列表 │ +│ │ 🔬 4大Agent协同 │ │ +│ │ ✅ 95%合格率 │ │ +│ └─────────────────────┘ │ +│ │ +└────────────────────────────────────────────────────────────────┘ + +CSS 代码: +.hero { + min-height: 60vh; + display: flex; + align-items: center; + justify-content: center; + text-align: center; + background: linear-gradient(135deg, var(--primary), var(--secondary)); + position: relative; + overflow: hidden; +} + +.hero-content { + max-width: 800px; + padding: var(--spacing-3xl) var(--spacing-xl); + z-index: 1; +} + +.hero-badge { + display: inline-block; + padding: var(--spacing-xs) var(--spacing-md); + background: rgba(255, 255, 255, 0.2); + border-radius: var(--radius-full); + backdrop-filter: blur(10px); + margin-bottom: var(--spacing-lg); +} + +.hero-title { + font-size: var(--text-5xl); + font-weight: var(--font-bold); + line-height: 1.1; + margin-bottom: var(--spacing-md); +} + +.hero-subtitle { + font-size: var(--text-2xl); + opacity: 0.9; + margin-bottom: var(--spacing-xl); +} + +.hero-description { + font-size: var(--text-lg); + line-height: 1.8; + opacity: 0.8; +} + +关键点: +✅ 徽章采用玻璃态效果 +✅ 标题层次清晰(5xl → 2xl → lg) +✅ 背景使用渐变色 +✅ 居中对齐,最大宽度限制 +``` + +### 2. Hero浮动卡片变体(数据展示型) +``` +┌────────────────────────────────────────────────────────────────┐ +│ Hero Section │ +│ │ +│ ┌────────────────────────┐ │ +│ │ 项目标题区域 │ │ +│ └────────────────────────┘ │ +│ │ +│ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ +│ │ ┌────────┐ │ │ ┌────────┐ │ │ ┌────────┐ │ │ ┌────────┐ │ │ +│ │ │ 3600片 │ │ │ │ 99.7% │ │ │ │±0.02mm │ │ │ │ 300ms │ │ │ +│ │ │ /小时 │ │ │ │ 检出率 │ │ │ │ 精度 │ │ │ │ 时间 │ │ │ +│ │ └────────┘ │ │ └────────┘ │ │ └────────┘ │ │ └────────┘ │ │ +│ │ Icon图标 │ │ Icon图标 │ │ Icon图标 │ │ Icon图标 │ │ +│ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ +│ ← Flexbox并排,nowrap强制不换行 │ +│ │ +└────────────────────────────────────────────────────────────────┘ + +CSS 代码: +.hero-floating-cards { + display: flex; + gap: var(--spacing-md); + justify-content: center; + flex-wrap: nowrap; /* 关键:强制并排 */ + margin-top: var(--spacing-2xl); +} + +.hero-card { + min-width: 120px; + padding: var(--spacing-md) var(--spacing-lg); + background: rgba(255, 255, 255, 0.15); + backdrop-filter: blur(15px); + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: var(--radius-lg); + text-align: center; + transition: transform 0.3s ease; +} + +.hero-card:hover { + transform: translateY(-5px); +} + +.hero-card-value { + font-size: var(--text-3xl); + font-weight: var(--font-bold); + margin-bottom: var(--spacing-xs); +} + +.hero-card-label { + font-size: var(--text-sm); + opacity: 0.8; +} +``` + +--- + +## 九、导航栏布局模式 ⭐ + +### 1. 水平滚动导航(订单班标准) +``` +┌────────────────────────────────────────────────────────────────┐ +│ 导航栏 (position: sticky) │ +├────────────────────────────────────────────────────────────────┤ +│ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ >>> │ +│ │ 📄项目 │ │ 🎯判定 │ │ 🔬检测 │ │ 📊结果 │ │ 💡总结 │ │ +│ │ 概述 │ │ 标准 │ │ 流程 │ │ 分析 │ │ 建议 │ │ +│ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ │ +│ │ +│ ← overflow-x: auto 水平滚动 │ +│ ← flex-wrap: nowrap 强制单行 │ +└────────────────────────────────────────────────────────────────┘ + +移动端滚动提示: +┌────────────────────────────────────────────────────────────────┐ +│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ▶▶▶ │ +│ │ 概述 │ │ 标准 │ │ 流程 │ │ 结果 │ │ +│ └──────┘ └──────┘ └──────┘ └──────┘ │ +│ ← 左右滑动查看更多 │ +└────────────────────────────────────────────────────────────────┘ + +CSS 代码: +.nav { + position: sticky; + top: 0; + z-index: 100; + background: var(--bg-semi-dark); + backdrop-filter: blur(20px); + border-bottom: 1px solid var(--border); + overflow-x: auto; + overflow-y: hidden; + -webkit-overflow-scrolling: touch; /* iOS平滑滚动 */ +} + +.nav-container { + display: flex; + gap: var(--spacing-sm); + padding: var(--spacing-md) var(--spacing-lg); + flex-wrap: nowrap; /* 强制单行 */ + min-width: min-content; +} + +.nav-item { + display: flex; + flex-direction: column; + align-items: center; + gap: var(--spacing-xs); + padding: var(--spacing-sm) var(--spacing-md); + border-radius: var(--radius-md); + white-space: nowrap; /* 防止文字换行 */ + cursor: pointer; + transition: all 0.3s ease; +} + +.nav-item.active { + background: var(--primary); + color: white; +} + +.nav-item:hover { + background: var(--bg-hover); +} + +/* 隐藏滚动条但保留功能 */ +.nav::-webkit-scrollbar { + display: none; +} + +.nav { + -ms-overflow-style: none; + scrollbar-width: none; +} + +关键点: +✅ sticky定位,滚动时固定顶部 +✅ overflow-x: auto 支持水平滚动 +✅ flex-wrap: nowrap 强制单行 +✅ backdrop-filter 玻璃态效果 +✅ 隐藏滚动条保持美观 +``` + +### 2. 导航项结构详解 +``` +单个导航项内部结构: +┌──────────────────┐ +│ .nav-item │ +│ ┌────────────┐ │ +│ │ Icon图标 │ │ ← +│ └────────────┘ │ +│ ┌────────────┐ │ +│ │ 文字标签 │ │ ← +│ └────────────┘ │ +└──────────────────┘ + flex-direction: column + align-items: center + +激活状态: +┌──────────────────┐ +│ .nav-item.active │ ← 背景色变化 +│ ┌────────────┐ │ +│ │ 🔵 Icon │ │ ← 图标高亮 +│ └────────────┘ │ +│ ┌────────────┐ │ +│ │ 项目概述 │ │ ← 文字加粗 +│ └────────────┘ │ +└──────────────────┘ + background: var(--primary) + color: white + font-weight: 600 +``` + +--- + +## 十、Agent头像区布局 ⭐ + +### 1. Section Header布局(Agent信息) +``` +┌────────────────────────────────────────────────────────────────┐ +│ Section Header │ +├────────────────────────────────────────────────────────────────┤ +│ ┌─────────┐ ┌────────────────────────────────────────┐ │ +│ │ │ │ .agent-info │ │ +│ │ Agent │ │ ┌──────────────────────────────────┐ │ │ +│ │ 头像 │ │ │ 👤 环境咨询师 │ │ │ +│ │ (80px) │ │ │ (.agent-name) │ │ │ +│ │ │ │ └──────────────────────────────────┘ │ │ +│ │ 圆形 │ │ │ │ +│ └─────────┘ │ ┌──────────────────────────────────┐ │ │ +│ │ │ 项目背景与需求分析 │ │ │ +│ │ │ (.section-title, text-4xl) │ │ │ +│ │ └──────────────────────────────────┘ │ │ +│ └────────────────────────────────────────┘ │ +│ ← Flexbox横向排列,头像在左,信息在右 │ +└────────────────────────────────────────────────────────────────┘ + +CSS 代码: +.section-header { + display: flex; + align-items: center; + gap: var(--spacing-xl); + margin-bottom: var(--spacing-2xl); + padding-bottom: var(--spacing-xl); + border-bottom: 2px solid var(--border); +} + +.agent-avatar { + width: 80px; + height: 80px; + border-radius: 50%; + object-fit: cover; + border: 3px solid var(--primary); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + flex-shrink: 0; /* 防止被压缩 */ +} + +.agent-info { + flex: 1; +} + +.agent-name { + display: flex; + align-items: center; + gap: var(--spacing-sm); + font-size: var(--text-lg); + font-weight: var(--font-semibold); + color: var(--primary); + margin-bottom: var(--spacing-xs); +} + +.section-title { + font-size: var(--text-4xl); + font-weight: var(--font-bold); + line-height: 1.2; + margin: 0; +} + +关键点: +✅ Flexbox横向布局 +✅ 头像圆形,带边框和阴影 +✅ gap间距清晰分隔 +✅ Agent名称带图标 +✅ 底部边框分隔区域 +``` + +### 2. 响应式Agent Header +``` +桌面端(>768px): +┌──────────────────────────────────────────────┐ +│ ┌─────┐ ┌──────────────────────────────┐ │ +│ │头像 │ │ 👤 环境咨询师 │ │ +│ │80px │ │ 项目背景与需求分析 │ │ +│ └─────┘ └──────────────────────────────┘ │ +└──────────────────────────────────────────────┘ + flex-direction: row + +移动端(≤768px): +┌──────────────────────────────────────────────┐ +│ ┌─────────┐ │ +│ │ 头像 │ │ +│ │ 60px │ │ +│ └─────────┘ │ +│ ┌─────────────────┐ │ +│ │ 👤 环境咨询师 │ │ +│ │ 项目背景 │ │ +│ └─────────────────┘ │ +└──────────────────────────────────────────────┘ + flex-direction: column + align-items: center + text-align: center + +@media (max-width: 768px) { + .section-header { + flex-direction: column; + align-items: center; + text-align: center; + } + + .agent-avatar { + width: 60px; + height: 60px; + } + + .section-title { + font-size: var(--text-3xl); + } +} +``` + +--- + +## 十一、Stats统计数据布局 ⭐ + +### 1. 标准Stats布局(4项并排) +``` +┌────────────────────────────────────────────────────────────────┐ +│ 统计数据区 (.stats) │ +├────────────────────────────────────────────────────────────────┤ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ │ │ │ │ │ │ │ │ +│ │ 项目总预算 │ │ 监测频次 │ │ 监测指标 │ │ 样品总数 │ │ +│ │ (.stat- │ │ (.stat- │ │ (.stat- │ │ (.stat- │ │ +│ │ label) │ │ label) │ │ label) │ │ label) │ │ +│ │ │ │ │ │ │ │ │ │ +│ │ 45万元 │ │ 12次/年 │ │ 26项 │ │ 144个/年 │ │ +│ │ (.stat- │ │ (.stat- │ │ (.stat- │ │ (.stat- │ │ +│ │ value) │ │ value) │ │ value) │ │ value) │ │ +│ │ │ │ │ │ │ │ │ │ +│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ +│ │ +│ ← grid-template-columns: repeat(4, 1fr) │ +└────────────────────────────────────────────────────────────────┘ + +CSS 代码: +.stats { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: var(--spacing-xl); + margin-top: var(--spacing-2xl); + padding: var(--spacing-xl); + background: var(--bg-semi-dark); + border-radius: var(--radius-lg); +} + +.stat-item { + text-align: center; + padding: var(--spacing-lg); + background: var(--bg-card); + border-radius: var(--radius-md); + border: 1px solid var(--border); + transition: all 0.3s ease; +} + +.stat-item:hover { + transform: translateY(-5px); + box-shadow: var(--shadow-lg); +} + +.stat-label { + font-size: var(--text-sm); + color: var(--text-gray); + margin-bottom: var(--spacing-sm); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.stat-value { + font-size: var(--text-3xl); + font-weight: var(--font-bold); + color: var(--primary); + line-height: 1.2; +} + +关键点: +✅ Grid 4列等宽布局 +✅ 标签小字,数值大字 +✅ 悬停上移效果 +✅ 卡片样式分隔 +``` + +### 2. 响应式Stats布局 +``` +桌面端(>1024px): +┌─────┬─────┬─────┬─────┐ +│ 1 │ 2 │ 3 │ 4 │ +└─────┴─────┴─────┴─────┘ +grid-template-columns: repeat(4, 1fr) + +平板端(768px-1024px): +┌──────────┬──────────┐ +│ 1 │ 2 │ +├──────────┼──────────┤ +│ 3 │ 4 │ +└──────────┴──────────┘ +grid-template-columns: repeat(2, 1fr) + +移动端(<768px): +┌──────────────┐ +│ 1 │ +├──────────────┤ +│ 2 │ +├──────────────┤ +│ 3 │ +├──────────────┤ +│ 4 │ +└──────────────┘ +grid-template-columns: 1fr + +CSS 代码: +@media (max-width: 1024px) { + .stats { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (max-width: 768px) { + .stats { + grid-template-columns: 1fr; + } + + .stat-value { + font-size: var(--text-2xl); + } +} +``` + +### 3. 动画数字Stats(带计数效果) +``` +数字滚动动画示意: +0 → 15 → 30 → 45 → 45万元 +┗━━━━━━━━━━━━━━━━━━━━━━━┛ + 1.5秒动画 + +JavaScript实现: +

0
+ +const statValues = document.querySelectorAll('.stat-value'); +statValues.forEach(stat => { + const target = parseInt(stat.dataset.target); + let current = 0; + const increment = target / 100; + + const timer = setInterval(() => { + current += increment; + if (current >= target) { + stat.textContent = target; + clearInterval(timer); + } else { + stat.textContent = Math.floor(current); + } + }, 15); +}); +``` + +--- + +## 十二、Footer总结区布局 ⭐ + +### 1. 三栏总结布局(项目成果) +``` +┌────────────────────────────────────────────────────────────────┐ +│ Footer总结区 │ +│ (background: var(--bg-semi-dark)) │ +├────────────────────────────────────────────────────────────────┤ +│ 🏆 项目成果总结 │ +│ (.section-title, text-center) │ +│ │ +├───────────────────┬───────────────────┬───────────────────────┤ +│ │ │ │ +│ 📋 交付物清单 │ 🎯 项目目标 │ ⚙️ 技术保障 │ +│ (.card) │ (.card) │ (.card) │ +│ │ │ │ +│ ✅ 采样方案报告 │ ✅ 26项指标 │ ✅ ICP-MS设备 │ +│ ✅ 季度监测报告 │ ✅ Ⅲ类水质 │ ✅ GC-MS分析仪 │ +│ ✅ 年度总结报告 │ ✅ 12次/年 │ ✅ BOD培养箱 │ +│ ✅ 监测数据库 │ ✅ 数据准确度 │ ✅ 自动采样器 │ +│ ✅ 现场照片资料 │ ✅ 质控样本 │ ✅ GPS定位系统 │ +│ ✅ 质控记录文件 │ ✅ 报告及时 │ ✅ 数据传输系统 │ +│ ✅ 趋势分析图表 │ ✅ 污染预警 │ ✅ LIMS实验室系统 │ +│ ✅ 改善建议方案 │ ✅ CMA认证 │ ✅ 三级质控体系 │ +│ │ │ │ +└───────────────────┴───────────────────┴───────────────────────┘ +│ │ +│ © 2024 环保订单班 | AI驱动的环境监测方案 │ +│ (.text-center, color: gray) │ +└────────────────────────────────────────────────────────────────┘ + +CSS 代码: +.footer-summary { + background: var(--bg-semi-dark); + padding: var(--spacing-3xl) 0; + margin-top: var(--spacing-3xl); +} + +.footer-summary .section-title { + text-align: center; + margin-bottom: var(--spacing-2xl); +} + +.footer-summary .grid-3 { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: var(--spacing-2xl); +} + +.footer-summary .card { + background: var(--bg-card); + padding: var(--spacing-xl); + border-radius: var(--radius-lg); +} + +.footer-summary .card-header { + order: 1; + margin-bottom: var(--spacing-md); +} + +.footer-summary .card-title { + font-size: var(--text-xl); + font-weight: var(--font-bold); +} + +.footer-summary .feature-list { + list-style: none; + padding: 0; +} + +.footer-summary .feature-list li { + display: flex; + align-items: center; + gap: var(--spacing-sm); + padding: var(--spacing-xs) 0; + font-size: var(--text-sm); +} + +.footer-summary .text-center { + text-align: center; + margin-top: var(--spacing-2xl); + color: var(--text-gray); + font-size: var(--text-sm); +} + +关键点: +✅ Grid 3列布局 +✅ 深色背景区分 +✅ 卡片样式分隔 +✅ Icon + 文字列表 +✅ 版权信息居中 +``` + +### 2. 响应式Footer布局 +``` +桌面端(>1024px): +┌──────────┬──────────┬──────────┐ +│ 卡片1 │ 卡片2 │ 卡片3 │ +└──────────┴──────────┴──────────┘ +grid-template-columns: repeat(3, 1fr) + +平板端(768px-1024px): +┌──────────┬──────────┐ +│ 卡片1 │ 卡片2 │ +└──────────┴──────────┘ +┌──────────────────────┐ +│ 卡片3 │ +└──────────────────────┘ +grid-template-columns: repeat(2, 1fr) + +移动端(<768px): +┌──────────────────────┐ +│ 卡片1 │ +├──────────────────────┤ +│ 卡片2 │ +├──────────────────────┤ +│ 卡片3 │ +└──────────────────────┘ +grid-template-columns: 1fr + +@media (max-width: 1024px) { + .footer-summary .grid-3 { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (max-width: 768px) { + .footer-summary .grid-3 { + grid-template-columns: 1fr; + } +} +``` + +--- + +## 十三、关键CSS属性速查表 + +``` +╔═══════════════════════════════════════════════════════════════╗ +║ 布局相关属性 ║ +╠═══════════════════════════════════════════════════════════════╣ +║ display: grid │ 启用Grid布局 ║ +║ display: flex │ 启用Flexbox布局 ║ +║ grid-template-columns │ 定义Grid列数和宽度 ║ +║ gap │ Grid/Flex项目间距 ║ +║ flex-direction │ Flex主轴方向 ║ +║ flex-wrap │ Flex换行控制 ║ +║ order │ Flex/Grid项目顺序 ║ +║ align-items │ 交叉轴对齐 ║ +║ justify-content │ 主轴对齐 ║ +╠═══════════════════════════════════════════════════════════════╣ +║ 尺寸相关属性 ║ +╠═══════════════════════════════════════════════════════════════╣ +║ aspect-ratio │ 宽高比例 ║ +║ min-width / max-width │ 最小/最大宽度 ║ +║ flex: 1 │ 占据剩余空间 ║ +║ flex: 0 0 300px │ 固定尺寸 ║ +╠═══════════════════════════════════════════════════════════════╣ +║ 定位相关属性 ║ +╠═══════════════════════════════════════════════════════════════╣ +║ position: relative │ 相对定位(定位上下文) ║ +║ position: absolute │ 绝对定位(脱离文档流) ║ +║ position: sticky │ 粘性定位(导航栏常用) ║ +║ inset: 0 │ top/right/bottom/left全为0 ║ +║ z-index │ 层级控制 ║ +╠═══════════════════════════════════════════════════════════════╣ +║ 视觉效果属性 ║ +╠═══════════════════════════════════════════════════════════════╣ +║ backdrop-filter: blur() │ 背景模糊(玻璃态) ║ +║ background: linear-gradient│ 渐变背景 ║ +║ box-shadow │ 阴影效果 ║ +║ border-radius │ 圆角 ║ +║ object-fit: cover │ 图片裁剪适应 ║ +║ overflow-x: auto │ 水平滚动 ║ +║ white-space: nowrap │ 文字不换行 ║ +╚═══════════════════════════════════════════════════════════════╝ +``` + +--- + +## 十四、常见问题解决方案 + +### 问题1: Grid布局出现3+1排列 +``` +❌ 问题: +┌─────┬─────┬─────┐ +│ 1 │ 2 │ 3 │ +└─────┴─────┴─────┘ +┌─────┐ +│ 4 │ ← 丑陋的换行 +└─────┘ + +✅ 解决:确保列数匹配项目数 +grid-template-columns: repeat(4, 1fr); /* 4项目 = 4列 */ + +或者:使用auto-fit/auto-fill +grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); +``` + +### 问题2: 图片被压缩变形 +``` +❌ 问题:img设置了width和height,导致变形 + +✅ 解决方案: +.image-container { + aspect-ratio: 16/9; + overflow: hidden; +} + +.image-container img { + width: 100%; + height: 100%; + object-fit: cover; ← 关键:裁剪而不是拉伸 +} +``` + +### 问题3: Flexbox项目换行不理想 +``` +❌ 问题:flex-wrap: wrap导致意外换行 + +✅ 解决方案: +/* 强制不换行 */ +.hero-floating-cards { + flex-wrap: nowrap; +} + +/* 或使用Grid替代 */ +.hero-floating-cards { + display: grid; + grid-template-columns: repeat(4, 1fr); +} +``` + +### 问题4: 背景图片看不清文字 +``` +❌ 问题:白色文字在浅色背景上不可读 + +✅ 解决方案:添加渐变遮罩 +
+
+
+

+ 文字内容 +

+
+``` + +### 问题5: 导航栏滚动不平滑 +``` +❌ 问题:iOS设备上滚动卡顿 + +✅ 解决方案: +.nav { + overflow-x: auto; + -webkit-overflow-scrolling: touch; ← iOS平滑滚动 +} +``` + +### 问题6: Stats数字不对齐 +``` +❌ 问题:数字长度不一致导致布局混乱 + +✅ 解决方案: +.stat-value { + font-variant-numeric: tabular-nums; ← 等宽数字 + min-height: 3rem; ← 固定最小高度 +} +``` + +--- + +## 十五、最佳实践总结 + +``` +┌──────────────────────────────────────────────────────────┐ +│ 布局设计原则 │ +├──────────────────────────────────────────────────────────┤ +│ │ +│ 1. 移动优先设计(Mobile First) │ +│ → 先设计小屏幕布局,再扩展到大屏幕 │ +│ │ +│ 2. 语义化HTML结构 │ +│ → section, article, header, nav 而非通用div │ +│ │ +│ 3. 使用CSS变量统一设计 │ +│ → --spacing-*, --text-*, --radius-* │ +│ │ +│ 4. 图片优先展示 │ +│ → 使用flexbox order将图片放在最前 │ +│ │ +│ 5. 保持一致的间距比例 │ +│ → 8px基准,倍数递增(8, 12, 20, 32, 40...) │ +│ │ +│ 6. 避免固定高度 │ +│ → 使用aspect-ratio而非固定height │ +│ │ +│ 7. Grid列数要合理 │ +│ → 4项目用4列,避免3+1布局 │ +│ │ +│ 8. 背景图要加遮罩 │ +│ → 使用linear-gradient保证文字可读性 │ +│ │ +│ 9. 卡片内容要紧凑 │ +│ → 图片占满宽度,padding为0 │ +│ │ +│ 10. 响应式断点统一 │ +│ → 768px (移动/平板), 1024px (平板/桌面) │ +│ │ +│ 11. 导航栏使用sticky定位 │ +│ → position: sticky; top: 0; 滚动时固定 │ +│ │ +│ 12. Agent头像突出显示 │ +│ → 圆形头像 + 边框 + 阴影 │ +│ │ +│ 13. Stats数据醒目展示 │ +│ → 大数值 + 小标签 + 卡片分隔 │ +│ │ +│ 14. Footer总结清晰明了 │ +│ → 三栏布局 + Icon列表 + 深色背景 │ +│ │ +│ 15. 玻璃态效果增强质感 │ +│ → backdrop-filter: blur() + 半透明 │ +│ │ +└──────────────────────────────────────────────────────────┘ +``` + +--- + +## 快速参考命令 + +```bash +# Grid布局速查 +display: grid; +grid-template-columns: repeat(2, 1fr); # 2列等宽 +grid-template-columns: repeat(3, 1fr); # 3列等宽 +grid-template-columns: repeat(4, 1fr); # 4列等宽 +gap: var(--spacing-2xl); # 48px间距 + +# Flexbox布局速查 +display: flex; +flex-direction: column; # 垂直排列 +flex-wrap: nowrap; # 不换行 +order: 1 / 2 / 3; # 排列顺序 +flex: 1; # 占据剩余空间 + +# 图片比例速查 +aspect-ratio: 16/9; # 宽屏 +aspect-ratio: 3/2; # 标准 +aspect-ratio: 4/3; # 传统 +aspect-ratio: 1/1; # 正方形 + +# 玻璃态效果 +background: rgba(255, 255, 255, 0.9); +backdrop-filter: blur(15px); +border: 2px solid rgba(76, 175, 80, 0.2); + +# 图层叠加 +position: relative; # 容器 +position: absolute; inset: 0; z-index: 0; # 遮罩层 +position: relative; z-index: 1; # 内容层 + +# Sticky导航 +position: sticky; +top: 0; +z-index: 100; +backdrop-filter: blur(20px); + +# 圆形头像 +width: 80px; +height: 80px; +border-radius: 50%; +border: 3px solid var(--primary); +box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + +# Stats布局 +display: grid; +grid-template-columns: repeat(4, 1fr); +gap: var(--spacing-xl); +text-align: center; + +# Footer布局 +background: var(--bg-semi-dark); +padding: var(--spacing-3xl) 0; +grid-template-columns: repeat(3, 1fr); +``` + +--- + +## 订单班页面标准结构 + +``` +完整页面结构: +┌────────────────────────────────────────────────────────────┐ +│ 1. Theme Toggle Button (主题切换) │ +├────────────────────────────────────────────────────────────┤ +│ 2. Hero Section (英雄区) │ +│ - Badge徽章 │ +│ - 主标题 + 副标题 │ +│ - 描述文字 │ +│ - 浮动数据卡片(可选) │ +├────────────────────────────────────────────────────────────┤ +│ 3. Navigation Bar (导航栏 - sticky) │ +│ - 水平滚动 │ +│ - Icon + 文字 │ +├────────────────────────────────────────────────────────────┤ +│ 4. Section 1 (Agent 1) │ +│ - Section Header (Agent头像 + 信息) │ +│ - Expert Intro (专家介绍) │ +│ - Content (Grid布局内容) │ +│ - Stats (统计数据) │ +├────────────────────────────────────────────────────────────┤ +│ 5. Section 2 (Agent 2) │ +│ - 同上结构 │ +├────────────────────────────────────────────────────────────┤ +│ 6. Section 3 (Agent 3) │ +│ - 同上结构 │ +├────────────────────────────────────────────────────────────┤ +│ 7. Section 4 (Agent 4) │ +│ - 同上结构 │ +├────────────────────────────────────────────────────────────┤ +│ 8. Footer Summary (项目成果总结) │ +│ - 标题居中 │ +│ - Grid-3布局 │ +│ - 深色背景 │ +│ - 版权信息 │ +└────────────────────────────────────────────────────────────┘ + +关键CSS变量: +--spacing-xs: 8px +--spacing-sm: 12px +--spacing-md: 20px +--spacing-lg: 32px +--spacing-xl: 40px +--spacing-2xl: 48px +--spacing-3xl: 64px + +--text-xs: 14px +--text-sm: 16px +--text-lg: 22px +--text-xl: 28px +--text-2xl: 32px +--text-3xl: 40px +--text-4xl: 48px +--text-5xl: 64px + +--radius-sm: 4px +--radius-md: 8px +--radius-lg: 12px +--radius-xl: 16px +--radius-2xl: 24px +--radius-full: 9999px +``` + +--- + +**文档版本**: v2.0 (完整增强版) +**创建日期**: 2025年 +**最后更新**: 2025年10月 +**适用项目**: web_frontend/web_result/order-classes/ +**相关文档**: food-compact-design-spec (Serena记忆) + +**新增内容总结**: +- ✅ Hero区域布局模式(徽章、标题、浮动卡片) +- ✅ 导航栏布局模式(水平滚动、sticky定位) +- ✅ Agent头像区布局(圆形头像、信息区) +- ✅ Stats统计数据布局(4列Grid、响应式) +- ✅ Footer总结区布局(三栏、深色背景) +- ✅ 订单班页面标准结构(完整模板) +- ✅ 更多实用CSS属性和技巧 \ No newline at end of file diff --git a/data/订单班文档资料/化工/notion文稿/check_consistency.sh b/data/订单班文档资料/化工/notion文稿/check_consistency.sh new file mode 100755 index 00000000..77b1bef1 --- /dev/null +++ b/data/订单班文档资料/化工/notion文稿/check_consistency.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +echo "=== 化工订单班图片名称一致性检查 ===" +echo "" + +# 提取所有图片引用 +echo "提取的图片引用:" +grep -o '!\[.*\](image/.*\.jpg)' "半导体ai综合检测项目 281d463fce518050869ac4e6fd58a861.md" | while IFS= read -r line; do + # 提取alt text + alt=$(echo "$line" | sed 's/!\[\([^]]*\)\].*/\1/') + # 提取文件名(不含路径和扩展名) + filename=$(echo "$line" | sed 's/.*image\/\([^)]*\)\)/\1/' | sed 's/.jpg$//') + + echo " Alt: [$alt]" + echo " File: [$filename]" + + if [ "$alt" = "$filename" ]; then + echo " ✅ 一致" + else + echo " ❌ 不一致" + fi + echo "" +done + +echo "=== 实际文件列表 ===" +ls -1 image/*.jpg | while IFS= read -r file; do + basename "$file" +done diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282049062736YSJF81583XYYNO.jpg b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282049062736YSJF81583XYYNO.jpg new file mode 100755 index 00000000..69675217 Binary files /dev/null and b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282049062736YSJF81583XYYNO.jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282049244326YSJF1MPE8J8BZJ.jpg b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282049244326YSJF1MPE8J8BZJ.jpg new file mode 100755 index 00000000..6f7d3c28 Binary files /dev/null and b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282049244326YSJF1MPE8J8BZJ.jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282049350886YSJFZL99Y5I6R9.jpg b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282049350886YSJFZL99Y5I6R9.jpg new file mode 100755 index 00000000..d8d81a70 Binary files /dev/null and b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282049350886YSJFZL99Y5I6R9.jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282049408326YSJFK2DKOI3I98.jpg b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282049408326YSJFK2DKOI3I98.jpg new file mode 100755 index 00000000..87f26127 Binary files /dev/null and b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282049408326YSJFK2DKOI3I98.jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282049463486YSJFDMPHGPCTXJ.jpg b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282049463486YSJFDMPHGPCTXJ.jpg new file mode 100755 index 00000000..8506b1fd Binary files /dev/null and b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282049463486YSJFDMPHGPCTXJ.jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282050040706YSJFJ0SUNAJ2AV (1).jpg b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282050040706YSJFJ0SUNAJ2AV (1).jpg new file mode 100755 index 00000000..87b42a45 Binary files /dev/null and b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282050040706YSJFJ0SUNAJ2AV (1).jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282050099516YSJFUTZV8MRO5Y.jpg b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282050099516YSJFUTZV8MRO5Y.jpg new file mode 100755 index 00000000..093a5945 Binary files /dev/null and b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282050099516YSJFUTZV8MRO5Y.jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282050164886YSJF24XJD61HTK.jpg b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282050164886YSJF24XJD61HTK.jpg new file mode 100755 index 00000000..842a94cf Binary files /dev/null and b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282050164886YSJF24XJD61HTK.jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282050375856YSJFSETU1WSEKB.jpg b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282050375856YSJFSETU1WSEKB.jpg new file mode 100755 index 00000000..d26797d4 Binary files /dev/null and b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282050375856YSJFSETU1WSEKB.jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282051240126YSJF06WPCZNY0N.jpg b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282051240126YSJF06WPCZNY0N.jpg new file mode 100755 index 00000000..a92a1c24 Binary files /dev/null and b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282051240126YSJF06WPCZNY0N.jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282051292356YSJFZSRKP9YK3R.jpg b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282051292356YSJFZSRKP9YK3R.jpg new file mode 100755 index 00000000..b38c1c0d Binary files /dev/null and b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282051292356YSJFZSRKP9YK3R.jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282054559316YSJFMABNCRL749.jpg b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282054559316YSJFMABNCRL749.jpg new file mode 100755 index 00000000..3717030b Binary files /dev/null and b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282054559316YSJFMABNCRL749.jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282055019276YSJF0F154WXH8Y.jpg b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282055019276YSJF0F154WXH8Y.jpg new file mode 100755 index 00000000..9e7f9816 Binary files /dev/null and b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282055019276YSJF0F154WXH8Y.jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282055137196YSJFSECMZ0PB0J.jpg b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282055137196YSJFSECMZ0PB0J.jpg new file mode 100755 index 00000000..bd8657f7 Binary files /dev/null and b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282055137196YSJFSECMZ0PB0J.jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282058159576YSJF97LS5RU9KO.jpg b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282058159576YSJF97LS5RU9KO.jpg new file mode 100755 index 00000000..6f9ce348 Binary files /dev/null and b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282058159576YSJF97LS5RU9KO.jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282058501036YSJF0KC10KFD5E (1).jpg b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282058501036YSJF0KC10KFD5E (1).jpg new file mode 100755 index 00000000..5046acff Binary files /dev/null and b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/202509282058501036YSJF0KC10KFD5E (1).jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/7d8332dac6cf3e659c95fe42c3cde899 (1).jpg b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/7d8332dac6cf3e659c95fe42c3cde899 (1).jpg new file mode 100755 index 00000000..669b6edc Binary files /dev/null and b/data/订单班文档资料/视觉设计/notion文稿/image/分镜/线稿图片/7d8332dac6cf3e659c95fe42c3cde899 (1).jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/电影风格参考图.jpg b/data/订单班文档资料/视觉设计/notion文稿/image/电影风格参考图.jpg old mode 100755 new mode 100644 index d84079d0..976745c4 Binary files a/data/订单班文档资料/视觉设计/notion文稿/image/电影风格参考图.jpg and b/data/订单班文档资料/视觉设计/notion文稿/image/电影风格参考图.jpg differ diff --git a/data/订单班文档资料/视觉设计/notion文稿/image/配色表.jpg b/data/订单班文档资料/视觉设计/notion文稿/image/配色表.jpg index 85d75906..6f7295c6 100755 Binary files a/data/订单班文档资料/视觉设计/notion文稿/image/配色表.jpg and b/data/订单班文档资料/视觉设计/notion文稿/image/配色表.jpg differ diff --git a/web_frontend/exhibition-demo/src/components/ResultModal.tsx b/web_frontend/exhibition-demo/src/components/ResultModal.tsx index e18a3229..f093e217 100644 --- a/web_frontend/exhibition-demo/src/components/ResultModal.tsx +++ b/web_frontend/exhibition-demo/src/components/ResultModal.tsx @@ -9,6 +9,9 @@ interface ResultModalProps { projectTitle?: string; projectSubtitle?: string; orderClassName?: string; + // 新增动态数据参数 + stats?: Array<{ label: string; value: string; icon: React.ReactNode }>; + sections?: Array<{ name: string; status: string; pages: number }>; } const ResultModal: React.FC = ({ @@ -17,15 +20,18 @@ const ResultModal: React.FC = ({ onViewDetails, projectTitle = '项目方案', projectSubtitle = '包含完整的分析、设计、预算、执行计划等内容', - orderClassName = '通用' + orderClassName = '通用', + stats: customStats, + sections: customSections }) => { - const stats = [ + // 使用传入的数据或默认数据 + const stats = customStats || [ { label: '生成时间', value: '3分钟', icon: }, { label: '文档页数', value: '68页', icon: }, { label: '预期ROI', value: '30%', icon: }, ]; - const sections = [ + const sections = customSections || [ { name: '策划案概述', status: 'completed', pages: 8 }, { name: '展会介绍', status: 'completed', pages: 12 }, { name: '营销方案', status: 'completed', pages: 15 }, diff --git a/web_frontend/exhibition-demo/src/pages/WorkflowPageV4.tsx b/web_frontend/exhibition-demo/src/pages/WorkflowPageV4.tsx index 3d5a9427..71d0d8b5 100644 --- a/web_frontend/exhibition-demo/src/pages/WorkflowPageV4.tsx +++ b/web_frontend/exhibition-demo/src/pages/WorkflowPageV4.tsx @@ -1,7 +1,7 @@ import { useState, useEffect, useRef, useCallback } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { useDemoStore } from '@/store/demoStore'; -import { Play, Pause, RotateCcw, Maximize2, Terminal, FileInput, Eye } from 'lucide-react'; +import { Play, Pause, RotateCcw, Maximize2, Terminal, FileInput, Eye, Calendar, FileText, TrendingUp } from 'lucide-react'; import RequirementModal from '@/components/RequirementModal'; import ResultModal from '@/components/ResultModal'; import { getSimulationData } from '@/data/terminalSimulations'; @@ -886,10 +886,68 @@ const WorkflowPageV4 = () => { // 可以添加更多订单班的描述 }; + // 从 completionSequence 中提取统计信息 + let executionTime = '3分钟'; + let filesCount = '15个'; + let dataSize = '287MB'; + + if (simulationData?.completionSequence) { + const completionSeq = simulationData.completionSequence; + + // 查找执行时间 + const timeOutput = completionSeq.find(line => line.content?.includes('总执行时间')); + if (timeOutput) { + const match = timeOutput.content?.match(/总执行时间[:\s]*(.+)/); + if (match) executionTime = match[1].trim(); + } + + // 查找文件数量 + const filesOutput = completionSeq.find(line => line.content?.includes('生成文件数')); + if (filesOutput) { + const match = filesOutput.content?.match(/生成文件数[:\s]*(\d+)/); + if (match) filesCount = match[1] + '个'; + } + + // 查找数据量 + const dataSizeOutput = completionSeq.find(line => line.content?.includes('总数据量')); + if (dataSizeOutput) { + const match = dataSizeOutput.content?.match(/总数据量[:\s]*([\d.]+\s*\w+)/); + if (match) dataSize = match[1].trim(); + } + } + + // 构建动态 stats + const stats = [ + { label: '生成时间', value: executionTime, icon: }, + { label: '生成文件', value: filesCount, icon: }, + { label: '数据量', value: dataSize, icon: }, + ]; + + // 从 agentSequence 中提取章节信息 + let sections: Array<{ name: string; status: string; pages: number }> = []; + + if (simulationData?.agentSequence) { + sections = simulationData.agentSequence.map((seq, index) => { + // 处理两种数据格式: + // 1. 原始格式:seq.agent 是函数 + // 2. 转换后格式:seq 直接包含 name 等属性 + const agent = typeof seq.agent === 'function' ? seq.agent() : seq; + // 简单的页数估算,实际应该从数据中提取 + const estimatedPages = 8 + Math.floor(Math.random() * 8); + return { + name: agent.name.replace('专家', ''), + status: 'completed', + pages: estimatedPages + }; + }); + } + return { projectTitle: simulationData?.projectTitle || '项目方案', projectSubtitle: projectSubtitles[selectedOrderClass || ''] || '包含完整的分析、设计、预算、执行计划等内容', - orderClassName: simulationData?.orderClassName || '订单班' + orderClassName: simulationData?.orderClassName || '订单班', + stats, + sections }; }; @@ -898,13 +956,16 @@ const WorkflowPageV4 = () => { // 不关闭弹窗,让用户可以继续查看 // setShowResultModal(false); - // 在新标签页中打开,而不是当前页面跳转 - const baseUrl = 'http://localhost:4155'; // 假设 web_result 运行在 4155 端口 + // 在新标签页中打开详情页面 + const baseUrl = 'http://localhost:4155'; + if (selectedOrderClass) { - window.open(`${baseUrl}/index.html?orderClass=${selectedOrderClass}`, '_blank'); + // 根据订单班 ID 映射到对应的路径 + // 这里使用 order-classes/{订单班变量} 的格式 + window.open(`${baseUrl}/order-classes/${selectedOrderClass}`, '_blank'); } else { // 默认跳转到文旅 - window.open(`${baseUrl}/index.html?orderClass=tourism`, '_blank'); + window.open(`${baseUrl}/order-classes/wenlu`, '_blank'); } }; diff --git a/web_frontend/web_result/app.js b/web_frontend/web_result/app.js index 90807fea..cd2f5330 100644 --- a/web_frontend/web_result/app.js +++ b/web_frontend/web_result/app.js @@ -174,7 +174,7 @@ function generateIndexPage() {

已完成的订单班方案

${completedClasses.map(([key, config]) => ` -
+
${getClassIcon(key)}

${config.name}

${config.description}

diff --git a/web_frontend/web_result/order-classes/chemical/css/styles.css b/web_frontend/web_result/order-classes/chemical/css/styles.css index 7fd15eb0..b8fb829a 100644 --- a/web_frontend/web_result/order-classes/chemical/css/styles.css +++ b/web_frontend/web_result/order-classes/chemical/css/styles.css @@ -959,3 +959,133 @@ body.dark-theme .theme-icon-dark { body.dark-theme .theme-icon-light { opacity: 0.5; } + +/* ========== Alternating Layout 图文交错布局 ========== */ +.alternating-layout { + display: flex; + gap: var(--spacing-2xl); + align-items: center; + margin-bottom: var(--spacing-3xl); +} + +.alternating-layout:nth-child(even) { + flex-direction: row-reverse; /* 偶数项自动反向 */ +} + +.alternating-layout .image-container { + flex: 0 0 45%; /* 图片占45% */ + aspect-ratio: 16/9; +} + +.alternating-layout .content { + flex: 1; /* 内容占剩余空间 */ +} + +/* ========== Featured Item 特色卡片 ========== */ +.featured-item { + display: flex; + flex-direction: column; +} + +.featured-item .image-container { + margin-bottom: var(--spacing-md); + aspect-ratio: 16/9; +} + +.featured-item .image-container img { + aspect-ratio: 16/9; + width: 100%; + object-fit: cover; +} + +/* ========== Progress Stats 进度条数据展示 ========== */ +.progress-stats { + display: flex; + flex-direction: column; + gap: var(--spacing-lg); + padding: var(--spacing-xl); + background: var(--bg-card); + border-radius: var(--radius-lg); + border: 1px solid var(--border); +} + +.progress-item { + display: flex; + flex-direction: column; + gap: var(--spacing-xs); +} + +.progress-label { + font-size: 14px; + color: var(--text-secondary); + font-weight: 500; +} + +.progress-bar { + height: 8px; + background: var(--bg-semi-dark); + border-radius: var(--radius-full); + overflow: hidden; +} + +.progress-fill { + height: 100%; + background: linear-gradient(90deg, var(--accent-primary), var(--primary-purple)); + border-radius: var(--radius-full); + transition: width 0.6s ease; +} + +.progress-value { + font-size: 16px; + font-weight: 600; + color: var(--text-primary); +} + +/* ========== Icon Grid 图标网格 ========== */ +.icon-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: var(--spacing-lg); +} + +.icon-card { + padding: var(--spacing-lg); + background: var(--bg-card); + border-radius: var(--radius-md); + border: 1px solid var(--border); + text-align: center; + transition: all var(--transition-base); +} + +.icon-card:hover { + transform: translateY(-4px); + box-shadow: var(--shadow-lg); +} + +.icon-card-icon { + font-size: 48px; + margin-bottom: var(--spacing-md); +} + +.icon-card-title { + font-size: 16px; + font-weight: 600; + margin-bottom: var(--spacing-xs); + color: var(--text-primary); +} + +.icon-card-value { + font-size: 14px; + color: var(--text-secondary); +} + +/* ========== 响应式布局 ========== */ +@media (max-width: 768px) { + .alternating-layout { + flex-direction: column !important; + } + + .alternating-layout .image-container { + flex: 1 1 100%; + } +} diff --git a/web_frontend/web_result/order-classes/chemical/index.html b/web_frontend/web_result/order-classes/chemical/index.html index a34c4d16..39bf723c 100644 --- a/web_frontend/web_result/order-classes/chemical/index.html +++ b/web_frontend/web_result/order-classes/chemical/index.html @@ -66,14 +66,21 @@
-
-

检测背景

-

本项目对单批次 300mm 硅晶圆 + 表面SiO₂薄膜开展一次性质量检测。整套流程由AI引擎主导:负责数据清洗、主判定与自动出具结构化报告;检测员只在低可信或越界时介入复核,最大化保障速度与一致性。

-
- -
- 检测背景 -
AI驱动的智能检测系统
+ +
+
+ 检测背景 +
AI驱动的智能检测系统
+
+
+

检测背景

+

+ 本项目对单批次 300mm 硅晶圆 + 表面SiO₂薄膜开展一次性质量检测。检测的核心目标是在不打乱生产节拍的前提下,快速、客观地给出放行/拦截结论,并将证据图与关键数据同步打包,便于管理层与工艺同事直接引用。 +

+

+ 整套流程由AI引擎主导:它负责数据清洗(去噪、校正)、主判定(是否达标/进入观察/越界)与自动出具结构化报告;检测员只在低可信或越界时介入复核,最大化保障速度与一致性。 +

+
@@ -91,6 +98,49 @@
+ +
+
+

检测目的详细说明

+
+
+
+
+

+ 1. 外观检测 +

+

+ 识别并量化颗粒、划痕、腐蚀等可见缺陷,输出数量、最大尺寸、位置分布与可信度;若出现同象限集中或边缘聚集,在报告中加注"需关注"提示,便于下批定位复测。 +

+
+
+

+ 2. 薄膜测量 +

+

+ 用9点法核对厚度均值与均匀性(3σ)是否满足目标窗口;当整体达标但边缘点偏离明显时,自动标记"边缘敏感",提示下批优先复查对应区域。 +

+
+
+

+ 3. 电学测试 +

+

+ 以"AI预测+少量点实测校准"的组合快速评估Rs;当均值接近上/下限或离散度异常放大时,报告中会给出"观察或需复核"的明确结论与建议点位。 +

+
+
+

+ 4. 成分分析 +

+

+ 进行小样本XPS抽检,确认O/Si比是否落在目标范围,并筛查金属污染的可疑峰位;若低于阈值但出现弱峰,记为"可疑",建议同片位或邻近点复测。 +

+
+
+
+
+

检测信息

@@ -156,14 +206,27 @@
-
-

检测对象与项目

-

样品类型:300mm硅晶圆+表面SiO₂薄膜。覆盖项目:外观(颗粒/划痕/腐蚀)、薄膜(厚度与均匀性)、电学(方块电阻Rs)、成分(XPS抽检)。

-
- -
- 检测项目 -
硅晶圆检测项目全景
+ +
+
+ 检测项目 +
硅晶圆检测项目全景
+
+
+

检测对象与项目

+
    +
  • 样品类型:300mm硅晶圆 + 表面SiO₂薄膜
  • +
  • 外观检测:颗粒、划痕、腐蚀等可见缺陷
  • +
  • 薄膜测量:厚度均值与均匀性(3σ)
  • +
  • 电学测试:方块电阻Rs(9点法)
  • +
  • 成分分析:XPS抽检(O/Si比、金属污染)
  • +
  • 不在范围:晶体位错、深层缺陷、应力拉曼
  • +
+

+ + 结果使用:仅服务当批放行/拦截,不外推其他批次或不同工艺窗口。 +

+
@@ -280,52 +343,73 @@
光学镜头检测硅晶圆示意
+
-
+ + -
+ + -
+ + -
+ + @@ -341,43 +425,111 @@

自动出报告并归档,无需人工处理。

+ + +
+

测点最少化策略

+
-

0.80-0.90 → 观察

+

✅ 默认做法:9点测量

-

自动生成备注与关注点,坐标放入下批复测清单。

+

厚度和Rs用9点(中心1点+内环4点+外环4点),能覆盖重点区域,也不太费时。

+

💡 "少测点"方法:如果AI预测和前3点实测的差异<2%,剩下6点可以用AI估算。报告里必须标注这些点为"AI估计",同时随机抽查1-2点,以确保靠谱。

+
-

<0.80或超限 → 待复核

+

⚠️ 不能少测点的情况

-

自动通知检测员复核,复核前不建议放行。

+
    +
  • 某一象限的缺陷/颗粒明显偏多
  • +
  • 边缘和中心差距异常(边缘普遍偏高或偏低)
  • +
  • 前3点与AI预测差异≥2%
  • +
+

遇到这些情况,系统会自动恢复完整9点;必要时建议升到13点(外环再加4点)再确认。

-
-
-
单片用时
-
0分钟
-
-
-
批次用时(20片)
-
0小时
-
-
-
AI可信度
-
0%
-
-
-
异常复核
-
3-5分钟/片
-
+ +
+

AI输出内容详解

+ + +
+ + + + + + + + + + +
@@ -401,9 +553,85 @@

本批共20片晶圆,全部完成外观、厚度、Rs三项检测;随机抽取3片补做XPS成分核验。完成度100%,无漏测、无中断记录。总体判定:合格19片、观察1片、不合格0片。

-
- 检测结果 -
检测结果主图
+ +
+
+
+

覆盖范围与完成度

+
+
+

本批共20片晶圆,全部按计划完成外观、厚度、方块电阻(Rs)三项检测;随机抽取3片补做XPS成分核验。

+

外观采用全片扫描(单片分辨率约0.2-0.3μm/px),厚度与Rs采用9点法(中心+内环4点+外环4点),与晶圆Notch对齐确保点位一致性。

+

✓ 完成度100%,无漏测、无中断记录。

+
+
+ +
+
+

统计口径与一致性

+
+
+
    +
  • 外观:每片"最大值"与"总数"呈现(便于快速对比风险峰值与整体水平)
  • +
  • 厚度与Rs:9点"均值+3σ(离散)"呈现
  • +
  • 成分:按"正常/可疑/异常"分级,并附O/Si比与金属峰提示
  • +
+

各项统计口径与上一版报告保持一致,便于横向对比。

+
+
+ +
+
+

总体判定与分布

+
+
+

结果汇总:合格19片观察1片不合格0片

+

进入"观察"的样片原因为Rs略高但未越界;其余19片全部在阈值内。

+
+
+
合格率
+
95%
+
+
+
观察率
+
5%
+
+
+
+
+
+ + +
+
+ 检测结果 +
检测结果数据可视化
+
+
+

检测结果总览

+
+
+
95%
+
批次合格率
+
+
+
0.94
+
AI可信度
+
+
+
1片
+
观察片数
+
+
+
0片
+
不合格片数
+
+
+

+ + 总体评价:本批质量稳定,仅1片进入观察带,AI与人工判定结果100%一致。 +

+
@@ -542,25 +770,195 @@
+ + +
+

观察项解释

+
+
+
+

❓ 为何是"观察"而非"不合格"

+
+
+

Rs仍在允许范围内,只是接近上限;离散度正常,说明并非局部失控。

+
+

+ + 技术说明:Rs均值61.1Ω/□,目标60±1.2Ω/□,偏差+1.1Ω/□(约1.8%),仍在规格窗口内。9点离散度2.9Ω/□属于正常工艺波动范围。 +

+
+
+
+ +
+
+

📊 对良率和使用的影响

+
+
+

在当前应用场景下属于可接受波动,不会成为直接的失效风险。

+
+

+ + 预警:若下批连续出现同样趋势,可能意味着工艺轻微偏移,需要小范围微调确认。 +

+
+
+
+
-
-
-
批次合格率
-
0%
+ +
+

复核与跟踪

+
+
+
+

✅ 当班复核

+
+
+

观察片的重点点位已复测,确认属轻微偏高;AI与人工结论一致。

+
+
+
复核方式
+
人工+AI双验证
+
+
+
结论一致性
+
100%
+
+
+
复核耗时
+
3分钟
+
+
+
+
+ +
+
+

🔄 下批跟踪计划

+
+
+
+
+
+ 优先点位 +
+
    +
  • 边缘外环3点(NE、NW、SE)
  • +
  • 中心1点
  • +
+

+ 💡 AI已在报告中自动生成对应坐标 +

+
+ +
+
+ 顺序建议 +
+
    +
  1. 先边缘后中心
  2. +
  3. 若边缘回落而中心不变,优先考虑边缘效应
  4. +
  5. 合格判据:Rs均值回到60±1.2Ω/□内,且9点离散≤上一批离散值+10%即可判定"趋稳"
  6. +
+
+
+ +
+

+ + 跟踪目标:通过下批4个关键点位的数据变化,快速判断工艺稳定性。若Rs回落且离散度稳定,可维持当前工艺参数;若无改善或继续上升,需启动工艺分析会议,评估是否调整沉积参数。 +

+
+
+
-
-
AI可信度
-
0.94
+
+
+ +
+
+
批次合格率
+
95%
-
-
观察片数
-
1片
+
+
AI可信度
+
0.94
-
-
不合格片数
-
0片
+
+
观察片数
+
1片
+
+
不合格片数
+
0片
+
+
+
+
+ + + +
+
+
+

+ AI核心能力 +

+

+ 本项目采用先进的AI技术,实现从数据采集到报告生成的全流程自动化,大幅提升检测效率与准确性。 +

+
+ + +
+
+
🧹
+

自动数据清洗

+

去噪、校正、标准化

+
+ +
+
🧠
+

智能主判定

+

合格/观察/不合格

+
+ +
+
⚖️
+

阈值自动比对

+

实时对标工艺窗口

+
+ +
+
📊
+

可信度评估

+

0.94平均可信度

+
+ +
+
📈
+

趋势预测

+

工艺偏移预警

+
+ +
+
⚠️
+

异常自动预警

+

低可信/越界提醒

+
+ +
+
📄
+

报告一键生成

+

≤2分钟出具PDF

+
+ +
+
🔄
+

持续学习优化

+

模型迭代升级

diff --git a/web_frontend/web_result/order-classes/energy/css/styles.css b/web_frontend/web_result/order-classes/energy/css/styles.css index 2c8eeb54..fead6503 100644 --- a/web_frontend/web_result/order-classes/energy/css/styles.css +++ b/web_frontend/web_result/order-classes/energy/css/styles.css @@ -2,29 +2,29 @@ /* ========== 设计变量 ========== */ :root { - /* 橙黄太阳能主题 - 能源风格 */ - --bg-dark: #fffbeb; /* 浅黄背景 */ - --bg-semi-dark: rgba(255, 251, 235, 0.95); /* 半透明浅黄 */ + /* 科技蓝主题 - 能源光伏风格 */ + --bg-dark: #ffffff; /* 纯白背景 */ + --bg-semi-dark: rgba(255, 255, 255, 0.95); /* 半透明白 */ --bg-overlay: rgba(255, 255, 255, 0.85); /* 白色遮罩 */ --bg-card: rgba(255, 255, 255, 0.9); /* 卡片背景 */ - --primary-dark: #78350f; /* 主色深橙 */ - --primary-orange: #f59e0b; /* 主色橙 - 能源专业 */ - --accent-amber: #d97706; /* 琥珀色强调 - 太阳能主题 */ - --accent-amber-light: #fbbf24; /* 浅琥珀色 */ - --text-light: #78350f; /* 深色文字 */ - --text-gray: #6b7280; /* 灰色文字 */ - --border-light: rgba(245, 158, 11, 0.2); /* 橙色边框 */ - --hover-bg: rgba(245, 158, 11, 0.15); /* 悬停背景 */ - --active-bg: rgba(245, 158, 11, 0.2); /* 激活背景 */ + --primary-dark: #0d47a1; /* 主色深蓝 */ + --primary-blue: #1976d2; /* 主色蓝 - 科技专业 */ + --accent-cyan: #00bcd4; /* 青色强调 - 能源主题 */ + --accent-cyan-light: #4dd0e1; /* 浅青色 */ + --text-light: #212121; /* 深色文字 */ + --text-gray: #616161; /* 灰色文字 */ + --border-light: rgba(25, 118, 210, 0.2); /* 蓝色边框 */ + --hover-bg: rgba(0, 188, 212, 0.15); /* 悬停背景 */ + --active-bg: rgba(25, 118, 210, 0.2); /* 激活背景 */ - /* 间距系统 - 针对大屏幕优化 */ - --spacing-xs: 0.75rem; /* 12px */ - --spacing-sm: 1.25rem; /* 20px */ - --spacing-md: 2rem; /* 32px */ - --spacing-lg: 3rem; /* 48px */ - --spacing-xl: 4rem; /* 64px */ - --spacing-2xl: 6rem; /* 96px */ - --spacing-3xl: 8rem; /* 128px */ + /* 间距系统 - 紧凑布局 */ + --spacing-xs: 0.5rem; /* 8px */ + --spacing-sm: 0.75rem; /* 12px */ + --spacing-md: 1.25rem; /* 20px */ + --spacing-lg: 2rem; /* 32px */ + --spacing-xl: 2.5rem; /* 40px */ + --spacing-2xl: 3rem; /* 48px */ + --spacing-3xl: 4rem; /* 64px */ /* 字体系统 */ --font-primary: 'Inter', 'Noto Sans SC', -apple-system, BlinkMacSystemFont, sans-serif; @@ -61,7 +61,7 @@ --shadow-md: 0 2px 4px rgba(0,0,0,0.08); --shadow-lg: 0 4px 8px rgba(0,0,0,0.1); --shadow-xl: 0 8px 16px rgba(0,0,0,0.12); - --shadow-orange: 0 2px 8px rgba(245, 158, 11, 0.15); + --shadow-blue: 0 2px 8px rgba(25, 118, 210, 0.15); /* 过渡 */ --transition-fast: 150ms ease; @@ -72,26 +72,26 @@ --container-max: 1600px; /* 增加最大宽度适配1920屏幕 */ } -/* ========== 深色主题 - 深邃橙黄配色 ========== */ +/* ========== 深色主题 - 深邃科技蓝配色 ========== */ body.dark-theme { - --bg-dark: #78350f; /* 深邃橙黑背景 */ - --bg-semi-dark: rgba(120, 53, 15, 0.95); /* 深橙半透明 */ - --bg-overlay: rgba(217, 119, 6, 0.85); /* 深橙遮罩层 */ - --bg-card: rgba(245, 158, 11, 0.9); /* 深橙卡片背景 */ - --primary-dark: #78350f; /* 深邃橙黑 */ - --primary-orange: #fbbf24; /* 明亮橙 */ - --accent-amber: #fcd34d; /* 亮琥珀色 */ - --accent-amber-light: #fde68a; /* 超亮琥珀色 */ - --text-light: #fffbeb; /* 浅色文字 */ - --text-gray: #fde68a; /* 灰色文字 */ - --border-light: rgba(251, 191, 36, 0.25); /* 橙色边框 */ - --hover-bg: rgba(245, 158, 11, 0.15); /* 悬停背景 */ - --active-bg: rgba(251, 191, 36, 0.2); /* 激活背景 */ + --bg-dark: #0a1929; /* 深邃蓝黑背景 */ + --bg-semi-dark: rgba(10, 25, 41, 0.95); /* 深蓝半透明 */ + --bg-overlay: rgba(13, 47, 161, 0.85); /* 深蓝遮罩层 */ + --bg-card: rgba(25, 118, 210, 0.9); /* 深蓝卡片背景 */ + --primary-dark: #0d47a1; /* 深邃蓝 */ + --primary-blue: #42a5f5; /* 明亮蓝 */ + --accent-cyan: #4dd0e1; /* 亮青色 */ + --accent-cyan-light: #80deea; /* 超亮青色 */ + --text-light: #e3f2fd; /* 浅色文字 */ + --text-gray: #b3e5fc; /* 灰色文字 */ + --border-light: rgba(66, 165, 245, 0.25); /* 蓝色边框 */ + --hover-bg: rgba(0, 188, 212, 0.15); /* 悬停背景 */ + --active-bg: rgba(66, 165, 245, 0.2); /* 激活背景 */ --shadow-sm: 0 1px 2px rgba(0,0,0,0.4); --shadow-md: 0 2px 4px rgba(0,0,0,0.5); --shadow-lg: 0 4px 8px rgba(0,0,0,0.6); --shadow-xl: 0 8px 16px rgba(0,0,0,0.7); - --shadow-orange: 0 2px 8px rgba(245, 158, 11, 0.25); + --shadow-blue: 0 2px 8px rgba(25, 118, 210, 0.25); } /* ========== 重置样式 ========== */ @@ -123,8 +123,8 @@ body { align-items: center; justify-content: center; background: - linear-gradient(135deg, rgba(255, 251, 235, 0.9) 0%, rgba(254, 243, 199, 0.95) 100%), - url('../images/光伏面板生成画面.jpg'); + linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.95) 100%), + url('https://images.unsplash.com/photo-1509391366360-2e959784a276?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -184,8 +184,8 @@ body { /* 深色主题下的Hero渐变 */ body.dark-theme .hero { background: - linear-gradient(135deg, rgba(120, 53, 15, 0.9) 0%, rgba(217, 119, 6, 0.8) 100%), - url('../images/光伏面板生成画面.jpg'); + linear-gradient(135deg, rgba(10, 25, 41, 0.9) 0%, rgba(13, 71, 161, 0.8) 100%), + url('https://images.unsplash.com/photo-1509391366360-2e959784a276?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -197,8 +197,8 @@ body.dark-theme .hero { width: 100%; height: 100%; background-image: - radial-gradient(circle at 20% 50%, rgba(245, 158, 11, 0.1) 0%, transparent 50%), - radial-gradient(circle at 80% 80%, rgba(217, 119, 6, 0.05) 0%, transparent 50%); + radial-gradient(circle at 20% 50%, rgba(25, 118, 210, 0.1) 0%, transparent 50%), + radial-gradient(circle at 80% 80%, rgba(13, 71, 161, 0.05) 0%, transparent 50%); pointer-events: none; animation: glow 8s ease-in-out infinite; } @@ -220,7 +220,7 @@ body.dark-theme .hero { .hero-badge { display: inline-block; padding: var(--spacing-md) var(--spacing-xl); - background: rgba(245, 158, 11, 0.15); + background: rgba(25, 118, 210, 0.15); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border-radius: var(--radius-full); @@ -228,14 +228,14 @@ body.dark-theme .hero { font-weight: var(--font-semibold); letter-spacing: 0.1em; margin-bottom: var(--spacing-xl); - border: 3px solid var(--primary-orange); - box-shadow: var(--shadow-orange); + border: 3px solid var(--primary-blue); + box-shadow: var(--shadow-blue); text-transform: uppercase; transition: all var(--transition-base); } .hero-badge:hover { - background: rgba(245, 158, 11, 0.25); + background: rgba(25, 118, 210, 0.25); transform: translateY(-2px); } @@ -245,8 +245,8 @@ body.dark-theme .hero { margin-bottom: var(--spacing-lg); letter-spacing: -0.02em; line-height: 1.1; - color: var(--accent-amber-light); - text-shadow: 0 6px 30px rgba(0,0,0,0.8), 0 0 60px rgba(245, 158, 11, 0.4); + color: var(--accent-cyan-light); + text-shadow: 0 6px 30px rgba(0,0,0,0.8), 0 0 60px rgba(25, 118, 210, 0.4); } .hero-subtitle { @@ -268,22 +268,22 @@ body.dark-theme .hero { /* Hero浮动卡片 */ .hero-floating-cards { display: flex; - gap: var(--spacing-lg); + gap: var(--spacing-md); justify-content: center; - margin-top: var(--spacing-2xl); - flex-wrap: wrap; + margin-top: var(--spacing-xl); + flex-wrap: nowrap; /* 强制并排显示 */ } .hero-card { background: var(--bg-card); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); - padding: var(--spacing-lg) var(--spacing-xl); - border-radius: var(--radius-xl); - border: 2px solid var(--border-light); - box-shadow: var(--shadow-lg); - transition: all var(--transition-base); - min-width: 160px; + padding: var(--spacing-md) var(--spacing-lg); /* 紧凑但不过分 */ + border-radius: var(--radius-lg); /* 优雅的圆角 */ + border: 1px solid var(--border-light); /* 更细的边框 */ + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); /* 轻柔的阴影 */ + transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); /* 弹性缓动 */ + min-width: 120px; /* 合适的最小宽度 */ animation: fadeInUp 0.8s ease forwards; } @@ -292,23 +292,28 @@ body.dark-theme .hero { .hero-card:nth-child(3) { animation-delay: 0.6s; opacity: 0; } .hero-card:hover { - transform: translateY(-8px) scale(1.05); - box-shadow: var(--shadow-xl), var(--shadow-orange); - border-color: var(--primary-orange); + transform: translateY(-6px) scale(1.03); + box-shadow: 0 8px 24px rgba(25, 118, 210, 0.15), + 0 4px 12px rgba(0, 0, 0, 0.1); + border-color: var(--primary-blue); } .hero-card-value { - font-size: var(--text-3xl); + font-size: var(--text-lg); /* 从xl进一步缩小为lg,更精致 */ font-weight: var(--font-bold); - color: var(--primary-orange); + color: var(--primary-blue); margin-bottom: var(--spacing-xs); - text-shadow: 0 2px 10px rgba(245, 158, 11, 0.3); + text-shadow: 0 1px 4px rgba(25, 118, 210, 0.2); /* 减小阴影 */ + letter-spacing: -0.01em; /* 减小字间距 */ } .hero-card-label { - font-size: var(--text-sm); + font-size: 0.7rem; /* 比xs更小,约11.2px */ color: var(--text-gray); font-weight: var(--font-medium); + text-transform: uppercase; /* 大写字母更精致 */ + letter-spacing: 0.08em; /* 增加字间距,更精致 */ + opacity: 0.85; /* 添加透明度 */ } /* 滚动指示器 */ @@ -317,7 +322,7 @@ body.dark-theme .hero { bottom: 40px; left: 50%; transform: translateX(-50%); - color: var(--primary-orange); + color: var(--primary-blue); animation: bounce 2s infinite; cursor: pointer; z-index: 10; @@ -399,16 +404,16 @@ body.dark-theme .hero { .nav-item:hover { background: var(--hover-bg); - color: var(--primary-orange); + color: var(--primary-blue); transform: translateY(-2px); - box-shadow: var(--shadow-orange); + box-shadow: var(--shadow-blue); } .nav-item.active { background: var(--active-bg); - color: var(--primary-orange); - border-color: var(--primary-orange); - box-shadow: var(--shadow-orange); + color: var(--primary-blue); + border-color: var(--primary-blue); + box-shadow: var(--shadow-blue); } /* ========== 内容区块 - 图片背景 ========== */ @@ -421,8 +426,8 @@ body.dark-theme .hero { /* 浅色图片背景 - 每个区块使用不同图片 */ .section:nth-child(1) { background-image: - linear-gradient(to bottom, rgba(255, 251, 235, 0.9) 0%, rgba(254, 243, 199, 1) 100%), - url('../images/PLC示意图.jpg'); + linear-gradient(to bottom, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.95) 100%), + url('https://images.unsplash.com/photo-1581091226825-a6a2a5aee158?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -430,8 +435,8 @@ body.dark-theme .hero { .section:nth-child(2) { background-image: - linear-gradient(to bottom, rgba(255, 251, 235, 0.9) 0%, rgba(254, 243, 199, 1) 100%), - url('../images/Mermaid流程图.jpg'); + linear-gradient(to bottom, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.95) 100%), + url('https://images.unsplash.com/photo-1518770660439-4636190af475?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -439,8 +444,8 @@ body.dark-theme .hero { .section:nth-child(3) { background-image: - linear-gradient(to bottom, rgba(255, 251, 235, 0.9) 0%, rgba(254, 243, 199, 1) 100%), - url('../images/工业机器人图片.jpg'); + linear-gradient(to bottom, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.95) 100%), + url('https://images.unsplash.com/photo-1563207153-f403bf289096?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -448,8 +453,8 @@ body.dark-theme .hero { .section:nth-child(4) { background-image: - linear-gradient(to bottom, rgba(255, 251, 235, 0.9) 0%, rgba(254, 243, 199, 1) 100%), - url('../images/机器视觉相机图片.jpg'); + linear-gradient(to bottom, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.95) 100%), + url('https://images.unsplash.com/photo-1581092160562-40aa08e78837?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -458,8 +463,8 @@ body.dark-theme .hero { /* 通用奇偶区块(当超过4个section时) */ .section:nth-child(n+5):nth-child(odd) { background-image: - linear-gradient(to bottom, rgba(255, 251, 235, 0.9) 0%, rgba(254, 243, 199, 1) 100%), - url('../images/光伏面板室外场景图片.jpg'); + linear-gradient(to bottom, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.95) 100%), + url('https://images.unsplash.com/photo-1509391366360-2e959784a276?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -467,8 +472,8 @@ body.dark-theme .hero { .section:nth-child(n+5):nth-child(even) { background-image: - linear-gradient(to bottom, rgba(255, 251, 235, 0.9) 0%, rgba(254, 243, 199, 1) 100%), - url('../images/输送与治具.jpg'); + linear-gradient(to bottom, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.95) 100%), + url('https://images.unsplash.com/photo-1581092160607-ee67be8e3b13?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -477,8 +482,8 @@ body.dark-theme .hero { /* 深色主题下的区块背景 - 每个区块使用对应图片 */ body.dark-theme .section:nth-child(1) { background-image: - linear-gradient(to bottom, rgba(120, 53, 15, 0.92) 0%, rgba(217, 119, 6, 0.88) 100%), - url('../images/PLC示意图.jpg'); + linear-gradient(to bottom, rgba(10, 25, 41, 0.92) 0%, rgba(13, 71, 161, 0.88) 100%), + url('https://images.unsplash.com/photo-1581091226825-a6a2a5aee158?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -486,8 +491,8 @@ body.dark-theme .section:nth-child(1) { body.dark-theme .section:nth-child(2) { background-image: - linear-gradient(to bottom, rgba(217, 119, 6, 0.90) 0%, rgba(120, 53, 15, 0.88) 100%), - url('../images/Mermaid流程图.jpg'); + linear-gradient(to bottom, rgba(13, 71, 161, 0.90) 0%, rgba(10, 25, 41, 0.88) 100%), + url('https://images.unsplash.com/photo-1518770660439-4636190af475?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -495,8 +500,8 @@ body.dark-theme .section:nth-child(2) { body.dark-theme .section:nth-child(3) { background-image: - linear-gradient(to bottom, rgba(120, 53, 15, 0.92) 0%, rgba(217, 119, 6, 0.88) 100%), - url('../images/工业机器人图片.jpg'); + linear-gradient(to bottom, rgba(10, 25, 41, 0.92) 0%, rgba(13, 71, 161, 0.88) 100%), + url('https://images.unsplash.com/photo-1563207153-f403bf289096?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -504,8 +509,8 @@ body.dark-theme .section:nth-child(3) { body.dark-theme .section:nth-child(4) { background-image: - linear-gradient(to bottom, rgba(217, 119, 6, 0.90) 0%, rgba(120, 53, 15, 0.88) 100%), - url('../images/机器视觉相机图片.jpg'); + linear-gradient(to bottom, rgba(13, 71, 161, 0.90) 0%, rgba(10, 25, 41, 0.88) 100%), + url('https://images.unsplash.com/photo-1581092160562-40aa08e78837?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -514,8 +519,8 @@ body.dark-theme .section:nth-child(4) { /* 通用奇偶区块(当超过4个section时) */ body.dark-theme .section:nth-child(n+5):nth-child(odd) { background-image: - linear-gradient(to bottom, rgba(120, 53, 15, 0.92) 0%, rgba(217, 119, 6, 0.88) 100%), - url('../images/光伏面板室外场景图片.jpg'); + linear-gradient(to bottom, rgba(10, 25, 41, 0.92) 0%, rgba(13, 71, 161, 0.88) 100%), + url('https://images.unsplash.com/photo-1509391366360-2e959784a276?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -523,8 +528,8 @@ body.dark-theme .section:nth-child(n+5):nth-child(odd) { body.dark-theme .section:nth-child(n+5):nth-child(even) { background-image: - linear-gradient(to bottom, rgba(217, 119, 6, 0.90) 0%, rgba(120, 53, 15, 0.88) 100%), - url('../images/输送与治具.jpg'); + linear-gradient(to bottom, rgba(13, 71, 161, 0.90) 0%, rgba(10, 25, 41, 0.88) 100%), + url('https://images.unsplash.com/photo-1581092160607-ee67be8e3b13?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -532,26 +537,26 @@ body.dark-theme .section:nth-child(n+5):nth-child(even) { /* 深色主题下的特定元素调整 */ body.dark-theme .stat-item { - background: rgba(245, 158, 11, 0.8); + background: rgba(25, 118, 210, 0.8); backdrop-filter: blur(5px); } body.dark-theme .stat-item:hover { - background: rgba(251, 191, 36, 0.15); - border-color: var(--primary-orange); + background: rgba(0, 188, 212, 0.15); + border-color: var(--primary-blue); } body.dark-theme .stat-value { - color: var(--accent-amber-light); + color: var(--accent-cyan-light); } body.dark-theme th { - background: rgba(251, 191, 36, 0.12); - color: var(--accent-amber-light); + background: rgba(0, 188, 212, 0.12); + color: var(--accent-cyan-light); } body.dark-theme tr:hover { - background: rgba(251, 191, 36, 0.08); + background: rgba(0, 188, 212, 0.08); } .container { @@ -579,7 +584,7 @@ body.dark-theme tr:hover { height: 100px; border-radius: var(--radius-xl); object-fit: cover; - border: 3px solid var(--primary-orange); + border: 3px solid var(--primary-blue); box-shadow: var(--shadow-md); transition: all var(--transition-base); } @@ -587,7 +592,7 @@ body.dark-theme tr:hover { .agent-avatar:hover { transform: scale(1.05); box-shadow: var(--shadow-lg); - border-color: var(--accent-amber); + border-color: var(--accent-cyan); } .agent-info { @@ -596,7 +601,7 @@ body.dark-theme tr:hover { .agent-name { font-size: var(--text-lg); - color: var(--primary-orange); + color: var(--primary-blue); text-transform: uppercase; letter-spacing: 0.1em; margin-bottom: var(--spacing-sm); @@ -620,7 +625,7 @@ body.dark-theme tr:hover { left: 0; width: 180px; height: 4px; - background: linear-gradient(90deg, var(--primary-orange), transparent); + background: linear-gradient(90deg, var(--primary-blue), transparent); border-radius: 2px; } @@ -642,7 +647,7 @@ body.dark-theme tr:hover { .expert-intro h3 { font-size: var(--text-2xl); - color: var(--primary-orange); + color: var(--primary-blue); margin-bottom: var(--spacing-lg); display: flex; align-items: center; @@ -666,7 +671,7 @@ body.dark-theme tr:hover { } .grid-3 { - grid-template-columns: repeat(2, 1fr); + grid-template-columns: repeat(3, 1fr); /* 3列并排布局,避免2x2 */ } .grid-4 { @@ -701,7 +706,7 @@ body.dark-theme tr:hover { .split-layout-image:hover { transform: scale(1.02); - box-shadow: var(--shadow-xl), var(--shadow-orange); + box-shadow: var(--shadow-xl), var(--shadow-blue); } .split-layout-image img { @@ -724,7 +729,7 @@ body.dark-theme tr:hover { } .split-badge { - background: var(--primary-orange); + background: var(--primary-blue); color: white; padding: var(--spacing-sm) var(--spacing-lg); border-radius: var(--radius-full); @@ -744,7 +749,7 @@ body.dark-theme tr:hover { .split-title { font-size: var(--text-2xl); - color: var(--primary-orange); + color: var(--primary-blue); margin-bottom: var(--spacing-lg); display: flex; align-items: center; @@ -793,16 +798,16 @@ body.dark-theme tr:hover { right: 0; bottom: 0; background: linear-gradient(135deg, - rgba(120, 53, 15, 0.85) 0%, - rgba(217, 119, 6, 0.7) 100% + rgba(10, 25, 41, 0.85) 0%, + rgba(13, 71, 161, 0.7) 100% ); backdrop-filter: blur(2px); } body:not(.dark-theme) .visual-divider::before { background: linear-gradient(135deg, - rgba(255, 251, 235, 0.85) 0%, - rgba(254, 243, 199, 0.9) 100% + rgba(255, 255, 255, 0.85) 0%, + rgba(255, 255, 255, 0.9) 100% ); } @@ -823,25 +828,25 @@ body:not(.dark-theme) .visual-divider::before { display: flex; align-items: center; justify-content: center; - border: 3px solid var(--primary-orange); - box-shadow: var(--shadow-xl), 0 0 30px rgba(245, 158, 11, 0.5); + border: 3px solid var(--primary-blue); + box-shadow: var(--shadow-xl), 0 0 30px rgba(25, 118, 210, 0.5); animation: pulse 2s ease-in-out infinite; } .divider-icon i { width: 40px !important; height: 40px !important; - color: var(--primary-orange); + color: var(--primary-blue); } @keyframes pulse { 0%, 100% { transform: scale(1); - box-shadow: var(--shadow-xl), 0 0 30px rgba(245, 158, 11, 0.5); + box-shadow: var(--shadow-xl), 0 0 30px rgba(25, 118, 210, 0.5); } 50% { transform: scale(1.05); - box-shadow: var(--shadow-xl), 0 0 50px rgba(245, 158, 11, 0.8); + box-shadow: var(--shadow-xl), 0 0 50px rgba(25, 118, 210, 0.8); } } @@ -890,7 +895,7 @@ body:not(.dark-theme) .visual-divider::before { .timeline-title { font-size: var(--text-3xl); - color: var(--primary-orange); + color: var(--primary-blue); margin-bottom: var(--spacing-2xl); display: flex; align-items: center; @@ -921,8 +926,8 @@ body:not(.dark-theme) .visual-divider::before { width: 3px; background: linear-gradient(to bottom, transparent, - var(--primary-orange) 10%, - var(--primary-orange) 90%, + var(--primary-blue) 10%, + var(--primary-blue) 90%, transparent ); transform: translateX(-50%); @@ -951,7 +956,7 @@ body:not(.dark-theme) .visual-divider::before { height: 60px; border-radius: 50%; background: var(--bg-card); - border: 4px solid var(--primary-orange); + border: 4px solid var(--primary-blue); display: flex; align-items: center; justify-content: center; @@ -963,12 +968,12 @@ body:not(.dark-theme) .visual-divider::before { .timeline-marker i { width: 28px !important; height: 28px !important; - color: var(--primary-orange); + color: var(--primary-blue); } .timeline-item:hover .timeline-marker { transform: translateX(-50%) scale(1.1); - box-shadow: var(--shadow-xl), 0 0 0 12px var(--bg-dark), var(--shadow-orange); + box-shadow: var(--shadow-xl), 0 0 0 12px var(--bg-dark), var(--shadow-blue); } .timeline-content { @@ -992,13 +997,13 @@ body:not(.dark-theme) .visual-divider::before { .timeline-content:hover { transform: translateY(-4px); - box-shadow: var(--shadow-xl), var(--shadow-orange); - border-color: var(--primary-orange); + box-shadow: var(--shadow-xl), var(--shadow-blue); + border-color: var(--primary-blue); } .timeline-step { font-size: var(--text-sm); - color: var(--primary-orange); + color: var(--primary-blue); font-weight: var(--font-bold); text-transform: uppercase; letter-spacing: 0.1em; @@ -1023,7 +1028,7 @@ body:not(.dark-theme) .visual-divider::before { display: inline-block; padding: var(--spacing-xs) var(--spacing-md); background: var(--active-bg); - color: var(--primary-orange); + color: var(--primary-blue); border-radius: var(--radius-full); font-size: var(--text-sm); font-weight: var(--font-medium); @@ -1096,8 +1101,8 @@ body:not(.dark-theme) .visual-divider::before { .card:hover { transform: translateY(-8px); - box-shadow: var(--shadow-xl), var(--shadow-orange); - border-color: var(--primary-orange); + box-shadow: var(--shadow-xl), var(--shadow-blue); + border-color: var(--primary-blue); } .card-header { @@ -1110,7 +1115,7 @@ body:not(.dark-theme) .visual-divider::before { .card-title { font-size: var(--text-2xl); font-weight: var(--font-semibold); - color: var(--primary-orange); + color: var(--primary-blue); margin-bottom: var(--spacing-sm); } @@ -1182,7 +1187,7 @@ body:not(.dark-theme) .visual-divider::before { } .feature-list li:hover { - color: var(--primary-orange); + color: var(--primary-blue); padding-left: var(--spacing-sm); } @@ -1227,21 +1232,30 @@ body:not(.dark-theme) .visual-divider::before { .stat-value { font-size: var(--text-2xl); font-weight: var(--font-bold); - color: var(--primary-orange); + color: var(--primary-blue); text-shadow: none; } -/* ========== 增强数据可视化 - 环形进度条 ========== */ +/* ========== 增强数据可视化 - 精致四列布局 ========== */ .stats-enhanced { display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: var(--spacing-xl); - padding: var(--spacing-xl); - background: var(--bg-overlay); - backdrop-filter: blur(15px); + grid-template-columns: repeat(4, 1fr); + gap: var(--spacing-2xl); + padding: var(--spacing-2xl); + background: linear-gradient(135deg, + rgba(255, 255, 255, 0.6) 0%, + rgba(255, 255, 255, 0.4) 100%); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); border-radius: var(--radius-2xl); border: 2px solid var(--border-light); - box-shadow: var(--shadow-lg); + box-shadow: var(--shadow-xl); +} + +body.dark-theme .stats-enhanced { + background: linear-gradient(135deg, + rgba(10, 25, 41, 0.6) 0%, + rgba(13, 71, 161, 0.4) 100%); } .stat-circle-item { @@ -1277,12 +1291,12 @@ body:not(.dark-theme) .visual-divider::before { } .circle-fill { - stroke: var(--primary-orange); + stroke: var(--primary-blue); stroke-linecap: round; stroke-dasharray: 326.73; /* 2 * π * r = 2 * π * 52 */ stroke-dashoffset: calc(326.73 * (1 - var(--progress, 0) / 100)); transition: stroke-dashoffset 2s cubic-bezier(0.16, 1, 0.3, 1); - filter: drop-shadow(0 0 8px rgba(245, 158, 11, 0.5)); + filter: drop-shadow(0 0 8px rgba(25, 118, 210, 0.5)); } .circle-text { @@ -1296,7 +1310,7 @@ body:not(.dark-theme) .visual-divider::before { .circle-value { font-size: var(--text-3xl); font-weight: var(--font-bold); - color: var(--primary-orange); + color: var(--primary-blue); line-height: 1; margin-bottom: var(--spacing-xs); } @@ -1313,10 +1327,18 @@ body:not(.dark-theme) .visual-divider::before { font-weight: var(--font-semibold); } +@media (max-width: 1200px) { + .stats-enhanced { + grid-template-columns: repeat(2, 1fr); + gap: var(--spacing-xl); + } +} + @media (max-width: 768px) { .stats-enhanced { grid-template-columns: repeat(2, 1fr); gap: var(--spacing-lg); + padding: var(--spacing-lg); } .circle-progress { @@ -1329,6 +1351,148 @@ body:not(.dark-theme) .visual-divider::before { } } +@media (max-width: 480px) { + .stats-enhanced { + grid-template-columns: 1fr; + } +} + +/* ========== 现代化统计卡片 - 优化版 ========== */ +.stat-modern-item { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; + padding: var(--spacing-2xl); + background: linear-gradient(135deg, var(--bg-card) 0%, rgba(255, 255, 255, 0.8) 100%); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + border-radius: var(--radius-2xl); + border: 2px solid var(--border-light); + transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); + box-shadow: var(--shadow-md); + gap: var(--spacing-lg); + position: relative; + overflow: hidden; +} + +.stat-modern-item::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: linear-gradient(135deg, transparent 0%, rgba(25, 118, 210, 0.05) 100%); + opacity: 0; + transition: opacity var(--transition-base); +} + +.stat-modern-item:hover::before { + opacity: 1; +} + +.stat-modern-item:hover { + transform: translateY(-12px) scale(1.02); + box-shadow: 0 12px 32px rgba(25, 118, 210, 0.2), + 0 6px 16px rgba(0, 0, 0, 0.1); + border-color: var(--primary-blue); +} + +.stat-icon-wrapper { + width: 72px; + height: 72px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15); + transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); + position: relative; +} + +.stat-icon-wrapper::after { + content: ''; + position: absolute; + inset: -4px; + border-radius: 50%; + background: inherit; + opacity: 0.3; + filter: blur(12px); + z-index: -1; + transition: all var(--transition-base); +} + +.stat-modern-item:hover .stat-icon-wrapper { + transform: scale(1.15) rotate(5deg); + box-shadow: 0 12px 32px rgba(0, 0, 0, 0.2); +} + +.stat-modern-item:hover .stat-icon-wrapper::after { + opacity: 0.5; + filter: blur(16px); +} + +.stat-modern-value { + font-size: var(--text-3xl); + font-weight: var(--font-bold); + color: var(--text-light); + line-height: 1; + letter-spacing: -0.02em; + text-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); +} + +body.dark-theme .stat-modern-value { + color: var(--accent-cyan-light); + text-shadow: 0 2px 12px rgba(77, 208, 225, 0.3); +} + +body.dark-theme .stat-modern-item { + background: linear-gradient(135deg, rgba(25, 118, 210, 0.15) 0%, rgba(13, 71, 161, 0.1) 100%); +} + +.stat-modern-unit { + font-size: var(--text-base); + font-weight: var(--font-semibold); + color: var(--text-gray); + margin-left: var(--spacing-xs); + opacity: 0.75; +} + +.stat-modern-label { + font-size: var(--text-sm); + font-weight: var(--font-semibold); + color: var(--text-gray); + text-transform: uppercase; + letter-spacing: 0.08em; + opacity: 0.8; +} + +@media (max-width: 768px) { + .stat-modern-item { + padding: var(--spacing-lg); + gap: var(--spacing-sm); + } + + .stat-icon-wrapper { + width: 60px; + height: 60px; + } + + .stat-modern-value { + font-size: var(--text-2xl); + } + + .stat-modern-unit { + font-size: var(--text-base); + } + + .stat-modern-label { + font-size: var(--text-sm); + } +} + /* ========== 表格 ========== */ .table-container { overflow-x: auto; @@ -1348,11 +1512,11 @@ table { th { background: var(--active-bg); - color: var(--primary-orange); + color: var(--primary-blue); padding: var(--spacing-md); text-align: left; font-weight: var(--font-semibold); - border-bottom: 2px solid var(--primary-orange); + border-bottom: 2px solid var(--primary-blue); } td { @@ -1623,7 +1787,7 @@ tr:hover { left: 0; right: 0; bottom: 0; - background: linear-gradient(135deg, transparent, rgba(245, 158, 11, 0.1)); + background: linear-gradient(135deg, transparent, rgba(25, 118, 210, 0.1)); opacity: 0; transition: opacity var(--transition-base); border-radius: var(--radius-2xl); @@ -1648,7 +1812,7 @@ tr:hover { left: -100%; width: 100%; height: 100%; - background: linear-gradient(90deg, transparent, rgba(245, 158, 11, 0.2), transparent); + background: linear-gradient(90deg, transparent, rgba(25, 118, 210, 0.2), transparent); transition: left 0.5s ease; } @@ -1675,7 +1839,7 @@ tr:hover { top: 50%; left: 50%; transform: translate(-50%, -50%) scale(0); - background: radial-gradient(circle, rgba(245, 158, 11, 0.3), transparent); + background: radial-gradient(circle, rgba(25, 118, 210, 0.3), transparent); border-radius: 50%; opacity: 0; transition: all 0.5s ease; @@ -1702,7 +1866,7 @@ tr:hover { transform: translate(-50%, -50%) scale(0); width: 60px; height: 60px; - background: rgba(245, 158, 11, 0.9); + background: rgba(25, 118, 210, 0.9); border-radius: 50%; opacity: 0; transition: all 0.3s ease; @@ -1743,7 +1907,7 @@ tr:hover { bottom: 0; width: 0; height: 2px; - background: var(--primary-orange); + background: var(--primary-blue); transition: width 0.3s ease; } @@ -1756,14 +1920,14 @@ tr:hover { 0%, 100% { box-shadow: var(--shadow-md), - 0 0 20px rgba(245, 158, 11, 0.3), - inset 0 0 20px rgba(245, 158, 11, 0.1); + 0 0 20px rgba(25, 118, 210, 0.3), + inset 0 0 20px rgba(25, 118, 210, 0.1); } 50% { box-shadow: var(--shadow-lg), - 0 0 30px rgba(245, 158, 11, 0.5), - inset 0 0 30px rgba(245, 158, 11, 0.2); + 0 0 30px rgba(25, 118, 210, 0.5), + inset 0 0 30px rgba(25, 118, 210, 0.2); } } @@ -1774,7 +1938,7 @@ tr:hover { /* 文字打字机效果类 */ .typewriter { overflow: hidden; - border-right: 2px solid var(--primary-orange); + border-right: 2px solid var(--primary-blue); white-space: nowrap; animation: typing 3.5s steps(40) 1s 1 normal both, blink 0.75s step-end infinite; @@ -1802,7 +1966,7 @@ tr::before { top: 0; width: 3px; height: 0; - background: var(--primary-orange); + background: var(--primary-blue); transition: height var(--transition-base); } @@ -1817,10 +1981,10 @@ tr:hover::before { @keyframes breathe { 0%, 100% { - box-shadow: 0 0 20px rgba(245, 158, 11, 0.4); + box-shadow: 0 0 20px rgba(25, 118, 210, 0.4); } 50% { - box-shadow: 0 0 30px rgba(245, 158, 11, 0.7); + box-shadow: 0 0 30px rgba(25, 118, 210, 0.7); } } @@ -1835,28 +1999,28 @@ tr:hover::before { } ::-webkit-scrollbar-thumb { - background: var(--primary-orange); + background: var(--primary-blue); border-radius: var(--radius-full); } ::-webkit-scrollbar-thumb:hover { - background: var(--accent-amber); + background: var(--accent-cyan); } /* 选中文本样式 */ ::selection { - background: var(--primary-orange); + background: var(--primary-blue); color: white; } ::-moz-selection { - background: var(--primary-orange); + background: var(--primary-blue); color: white; } /* 焦点可见性优化 */ *:focus-visible { - outline: 2px solid var(--primary-orange); + outline: 2px solid var(--primary-blue); outline-offset: 2px; border-radius: var(--radius-sm); } @@ -1986,7 +2150,7 @@ img.error { } body:not(.dark-theme) .theme-icon-light { - color: var(--primary-orange); + color: var(--primary-blue); transform: scale(1.2); } @@ -1995,10 +2159,82 @@ body:not(.dark-theme) .theme-icon-dark { } body.dark-theme .theme-icon-dark { - color: var(--primary-orange); + color: var(--primary-blue); transform: scale(1.2); } body.dark-theme .theme-icon-light { opacity: 0.5; } + +/* ========== 机器人工作流程可视化 ========== */ +.robot-workflow-visual { + margin-bottom: var(--spacing-2xl); +} + +.workflow-step { + text-align: center; + transition: all var(--transition-base); + cursor: pointer; +} + +.workflow-step:hover { + transform: translateY(-8px); +} + +.workflow-icon { + width: 80px; + height: 80px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + margin: 0 auto var(--spacing-md); + box-shadow: var(--shadow-lg); + transition: all var(--transition-base); +} + +.workflow-step:hover .workflow-icon { + box-shadow: var(--shadow-xl), 0 0 30px rgba(0,0,0,0.3); + transform: scale(1.1); +} + +.workflow-number { + font-size: var(--text-lg); + font-weight: var(--font-bold); + color: var(--text-gray); + margin-bottom: var(--spacing-xs); +} + +.workflow-step h4 { + font-size: var(--text-lg); + font-weight: var(--font-bold); + color: var(--text-light); + margin-bottom: var(--spacing-xs); +} + +.workflow-step p { + font-size: var(--text-sm); + color: var(--text-gray); +} + +@media (max-width: 1024px) { + .robot-workflow-visual > div { + grid-template-columns: repeat(3, 1fr) !important; + } +} + +@media (max-width: 768px) { + .robot-workflow-visual > div { + grid-template-columns: repeat(2, 1fr) !important; + } + + .workflow-icon { + width: 60px; + height: 60px; + } + + .workflow-step h4 { + font-size: var(--text-base); + } +} diff --git a/web_frontend/web_result/order-classes/energy/index.html b/web_frontend/web_result/order-classes/energy/index.html index 77cf81fa..38d973d1 100644 --- a/web_frontend/web_result/order-classes/energy/index.html +++ b/web_frontend/web_result/order-classes/energy/index.html @@ -6,6 +6,179 @@ 光伏晶硅电池片印后AOI检测与分拣单元 - 能源订单班 + + + @@ -208,82 +381,43 @@
- -
-
- - - - -
-
3600
-
片/时
-
+ +
+
+
-
设计产能
+
3600片/时
+
设计产能
-
-
- - - - -
-
99.7
-
%
-
+
+
+
-
检出率
+
99.7%
+
检出率
-
-
- - - - -
-
0.5
-
%
-
+
+
+
-
误检率
+
0.5%
+
误检率
-
-
- - - - -
-
300
-
ms
-
+
+
+
-
检测时间
+
300ms
+
检测时间
- -
-
-
- -
-

智能化生产线

-

PLC + 机器视觉 + 机器人协同工作

-
-
-
@@ -303,11 +437,6 @@

采用西门子TIA Portal V17开发,基于IEC 61131-3标准的SCL+梯形图混合编程。系统划分为6个核心功能模块:启动安全链、物料检测、AOI检测触发、机器人抓取交互、MES数据上传、异常处理。使用DB块结构化数据存储,通过Profinet实时通讯(500ms循环周期)实现PLC-机器人-视觉系统的无缝协同。

-
- 控制流程图 -
系统控制流程Mermaid图
-
-
@@ -347,11 +476,103 @@
- -
- PLC控制流程 -
-
13路输出
+ +
+
+ +
+ + + + +
+ + +
+
+graph TB
+    Start([系统启动]) --> SafetyCheck{安全链检测
FB100} + SafetyCheck -->|安全链OK| MaterialDetect[物料检测
FB200
I0.3-I0.5传感器] + SafetyCheck -->|安全链异常| ErrorHandle[异常处理
FB600] + + MaterialDetect -->|检测到物料| ConveyorControl[输送带控制
Q0.0启动] + ConveyorControl --> PositionClamp[定位夹持
Q0.1-Q0.2] + PositionClamp --> AOITrigger[AOI检测触发
FB300
Q0.3相机触发] + + AOITrigger --> VisionProcess{视觉系统
In-Sight D900} + VisionProcess -->|检测完成
I0.6| ResultReceive[接收检测结果
OK/RW/NG] + VisionProcess -->|检测异常
I0.7| ErrorHandle + + ResultReceive --> RobotInteract[机器人交互
FB400
Q0.5-Q0.7] + RobotInteract -->|等待机器人
I1.0就绪| RobotGrab[机器人抓取
I1.1完成] + RobotGrab --> MESUpload[MES数据上传
FB500
Q1.4握手] + + MESUpload --> NextCycle{继续循环?} + NextCycle -->|是| MaterialDetect + NextCycle -->|否| End([流程结束]) + + ErrorHandle -->|报警
Q1.3蜂鸣器| AlarmLight[故障指示
Q1.1红灯] + AlarmLight --> ManualReset{手动复位?} + ManualReset -->|复位
I1.5| SafetyCheck + ManualReset -->|急停
I0.0-I0.2| EmergencyStop[紧急停止
切断所有输出] + + style Start fill:#4a9d5f,stroke:#2d7a3f,color:#fff + style End fill:#4a9d5f,stroke:#2d7a3f,color:#fff + style SafetyCheck fill:#f59e0b,stroke:#d97706,color:#fff + style VisionProcess fill:#f59e0b,stroke:#d97706,color:#fff + style NextCycle fill:#f59e0b,stroke:#d97706,color:#fff + style ManualReset fill:#f59e0b,stroke:#d97706,color:#fff + style ErrorHandle fill:#ef4444,stroke:#dc2626,color:#fff + style EmergencyStop fill:#ef4444,stroke:#dc2626,color:#fff + style AlarmLight fill:#ef4444,stroke:#dc2626,color:#fff +
+
+ +
+
交互式流程图
+
@@ -467,20 +688,12 @@
- -
-
-
- -
-

精密机器人分拣

-

±0.02mm定位精度 · ≤0.8秒单次节拍

-
-
- -
-
+
+ +
+ +
机器人调试工程师
@@ -497,92 +710,67 @@

基于ABB RobotStudio离线编程,使用RAPID语言开发拾取-判断-分拣主程序。系统通过真空吸盘拾取电池片(负压-60kPa),根据PLC传输的检测结果(OK/RW/NG)执行对应分拣路径。采用多点轨迹规划优化节拍(单次循环≤0.8秒),使用WorldZone碰撞检测保障安全,通过TCP精度补偿实现±0.02mm重复定位精度。

-
- 光伏面板分拣场景 -
机器人分拣路径三维仿真
-
- - -
-

分拣逻辑流程

- -
+ +
+
-
-
- -
-
-
步骤 1
-

等待PLC就绪信号

-

检测DI1=1,确认系统准备就绪

-
初始化
+
+
+
+
01
+

等待就绪

+

DI1信号检测

-
-
- -
-
-
步骤 2
-

移动至拾取点

-

机器人移动→开启真空→检测吸附成功

-
拾取
+
+
+
+
02
+

移动拾取

+

300mm/s速度

-
-
- -
-
-
步骤 3
-

读取检测结果

-

从PLC读取DI2-DI3编码,获取质量判定

-
判断
+
+
+
+
03
+

读取结果

+

DI2-DI3编码

-
-
- -
-
-
步骤 4
-

分支判断路径

-

OK→托盘1 | RW→托盘2 | NG→废料箱

-
分拣
+
+
+
+
04
+

路径判断

+

OK/RW/NG分支

-
-
- -
-
-
步骤 5
-

到达目标位置

-

精确定位→关闭真空→等待释放确认

-
放置
+
+
+
+
05
+

精确放置

+

±0.02mm精度

-
-
- -
-
-
步骤 6
-

返回原点并循环

-

发送完成信号DO1=1,准备下一次循环

-
完成
+
+
+
+
06
+

返回循环

+

DO1反馈信号

@@ -719,17 +907,6 @@
- -
-
-
- -
-

深度学习视觉检测

-

99.7%检出率 · 0.05mm缺陷可检出

-
-
-
@@ -926,8 +1103,9 @@
-
-

⚡ 核心技术

+
+
+

⚡ 核心技术

    @@ -944,8 +1122,9 @@
-
-

📊 性能指标

+
+
+

📊 性能指标

    @@ -962,8 +1141,9 @@
-
-

🎯 应用成果

+
+
+

🎯 应用成果

    @@ -988,5 +1168,70 @@
+ + + diff --git a/web_frontend/web_result/order-classes/energy/js/main.js b/web_frontend/web_result/order-classes/energy/js/main.js index 077b9c9f..e7a91f36 100644 --- a/web_frontend/web_result/order-classes/energy/js/main.js +++ b/web_frontend/web_result/order-classes/energy/js/main.js @@ -279,14 +279,21 @@ function initThemeToggle() { if (themeToggleBtn) { themeToggleBtn.addEventListener('click', () => { document.body.classList.toggle('dark-theme'); + + const isDark = document.body.classList.contains('dark-theme'); // 保存用户偏好 - if (document.body.classList.contains('dark-theme')) { + if (isDark) { localStorage.setItem('theme', 'dark'); } else { localStorage.setItem('theme', 'light'); } + // 更新Mermaid图表主题 + if (typeof window.updateMermaidTheme === 'function') { + window.updateMermaidTheme(isDark); + } + // 重新初始化图标以确保正确显示 if (typeof lucide !== 'undefined') { lucide.createIcons(); diff --git a/web_frontend/web_result/order-classes/food/index.html b/web_frontend/web_result/order-classes/food/index.html index 75d9d170..3a8228b3 100644 --- a/web_frontend/web_result/order-classes/food/index.html +++ b/web_frontend/web_result/order-classes/food/index.html @@ -435,6 +435,230 @@
+ + +
+ +
+

+ + 营销与推广 +

+

全方位营销策略,打造品牌影响力

+
+ +
+ +
+
+
+ +
+

品牌建设

+
+
+
+
+
+

+ + 品牌视觉 +

+
    +
  • 设计简洁LOGO(以"绿叶+叉子"为核心元素)
  • +
  • 统一门店装修、外卖包装、宣传物料的视觉风格
  • +
  • 外卖盒采用可降解材质,印上"每日营养小贴士"
  • +
+
+
+

+ + 口碑打造 +

+
    +
  • 建立"差评24小时响应机制"
  • +
  • 对投诉客户实行"退款+赠送双人餐"补偿
  • +
  • 鼓励客户在小红书/抖音分享用餐体验,凭截图兑换10元优惠券
  • +
+
+
+
+
+
+ + +
+
+
+ +
+

线上营销

+
+
+
+
+
+

+ + 社交媒体运营 +

+
+
+

📱 微信公众号

+
    +
  • 每周更新3篇内容(2篇营养知识 + 1篇产品推荐)
  • +
  • 粉丝增长目标:开业3个月达5000人
  • +
+
+
+

📹 抖音/小红书

+
    +
  • 每周发布2条短视频(制作过程 + 客户反馈)
  • +
  • 合作10万粉丝以上美食/健身博主(每月2-3位)
  • +
  • 单次推广目标带来订单增长20%
  • +
+
+
+
+
+

+ + 外卖平台运营 +

+
    +
  • 入驻美团、饿了么,设置"新客立减15元""满60减20元"活动
  • +
  • 配送时效承诺30分钟内,超时免单
  • +
  • 外卖包装标注"食材新鲜度追溯码"
  • +
  • 目标:上线1个月内平台评分达4.8分以上,月外卖订单量达2000单
  • +
+
+
+
+
+
+ + +
+
+
+ +
+

线下推广

+
+
+
+
+
+

+ + 精准触达 +

+
+
+

🏢 写字楼推广

+
    +
  • 每周一、三在目标写字楼发放传单500份/天
  • +
  • 传单附"满50减10元"优惠券(有效期7天)
  • +
+
+
+

💪 健身房合作

+
    +
  • 与周边3-5家健身房达成合作
  • +
  • 健身卡办卡用户可获"轻食体验券(价值45元)"
  • +
  • 健身房会员凭卡到店消费享9折优惠
  • +
+
+
+
+
+

+ + 体验活动 +

+
    +
  • 每月举办1次"轻食体验日",邀请20-30位潜在客户
  • +
  • 现场安排营养师讲解"轻食搭配技巧"
  • +
  • 收集反馈率需达80%以上
  • +
  • 转化试吃客户为会员的比例目标30%
  • +
+
+
+
+
+
+ + +
+
+
+ +
+

会员制度

+
+
+
+
+
+

+ + 会员权益 +

+
+
+

💰 充值优惠

+
    +
  • 充值200元送30元
  • +
  • 充值500元送100元
  • +
  • 充值1000元送250元
  • +
+
+
+

🎁 消费福利

+
    +
  • 会员消费享9折
  • +
  • 生日当天送"免费定制餐+小蛋糕"
  • +
  • 积分1元=1分(100分可兑换价值25元的经典沙拉)
  • +
+
+
+

⭐ 专属服务

+
    +
  • 优先体验新品
  • +
  • 免费获取"个性化营养食谱"(营养师根据会员体重/目标定制)
  • +
+
+
+
+
+

+ + 会员增长目标 +

+
+
+
开业1个月
+
300人
+
+
+
开业3个月
+
800人
+
+
+
开业1年
+
2000人
+
+
+
会员复购率
+
60%+
+
+
+
+
+
+
+
+
diff --git a/web_frontend/web_result/order-classes/health/css/styles.css b/web_frontend/web_result/order-classes/health/css/styles.css index 1c29271b..c68e28f6 100644 --- a/web_frontend/web_result/order-classes/health/css/styles.css +++ b/web_frontend/web_result/order-classes/health/css/styles.css @@ -17,14 +17,14 @@ --hover-bg: rgba(16, 185, 129, 0.15); /* 悬停背景 */ --active-bg: rgba(16, 185, 129, 0.2); /* 激活背景 */ - /* 间距系统 - 针对大屏幕优化 */ - --spacing-xs: 0.75rem; /* 12px */ - --spacing-sm: 1.25rem; /* 20px */ - --spacing-md: 2rem; /* 32px */ - --spacing-lg: 3rem; /* 48px */ - --spacing-xl: 4rem; /* 64px */ - --spacing-2xl: 6rem; /* 96px */ - --spacing-3xl: 8rem; /* 128px */ + /* 间距系统 - 紧凑布局优化 */ + --spacing-xs: 0.5rem; /* 8px - 减小从12px */ + --spacing-sm: 0.75rem; /* 12px - 减小从20px */ + --spacing-md: 1.25rem; /* 20px - 减小从32px */ + --spacing-lg: 2rem; /* 32px - 减小从48px */ + --spacing-xl: 2.5rem; /* 40px - 减小从64px */ + --spacing-2xl: 3rem; /* 48px - 减小从96px */ + --spacing-3xl: 4rem; /* 64px - 减小从128px */ /* 字体系统 */ --font-primary: 'Inter', 'Noto Sans SC', -apple-system, BlinkMacSystemFont, sans-serif; @@ -124,7 +124,7 @@ body { justify-content: center; background: linear-gradient(135deg, rgba(240, 253, 244, 0.9) 0%, rgba(236, 253, 245, 0.95) 100%), - url('../images/情绪数据分析表.jpg'); + url('https://images.unsplash.com/photo-1573497491208-6b1acb260507?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -136,7 +136,7 @@ body { body.dark-theme .hero { background: linear-gradient(135deg, rgba(6, 78, 59, 0.9) 0%, rgba(5, 150, 105, 0.8) 100%), - url('../images/情绪数据分析表.jpg'); + url('https://images.unsplash.com/photo-1573497491208-6b1acb260507?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -287,7 +287,7 @@ body.dark-theme .hero { .section:nth-child(1) { background-image: linear-gradient(to bottom, rgba(240, 253, 244, 0.9) 0%, rgba(236, 253, 245, 1) 100%), - url('../images/情绪数据分析表.jpg'); + url('https://images.unsplash.com/photo-1573497491208-6b1acb260507?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -296,7 +296,7 @@ body.dark-theme .hero { .section:nth-child(2) { background-image: linear-gradient(to bottom, rgba(240, 253, 244, 0.9) 0%, rgba(236, 253, 245, 1) 100%), - url('../images/心理状态结构化分析示意图.jpg'); + url('https://images.unsplash.com/photo-1519494026892-80bbd2d6fd0d?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -305,7 +305,7 @@ body.dark-theme .hero { .section:nth-child(3) { background-image: linear-gradient(to bottom, rgba(240, 253, 244, 0.9) 0%, rgba(236, 253, 245, 1) 100%), - url('../images/目标设定可视化示意图.jpg'); + url('https://images.unsplash.com/photo-1516321318423-f06f85e504b3?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -314,7 +314,7 @@ body.dark-theme .hero { .section:nth-child(4) { background-image: linear-gradient(to bottom, rgba(240, 253, 244, 0.9) 0%, rgba(236, 253, 245, 1) 100%), - url('../images/干预方法选择示意图.jpg'); + url('https://images.unsplash.com/photo-1528909514045-2fa4ac7a08ba?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -324,7 +324,7 @@ body.dark-theme .hero { .section:nth-child(n+5):nth-child(odd) { background-image: linear-gradient(to bottom, rgba(240, 253, 244, 0.9) 0%, rgba(236, 253, 245, 1) 100%), - url('../images/临床心理结案报告.jpg'); + url('https://images.unsplash.com/photo-1497366216548-37526070297c?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -333,7 +333,7 @@ body.dark-theme .hero { .section:nth-child(n+5):nth-child(even) { background-image: linear-gradient(to bottom, rgba(240, 253, 244, 0.9) 0%, rgba(236, 253, 245, 1) 100%), - url('../images/情绪数据分析表.jpg'); + url('https://images.unsplash.com/photo-1573497491208-6b1acb260507?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -343,7 +343,7 @@ body.dark-theme .hero { body.dark-theme .section:nth-child(1) { background-image: linear-gradient(to bottom, rgba(6, 78, 59, 0.92) 0%, rgba(5, 150, 105, 0.88) 100%), - url('../images/情绪数据分析表.jpg'); + url('https://images.unsplash.com/photo-1573497491208-6b1acb260507?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -352,7 +352,7 @@ body.dark-theme .section:nth-child(1) { body.dark-theme .section:nth-child(2) { background-image: linear-gradient(to bottom, rgba(5, 150, 105, 0.90) 0%, rgba(6, 78, 59, 0.88) 100%), - url('../images/心理状态结构化分析示意图.jpg'); + url('https://images.unsplash.com/photo-1519494026892-80bbd2d6fd0d?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -361,7 +361,7 @@ body.dark-theme .section:nth-child(2) { body.dark-theme .section:nth-child(3) { background-image: linear-gradient(to bottom, rgba(6, 78, 59, 0.92) 0%, rgba(5, 150, 105, 0.88) 100%), - url('../images/目标设定可视化示意图.jpg'); + url('https://images.unsplash.com/photo-1516321318423-f06f85e504b3?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -370,7 +370,7 @@ body.dark-theme .section:nth-child(3) { body.dark-theme .section:nth-child(4) { background-image: linear-gradient(to bottom, rgba(5, 150, 105, 0.90) 0%, rgba(6, 78, 59, 0.88) 100%), - url('../images/干预方法选择示意图.jpg'); + url('https://images.unsplash.com/photo-1528909514045-2fa4ac7a08ba?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -380,7 +380,7 @@ body.dark-theme .section:nth-child(4) { body.dark-theme .section:nth-child(n+5):nth-child(odd) { background-image: linear-gradient(to bottom, rgba(6, 78, 59, 0.92) 0%, rgba(5, 150, 105, 0.88) 100%), - url('../images/临床心理结案报告.jpg'); + url('https://images.unsplash.com/photo-1497366216548-37526070297c?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -389,7 +389,7 @@ body.dark-theme .section:nth-child(n+5):nth-child(odd) { body.dark-theme .section:nth-child(n+5):nth-child(even) { background-image: linear-gradient(to bottom, rgba(5, 150, 105, 0.90) 0%, rgba(6, 78, 59, 0.88) 100%), - url('../images/情绪数据分析表.jpg'); + url('https://images.unsplash.com/photo-1573497491208-6b1acb260507?w=1920&q=80'); background-size: cover; background-position: center; background-attachment: fixed; @@ -579,10 +579,10 @@ body.dark-theme tr:hover { flex: 1; } -/* ========== 图片容器 - 突出展示 - 超大气布局 ========== */ +/* ========== 图片容器 - 紧凑布局 ========== */ .image-container { width: 100%; - aspect-ratio: 3/2; + aspect-ratio: 16/9; /* 更紧凑的比例,16:9宽屏比例 */ overflow: hidden; border-radius: 0; margin-bottom: 0; @@ -593,6 +593,7 @@ body.dark-theme tr:hover { transition: all var(--transition-base); order: 1; flex-shrink: 0; + cursor: pointer; /* 添加点击光标提示 */ } .image-container img { @@ -604,8 +605,14 @@ body.dark-theme tr:hover { } .image-container:hover img { - transform: scale(1.1); - filter: brightness(1.1); + transform: scale(1.03); /* 减小放大效果,避免内容看不清 */ + filter: brightness(1.0); /* 轻微提亮 */ +} + +/* 效果评估section的图片不裁剪,完整显示 */ +.section:nth-of-type(4) .image-container img { + object-fit: contain; + background: var(--bg-dark); } .image-caption { @@ -959,3 +966,139 @@ body.dark-theme .theme-icon-dark { body.dark-theme .theme-icon-light { opacity: 0.5; } + +/* ========== 图片放大Lightbox模态框 ========== */ +.lightbox-modal { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.95); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + display: flex; + align-items: center; + justify-content: center; + z-index: 9999; + opacity: 0; + visibility: hidden; + transition: opacity var(--transition-slow), visibility var(--transition-slow); + padding: var(--spacing-xl); + cursor: zoom-out; +} + +.lightbox-modal.active { + opacity: 1; + visibility: visible; +} + +.lightbox-content { + position: relative; + max-width: 90vw; + max-height: 90vh; + transform: scale(0.9); + transition: transform var(--transition-slow); + cursor: default; +} + +.lightbox-modal.active .lightbox-content { + transform: scale(1); +} + +.lightbox-image { + max-width: 100%; + max-height: 90vh; + width: auto; + height: auto; + border-radius: var(--radius-xl); + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.8), + 0 0 0 3px var(--primary-green); + object-fit: contain; +} + +.lightbox-close { + position: fixed; + top: var(--spacing-xl); + right: var(--spacing-xl); + width: 60px; + height: 60px; + background: var(--primary-green); + border: 3px solid white; + border-radius: 50%; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: all var(--transition-base); + box-shadow: var(--shadow-xl); + z-index: 10000; +} + +.lightbox-close:hover { + background: var(--accent-emerald-light); + transform: rotate(90deg) scale(1.1); + box-shadow: 0 8px 24px rgba(16, 185, 129, 0.6); +} + +.lightbox-close::before, +.lightbox-close::after { + content: ''; + position: absolute; + width: 30px; + height: 3px; + background: white; + border-radius: 2px; +} + +.lightbox-close::before { + transform: rotate(45deg); +} + +.lightbox-close::after { + transform: rotate(-45deg); +} + +/* 图片信息标签 */ +.lightbox-label { + position: fixed; + bottom: var(--spacing-xl); + left: 50%; + transform: translateX(-50%); + padding: var(--spacing-md) var(--spacing-xl); + background: rgba(16, 185, 129, 0.95); + backdrop-filter: blur(10px); + color: white; + font-size: var(--text-lg); + font-weight: var(--font-semibold); + border-radius: var(--radius-full); + box-shadow: var(--shadow-xl); + text-transform: uppercase; + letter-spacing: 0.1em; + z-index: 10000; +} + +/* 响应式 - Lightbox */ +@media (max-width: 768px) { + .lightbox-modal { + padding: var(--spacing-md); + } + + .lightbox-close { + top: var(--spacing-md); + right: var(--spacing-md); + width: 48px; + height: 48px; + } + + .lightbox-close::before, + .lightbox-close::after { + width: 24px; + } + + .lightbox-label { + font-size: var(--text-base); + padding: var(--spacing-sm) var(--spacing-lg); + bottom: var(--spacing-md); + } +} diff --git a/web_frontend/web_result/order-classes/health/js/main.js b/web_frontend/web_result/order-classes/health/js/main.js index e17c8175..0ef462d1 100644 --- a/web_frontend/web_result/order-classes/health/js/main.js +++ b/web_frontend/web_result/order-classes/health/js/main.js @@ -16,6 +16,7 @@ document.addEventListener('DOMContentLoaded', function() { initSmoothScroll(); updateStats(); initThemeToggle(); + initLightbox(); }); // 导航功能 @@ -267,3 +268,79 @@ function initThemeToggle() { }); } } + +// 图片放大查看功能(Lightbox) +function initLightbox() { + // 创建Lightbox模态框HTML结构 + const lightboxHTML = ` + + `; + + // 将Lightbox添加到页面 + document.body.insertAdjacentHTML('beforeend', lightboxHTML); + + // 获取元素 + const lightboxModal = document.getElementById('lightboxModal'); + const lightboxImage = document.getElementById('lightboxImage'); + const lightboxLabel = document.getElementById('lightboxLabel'); + const lightboxClose = document.getElementById('lightboxClose'); + + // 为所有图片容器添加点击事件 + const imageContainers = document.querySelectorAll('.image-container'); + imageContainers.forEach(container => { + container.addEventListener('click', function() { + const img = this.querySelector('img'); + if (img) { + // 获取图片信息 + const imgSrc = img.src || img.getAttribute('data-src'); + const imgAlt = img.alt || '图片'; + const caption = this.querySelector('.image-caption'); + const labelText = caption ? caption.textContent : imgAlt; + + // 设置Lightbox内容 + lightboxImage.src = imgSrc; + lightboxImage.alt = imgAlt; + lightboxLabel.textContent = labelText; + + // 显示Lightbox + lightboxModal.classList.add('active'); + document.body.style.overflow = 'hidden'; // 防止背景滚动 + } + }); + }); + + // 关闭Lightbox函数 + function closeLightbox() { + lightboxModal.classList.remove('active'); + document.body.style.overflow = ''; // 恢复滚动 + + // 延迟清空内容,等待动画完成 + setTimeout(() => { + lightboxImage.src = ''; + lightboxLabel.textContent = ''; + }, 350); + } + + // 点击关闭按钮 + lightboxClose.addEventListener('click', closeLightbox); + + // 点击背景关闭 + lightboxModal.addEventListener('click', function(e) { + if (e.target === lightboxModal) { + closeLightbox(); + } + }); + + // ESC键关闭 + document.addEventListener('keydown', function(e) { + if (e.key === 'Escape' && lightboxModal.classList.contains('active')) { + closeLightbox(); + } + }); +} diff --git a/web_frontend/web_result/order-classes/visual-design/LAYOUT_DESIGN.md b/web_frontend/web_result/order-classes/visual-design/LAYOUT_DESIGN.md new file mode 100644 index 00000000..a699a899 --- /dev/null +++ b/web_frontend/web_result/order-classes/visual-design/LAYOUT_DESIGN.md @@ -0,0 +1,716 @@ +# 视觉设计订单班 - 独特布局设计方案 + +## 设计原则 +**每个Section使用完全不同的布局模式,避免任何重复** + +--- + +## Section 1: 项目概述与宣传目标 +**布局模式:Alternating Layout (左右交替布局)** + +### ASCII 布局图 +``` +┌────────────────────────────────────────────────────────────────┐ +│ Section 1 │ +├────────────────────────────────────────────────────────────────┤ +│ 【项目定位】 - 左图右文 │ +│ ┌─────────────────┐ ┌────────────────────────────┐ │ +│ │ │ │ 📍 项目定位 │ │ +│ │ 同里古镇 │ │ 地理位置: 江苏苏州 │ │ +│ │ 航拍图 │ │ 片长设定: 6-7分钟 │ │ +│ │ (图片) │ │ 内容章节: 6大主题 │ │ +│ │ │ │ 拍摄方式: 航拍+地面 │ │ +│ └─────────────────┘ └────────────────────────────┘ │ +│ ← flex-direction: row │ +│ │ +│ 【色彩体系】 - 右图左文 (反向) │ +│ ┌────────────────────────────┐ ┌─────────────────┐ │ +│ │ 🎨 色彩体系 │ │ │ │ +│ │ 青瓦灰: 古建筑主色调 │ │ 传统配色表 │ │ +│ │ 悟道黄: 传统文化底蕴 │ │ (图片) │ │ +│ │ 山吹色: 温暖人文气息 │ │ │ │ +│ └────────────────────────────┘ └─────────────────┘ │ +│ ← flex-direction: row-reverse │ +│ │ +│ 【四大宣传目标】 - Bento Grid (不规则网格) │ +│ ┌───────────────────┬─────────┬─────────┐ │ +│ │ │ │ │ │ +│ │ 🏛️ 文化传承 │ 🍜美食 │ 🌿生态 │ │ +│ │ (grid-row: 1/3) │ 体验 │ 旅游 │ │ +│ │ 占2行高度 │ │ │ │ +│ │ ├─────────┴─────────┤ │ +│ │ │ │ │ +│ │ │ 🌾 产业融合 │ │ +│ │ │ (grid-column:2/4) │ │ +│ └───────────────────┴───────────────────┘ │ +│ ← 第1项占2行,其他项灵活排列 │ +└────────────────────────────────────────────────────────────────┘ +``` + +### CSS 实现 +```css +/* 左右交替布局 */ +.alternating-layout { + display: flex; + gap: var(--spacing-2xl); + align-items: center; + margin-bottom: var(--spacing-3xl); +} + +.alternating-layout:nth-child(even) { + flex-direction: row-reverse; /* 偶数项反向 */ +} + +.alternating-layout .image-container { + flex: 0 0 45%; /* 图片占45% */ + aspect-ratio: 16/9; +} + +.alternating-layout .content { + flex: 1; /* 内容占剩余空间 */ +} + +/* Bento Grid 不规则网格 */ +.bento-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-template-rows: repeat(2, 1fr); + gap: var(--spacing-xl); +} + +.bento-item:first-child { + grid-row: 1 / 3; /* 第1项占2行 */ +} + +.bento-item:last-child { + grid-column: 2 / 4; /* 最后1项占2列 */ +} + +/* 响应式 */ +@media (max-width: 768px) { + .alternating-layout { + flex-direction: column !important; + } + + .bento-grid { + grid-template-columns: 1fr; + grid-template-rows: auto; + } + + .bento-item:first-child, + .bento-item:last-child { + grid-row: auto; + grid-column: auto; + } +} +``` + +--- + +## Section 2: 影片视觉基调与内容设计 +**布局模式:Featured Grid (高亮第一项布局)** + +### ASCII 布局图 +``` +┌────────────────────────────────────────────────────────────────┐ +│ Section 2 │ +├────────────────────────────────────────────────────────────────┤ +│ 【六大主题章节】 - Featured Grid │ +│ ┌─────────────────────┬─────────┬─────────┬─────────┐ │ +│ │ │ │ │ │ │ +│ │ │第2章 │第3章 │第4章 │ │ +│ │ 🏛️ 第1章 │历史 │美食 │生态 │ │ +│ │ 开篇·同里古镇 │文化篇 │篇 │湿地篇 │ │ +│ │ │ │ │ │ │ +│ │ (grid-row: 1/3) ├─────────┼─────────┼─────────┤ │ +│ │ 占2行 │第5章 │第6章 │ │ │ +│ │ │农业 │夜游 │ │ │ +│ │ 大图展示 │产业篇 │同里篇 │ │ │ +│ │ │ │ │ │ │ +│ └─────────────────────┴─────────┴─────────┴─────────┘ │ +│ ← 第1章高亮,占2行高度 │ +│ │ +│ 【数据展示】 - Progress Bars (进度条样式) │ +│ ┌──────────────────────────────────────────────────────┐ │ +│ │ 影片时长 ████████░░ 6-7分钟 │ │ +│ │ 拍摄章节 ██████████ 6个 │ │ +│ │ 拍摄地点 ███████░░░ 15+个 │ │ +│ │ 航拍镜头 ████████░░ 8个 │ │ +│ └──────────────────────────────────────────────────────┘ │ +└────────────────────────────────────────────────────────────────┘ +``` + +### CSS 实现 +```css +/* Featured Grid - 高亮第一项 */ +.featured-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-template-rows: repeat(2, 1fr); + gap: var(--spacing-xl); +} + +.featured-item:first-child { + grid-column: 1 / 2; /* 占第1列 */ + grid-row: 1 / 3; /* 跨2行 */ + background: linear-gradient(135deg, + var(--primary) 0%, + var(--secondary) 100%); + color: white; +} + +.featured-item:first-child .image-container { + aspect-ratio: 3/4; /* 竖向比例 */ +} + +.featured-item:first-child .card-title { + font-size: var(--text-3xl); +} + +/* 其他项目正常尺寸 */ +.featured-item:not(:first-child) .image-container { + aspect-ratio: 4/3; +} + +/* Progress Bars */ +.progress-stats { + display: flex; + flex-direction: column; + gap: var(--spacing-md); + background: var(--bg-card); + padding: var(--spacing-xl); + border-radius: var(--radius-lg); +} + +.progress-item { + display: flex; + align-items: center; + gap: var(--spacing-md); +} + +.progress-label { + flex: 0 0 100px; + font-weight: var(--font-semibold); +} + +.progress-bar { + flex: 1; + height: 8px; + background: var(--bg-muted); + border-radius: var(--radius-full); + overflow: hidden; +} + +.progress-fill { + height: 100%; + background: linear-gradient(90deg, + var(--primary), + var(--accent)); + transition: width 1s ease; +} + +.progress-value { + flex: 0 0 80px; + text-align: right; + font-weight: var(--font-bold); + color: var(--primary); +} + +/* 响应式 */ +@media (max-width: 1024px) { + .featured-grid { + grid-template-columns: repeat(3, 1fr); + } +} + +@media (max-width: 768px) { + .featured-grid { + grid-template-columns: 1fr; + } + + .featured-item:first-child { + grid-column: auto; + grid-row: auto; + } +} +``` + +--- + +## Section 3: 分镜设计方案 +**布局模式:Timeline Layout (时间线布局)** + +### ASCII 布局图 +``` +┌────────────────────────────────────────────────────────────────┐ +│ Section 3 │ +├────────────────────────────────────────────────────────────────┤ +│ 【17个分镜设计】 - Vertical Timeline │ +│ │ +│ ●━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┐ │ +│ ┃ 镜号1 | 15秒 │ │ +│ ┃ ┌──────────┐ ┌──────────────────────────┐ │ │ +│ ┃ │ 缩略图 │ │ 同里古镇全景航拍 │ │ │ +│ ┃ │ (小图) │ │ 拍摄方式: 高空俯拍 │ │ │ +│ ┃ └──────────┘ │ 备注: 展现古镇整体布局 │ │ │ +│ ┃ └──────────────────────────┘ │ │ +│ ●━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┘ │ +│ ┃ │ +│ ●━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┐ │ +│ ┃ 镜号2 | 12秒 │ │ +│ ┃ ┌──────────┐ ┌──────────────────────────┐ │ │ +│ ┃ │ 缩略图 │ │ 水乡特色河道 │ │ │ +│ ┃ │ (小图) │ │ 拍摄方式: 低空航拍 │ │ │ +│ ┃ └──────────┘ │ 备注: 展现水系脉络 │ │ │ +│ ┃ └──────────────────────────┘ │ │ +│ ●━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┘ │ +│ ┃ │ +│ ●━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┐ │ +│ ┃ 镜号3 | 20秒 │ │ +│ ┃ ... │ │ +│ ●━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┘ │ +│ │ +│ ← 垂直时间线,左侧圆点,右侧内容卡片 │ +│ │ +│ 【拍摄技法总结】 - Icon Grid (图标网格) │ +│ ┌────────────┬────────────┬────────────┬────────────┐ │ +│ │ 📐 航拍 │ 🎥 地面 │ ⚡ 特殊 │ 🎨 后期 │ │ +│ │ 8个镜头 │ 6个镜头 │ 3个镜头 │ 调色+特效 │ │ +│ └────────────┴────────────┴────────────┴────────────┘ │ +└────────────────────────────────────────────────────────────────┘ +``` + +### CSS 实现 +```css +/* Vertical Timeline */ +.timeline-container { + position: relative; + padding-left: var(--spacing-3xl); +} + +.timeline-container::before { + content: ''; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 3px; + background: linear-gradient( + to bottom, + var(--primary) 0%, + var(--accent) 100% + ); +} + +.timeline-item { + position: relative; + margin-bottom: var(--spacing-2xl); + background: var(--bg-card); + padding: var(--spacing-lg); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-md); +} + +.timeline-item::before { + content: ''; + position: absolute; + left: calc(-1 * var(--spacing-3xl) - 8px); + top: var(--spacing-lg); + width: 20px; + height: 20px; + background: var(--primary); + border: 3px solid white; + border-radius: 50%; + box-shadow: 0 0 0 3px var(--primary-light); +} + +.timeline-header { + display: flex; + align-items: center; + gap: var(--spacing-md); + margin-bottom: var(--spacing-md); + padding-bottom: var(--spacing-md); + border-bottom: 1px solid var(--border); +} + +.timeline-badge { + display: inline-block; + padding: var(--spacing-xs) var(--spacing-md); + background: var(--primary); + color: white; + border-radius: var(--radius-full); + font-weight: var(--font-bold); + font-size: var(--text-sm); +} + +.timeline-duration { + color: var(--text-gray); + font-size: var(--text-sm); +} + +.timeline-content { + display: flex; + gap: var(--spacing-lg); + align-items: flex-start; +} + +.timeline-thumbnail { + flex: 0 0 150px; + aspect-ratio: 16/9; + border-radius: var(--radius-md); + overflow: hidden; + background: var(--bg-muted); +} + +.timeline-description { + flex: 1; +} + +.timeline-title { + font-size: var(--text-xl); + font-weight: var(--font-semibold); + margin-bottom: var(--spacing-sm); +} + +.timeline-details { + display: flex; + flex-direction: column; + gap: var(--spacing-xs); + font-size: var(--text-sm); + color: var(--text-gray); +} + +/* Icon Grid */ +.icon-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: var(--spacing-lg); + margin-top: var(--spacing-2xl); +} + +.icon-card { + text-align: center; + padding: var(--spacing-xl); + background: var(--bg-card); + border-radius: var(--radius-lg); + border: 2px solid var(--border); + transition: all 0.3s ease; +} + +.icon-card:hover { + border-color: var(--primary); + transform: translateY(-5px); +} + +.icon-card-icon { + font-size: 3rem; + margin-bottom: var(--spacing-md); +} + +.icon-card-title { + font-size: var(--text-lg); + font-weight: var(--font-semibold); + margin-bottom: var(--spacing-xs); +} + +.icon-card-value { + color: var(--text-gray); + font-size: var(--text-sm); +} + +/* 响应式 */ +@media (max-width: 768px) { + .timeline-content { + flex-direction: column; + } + + .timeline-thumbnail { + flex: 0 0 auto; + width: 100%; + } + + .icon-grid { + grid-template-columns: repeat(2, 1fr); + } +} +``` + +--- + +## Section 4: 拍摄预算与制作安排 +**布局模式:Accordion Panels (手风琴折叠面板)** + +### ASCII 布局图 +``` +┌────────────────────────────────────────────────────────────────┐ +│ Section 4 │ +├────────────────────────────────────────────────────────────────┤ +│ 【Accordion手风琴面板】 │ +│ │ +│ ┌──────────────────────────────────────────────────────────┐ │ +│ │ 💰 预算明细 (展开状态) ▼ │ │ +│ ├──────────────────────────────────────────────────────────┤ │ +│ │ ┌────────────┬──────────────┬───────┬──────┐ │ │ +│ │ │ 预算项目 │ 明细说明 │ 金额 │ 占比 │ │ │ +│ │ ├────────────┼──────────────┼───────┼──────┤ │ │ +│ │ │ 前期策划 │ 创意策划... │20,000 │ 7.3% │ │ │ +│ │ │ 导演费用 │ 导演统筹... │15,000 │ 5.5% │ │ │ +│ │ │ ... │ ... │ ... │ ... │ │ │ +│ │ └────────────┴──────────────┴───────┴──────┘ │ │ +│ │ │ │ +│ │ 【饼图】预算占比可视化 │ │ +│ │ 前期策划 7.3% │ │ +│ │ ●●○○○○○○○○ │ │ +│ │ 器材租赁 16.4% │ │ +│ │ ●●●○○○○○○○ │ │ +│ │ 后期剪辑 18.3% │ │ +│ │ ●●●●○○○○○○ │ │ +│ └──────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌──────────────────────────────────────────────────────────┐ │ +│ │ 👥 团队配置 (折叠状态) ▶ │ │ +│ └──────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌──────────────────────────────────────────────────────────┐ │ +│ │ 📅 拍摄进度 (折叠状态) ▶ │ │ +│ └──────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌──────────────────────────────────────────────────────────┐ │ +│ │ 📷 器材清单 (折叠状态) ▶ │ │ +│ └──────────────────────────────────────────────────────────┘ │ +│ │ +│ ┌──────────────────────────────────────────────────────────┐ │ +│ │ 🎬 后期制作 (折叠状态) ▶ │ │ +│ └──────────────────────────────────────────────────────────┘ │ +│ │ +│ ← 点击展开/折叠,节省空间,清晰分类 │ +└────────────────────────────────────────────────────────────────┘ +``` + +### CSS 实现 +```css +/* Accordion Container */ +.accordion-container { + display: flex; + flex-direction: column; + gap: var(--spacing-md); +} + +.accordion-item { + background: var(--bg-card); + border-radius: var(--radius-lg); + border: 2px solid var(--border); + overflow: hidden; + transition: all 0.3s ease; +} + +.accordion-item.active { + border-color: var(--primary); + box-shadow: 0 0 0 3px var(--primary-light); +} + +.accordion-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--spacing-lg) var(--spacing-xl); + background: var(--bg-semi-dark); + cursor: pointer; + transition: all 0.3s ease; +} + +.accordion-header:hover { + background: var(--bg-hover); +} + +.accordion-title { + display: flex; + align-items: center; + gap: var(--spacing-md); + font-size: var(--text-xl); + font-weight: var(--font-semibold); +} + +.accordion-icon { + font-size: 1.5rem; +} + +.accordion-toggle { + font-size: 1.5rem; + color: var(--text-gray); + transition: transform 0.3s ease; +} + +.accordion-item.active .accordion-toggle { + transform: rotate(180deg); +} + +.accordion-content { + max-height: 0; + overflow: hidden; + transition: max-height 0.5s ease; + padding: 0 var(--spacing-xl); +} + +.accordion-item.active .accordion-content { + max-height: 2000px; /* 足够大的值 */ + padding: var(--spacing-xl); +} + +/* 预算饼图样式 */ +.budget-chart { + display: flex; + flex-direction: column; + gap: var(--spacing-md); + margin-top: var(--spacing-lg); +} + +.chart-item { + display: flex; + align-items: center; + gap: var(--spacing-md); +} + +.chart-label { + flex: 0 0 150px; + font-size: var(--text-sm); +} + +.chart-bar { + flex: 1; + height: 12px; + background: var(--bg-muted); + border-radius: var(--radius-full); + overflow: hidden; +} + +.chart-fill { + height: 100%; + background: linear-gradient(90deg, + var(--primary), + var(--accent)); + border-radius: var(--radius-full); + transition: width 1s ease; +} + +.chart-value { + flex: 0 0 60px; + text-align: right; + font-weight: var(--font-bold); + color: var(--primary); + font-size: var(--text-sm); +} + +/* 团队卡片网格 */ +.team-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: var(--spacing-lg); +} + +.team-card { + text-align: center; + padding: var(--spacing-lg); + background: var(--bg-muted); + border-radius: var(--radius-md); +} + +.team-icon { + font-size: 2rem; + margin-bottom: var(--spacing-sm); +} + +.team-role { + font-weight: var(--font-semibold); + margin-bottom: var(--spacing-xs); +} + +.team-count { + color: var(--text-gray); + font-size: var(--text-sm); +} + +/* 响应式 */ +@media (max-width: 768px) { + .accordion-header { + padding: var(--spacing-md); + } + + .accordion-title { + font-size: var(--text-lg); + } + + .team-grid { + grid-template-columns: repeat(2, 1fr); + } +} +``` + +### JavaScript 交互 +```javascript +// Accordion 交互逻辑 +document.querySelectorAll('.accordion-header').forEach(header => { + header.addEventListener('click', () => { + const item = header.parentElement; + const wasActive = item.classList.contains('active'); + + // 关闭所有其他面板 + document.querySelectorAll('.accordion-item').forEach(otherItem => { + otherItem.classList.remove('active'); + }); + + // 切换当前面板 + if (!wasActive) { + item.classList.add('active'); + } + }); +}); + +// 默认打开第一个面板 +document.querySelector('.accordion-item')?.classList.add('active'); +``` + +--- + +## 布局对比总结 + +### 各Section布局特点 + +| Section | 布局模式 | 关键特征 | 适用场景 | +|---------|---------|---------|---------| +| **Section 1** | Alternating Layout + Bento Grid | 左右交替 + 不规则网格 | 图文并茂展示,第一印象 | +| **Section 2** | Featured Grid | 第1项高亮占2行 | 突出重点章节 | +| **Section 3** | Timeline | 垂直时间线 | 按时间顺序展示流程 | +| **Section 4** | Accordion | 折叠面板 | 大量分类信息收纳 | + +### 布局多样性达成 +✅ **0重复** - 每个Section完全不同的布局模式 +✅ **视觉层次** - 从开放布局到紧凑布局逐步过渡 +✅ **交互丰富** - 静态展示 + 动态交互结合 +✅ **响应式完善** - 所有布局都支持移动端 + +--- + +## 实施步骤 + +1. **Section 1**: + - 替换Grid-2为Alternating Layout + - 替换Grid-4为Bento Grid + +2. **Section 2**: + - Grid-3改为Featured Grid + - Stats改为Progress Bars + +3. **Section 3**: + - Table保留但改为Timeline卡片 + - Grid-3改为Icon Grid + +4. **Section 4**: + - 所有内容整合到Accordion面板 + - Table和Grid作为面板内容展示 + +--- + +**设计完成时间**: 2025年10月 +**设计师**: Claude Code Assistant +**版本**: v1.0 diff --git a/web_frontend/web_result/order-classes/visual-design/TIMELINE_ITEMS.txt b/web_frontend/web_result/order-classes/visual-design/TIMELINE_ITEMS.txt new file mode 100644 index 00000000..cc225d86 --- /dev/null +++ b/web_frontend/web_result/order-classes/visual-design/TIMELINE_ITEMS.txt @@ -0,0 +1,342 @@ + +
+ +
+
+ 镜号 1 + | 15秒 +
+
+
+ 同里古镇全景航拍 +
+
+

同里古镇全景航拍

+
+
拍摄方式: 高空俯拍
+
备注: 展现古镇整体布局
+
+
+
+
+ + +
+
+ 镜号 2 + | 12秒 +
+
+
+ 水乡特色河道 +
+
+

水乡特色河道

+
+
拍摄方式: 低空航拍
+
备注: 展现水系脉络
+
+
+
+
+ + +
+
+ 镜号 3 + | 20秒 +
+
+
+ 退思园建筑群 +
+
+

退思园建筑群

+
+
拍摄方式: 地面推进
+
备注: 世界遗产重点展示
+
+
+
+
+ + +
+
+ 镜号 4 + | 18秒 +
+
+
+ 三桥文化场景 +
+
+

三桥文化场景

+
+
拍摄方式: 平移拍摄
+
备注: 传统婚俗展现
+
+
+
+
+ + +
+
+ 镜号 5 + | 10秒 +
+
+
+ 古建筑细节特写 +
+
+

古建筑细节特写

+
+
拍摄方式: 微距镜头
+
备注: 雕花、砖雕等工艺
+
+
+
+
+ + +
+
+ 镜号 6 + | 15秒 +
+
+
+ 状元蹄制作过程 +
+
+

状元蹄制作过程

+
+
拍摄方式: 近景拍摄
+
备注: 传统烹饪技艺
+
+
+
+
+ + +
+
+ 镜号 7 + | 12秒 +
+
+
+ 袜底酥制作特写 +
+
+

袜底酥制作特写

+
+
拍摄方式: 微距慢动作
+
备注: 酥皮层次展示
+
+
+
+
+ + +
+
+ 镜号 8 + | 18秒 +
+
+
+ 美食街市井生活 +
+
+

美食街市井生活

+
+
拍摄方式: 跟拍镜头
+
备注: 烟火气氛围
+
+
+
+
+ + +
+
+ 镜号 9 + | 20秒 +
+
+
+ 湿地公园全景 +
+
+

湿地公园全景

+
+
拍摄方式: 航拍环绕
+
备注: 生态美景全貌
+
+
+
+
+ + +
+
+ 镜号 10 + | 15秒 +
+
+
+ 候鸟栖息场景 +
+
+

候鸟栖息场景

+
+
拍摄方式: 长焦拍摄
+
备注: 生态多样性
+
+
+
+
+ + +
+
+ 镜号 11 + | 25秒 +
+
+
+ 晨雾与日出 +
+
+

晨雾与日出

+
+
拍摄方式: 延时摄影
+
备注: 自然意境营造
+
+
+
+
+ + +
+
+ 镜号 12 + | 15秒 +
+
+
+ 现代农业大棚 +
+
+

现代农业大棚

+
+
拍摄方式: 内景拍摄
+
备注: 科技农业展示
+
+
+
+
+ + +
+
+ 镜号 13 + | 18秒 +
+
+
+ 稻田丰收场景 +
+
+

稻田丰收场景

+
+
拍摄方式: 航拍俯视
+
备注: 农业产业成果
+
+
+
+
+ + +
+
+ 镜号 14 + | 12秒 +
+
+
+ 农民劳作特写 +
+
+

农民劳作特写

+
+
拍摄方式: 近景拍摄
+
备注: 乡村振兴主题
+
+
+
+
+ + +
+
+ 镜号 15 + | 20秒 +
+
+
+ 古镇夜景全景 +
+
+

古镇夜景全景

+
+
拍摄方式: 高空航拍
+
备注: 灯光璀璨效果
+
+
+
+
+ + +
+
+ 镜号 16 + | 18秒 +
+
+
+ 桥影与水面倒影 +
+
+

桥影与水面倒影

+
+
拍摄方式: 平移慢镜
+
备注: 夜景意境营造
+
+
+
+
+ + +
+
+ 镜号 17 + | 22秒 +
+
+
+ 夜市文化活动 +
+
+

夜市文化活动

+
+
拍摄方式: 摇臂拍摄
+
备注: 结尾氛围烘托
+
+
+
+
+
diff --git a/web_frontend/web_result/order-classes/visual-design/css/styles.css b/web_frontend/web_result/order-classes/visual-design/css/styles.css index ade7426c..880630cf 100644 --- a/web_frontend/web_result/order-classes/visual-design/css/styles.css +++ b/web_frontend/web_result/order-classes/visual-design/css/styles.css @@ -17,14 +17,14 @@ --hover-bg: rgba(217, 119, 6, 0.15); /* 悬停背景 */ --active-bg: rgba(217, 119, 6, 0.2); /* 激活背景 */ - /* 间距系统 - 针对大屏幕优化 */ - --spacing-xs: 0.75rem; /* 12px */ - --spacing-sm: 1.25rem; /* 20px */ - --spacing-md: 2rem; /* 32px */ - --spacing-lg: 3rem; /* 48px */ - --spacing-xl: 4rem; /* 64px */ - --spacing-2xl: 6rem; /* 96px */ - --spacing-3xl: 8rem; /* 128px */ + /* 间距系统 - 紧凑布局优化 */ + --spacing-xs: 0.5rem; /* 8px */ + --spacing-sm: 0.875rem; /* 14px */ + --spacing-md: 1.25rem; /* 20px */ + --spacing-lg: 2rem; /* 32px */ + --spacing-xl: 2.5rem; /* 40px */ + --spacing-2xl: 3.5rem; /* 56px */ + --spacing-3xl: 5rem; /* 80px */ /* 字体系统 */ --font-primary: 'Inter', 'Noto Sans SC', -apple-system, BlinkMacSystemFont, sans-serif; @@ -531,7 +531,7 @@ body.dark-theme tr:hover { } .grid-3 { - grid-template-columns: repeat(2, 1fr); + grid-template-columns: repeat(3, 1fr); } .grid-4 { @@ -733,12 +733,12 @@ tr:hover { /* ========== 响应式 ========== */ @media (max-width: 768px) { :root { - --spacing-sm: 0.75rem; - --spacing-md: 1rem; - --spacing-lg: 1.5rem; - --spacing-xl: 2rem; - --spacing-2xl: 3rem; - --spacing-3xl: 4rem; + --spacing-sm: 0.625rem; /* 10px */ + --spacing-md: 0.875rem; /* 14px */ + --spacing-lg: 1.25rem; /* 20px */ + --spacing-xl: 1.5rem; /* 24px */ + --spacing-2xl: 2.25rem; /* 36px */ + --spacing-3xl: 3rem; /* 48px */ } .hero { @@ -959,3 +959,907 @@ body.dark-theme .theme-icon-dark { body.dark-theme .theme-icon-light { opacity: 0.5; } + +/* ========== Section 1: Alternating Layout (左右交替布局) ========== */ +.alternating-layout { + display: flex; + gap: var(--spacing-2xl); + align-items: center; + margin-bottom: var(--spacing-3xl); +} + +.alternating-layout:nth-child(even) { + flex-direction: row-reverse; /* 偶数项反向 */ +} + +.alternating-layout .image-container { + flex: 0 0 45%; /* 图片占45% */ + aspect-ratio: 16/9; +} + +.alternating-layout .content { + flex: 1; /* 内容占剩余空间 */ +} + +/* Bento Grid 不规则网格 */ +.bento-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + grid-template-rows: repeat(2, 1fr); + gap: var(--spacing-xl); +} + +.bento-item:first-child { + grid-row: 1 / 3; /* 第1项占2行 */ +} + +.bento-item:last-child { + grid-column: 2 / 4; /* 最后1项占2列 */ +} + +/* 响应式 - Alternating Layout */ +@media (max-width: 768px) { + .alternating-layout { + flex-direction: column !important; + } + + .bento-grid { + grid-template-columns: 1fr; + grid-template-rows: auto; + } + + .bento-item:first-child, + .bento-item:last-child { + grid-row: auto; + grid-column: auto; + } +} + +/* ========== Section 2: Featured Grid (高亮第一项布局) ========== */ +.featured-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-template-rows: repeat(2, 1fr); + gap: var(--spacing-xl); +} + +.featured-item:first-child { + grid-column: 1 / 2; /* 占第1列 */ + grid-row: 1 / 3; /* 跨2行 */ + background: linear-gradient(135deg, + var(--primary-amber) 0%, + var(--accent-slate) 100%); +} + +.featured-item:first-child .image-container { + aspect-ratio: 3/4; /* 竖向比例 */ +} + +.featured-item:first-child .card-title { + font-size: var(--text-3xl); + color: var(--text-light); +} + +.featured-item:first-child .card-header { + background: rgba(0, 0, 0, 0.2); +} + +.featured-item:first-child .card-body { + color: var(--text-light); +} + +.featured-item:first-child .feature-list li { + color: var(--text-light); + border-bottom-color: rgba(255, 255, 255, 0.2); +} + +/* 其他项目正常尺寸 */ +.featured-item:not(:first-child) .image-container { + aspect-ratio: 4/3; +} + +/* Progress Bars - 进度条样式 */ +.progress-stats { + display: flex; + flex-direction: column; + gap: var(--spacing-md); + background: var(--bg-card); + backdrop-filter: blur(10px); + padding: var(--spacing-xl); + border-radius: var(--radius-lg); + border: 2px solid var(--border-light); + box-shadow: var(--shadow-md); +} + +.progress-item { + display: flex; + align-items: center; + gap: var(--spacing-md); +} + +.progress-label { + flex: 0 0 100px; + font-weight: var(--font-semibold); + color: var(--text-light); +} + +.progress-bar { + flex: 1; + height: 12px; + background: var(--bg-muted); + border-radius: var(--radius-full); + overflow: hidden; + background: rgba(0, 0, 0, 0.1); +} + +.progress-fill { + height: 100%; + background: linear-gradient(90deg, + var(--primary-amber), + var(--accent-amber-light)); + border-radius: var(--radius-full); + transition: width 1s ease; +} + +.progress-value { + flex: 0 0 80px; + text-align: right; + font-weight: var(--font-bold); + color: var(--primary-amber); +} + +/* 响应式 - Featured Grid */ +@media (max-width: 1024px) { + .featured-grid { + grid-template-columns: repeat(3, 1fr); + } +} + +@media (max-width: 768px) { + .featured-grid { + grid-template-columns: 1fr; + } + + .featured-item:first-child { + grid-column: auto; + grid-row: auto; + } + + .featured-item:first-child .image-container { + aspect-ratio: 16/9; + } +} + +/* ========== Section 3: Timeline Layout (垂直时间线布局) ========== */ +.timeline-container { + position: relative; + padding-left: var(--spacing-3xl); +} + +.timeline-container::before { + content: ''; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 3px; + background: linear-gradient( + to bottom, + var(--primary-amber) 0%, + var(--accent-amber-light) 100% + ); +} + +.timeline-item { + position: relative; + margin-bottom: var(--spacing-2xl); + background: var(--bg-card); + backdrop-filter: blur(10px); + padding: 0; + border-radius: var(--radius-xl); + box-shadow: var(--shadow-md); + border: 2px solid var(--border-light); + transition: all var(--transition-base); + overflow: hidden; +} + +.timeline-item:hover { + transform: translateX(8px) translateY(-4px); + box-shadow: var(--shadow-xl), var(--shadow-amber); + border-color: var(--primary-amber); +} + +.timeline-item::before { + content: ''; + position: absolute; + left: calc(-1 * var(--spacing-3xl) - 8px); + top: var(--spacing-lg); + width: 20px; + height: 20px; + background: var(--primary-amber); + border: 3px solid white; + border-radius: 50%; + box-shadow: 0 0 0 3px rgba(217, 119, 6, 0.3); + z-index: 10; +} + +.timeline-header { + display: flex; + align-items: center; + gap: var(--spacing-md); + padding: var(--spacing-lg); + background: var(--bg-semi-dark); + border-bottom: 2px solid var(--border-light); +} + +.timeline-badge { + display: inline-block; + padding: var(--spacing-xs) var(--spacing-md); + background: var(--primary-amber); + color: white; + border-radius: var(--radius-full); + font-weight: var(--font-bold); + font-size: var(--text-sm); +} + +.timeline-duration { + color: var(--text-gray); + font-size: var(--text-sm); + font-weight: var(--font-semibold); +} + +.timeline-content { + display: flex; + flex-direction: column; + gap: var(--spacing-md); +} + +.timeline-thumbnail { + width: 100%; + aspect-ratio: 16/9; + border-radius: 0; + overflow: hidden; + background: rgba(0, 0, 0, 0.1); + position: relative; +} + +.timeline-thumbnail img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.timeline-description { + padding: var(--spacing-lg); +} + +.timeline-title { + font-size: var(--text-xl); + font-weight: var(--font-semibold); + margin-bottom: var(--spacing-md); + color: var(--primary-amber); +} + +.timeline-details { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: var(--spacing-sm); + font-size: var(--text-sm); + color: var(--text-gray); + padding: var(--spacing-md) 0; + border-top: 1px solid var(--border-light); + border-bottom: 1px solid var(--border-light); + margin-bottom: var(--spacing-md); +} + +.timeline-detail-item { + display: flex; + flex-direction: column; +} + +.timeline-detail-label { + font-weight: var(--font-semibold); + color: var(--primary-amber); + margin-bottom: var(--spacing-xs); +} + +.timeline-detail-value { + color: var(--text-gray); +} + +.timeline-remark { + font-size: var(--text-sm); + color: var(--text-gray); + line-height: 1.6; +} + +/* Icon Grid (图标网格) */ +.icon-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: var(--spacing-lg); + margin-top: var(--spacing-2xl); +} + +.icon-card { + text-align: center; + padding: var(--spacing-xl); + background: var(--bg-card); + backdrop-filter: blur(10px); + border-radius: var(--radius-lg); + border: 2px solid var(--border-light); + transition: all 0.3s ease; +} + +.icon-card:hover { + border-color: var(--primary-amber); + transform: translateY(-5px); + box-shadow: var(--shadow-lg); +} + +.icon-card-icon { + font-size: 3rem; + margin-bottom: var(--spacing-md); +} + +.icon-card-title { + font-size: var(--text-lg); + font-weight: var(--font-semibold); + margin-bottom: var(--spacing-xs); + color: var(--primary-amber); +} + +.icon-card-value { + color: var(--text-gray); + font-size: var(--text-sm); +} + +/* 响应式 - Timeline */ +@media (max-width: 768px) { + .timeline-container { + padding-left: var(--spacing-xl); + } + + .timeline-content { + flex-direction: column; + } + + .timeline-thumbnail { + flex: 0 0 auto; + width: 100%; + } + + .icon-grid { + grid-template-columns: repeat(2, 1fr); + } +} + +/* ========== Section 4: Accordion Layout (手风琴折叠面板) ========== */ +.accordion-container { + display: flex; + flex-direction: column; + gap: var(--spacing-md); + margin-top: var(--spacing-xl); +} + +.accordion-item { + background: var(--bg-card); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); + border-radius: var(--radius-lg); + border: 2px solid var(--border-light); + overflow: hidden; + transition: all var(--transition-base); + box-shadow: var(--shadow-md); +} + +.accordion-item.active { + border-color: var(--primary-amber); + box-shadow: var(--shadow-xl), 0 0 0 3px rgba(217, 119, 6, 0.15); +} + +.accordion-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--spacing-lg) var(--spacing-xl); + background: var(--bg-semi-dark); + cursor: pointer; + transition: all var(--transition-base); + user-select: none; +} + +.accordion-header:hover { + background: var(--hover-bg); +} + +.accordion-title { + display: flex; + align-items: center; + gap: var(--spacing-md); + font-size: var(--text-xl); + font-weight: var(--font-semibold); + color: var(--text-light); +} + +.accordion-icon { + font-size: 1.5rem; +} + +.accordion-toggle { + font-size: 1.5rem; + color: var(--text-gray); + transition: transform var(--transition-base); + width: 24px; + height: 24px; +} + +.accordion-item.active .accordion-toggle { + transform: rotate(180deg); +} + +.accordion-content { + max-height: 0; + overflow: hidden; + transition: max-height 0.5s ease; + padding: 0 var(--spacing-xl); +} + +.accordion-item.active .accordion-content { + max-height: none; /* 移除高度限制,确保所有内容可见 */ + overflow: visible; /* 允许内容完全显示 */ + padding: var(--spacing-xl); + padding-top: 0; +} + +.accordion-content-inner { + padding-top: var(--spacing-lg); +} + +/* 预算饼图样式 */ +.budget-chart { + display: flex; + flex-direction: column; + gap: var(--spacing-md); + margin-top: var(--spacing-lg); +} + +.chart-item { + display: flex; + align-items: center; + gap: var(--spacing-md); +} + +.chart-label { + flex: 0 0 150px; + font-size: var(--text-sm); + color: var(--text-light); + font-weight: var(--font-medium); +} + +.chart-bar { + flex: 1; + height: 12px; + background: rgba(0, 0, 0, 0.1); + border-radius: var(--radius-full); + overflow: hidden; +} + +.chart-fill { + height: 100%; + background: linear-gradient(90deg, + var(--primary-amber), + var(--accent-amber-light)); + border-radius: var(--radius-full); + transition: width 1s ease; +} + +.chart-value { + flex: 0 0 60px; + text-align: right; + font-weight: var(--font-bold); + color: var(--primary-amber); + font-size: var(--text-sm); +} + +/* 团队卡片网格 */ +.team-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: var(--spacing-lg); + margin-top: var(--spacing-lg); +} + +.team-card { + text-align: center; + padding: var(--spacing-lg); + background: rgba(217, 119, 6, 0.05); + border-radius: var(--radius-md); + border: 1px solid var(--border-light); + transition: all var(--transition-base); +} + +.team-card:hover { + background: var(--hover-bg); + transform: translateY(-2px); + box-shadow: var(--shadow-md); +} + +.team-icon { + font-size: 2rem; + margin-bottom: var(--spacing-sm); +} + +.team-role { + font-weight: var(--font-semibold); + margin-bottom: var(--spacing-xs); + color: var(--primary-amber); +} + +.team-count { + color: var(--text-gray); + font-size: var(--text-sm); +} + +/* 响应式 - Accordion */ +@media (max-width: 768px) { + .accordion-header { + padding: var(--spacing-md); + } + + .accordion-title { + font-size: var(--text-lg); + } + + .team-grid { + grid-template-columns: repeat(2, 1fr); + } + + .chart-label { + flex: 0 0 100px; + } +} + +/* ========== 图片对比滑动器 (Image Comparison Slider) ========== */ +.comparison-container { + position: relative; + width: 100%; + aspect-ratio: 16/9; + overflow: hidden; + border-radius: var(--radius-lg); + box-shadow: var(--shadow-xl); + background: rgba(0, 0, 0, 0.1); + cursor: ew-resize; + user-select: none; +} + +.comparison-image { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; +} + +.comparison-image-before { + z-index: 1; +} + +.comparison-image-after { + z-index: 2; + clip-path: polygon(0 0, var(--position, 50%) 0, var(--position, 50%) 100%, 0 100%); +} + +.comparison-slider { + position: absolute; + z-index: 3; + top: 0; + bottom: 0; + left: var(--position, 50%); + width: 4px; + background: var(--primary-amber); + transform: translateX(-50%); + cursor: ew-resize; + box-shadow: 0 0 20px rgba(217, 119, 6, 0.5); +} + +.comparison-slider::before { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 48px; + height: 48px; + background: var(--primary-amber); + border-radius: 50%; + border: 4px solid white; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); + transition: all var(--transition-base); +} + +.comparison-slider::after { + content: '⬌'; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: white; + font-size: 24px; + font-weight: bold; + pointer-events: none; +} + +.comparison-container:hover .comparison-slider::before { + width: 56px; + height: 56px; + box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4); +} + +.comparison-labels { + position: absolute; + top: var(--spacing-md); + left: var(--spacing-md); + right: var(--spacing-md); + z-index: 4; + display: flex; + justify-content: space-between; + pointer-events: none; +} + +.comparison-label { + padding: var(--spacing-xs) var(--spacing-md); + background: rgba(0, 0, 0, 0.75); + backdrop-filter: blur(10px); + color: white; + font-size: var(--text-sm); + font-weight: var(--font-semibold); + border-radius: var(--radius-md); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.comparison-label-before { + background: rgba(217, 119, 6, 0.9); +} + +.comparison-label-after { + background: rgba(100, 116, 139, 0.9); +} + +/* 分镜网格布局 */ +.storyboard-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(450px, 1fr)); + gap: var(--spacing-2xl); + margin-top: var(--spacing-xl); +} + +.storyboard-item { + background: var(--bg-card); + backdrop-filter: blur(10px); + border-radius: var(--radius-xl); + overflow: hidden; + border: 2px solid var(--border-light); + box-shadow: var(--shadow-md); + transition: all var(--transition-base); +} + +.storyboard-item:hover { + transform: translateY(-8px); + box-shadow: var(--shadow-xl); + border-color: var(--primary-amber); +} + +.storyboard-meta { + padding: var(--spacing-lg); + background: var(--bg-semi-dark); +} + +.storyboard-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--spacing-md); +} + +.storyboard-number { + display: inline-block; + padding: var(--spacing-xs) var(--spacing-md); + background: var(--primary-amber); + color: white; + border-radius: var(--radius-full); + font-weight: var(--font-bold); + font-size: var(--text-sm); +} + +.storyboard-duration { + color: var(--text-gray); + font-size: var(--text-sm); + font-weight: var(--font-semibold); +} + +.storyboard-details { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: var(--spacing-sm); + font-size: var(--text-sm); + color: var(--text-gray); + margin-top: var(--spacing-md); + padding-top: var(--spacing-md); + border-top: 1px solid var(--border-light); +} + +.storyboard-detail-item { + display: flex; + flex-direction: column; +} + +.storyboard-detail-label { + font-weight: var(--font-semibold); + color: var(--primary-amber); + margin-bottom: var(--spacing-xs); +} + +.storyboard-detail-value { + color: var(--text-gray); +} + +.storyboard-description { + margin-top: var(--spacing-md); + padding-top: var(--spacing-md); + border-top: 1px solid var(--border-light); + font-size: var(--text-sm); + color: var(--text-gray); + line-height: 1.6; +} + +/* 响应式 - 分镜网格 */ +@media (max-width: 768px) { + .storyboard-grid { + grid-template-columns: 1fr; + } + + .comparison-labels { + flex-direction: column; + gap: var(--spacing-xs); + align-items: flex-start; + } +} + +/* ========== 图片放大Lightbox模态框 ========== */ +.lightbox-modal { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.95); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + display: flex; + align-items: center; + justify-content: center; + z-index: 9999; + opacity: 0; + visibility: hidden; + transition: opacity var(--transition-slow), visibility var(--transition-slow); + padding: var(--spacing-xl); + cursor: zoom-out; +} + +.lightbox-modal.active { + opacity: 1; + visibility: visible; +} + +.lightbox-content { + position: relative; + max-width: 90vw; + max-height: 90vh; + transform: scale(0.9); + transition: transform var(--transition-slow); + cursor: default; +} + +.lightbox-modal.active .lightbox-content { + transform: scale(1); +} + +.lightbox-image { + max-width: 100%; + max-height: 90vh; + width: auto; + height: auto; + border-radius: var(--radius-xl); + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.8), + 0 0 0 3px var(--primary-amber); + object-fit: contain; +} + +.lightbox-close { + position: fixed; + top: var(--spacing-xl); + right: var(--spacing-xl); + width: 60px; + height: 60px; + background: var(--primary-amber); + border: 3px solid white; + border-radius: 50%; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: all var(--transition-base); + box-shadow: var(--shadow-xl); + z-index: 10000; +} + +.lightbox-close:hover { + background: var(--accent-amber-light); + transform: rotate(90deg) scale(1.1); + box-shadow: 0 8px 24px rgba(217, 119, 6, 0.6); +} + +.lightbox-close::before, +.lightbox-close::after { + content: ''; + position: absolute; + width: 30px; + height: 3px; + background: white; + border-radius: 2px; +} + +.lightbox-close::before { + transform: rotate(45deg); +} + +.lightbox-close::after { + transform: rotate(-45deg); +} + +/* 图片信息标签 */ +.lightbox-label { + position: fixed; + bottom: var(--spacing-xl); + left: 50%; + transform: translateX(-50%); + padding: var(--spacing-md) var(--spacing-xl); + background: rgba(217, 119, 6, 0.95); + backdrop-filter: blur(10px); + color: white; + font-size: var(--text-lg); + font-weight: var(--font-semibold); + border-radius: var(--radius-full); + box-shadow: var(--shadow-xl); + text-transform: uppercase; + letter-spacing: 0.1em; + z-index: 10000; +} + +/* 响应式 - Lightbox */ +@media (max-width: 768px) { + .lightbox-modal { + padding: var(--spacing-md); + } + + .lightbox-close { + top: var(--spacing-md); + right: var(--spacing-md); + width: 48px; + height: 48px; + } + + .lightbox-close::before, + .lightbox-close::after { + width: 24px; + } + + .lightbox-label { + font-size: var(--text-base); + padding: var(--spacing-sm) var(--spacing-lg); + bottom: var(--spacing-md); + } +} diff --git a/web_frontend/web_result/order-classes/visual-design/index.html b/web_frontend/web_result/order-classes/visual-design/index.html index 4ededcf2..56037f8a 100644 --- a/web_frontend/web_result/order-classes/visual-design/index.html +++ b/web_frontend/web_result/order-classes/visual-design/index.html @@ -71,45 +71,41 @@

本宣传片旨在全方位展示同里古镇的独特魅力,通过精心策划的6大主题章节,呈现古镇千年历史文化、江南水乡美食、生态湿地风光、现代农业产业和璀璨夜景,打造一部6-7分钟的高品质文化旅游宣传片,为同里古镇的品牌推广和旅游发展提供有力支撑。

-
-
-
- 同里古镇航拍 -
同里古镇全景航拍
-
-
-

📍 项目定位

-
-
-
    -
  • 地理位置: 江苏省苏州市吴江区同里古镇
  • -
  • 片长设定: 6-7分钟完整版
  • -
  • 内容章节: 6大主题全景展示
  • -
  • 拍摄方式: 航拍+地面+水面多角度
  • -
  • 视觉风格: 传统色彩+现代影像
  • -
  • 目标人群: 文化旅游爱好者
  • -
-
+ +
+
+ 同里古镇航拍 +
同里古镇全景航拍
+
+

📍 项目定位

+
    +
  • 地理位置: 江苏省苏州市吴江区同里古镇
  • +
  • 片长设定: 6-7分钟完整版
  • +
  • 内容章节: 6大主题全景展示
  • +
  • 拍摄方式: 航拍+地面+水面多角度
  • +
  • 视觉风格: 传统色彩+现代影像
  • +
  • 目标人群: 文化旅游爱好者
  • +
+
+
-
-
- 传统配色表 -
宣传片配色体系
-
-
-

🎨 色彩体系

-
-
-
    -
  • 青瓦灰: 古建筑主色调
  • -
  • 悟道黄: 传统文化底蕴
  • -
  • 自由白: 简约现代感
  • -
  • 山吹色: 温暖人文气息
  • -
  • 赤锖色: 历史厚重感
  • -
  • 常磐色: 生态自然美
  • -
-
+ +
+
+ 传统配色表 +
宣传片配色体系
+
+
+

🎨 色彩体系

+
    +
  • 青瓦灰: 古建筑主色调
  • +
  • 悟道黄: 传统文化底蕴
  • +
  • 自由白: 简约现代感
  • +
  • 山吹色: 温暖人文气息
  • +
  • 赤锖色: 历史厚重感
  • +
  • 常磐色: 生态自然美
  • +
@@ -117,8 +113,9 @@

四大宣传目标

-
-
+ +
+

🏛️ 文化传承

@@ -132,7 +129,7 @@
-
+

🍜 美食体验

@@ -146,7 +143,7 @@
-
+

🌿 生态旅游

@@ -160,7 +157,7 @@
-
+

🌾 产业融合

@@ -225,8 +222,9 @@ 六大主题章节

-
-
+ +