Loading Spinner带脉冲动画组件实战:实现思路与Demo

229 阅读5分钟

在现代 Web 开发中,用户体验往往是决定产品成败的关键之一。尤其是在涉及异步请求(如 API 调用、图片加载、表单提交等)时,一个优雅且直观的 Loading Spinner(加载器)不仅可以让用户感知到页面仍在“工作”,还能提升他们对应用的信任感和满意度。

本文将带你一步步实现一个 简单而美观的 Loading Spinner,并分享一些实现思路和技巧,让你在实际项目中也能轻松应用。

2025-09-1413-53-00-ezgif.com-video-to-gif-converter.gif

📌 一、实现思路

1. 功能需求

我们需要实现一个加载器,具备以下功能:

  • 显示/隐藏加载器
  • 在用户点击按钮后触发加载动画,模拟异步请求
  • 加载器应美观、贴近用户的视觉感知(即使只是简单的 CSS 动画)

2. 技术选型

为了实现这一目标,我们主要使用以下技术:

  • HTML 布局结构
  • CSS 动画 & 样式设计
  • JavaScript 逻辑控制

3. 实现流程

  1. 设计一个页面结构(如包含按钮和内容区域)
  2. 编写 CSS 定义加载器样式和动画
  3. 使用 JavaScript 控制加载器的显示与隐藏
  4. 模拟异步加载过程,使用户能直观地看到加载器运作
  5. 优化体验,比如隐藏加载器后刷新内容等

🎨 二、样式与动画设计

为了让加载器看起来更加舒适和美观,我们使用 CSS 动画 来实现旋转的、渐变的、交错的加载效果。

1. 基础样式

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}
body {
    font-family: 'Arial', sans-serif;
    line-height: 1.6;
    color: #333;
    min-height: 100vh;
    background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
    padding-top: 100px;
}

这段样式确保了页面的整体布局,并设置了一个柔和的背景。将主内容和加载器居中显示,符合用户观看习惯。

2. 加载器布局与隐藏效果

.preloader {
    position: fixed;
    width: 100%;
    height: 100%;
    z-index: 9999;
    background: rgba(255, 255, 255, 0.95);
    display: flex;
    justify-content: center;
    align-items: center;
    transition: opacity 0.5s ease, visibility 0.5s ease;
}
.preloader.hidden {
    opacity: 0;
    visibility: hidden;
}
  • 使用 position: fixed 来确保加载器始终在页面上层显示
  • 设置透明的背景,既不会干扰内容,又能突出加载状态
  • 使用 CSS 过渡,使隐藏和显示更加平滑自然

是的,visibility: hidden 会允许用户点击下方的元素(比如按钮)即使设置了z-index: 9999

3. 加载动画的设计(sk-scaleout 示例)

.preloader-spinner {
    width: 52px;
    height: 52px;
    background-color: #007ced;
    border-radius: 50%;
    box-shadow: 0 0 10px rgba(0, 124, 237, 0.3);
    animation: sk-scaleout 1.0s infinite ease-in-out;
}
@keyframes sk-scaleout {
    0% {
        transform: scale(0);
        opacity: 1;
    }
    100% {
        transform: scale(1);
        opacity: 0;
    }
}
  • 使用带阴影的圆形设计,形成一种“光环”效果
  • sk-scaleout 是一个经典但简洁的动画,从缩小到放大,配合透明度的变化,形成加载动画的“脉冲”效果
  • 动画设置了 infinite,确保持续地循环播放

🧠 三、JavaScript 控制逻辑

1. 页面初始化

我们使用 DOMContentLoaded 事件来确保 DOM 完全加载后才执行初始化脚本:

document.addEventListener('DOMContentLoaded', function () {
    const preloader = document.getElementById('preloader');
    const loadBtn = document.getElementById('loadBtn');
    // 显示加载器
    function showLoader() {
        preloader.classList.remove('hidden');
    }
    // 隐藏加载器
    function hideLoader() {
        preloader.classList.add('hidden');
    }
    // 模拟异步加载
    loadBtn.addEventListener('click', function () {
        showLoader();
        setTimeout(() => {
            hideLoader();
            // 可以在此处添加加载完成后的业务逻辑,比如刷新内容
        }, 3000);
    });
});
  • 在按钮点击时,调用 showLoader() 显示加载动画
  • 使用 setTimeout 模拟异步请求耗时(3 秒)
  • 在异步完成时,调用 hideLoader() 隐藏加载器

2. 进阶思路(异步请求实际中)

在实际应用中,我们可能会用 fetchXMLHttpRequest 来发起请求,并通过 Promiseasync/await 控制流程:

<JS>
loadBtn.addEventListener('click', async () => {
    showLoader();
    try {
        const response = await fetch('/api/data');
        const data = await response.json();
        // 业务逻辑
    } catch (error) {
        // 错误处理逻辑
    } finally {
        hideLoader();
    }
});

这样的写法更加清晰、可控,并且有助于错误处理和埋点追踪。


⚙️ 四、优化建议

1. 加载器的触发动画时间控制

  • 如果用户的点击后到数据返回时间较长,我们可以设置一个 加载器加载时长 与一个 动画轮询次数,比如在动画完成 3 次后判断是否仍需显示。

2. 合理使用 CSS 动画性能优化

  • 避免使用大量的动画同时运行,影响性能
  • 若加载器在多个页面中被复用,可以考虑 将其封装为组件(如 React、Vue 等) ,方便维护
  • 对于移动端,可以考虑 对动画进行优化,减少视觉卡顿

3. 加载器的样式可拓展性

  • 使用 自定义类名,方便后续替换动画
  • 提供 可配置的参数(如颜色、大小、动画持续时间等)
  • 集成到项目的 UI 库中,提升开发效率

✅ 五、总结

使用一个简单的 CSS 动画和 JS 控制逻辑,我们就可以给用户一个良好的视觉反馈,提升他们的体验。即使在没有复杂库的情况下,也能轻松实现一个优雅的 Loading Spinner。

我们可以基于此实现更复杂的加载器,比如:

  • 多个 Loader 的动画切换
  • Loading 时展示进度条
  • 加载器支持自定义大小、颜色、动画类型
  • 支持加载器的响应式适配

下面是一个扩展版本的示例代码,具备更强的复用性和可扩展性(适合实际项目中使用):


✅ 扩展版本示例(兼顾功能性与可复用性)

📌 写在最后

一个优雅的 Loading Spinner 不仅是 UI 的点缀,更是用户体验的一部分。通过本篇文章的思路和代码示例,相信你能更好地理解如何构建一个合适的加载器,并在项目中灵活运用。