【HTML+CSS】day16-dashboard-build

作者:mario 发布时间: 2026-08-20 阅读量:6 评论数:0

第十六天:从零搭建工业大屏 — Grid 布局 + 深色主题 + 设备卡片

蜗牛往上爬 · 前端工业可视化学习笔记 第 16 篇
今天是阶段0的"期末考试"——把前 5 周学的 HTML 语义化、CSS 盒模型、Flex 布局、Grid 布局、响应式、动效全部整合到一个项目中,从零搭建一个智慧工厂监控大屏。纯 HTML+CSS,不加任何 JS。


目录


一、大屏的整体设计思路

在动手写代码之前,先想清楚布局:

┌──────────────────────────────────────────────┐
│              顶部标题栏(header)              │  ← 60px 高
├──────────┬──────────────────┬────────────────┤
│ 左侧边栏 │   中间图表区      │   右侧边栏      │
│ (left)   │   (main)         │   (right)       │  ← 自适应高度
│ 280px    │   1fr            │   280px          │
├──────────┴──────────────────┴────────────────┤
│              底部滚动告警条(footer)          │  ← 40px 高
└──────────────────────────────────────────────┘

这是大屏最经典的 “三栏 + 头尾” 布局。用 Grid 的 grid-template-areas 来实现最直观。


二、Grid 五区域布局

.dashboard {
  display: grid;
  grid-template-areas:
    "header header header"
    "left   main   right"
    "footer footer footer";
  grid-template-columns: 280px 1fr 280px;
  grid-template-rows: 60px 1fr 40px;
  height: 100vh;
  gap: 1px;
  background: var(--border-color); /* gap 的背景色,形成"边框线"效果 */
}

关键点

  • grid-template-areas 用字符串直观描述布局,比行列号更容易理解

  • grid-template-columns: 280px 1fr 280px — 两侧固定宽度,中间自适应

  • height: 100vh — 占满整个视口高度

  • gap: 1px + 背景色 — 用 1px 间隙制造"发光边框线"的视觉效果


三、深色工业风配色方案

配色是工业大屏的视觉灵魂。用 CSS 变量统一管理,方便后续换肤:

:root {
  --bg-primary: #0a0e17;       /* 最深色:主背景 */
  --bg-secondary: #111827;     /* 次深色:面板背景 */
  --bg-tertiary: #1a2332;      /* 稍浅色:卡片背景 */
  --border-color: #1e3a5f;     /* 边框色:深蓝灰 */
  --text-primary: #e0e6ed;     /* 主文字:浅灰白 */
  --text-secondary: #8899aa;   /* 次文字:蓝灰 */
  --accent-blue: #00d4ff;      /* 强调蓝:用于标题、数据 */
  --accent-green: #00ff88;     /* 强调绿:正常状态 */
  --accent-orange: #ff8c00;    /* 警告橙 */
  --accent-red: #ff3b3b;       /* 危险红 */
}

设计思路:深色背景 + 荧光色强调,这是工业大屏的经典配色公式。荧光色在深色背景上格外醒目,数据一目了然。


四、顶部标题栏

.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0 24px;
  /* 底部渐变装饰线 — 从透明到蓝色再到透明 */
  border-bottom: 2px solid transparent;
  border-image: linear-gradient(90deg, transparent, var(--accent-blue), transparent) 1;
}

.header__title {
  font-size: 20px;
  letter-spacing: 4px;
  /* 渐变色文字 — 蓝到绿 */
  background: linear-gradient(90deg, var(--accent-blue), var(--accent-green));
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
}

.header__time {
  font-family: 'Courier New', monospace;
  font-size: 16px;
  color: var(--text-secondary);
  letter-spacing: 2px;
}

关键技巧

  • border-image 实现渐变装饰线,比纯色边框更有科技感

  • background-clip: text 实现渐变色文字,工业大屏常用

  • 等宽字体显示时间,数字对齐更整齐


五、左侧设备状态卡片

设备卡片是工业大屏最常见的组件,每种设备一张卡片,包含名称、状态、关键指标。

<div class="device-card">
  <div class="device-card__header">
    <span class="device-card__name">CNC-001 数控机床</span>
    <span class="device-card__status device-card__status--running">运行中</span>
  </div>
  <div class="device-card__body">
    <div class="device-card__metric">
      <span class="device-card__label">转速</span>
      <span class="device-card__value">1200 rpm</span>
    </div>
    <div class="device-card__metric">
      <span class="device-card__label">温度</span>
      <span class="device-card__value">65°C</span>
    </div>
  </div>
  <!-- 左侧状态指示条 -->
  <div class="device-card__indicator device-card__indicator--normal"></div>
</div>
.device-card {
  background: var(--bg-tertiary);
  border: 1px solid var(--border-color);
  border-radius: 6px;
  padding: 12px;
  position: relative; /* 为左侧指示条提供定位上下文 */
  overflow: hidden;
  transition: border-color 0.3s ease, transform 0.3s ease;
}

.device-card:hover {
  border-color: var(--accent-blue);
  transform: translateX(4px); /* 悬停时微微右移 */
}

/* 左侧状态指示条 */
.device-card__indicator {
  position: absolute;
  left: 0; top: 0; bottom: 0;
  width: 3px;
}

.device-card__indicator--normal  { background: var(--accent-green); }
.device-card__indicator--warning { background: var(--accent-orange); }
.device-card__indicator--danger  { background: var(--accent-red); }

设计要点

  • 左侧彩色竖条一眼就能看出设备状态(绿/橙/红)

  • hover 时边框变色 + 微微右移,交互反馈清晰

  • BEM 命名:device-card__status--running,一目了然


六、右侧生产指标面板

<div class="metric-card">
  <div class="metric-card__label">产能利用率</div>
  <div class="metric-card__value metric-card__value--large">
    87.5<span class="metric-card__unit">%</span>
  </div>
  <!-- 进度条 -->
  <div class="metric-card__bar">
    <div class="metric-card__fill" style="width: 87.5%;"></div>
  </div>
</div>
.metric-card__value--large {
  font-family: 'Courier New', monospace;
  font-size: 28px;
  font-weight: 700;
  color: var(--accent-blue);
}

.metric-card__bar {
  height: 4px;
  background: var(--bg-primary);
  border-radius: 2px;
  overflow: hidden;
}

.metric-card__fill {
  height: 100%;
  background: var(--accent-blue);
  border-radius: 2px;
}

设计要点

  • 大号等宽数字 + 单位小字,工业仪表盘风格

  • 进度条用 width 百分比控制,后续可以做成动画


七、中间图表占位区域

图表区域目前用占位符代替,后续用 ECharts 实现。关键是用 Grid 把 4 个图表卡片排列好:

.chart-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-rows: 1fr 1fr;
  gap: 8px;
  height: 100%;
  padding: 8px;
}

.chart-card--large {
  grid-column: 1 / -1; /* 占满一整行 */
}

占位区域用虚线边框 + 图标 + 提示文字,既好看又明确告诉用户"这里是图表"。


八、底部滚动告警条

.marquee__inner {
  display: flex;
  gap: 48px;
  white-space: nowrap;
  animation: marquee 30s linear infinite;
}

@keyframes marquee {
  0%   { transform: translateX(0); }
  100% { transform: translateX(-50%); } /* 移动自身一半 */
}

无缝滚动的原理:把内容复制一份,动画从 0 移动到 -50%(即移动自身一半),当第一份移出视口时,第二份刚好补上,视觉上无缝衔接。


九、动手练:完整代码

完整的 HTML 和 CSS 代码见学习笔记 week6-comprehensive-practice.md

建议按这个顺序练习:

  1. Day 1:搭骨架 — HTML 结构 + Grid 五区域布局

  2. Day 2:填内容 — 标题栏、设备列表、指标面板

  3. Day 3:图表区 — 图表占位卡片 + 底部滚动条

  4. Day 4:加动效 — 呼吸灯、hover、数字跳动


十、常见坑点与最佳实践

坑点 1:Grid 区域不显示

/* ❌ 错误:grid-template-areas 的名称必须和 grid-area 完全一致 */
.sidebar-left { grid-area: left; }

/* ✅ 正确:HTML 中用的是 .sidebar--left,CSS 用 grid-area: left */
.sidebar--left { grid-area: left; }

坑点 2:overflow: hidden 导致内容被裁切

/* 大屏场景通常设 overflow: hidden 防止双滚动条 */
body { overflow: hidden; }

/* 但侧边栏内容多时需要内部滚动 */
.sidebar--left { overflow-y: auto; }

坑点 3:跑马灯不滚动

/* ❌ 错误:忘记设 white-space: nowrap,文字会换行 */
.marquee__inner { display: flex; }

/* ✅ 正确 */
.marquee__inner {
  display: flex;
  white-space: nowrap;
  flex-wrap: nowrap; /* 确保不换行 */
}

坑点 4:CSS 变量没生效

/* 确保变量定义在 :root 中,且在使用之前 */
:root { --accent-blue: #00d4ff; }  /* 先定义 */
.header { color: var(--accent-blue); } /* 后使用 */

十一、总结

知识点

在大屏中的实际应用

HTML 语义化

<header> <main> <aside> <footer>

CSS 盒模型

卡片 padding、border、margin

Flex 布局

标题栏(横向排列)、设备卡片内部布局

Grid 布局

五区域整体布局、图表区 2×2 网格

position

设备卡片左侧指示条(absolute)

transition

卡片 hover 效果

@keyframes

跑马灯滚动、呼吸灯边框

伪元素

呼吸灯边框(::before)

响应式

三个断点适配不同屏幕

CSS 变量

统一配色管理

🎉 完成这个大屏页面,你就正式从 HTML/CSS 阶段毕业了!接下来进入阶段1:JavaScript 核心基础,让大屏真正"活"起来。

评论