当前位置:首页 > VUE

vue实现页面骨框架

2026-02-23 17:54:49VUE

Vue 实现页面骨架屏的方法

骨架屏(Skeleton Screen)是一种在页面数据加载前展示的占位图,能够提升用户体验。以下是几种实现方式:

使用 CSS 实现基础骨架屏

通过纯 CSS 可以快速创建简单的骨架效果,适合静态内容的占位:

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

<style>
.skeleton-container {
  padding: 20px;
}
.skeleton-item {
  height: 40px;
  background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
  background-size: 400% 100%;
  margin-bottom: 15px;
  animation: shimmer 1.5s infinite;
  border-radius: 4px;
}
@keyframes shimmer {
  0% { background-position: 100% 50%; }
  100% { background-position: 0 50%; }
}
</style>

使用 vue-skeleton-webpack-plugin

该插件能自动生成骨架屏并与路由结合:

  1. 安装插件:

    npm install vue-skeleton-webpack-plugin --save-dev
  2. 创建骨架屏组件 Skeleton.vue

    <template>
    <div class="skeleton-wrapper">
     <!-- 自定义骨架结构 -->
    </div>
    </template>
  3. vue.config.js 中配置:

    const SkeletonWebpackPlugin = require('vue-skeleton-webpack-plugin');
    module.exports = {
    configureWebpack: {
     plugins: [
       new SkeletonWebpackPlugin({
         webpackConfig: {
           entry: './src/skeleton.js'
         },
         minimize: true,
         quiet: true
       })
     ]
    }
    }

结合路由实现按需加载

通过路由元信息控制骨架屏显示:

const routes = [
  {
    path: '/detail',
    component: () => import('@/views/Detail.vue'),
    meta: { skeleton: true }
  }
]

在全局路由守卫中处理:

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

使用第三方库 vue-content-loader

该库提供更丰富的预制形状:

  1. 安装:

    npm install vue-content-loader
  2. 使用示例:

    
    <template>
    <content-loader>
     <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" />
     <circle cx="25" cy="65" r="20" />
     <rect x="60" y="50" rx="3" ry="3" width="170" height="10" />
    </content-loader>
    </template>
import { ContentLoader } from 'vue-content-loader' export default { components: { ContentLoader } } ```

动态数据适配的骨架屏

对于动态内容,可以计算元素尺寸生成匹配的骨架:

export default {
  data() {
    return {
      skeletonRects: []
    }
  },
  mounted() {
    this.$nextTick(() => {
      const elements = document.querySelectorAll('.dynamic-item')
      this.skeletonRects = Array.from(elements).map(el => {
        const rect = el.getBoundingClientRect()
        return {
          width: rect.width,
          height: rect.height,
          top: rect.top,
          left: rect.left
        }
      })
    })
  }
}

性能优化建议

  • 使用 v-cloak 防止闪现

    [v-cloak] { display: none; }
  • 骨架屏元素数量应与实际内容保持一致

  • 适当添加动画效果但避免过度复杂

  • 移动端考虑使用 rem 单位适配不同屏幕

    vue实现页面骨框架

以上方法可根据项目需求组合使用,CSS 方案适合简单场景,插件方案适合复杂应用,第三方库则能快速实现精美效果。

标签: 框架页面
分享给朋友:

相关文章

Vue实现lagger页面

Vue实现lagger页面

Vue实现懒加载页面的方法 懒加载(Lazy Loading)是一种优化技术,用于延迟加载页面或组件,直到它们真正需要显示时才加载。以下是几种在Vue中实现懒加载页面的常见方法: 使用Vue Rou…

vue页面实现日历

vue页面实现日历

实现基础日历布局 使用Vue的模板语法构建日历的基本HTML结构,通常需要包含星期标题和日期格子。月份切换按钮可以通过v-on绑定事件。 <template> <div cla…

vue页面实现流程

vue页面实现流程

Vue 页面实现流程 创建 Vue 项目 使用 Vue CLI 或 Vite 初始化项目。Vue CLI 适用于传统项目,Vite 适合现代轻量级应用。 安装依赖后,通过命令行工具运行项目初始化命令,…

vue实现页面刻度

vue实现页面刻度

实现页面刻度的基本思路 在Vue中实现页面刻度通常用于展示进度、测量或标记特定位置。可以通过动态计算和渲染刻度元素来实现,结合CSS样式控制显示效果。 使用动态渲染刻度线 通过v-for指令动态生成…

vue页面实现pdf

vue页面实现pdf

在Vue中实现PDF功能 使用vue-pdf库 安装vue-pdf库: npm install vue-pdf 在Vue组件中使用: <template> <pdf :src…

vue 实现打印页面

vue 实现打印页面

实现 Vue 页面打印功能 使用 window.print() 方法 在 Vue 中可以直接调用浏览器的打印 API 实现基本打印功能。创建一个打印按钮,绑定点击事件调用 window.print()…