当前位置:首页 > 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项目设计的骨架屏插件,能够自动生成骨架屏。

安装插件:

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的动态组件特性,可以在数据加载前后切换显示内容。

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中使用:

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

最佳实践建议

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

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

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

相关文章

实现vue模版

实现vue模版

Vue 模板的基本结构 Vue 模板基于 HTML 语法,通过 Vue 的指令和插值实现动态渲染。以下是一个基础模板示例: <template> <div id="…

vue实现类别

vue实现类别

Vue 实现类别的几种方法 在 Vue 中实现类别功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-bind:class 动态绑定类名 通过对象语法或数组语法动态绑定类名,根据条件添加或移…

vue实现gps

vue实现gps

Vue 中实现 GPS 定位功能 在 Vue 中实现 GPS 定位功能通常依赖于浏览器的 Geolocation API 或第三方地图服务(如高德、百度地图等)。以下是两种常见的实现方式: 使用浏览…

vue实现翻页

vue实现翻页

Vue实现翻页功能 在Vue中实现翻页功能通常需要结合分页组件和数据请求逻辑。以下是常见的实现方法: 使用Element UI分页组件 安装Element UI后,可以直接使用其分页组件:…

vue watch实现

vue watch实现

在 Vue 中实现 watch 监听数据变化 Vue 的 watch 选项用于监听数据变化并执行相应的回调函数。以下是几种常见的实现方式: 基础用法 export default { data(…

vue实现气泡

vue实现气泡

Vue 实现气泡效果的方法 在 Vue 中实现气泡效果可以通过 CSS 动画、第三方库或自定义组件完成。以下是几种常见实现方式: 使用纯 CSS 和 Vue 过渡 通过 Vue 的过渡系统结合 CS…