当前位置:首页 > 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,直接作为首屏内容返回。这种方式能避免客户端渲染时的闪烁问题。

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

// 在服务端入口文件中
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 实现复选功能 在 Vue 中实现复选功能可以通过多种方式完成,以下是常见的几种方法: 使用 v-model 绑定数组 通过 v-model 绑定一个数组,可以自动收集用户选择的复选框值。…

vue实现ai

vue实现ai

Vue 实现 AI 功能 Vue.js 可以通过集成第三方 AI 服务或本地 AI 模型来实现 AI 功能。以下是几种常见的方法: 集成第三方 AI API 使用 Vue 调用如 OpenAI、G…

vue实现主题

vue实现主题

Vue 实现主题的方法 使用 CSS 变量动态切换主题 定义全局 CSS 变量,通过修改这些变量实现主题切换。在 Vue 的根组件或全局样式中定义变量: :root { --primary-co…

vue实现slider

vue实现slider

Vue 实现 Slider 组件 使用 Vue 实现 Slider 组件可以通过原生开发或借助第三方库。以下是两种常见方法: 原生实现 Slider 创建一个基础的 Slider 组件,通过 v-m…

vue SSG实现

vue SSG实现

Vue SSG 实现方法 Vue 的静态站点生成(SSG)可以通过多种工具和框架实现,以下是几种常见的方法: 使用 VuePress VuePress 是一个基于 Vue 的静态站点生成器,适合文…

vue实现删除

vue实现删除

Vue 实现删除功能的方法 在 Vue 中实现删除功能通常涉及以下几个步骤: 数据绑定与列表渲染 使用 v-for 指令渲染列表数据,并为每个项绑定唯一标识符(如 id)。例如: <ul…