2021-06-29 23:40:23
使用CSS动画构建加载进度条和循环Loading效果的核心是通过@keyframes规则配合transform、width或opacity等属性实现动画效果,同时结合性能优化策略确保流畅性。以下是具体实现方案:
一、线性加载进度条适用于展示明确进度的场景(如文件上传、页面加载),通过width属性从0%到100%的动画实现。
<div class="progress-container"> <div class="progress-bar"></div></div>.progress-container { width: 80%; height: 10px; background-color: #e0e0e0; border-radius: 5px; overflow: hidden; margin: 50px auto;}.progress-bar { width: 0%; height: 100%; background-color: #4CAF50; border-radius: 5px; animation: fillProgress 3s forwards; /* 单次填充动画 */ /* animation: fillProgress 3s linear infinite; 无限循环的“假进度条” */}@keyframes fillProgress { 0% { width: 0%; } 100% { width: 100%; }}关键点:
适用于无明确进度的场景(如数据加载、异步请求),通过border颜色差异和rotate旋转实现。
<div class="spinner"></div>.spinner { border: 4px solid rgba(0, 0, 0, 0.1); border-top: 4px solid #3498db; border-radius: 50%; width: 40px; height: 40px; animation: spin 1s linear infinite; margin: 50px auto;}@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); }}关键点:
优先使用transform和opacity这些属性仅触发合成层(Compositing)更新,避免重排(Reflow)和重绘(Repaint),例如用transform: scaleX()替代width动画:
@keyframes fillProgressScale { 0% { transform: scaleX(0); transform-origin: left; } 100% { transform: scaleX(1); transform-origin: left; }}.progress-bar-scale { animation: fillProgressScale 3s forwards;}选择合适的动画曲线
ease-in-out:使动画开始和结束时缓冲,更柔和。
cubic-bezier():自定义曲线(如cubic-bezier(0.68, -0.55, 0.27, 1.55)实现弹跳效果)。
减少重排与重绘避免动画width、height、margin等触发布局变化的属性,优先使用transform和opacity。
使用will-change提前优化告知浏览器元素将变化,但需谨慎使用以避免内存消耗:
.progress-bar { will-change: width, transform;}简化复杂动画若动画卡顿,减少同时运行的动画数量或简化逻辑(如拆分多阶段动画)。
浏览器开发者工具
切换到“Performance”面板录制动画,分析“Layout”或“Paint”事件是否过多。
检查“Rendering”面板中的“Paint Flashing”选项,观察重绘区域。
常见问题原因
动画属性触发重排(如width、top)。
浏览器同时处理大量渲染任务(如多个复杂动画并行)。
优势:
适用场景:
JavaScript动画适用场景:
通过@keyframes结合transform、width等属性,可高效实现线性进度条和循环Loading效果。优先使用transform和opacity、选择合适的动画曲线、合理运用will-change,能显著提升动画性能。对于简单视觉反馈,CSS动画是首选;复杂交互场景则需结合JavaScript实现。