第十七天:打磨与收尾 — 动效、响应式、阶段0毕业总结
蜗牛往上爬 · 前端工业可视化学习笔记 第 17 篇
大屏的骨架和内容已经搭好了,今天是"画龙点睛"——加上动效让页面活起来,做响应式适配让它换个屏幕也能看,最后写一份阶段0总结,为这段 HTML/CSS 之旅画上句号。
目录
一、给大屏"注入灵魂":动效
工业大屏如果全是静态的,看起来就像一张截图。加上动效后,用户能感知到"系统在运行"、“数据在更新”、“设备有异常”。
动效三原则:
克制:不要每个元素都动,喧宾夺主
有意义:动效应该传达信息(如告警闪烁 = 有问题)
性能优先:只用
transform和opacity,避免触发重排
二、呼吸灯边框
.chart-card::before {
content: "";
position: absolute;
top: -1px; left: -1px; right: -1px; bottom: -1px;
border-radius: 9px;
border: 2px solid transparent;
animation: borderBreathe 3s ease-in-out infinite;
pointer-events: none; /* 不阻挡鼠标事件 */
}
@keyframes borderBreathe {
0%, 100% {
border-color: rgba(0, 212, 255, 0.1);
box-shadow: 0 0 8px rgba(0, 212, 255, 0);
}
50% {
border-color: rgba(0, 212, 255, 0.4);
box-shadow: 0 0 16px rgba(0, 212, 255, 0.15);
}
}
核心技巧:用 ::before 伪元素画一个比卡片大 1px 的边框,然后给这个边框做呼吸动画。pointer-events: none 确保伪元素不阻挡鼠标点击。
三、数字跳动动画
@keyframes numberPop {
0% { transform: scale(1); }
50% { transform: scale(1.05); color: var(--accent-green); }
100% { transform: scale(1); }
}
.metric-card__value--large {
animation: numberPop 2s ease-in-out infinite;
}
/* 不同指标错开时间,避免同时跳动 */
.metric-card:nth-child(2) .metric-card__value--large { animation-delay: 0.5s; }
.metric-card:nth-child(3) .metric-card__value--large { animation-delay: 1s; }
.metric-card:nth-child(4) .metric-card__value--large { animation-delay: 1.5s; }
设计思路:数字每隔 2 秒微微放大并变绿,模拟"数据实时更新"的感觉。用 nth-child + animation-delay 错开时间,让四个指标依次跳动,更有节奏感。
四、页面入场动画
@keyframes fadeInUp {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
.header { animation: fadeInUp 0.5s ease-out; }
.sidebar--left { animation: fadeInUp 0.5s ease-out 0.1s both; }
.main { animation: fadeInUp 0.5s ease-out 0.2s both; }
.sidebar--right { animation: fadeInUp 0.5s ease-out 0.3s both; }
.footer { animation: fadeInUp 0.5s ease-out 0.4s both; }
关键点:animation-fill-mode: both(简写中的 both)确保动画开始前元素不可见,结束后保持最终状态。五个区域依次延迟 0.1s 入场,形成"波浪"效果。
五、响应式适配
大屏虽然主要面向 1920×1080,但实际可能在不同设备上查看。三个断点覆盖主要场景:
/* 中等屏幕(笔记本 1366×768) */
@media (max-width: 1600px) {
.dashboard {
grid-template-columns: 240px 1fr 240px;
}
}
/* 平板横屏(1024×768) */
@media (max-width: 1200px) {
.dashboard {
grid-template-areas:
"header header"
"main main"
"left right"
"footer footer";
grid-template-columns: 1fr 1fr;
}
}
/* 手机竖屏(< 768px) */
@media (max-width: 768px) {
.dashboard {
grid-template-areas:
"header"
"main"
"left"
"right"
"footer";
grid-template-columns: 1fr;
overflow-y: auto;
}
}
响应式策略:
1600px:缩小侧边栏宽度
1200px:主区域和图表区占满宽度,左右侧边栏移到下方
768px:全部单列堆叠,开启滚动
六、代码规范自查
在提交代码之前,逐项检查:
七、阶段0 毕业总结
6 周前 vs 6 周后
技能树
阶段0 · HTML + CSS
├── HTML
│ ├── 基本结构(html/head/body)
│ ├── 文本标签(h1-h6/p/span/strong/em)
│ ├── 列表(ul/ol/dl)
│ ├── 链接与图片(a/img)
│ ├── 表格(table/thead/tbody/tr/td/th)
│ ├── 表单(form/input/select/textarea/button/label)
│ └── 语义化标签(header/main/aside/footer/section/article/nav)
│
├── CSS 基础
│ ├── 三种引入方式(内联/内嵌/外链)
│ ├── 选择器(基本/组合/属性/伪类/伪元素)
│ ├── 盒模型(content/padding/border/margin/box-sizing)
│ ├── 文字样式(font/color/line-height/text-align)
│ ├── 背景(颜色/图片/渐变)
│ └── 优先级(继承/层叠/权重计算)
│
├── CSS 布局
│ ├── Flex 布局(容器属性 + 项目属性)
│ ├── Grid 布局(grid-template-areas/columns/rows)
│ └── 定位(static/relative/absolute/fixed/sticky + z-index)
│
├── CSS 进阶
│ ├── 过渡(transition)
│ ├── 变换(transform:translate/rotate/scale/skew)
│ ├── 动画(@keyframes + animation)
│ ├── 伪元素(::before/::after)
│ ├── CSS 变量(--custom-property)
│ └── BEM 命名规范
│
└── 响应式
├── 媒体查询(@media)
├── 断点设计(1600/1200/768)
└── 移动优先
产出作品
踩过的坑(值得记住的)
盒模型不设 border-box:padding 和 border 会撑大元素,后来统一加了
* { box-sizing: border-box; }Flex 主轴/交叉轴搞混:
justify-content是主轴方向,align-items是交叉轴,方向取决于flex-directiontransition 写在 :hover 里:鼠标移出时没有过渡效果,应该写在元素本身
z-index 不生效:忘了给元素设置
position(非 static)伪元素不显示:忘了写
content: ""Grid 区域不显示:
grid-area的名字和grid-template-areas中的名字不一致
八、从 HTML/CSS 到 JavaScript
阶段0 结束了,但大屏还只是"静态的"——图表是占位符,数据是写死的,时间不更新,告警不刷新。
阶段1 要解决的问题:
用 JavaScript 让数据"活"起来(实时更新、动态计算)
用 ECharts 把占位区域变成真正的图表
用定时器让时间自动跳动
用事件让用户能交互(点击、切换、筛选)
阶段1 学习路线
阶段1(约 10 周):JavaScript 核心基础 + ES6
├── 第 1-2 周:JS 基础语法(变量/类型/运算符/流程控制)
├── 第 3-4 周:函数与作用域(声明/参数/闭包/箭头函数)
├── 第 5-6 周:对象与数组(方法/遍历/解构/展开)
├── 第 7-8 周:DOM 操作(获取元素/事件/修改样式)
├── 第 9 周:ES6 核心(let/const/模板字符串/Promise/模块化)
└── 第 10 周:综合实战(给大屏加上 JS 交互)
九、总结
🎓 阶段0 毕业!从完全不懂 HTML/CSS 到能独立搭建工业大屏,6 周前我做不到,现在我能。接下来,用 JavaScript 让大屏真正"活"起来!