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}%`; }});关键点总结根据需求选择合适方案,复杂进度控制建议结合JS动态更新样式。