当前位置:首页 > VUE

vue骨架屏实现

2026-03-09 19:54:56VUE

Vue 骨架屏实现方法

使用专用库(如vue-skeleton-webpack-plugin)

安装插件依赖:

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

创建骨架屏组件(Skeleton.vue):

<template>
  <div class="skeleton">
    <div class="skeleton-head"></div>
    <div class="skeleton-body">
      <div class="skeleton-title"></div>
      <div class="skeleton-content"></div>
    </div>
  </div>
</template>

<style scoped>
.skeleton {
  padding: 15px;
}
.skeleton-head {
  height: 40px;
  background: #f2f2f2;
}
.skeleton-title {
  height: 20px;
  margin-top: 10px;
  background: #f2f2f2;
}
.skeleton-content {
  height: 60px;
  margin-top: 10px;
  background: #f2f2f2;
}
</style>

配置webpack:

// vue.config.js
const SkeletonWebpackPlugin = require('vue-skeleton-webpack-plugin')

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

纯CSS实现方案

通过v-if控制显示状态:

<template>
  <div>
    <div v-if="loading" class="skeleton">
      <!-- 骨架屏结构 -->
    </div>
    <div v-else>
      <!-- 实际内容 -->
    </div>
  </div>
</template>

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

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

基于路由的动态骨架屏

创建路由对应骨架组件:

// router.js
const routes = [
  {
    path: '/product',
    component: () => import('@/views/Product.vue'),
    meta: {
      skeleton: () => import('@/components/ProductSkeleton.vue')
    }
  }
]

路由守卫中处理:

router.beforeEach((to, from, next) => {
  if (to.meta.skeleton) {
    store.commit('SET_SKELETON', to.meta.skeleton())
  }
  next()
})

服务端渲染(SSR)方案

Nu.js中配置:

// nuxt.config.js
export default {
  loading: {
    color: '#3B8070',
    height: '2px'
  },
  loadingIndicator: {
    name: 'circle',
    color: '#3B8070',
    background: 'white'
  }
}

自定义加载组件:

<!-- components/loading.vue -->
<template>
  <div class="skeleton-wrapper">
    <content-loader :width="400" :height="150">
      <rect x="0" y="0" rx="3" ry="3" width="250" height="10" />
      <rect x="20" y="20" rx="3" ry="3" width="220" height="10" />
      <rect x="0" y="40" rx="3" ry="3" width="350" height="10" />
    </content-loader>
  </div>
</template>

关键实现要点:

  • 保持骨架屏结构与真实DOM结构一致
  • 使用CSS动画增强视觉效果
  • 合理控制骨架屏显示时机
  • 移动端需考虑响应式布局
  • 可结合vuex管理加载状态

性能优化建议:

vue骨架屏实现

  • 避免过多DOM节点
  • 使用will-change优化动画
  • 对重复骨架元素使用v-for
  • 分块加载复杂页面区域

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

相关文章

vue实现点击样式

vue实现点击样式

Vue 实现点击样式的方法 在 Vue 中实现点击样式可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 v-bind:class 动态绑定类名 通过数据驱动的方式动态切换类名,结合 CS…

vue表格实现教学

vue表格实现教学

Vue 表格实现方法 使用原生HTML表格 在Vue模板中直接使用HTML的<table>标签,结合v-for动态渲染数据: <template> <table&g…

vue设计与实现目录

vue设计与实现目录

以下是《Vue设计与实现》一书的典型目录结构(根据常见技术书籍及Vue核心内容整理): 响应式系统 响应式数据的基本原理 依赖收集与触发更新 实现简易响应式系统 Proxy与Refl…

代码实现vue

代码实现vue

创建Vue项目 使用Vue CLI快速初始化项目,确保已安装Node.js和npm/yarn: npm install -g @vue/cli vue create my-vue-project c…

vue实现答辩

vue实现答辩

Vue 实现答辩系统的关键步骤 项目初始化与配置 使用 Vue CLI 或 Vite 创建项目,安装 Vue Router 管理路由,Pinia/Vuex 进行状态管理。配置 ESLint 和 Pre…

vue实现tap

vue实现tap

Vue 实现 Tap 事件 在移动端开发中,Tap 事件比 Click 事件更常用,因为 Click 事件有 300ms 延迟。以下是几种在 Vue 中实现 Tap 事件的方法。 使用第三方库 安装…