vue加载动画实现
Vue 加载动画实现方法
使用 CSS 动画
通过 Vue 的过渡系统结合 CSS 动画实现加载效果。在组件模板中添加动画元素,利用 v-if 或 v-show 控制显示。
<template>
<div class="loader" v-if="isLoading"></div>
</template>
<style>
.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); }
}
</style>
使用第三方库
集成如 vue-loading-overlay 或 vue-spinner 等专门为 Vue 设计的加载动画库,快速实现专业效果。
安装 vue-loading-overlay:
npm install vue-loading-overlay
使用示例:
<template>
<loading :active="isLoading" :can-cancel="false"/>
</template>
<script>
import Loading from 'vue-loading-overlay'
import 'vue-loading-overlay/dist/vue-loading.css'
export default {
components: { Loading },
data() {
return { isLoading: true }
}
}
</script>
条件渲染与过渡
利用 Vue 的 <transition> 组件实现加载完成时的平滑过渡效果,增强用户体验。
<template>
<transition name="fade">
<div v-if="!isLoading" class="content">Loaded Content</div>
</transition>
</template>
<style>
.fade-enter-active, .fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
opacity: 0;
}
</style>
骨架屏技术
在数据加载前显示内容占位图(骨架屏),减少布局偏移。可通过 vue-skeleton-webpack-plugin 或手动实现。
手动实现示例:
<template>
<div v-if="loading" class="skeleton">
<div class="skeleton-line"></div>
<div class="skeleton-line"></div>
</div>
</template>
<style>
.skeleton {
width: 100%;
}
.skeleton-line {
height: 20px;
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
margin-bottom: 10px;
}
@keyframes shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
</style>
路由切换动画
在 Vue Router 的路由切换时添加加载指示器,通过导航守卫控制显示状态。

// router.js
router.beforeEach((to, from, next) => {
store.commit('setLoading', true)
next()
})
router.afterEach(() => {
setTimeout(() => store.commit('setLoading', false), 500)
})
性能优化建议
对于复杂动画,考虑使用 CSS will-change 属性或 transform/opacity 等硬件加速属性。避免在加载动画期间执行大量计算任务,保持动画流畅性。






