当前位置:首页 > VUE

vue骨架屏怎么实现

2026-02-21 13:35:26VUE

实现 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 模板中直接使用骨架屏结构:

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

通过插件快速生成

使用 vue-skeleton-webpack-plugin 自动生成骨架屏,该插件会为每个路由生成对应的骨架屏 HTML。

安装插件:

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

配置 vue.config.js

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

module.exports = {
  configureWebpack: {
    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 />'
});

结合路由实现按需加载

在路由配置中为每个路由指定对应的骨架屏组件:

const routes = [
  {
    path: '/',
    component: () => import('@/views/Home.vue'),
    meta: { skeleton: () => import('@/components/SkeletonHome.vue') }
  }
];

在根组件中根据路由状态切换骨架屏:

export default {
  data() {
    return { isLoading: true }
  },
  watch: {
    $route() {
      this.isLoading = true;
      setTimeout(() => this.isLoading = false, 1000);
    }
  }
}

使用预渲染技术

通过 SSR 或 Prerender 提前生成骨架屏 HTML,直接作为首屏内容返回。这种方式能避免客户端渲染时的闪烁问题。

配置示例(需配合服务端渲染):

vue骨架屏怎么实现

// 在服务端入口文件中
import { createRenderer } from 'vue-server-renderer';
const renderer = createRenderer();

app.get('*', (req, res) => {
  const context = { url: req.url };
  const app = new Vue({ /* ... */ });

  renderer.renderToString(app, (err, html) => {
    if (err) res.send(skeletonHtml);
    else res.send(html);
  });
});

注意事项

  • 骨架屏的布局结构应与实际内容保持一致,避免页面跳动
  • 动画效果不宜过于复杂,以免影响性能
  • 移动端需要针对不同屏幕尺寸做适配
  • 对于复杂界面,可以分区块逐步替换骨架屏
  • 使用 v-cloak 配合 CSS 隐藏未编译的模板,避免闪现原始模板
[v-cloak] { display: none; }

以上方法可根据项目需求组合使用,CSS 方案适合简单场景,插件方案适合标准化项目,预渲染方案对性能要求较高但体验最佳。

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

相关文章

vue前端实现打印功能

vue前端实现打印功能

使用Vue实现前端打印功能 在Vue项目中实现打印功能可以通过多种方式完成,以下是几种常见的方法: 使用window.print()方法 这是最简单的打印方式,直接调用浏览器的打印功能。 meth…

vue实现ppt

vue实现ppt

Vue 实现 PPT 的功能 Vue 可以结合第三方库或自定义组件实现类似 PPT 的演示效果。以下是几种常见的方法: 使用第三方库 reveal.js reveal.js 是一个流行的演示框架,支…

vue实现popper

vue实现popper

Vue 实现 Popper 的方法 使用 Tippy.js 库 Tippy.js 是一个轻量级的 Popper.js 封装库,提供丰富的工具提示功能。安装 Tippy.js 及其 Vue 封装: n…

vue实现加载

vue实现加载

Vue 实现加载功能的方法 使用 v-if 或 v-show 控制加载状态 通过数据绑定控制加载动画的显示与隐藏。v-if 会完全移除 DOM 元素,v-show 只是切换 display 属性。…

vue怎样实现mvvm

vue怎样实现mvvm

Vue 实现 MVVM 的原理 Vue 的 MVVM(Model-View-ViewModel)模式通过数据绑定和响应式系统实现视图与数据的自动同步。以下是 Vue 实现 MVVM 的核心机制: 数…

vue实现登录拦截

vue实现登录拦截

实现登录拦截的方法 在Vue项目中,可以通过路由守卫(Navigation Guards)实现登录拦截,确保未登录用户无法访问受保护的路由。以下是具体实现方式: 使用全局前置守卫 在路由配置文件中(…