骨架屏

1. 骨架屏的作用与项目应用场景

骨架屏(Skeleton Screen)是一种在数据加载期间用灰色块、占位图等模拟页面结构的技术,提升用户感知速度和体验。常用于首页、新闻详情、产品列表等数据异步加载的页面。

在本项目(如 web-company、web-admin),首页、新闻列表、产品列表等页面都适合用骨架屏优化加载体验。

2. 项目中骨架屏的实现方法

以 web-company/src/views/News.vue 为例:

(1)新建骨架屏组件

在 web-company/src/components/SkeletonNews.vue:

vue 复制代码
<template>
  <div class="skeleton-news">
    <div class="skeleton-title"></div>
    <div class="skeleton-meta"></div>
    <div class="skeleton-content"></div>
  </div>
</template>

<style scoped>
.skeleton-news {
  padding: 16px;
}
.skeleton-title,
.skeleton-meta,
.skeleton-content {
  background: #eee;
  border-radius: 4px;
  margin-bottom: 12px;
  animation: skeleton-loading 1.2s infinite linear alternate;
}
.skeleton-title { width: 60%; height: 24px; }
.skeleton-meta { width: 30%; height: 16px; }
.skeleton-content { width: 100%; height: 80px; }
@keyframes skeleton-loading {
  0% { background-color: #eee; }
  100% { background-color: #f5f5f5; }
}
</style>

(2)在页面中使用骨架屏

vue 复制代码
<template>
  <div>
    <SkeletonNews v-if="loading" />
    <div v-else>
      <!-- 正常新闻内容 -->
      <h1>{{ news.title }}</h1>
      <div>{{ news.meta }}</div>
      <div v-html="news.content"></div>
    </div>
  </div>
</template>

<script setup lang="ts">
import { ref, onMounted } from 'vue'
import SkeletonNews from '@/components/SkeletonNews.vue'

const loading = ref(true)
const news = ref({ title: '', meta: '', content: '' })

onMounted(async () => {
  // 模拟异步加载
  setTimeout(() => {
    news.value = { title: '新闻标题', meta: '2024-06-01', content: '新闻内容...' }
    loading.value = false
  }, 1500)
})
</script>

二、问题

1. 问:你在项目中是如何实现骨架屏的?为什么要用骨架屏?

答:

在本项目(如 web-company 的新闻详情页),我新建了骨架屏组件(SkeletonNews.vue),在数据加载期间用灰色块模拟页面结构。这样用户在等待数据时不会看到空白页面,提升了加载体验和感知速度。


2. 问:骨架屏和 loading 动画的区别是什么?项目中为什么选择骨架屏?

答:

loading 动画通常是转圈等简单提示,用户无法预知页面结构。骨架屏则模拟真实页面布局,让用户提前感知内容分布。项目中页面内容较多,骨架屏能有效减少用户焦虑,提升专业感和体验。


3. 问:骨架屏组件如何设计成可复用?项目中有实践吗?

答:

我将骨架屏封装为独立组件(如 SkeletonNews.vue),并通过 props 控制不同页面的骨架结构。这样新闻列表、产品列表等页面都能复用骨架屏组件,减少重复代码,提升开发效率。


4. 问:骨架屏如何与异步数据加载配合?项目中是怎么做的?

答:

通过 loading 状态控制骨架屏的显示与隐藏。数据请求前设置 loading=true,数据加载完成后设置 loading=false,切换为真实内容。项目中在 onMounted 钩子里异步获取数据,配合骨架屏实现平滑过渡。


5. 问:骨架屏在实际开发中遇到过哪些问题?你是如何解决的?

答:

遇到过骨架屏和真实内容切换时闪烁、骨架屏样式与实际内容不一致等问题。为此,项目中优化了骨架屏样式,保证与真实内容布局一致,并通过合理的 loading 状态管理,避免闪烁和突兀的切换。

相关推荐
IT_陈寒3 小时前
Redis大key删除为什么会导致服务卡顿?我的线上事故复盘
前端·人工智能·后端
用户2705077725243 小时前
MCP 最小 Server 实测:3 个 JSON-RPC 报错与修法
前端
用户499335025073 小时前
一人VIP账号多人共用:Web 代理里的会话共享怎么实现
前端
用户老李3 小时前
无线电自学教程 05:第一台收音机——从矿石机到 SDR
前端
IPIPD3 小时前
Node.js请求遇到503怎么重试?先解析Retry-After,再做有上限退避
前端
葡萄城技术团队4 小时前
dsh-spreadjs-editor 的集成链路:把 SpreadJS Designer 嵌进 Agent 工作台
前端
FlyWIHTSKY4 小时前
vue2和vue3有什么区别,用法上有哪些区别
前端·javascript·vue.js
码云之上4 小时前
10 颗一模一样的「Edit」:中后台 Web Agent 怎么找到对的那一行
前端·人工智能·浏览器
量化分析码农5 小时前
【Python量化多因子实战 04】因子暴露不是 alpha:市值与行业中性化实战
前端·后端
不可能片场5 小时前
Electron 发布 正文写入的三条通道与读回口径
前端·electron