当前位置:首页 > VUE

vue前端实现骨架屏

2026-01-21 05:51:26VUE

骨架屏的实现方法

骨架屏(Skeleton Screen)是一种在页面加载时展示的占位符效果,能够提升用户体验。以下是几种在Vue中实现骨架屏的方法:

使用CSS实现基础骨架屏

通过纯CSS可以快速实现简单的骨架屏效果。定义一个骨架屏的样式类,在数据加载前展示。

.skeleton {
  background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
  background-size: 200% 100%;
  animation: shimmer 1.5s infinite;
}

@keyframes shimmer {
  from { background-position: 200% 0; }
  to { background-position: -200% 0; }
}

在Vue模板中应用:

<div v-if="loading" class="skeleton" style="width:100%; height:100px;"></div>
<div v-else>实际内容</div>

使用第三方库

vue-skeleton-webpack-plugin 是一个专门为Vue项目设计的骨架屏插件,能够自动生成骨架屏。

安装插件:

npm install vue-skeleton-webpack-plugin --save-dev

配置webpack:

const SkeletonWebpackPlugin = require('vue-skeleton-webpack-plugin');

module.exports = {
  plugins: [
    new SkeletonWebpackPlugin({
      webpackConfig: {
        entry: './src/skeleton.js'
      }
    })
  ]
}

创建skeleton.js:

import Vue from 'vue';
import Skeleton from './Skeleton.vue';

export default new Vue({
  components: { Skeleton },
  template: '<Skeleton />'
});

动态组件切换

通过Vue的动态组件特性,可以在数据加载前后切换显示内容。

<template>
  <component :is="currentComponent" />
</template>

<script>
export default {
  data() {
    return {
      loading: true,
      skeleton: SkeletonComponent,
      content: MainComponent
    }
  },
  computed: {
    currentComponent() {
      return this.loading ? this.skeleton : this.content;
    }
  },
  async created() {
    await this.fetchData();
    this.loading = false;
  }
}
</script>

骨架屏组件化

创建可复用的骨架屏组件,针对不同页面定制。

<template>
  <div class="skeleton-container">
    <div class="skeleton-header"></div>
    <div class="skeleton-content" v-for="i in 3" :key="i"></div>
  </div>
</template>

<style>
.skeleton-container {
  padding: 20px;
}
.skeleton-header {
  height: 60px;
  margin-bottom: 20px;
}
.skeleton-content {
  height: 40px;
  margin-bottom: 10px;
}
</style>

结合路由实现整页骨架屏

在路由切换时显示全屏骨架屏,提升页面过渡体验。

router.beforeEach((to, from, next) => {
  store.commit('SET_LOADING', true);
  next();
});

router.afterEach(() => {
  setTimeout(() => {
    store.commit('SET_LOADING', false);
  }, 500);
});

在App.vue中使用:

vue前端实现骨架屏

<template>
  <div id="app">
    <GlobalSkeleton v-if="$store.state.isLoading" />
    <router-view v-else />
  </div>
</template>

最佳实践建议

  • 保持骨架屏结构与实际内容布局一致,避免加载后页面跳动
  • 为不同页面设计专门的骨架屏,提高真实感
  • 控制骨架屏显示时间,避免过长等待
  • 在移动端注意性能优化,避免复杂动画影响流畅度
  • 结合加载状态管理,确保数据完全加载后再隐藏骨架屏

以上方法可以根据项目需求单独或组合使用,实现不同复杂度的骨架屏效果。

标签: 骨架vue
分享给朋友:

相关文章

vue 实现闪烁

vue 实现闪烁

Vue 实现闪烁效果的方法 方法一:使用 CSS 动画 在 Vue 组件中定义一个闪烁的 CSS 动画,通过绑定 class 或 style 来控制元素的闪烁效果。 <template>…

vue实现modal

vue实现modal

Vue 实现 Modal 弹窗组件 使用 Vue 实现 Modal 弹窗组件可以通过多种方式,包括原生 Vue 组件、第三方库或自定义指令。以下是几种常见方法: 原生 Vue 组件实现 创建一个基础…

vue实现画图

vue实现画图

Vue 实现画图功能 在 Vue 中实现画图功能通常需要结合 HTML5 的 <canvas> 元素或第三方库。以下是几种常见的方法: 使用原生 Canvas API 通过 Vue 直接…

vue翻页实现

vue翻页实现

Vue翻页实现方法 基础分页组件实现 使用v-for和计算属性实现基础分页逻辑: <template> <div> <ul> <li…

vue实现浮标

vue实现浮标

Vue 实现浮动按钮(浮标) 使用 Vue 实现浮动按钮可以通过多种方式完成,以下是几种常见的方法: 使用 CSS 定位和 Vue 组件 创建 Vue 组件并配合 CSS 固定定位实现浮动按钮:…

vue实现mui

vue实现mui

使用 Vue 实现 MUI(Material-UI)风格的界面 Vue 本身不直接提供 MUI(Material Design)组件,但可以通过集成第三方库或手动实现来达到类似效果。以下是几种常见方法…