CSS如何实现动态loading效果?

CSS如何实现动态loading效果?
最新回答
词家小生

2023-06-02 12:14:07

CSS实现动态loading效果主要依赖动画技术样式控制,结合少量JavaScript(如需进度同步)。以下是具体实现方法及示例:

1. 使用CSS动画(纯CSS方案)

通过@keyframes定义动画,利用width、transform或background属性实现循环加载效果。

示例:旋转圆环加载<div class="loader"></div>.loader { width: 50px; height: 50px; border: 5px solid #f3f3f3; border-top: 5px solid #3498db; border-radius: 50%; animation: spin 1s linear infinite;}@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); }}

效果:蓝色圆环持续旋转。

2. 进度条式加载(需JS配合)

通过JavaScript动态更新元素的width或stroke-dashoffset(SVG)实现进度同步。

示例:CSS掩码 + JS控制<div class="progress-container"> <div class="progress-bar" id="progressBar"></div></div>.progress-container { width: 300px; height: 20px; background: #eee; mask: linear-gradient(90deg, black 0%, black var(--progress), transparent var(--progress)); -webkit-mask: linear-gradient(90deg, black 0%, black var(--progress), transparent var(--progress));}.progress-bar { width: 100%; height: 100%; background: #4CAF50; transform-origin: left; transform: scaleX(0); transition: transform 0.3s;}// 模拟进度更新let progress = 0;const bar = document.getElementById('progressBar');const interval = setInterval(() => { progress += 0.1; bar.style.transform = `scaleX(${progress})`; // 或使用CSS变量(需浏览器支持) // document.documentElement.style.setProperty('--progress', `${progress * 100}%`); if (progress >= 1) clearInterval(interval);}, 300);

效果:绿色进度条从左向右填充。

3. SVG动态绘制

利用SVG的stroke-dasharray和stroke-dashoffset属性创建可控制的路径动画。

示例:SVG圆形加载<svg class="svg-loader" viewBox="0 0 50 50"> <circle cx="25" cy="25" r="20" fill="none" stroke="#3498db" stroke-width="5"/></svg>.svg-loader { width: 50px; height: 50px; animation: rotate 2s linear infinite;}.svg-loader circle { stroke-dasharray: 125; /* 2πr ≈ 125.66 */ stroke-dashoffset: 125; animation: dash 1.5s ease-in-out infinite;}@keyframes rotate { 100% { transform: rotate(360deg); }}@keyframes dash { 0% { stroke-dashoffset: 125; } 50% { stroke-dashoffset: 30; } 100% { stroke-dashoffset: 125; }}

效果:蓝色圆环边旋转边绘制。

4. 结合JavaScript动态更新

若需根据实际加载进度(如文件上传、API请求)更新效果,需通过JS监听事件并修改样式。

示例:文件上传进度// 假设使用XMLHttpRequestconst xhr = new XMLHttpRequest();xhr.upload.addEventListener('progress', (e) => { if (e.lengthComputable) { const percent = e.loaded / e.total * 100; document.getElementById('progressBar').style.width = `${percent}%`; }});关键点总结
  • 纯CSS动画:适合无限循环的加载效果(如旋转图标)。
  • CSS掩码/变换:需配合JS控制进度,灵活性高。
  • SVG动画:适合复杂路径或精确控制。
  • JavaScript:用于动态进度同步(如API请求、文件上传)。

根据需求选择合适方案,复杂进度控制建议结合JS动态更新样式。