当前位置:首页 > VUE

vue骨架屏实现

2026-01-17 14:23:04VUE

vue骨架屏实现方法

骨架屏(Skeleton Screen)是一种优化用户体验的技术,在页面数据加载前展示页面的大致结构,避免白屏或闪烁问题。以下是几种常见的实现方式:

使用CSS实现基础骨架屏

通过纯CSS编写骨架屏样式,适用于简单场景。创建一个与真实内容结构相似的DOM元素,并添加CSS动画效果。

<template>
  <div class="skeleton-container">
    <div class="skeleton-item" v-for="i in 5" :key="i"></div>
  </div>
</template>

<style>
.skeleton-item {
  height: 20px;
  background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%);
  background-size: 400% 100%;
  animation: skeleton-loading 1.4s ease infinite;
  margin-bottom: 10px;
}

@keyframes skeleton-loading {
  0% { background-position: 100% 50%; }
  100% { background-position: 0 50%; }
}
</style>

使用vue-skeleton-webpack-plugin

该插件能在构建时生成骨架屏组件,并自动注入到页面中。

安装插件:

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

配置vue.config.js:

vue骨架屏实现

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

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

创建skeleton.js入口文件:

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

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

使用第三方库vue-content-loader

vue-content-loader提供了丰富的预置骨架屏模板和自定义功能。

安装:

vue骨架屏实现

npm install vue-content-loader

使用示例:

<template>
  <content-loader>
    <rect x="0" y="0" rx="3" ry="3" width="250" height="10" />
    <rect x="0" y="20" rx="3" ry="3" width="220" height="10" />
    <rect x="0" y="40" rx="3" ry="3" width="180" height="10" />
  </content-loader>
</template>

<script>
import { ContentLoader } from 'vue-content-loader'
export default {
  components: { ContentLoader }
}
</script>

动态切换真实内容与骨架屏

在数据加载完成后,切换显示真实内容:

<template>
  <div>
    <div v-if="loading">
      <!-- 骨架屏内容 -->
    </div>
    <div v-else>
      <!-- 真实内容 -->
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      loading: true
    }
  },
  async created() {
    await this.fetchData();
    this.loading = false;
  }
}
</script>

服务端渲染(SSR)中的骨架屏

对于Nuxt.js等SSR框架,可在asyncData或fetch方法中控制骨架屏显示:

export default {
  async asyncData({ params }) {
    try {
      const data = await getData(params.id);
      return { data, loading: false };
    } catch (e) {
      return { loading: false, error: e };
    }
  }
}

选择合适的方法取决于项目需求,简单项目可使用CSS方案,复杂项目推荐使用vue-content-loader或webpack插件方案。

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

相关文章

vue实现一个系统

vue实现一个系统

Vue 系统实现步骤 项目初始化与配置 使用 Vue CLI 或 Vite 创建项目: npm init vue@latest my-system 选择需要的配置(Router、Pinia 等)。…

vue 实现级联

vue 实现级联

Vue 实现级联选择器 级联选择器(Cascader)常用于省市区选择、分类选择等场景。Vue 中可以通过 Element UI、Ant Design Vue 等 UI 库实现,也可以手动封装。 使…

vue实现xss

vue实现xss

XSS 攻击简介 XSS(跨站脚本攻击)是一种常见的安全漏洞,攻击者通过注入恶意脚本到网页中,当其他用户访问该页面时,脚本会在其浏览器中执行,可能导致数据泄露或会话劫持。 Vue 中的 XSS…

vue tab实现

vue tab实现

Vue Tab 实现方法 使用动态组件实现 Tab 在 Vue 中可以通过动态组件 <component :is="currentTab"> 结合 v-for 和 v-bind 实现 Ta…

vue实现评分

vue实现评分

Vue 实现评分功能 使用组件库实现 安装 element-ui 或 ant-design-vue 这类 UI 库,它们已经内置了评分组件。 以 element-ui 为例: <te…

vue实现理财超市

vue实现理财超市

Vue实现理财超市功能 理财超市通常包含产品展示、筛选、排序、详情页等功能,以下是基于Vue的实现方案: 技术栈建议 Vue 2/3 + Vue Router UI库:Element UI/Ant…