一. 骨架屏简介

简单来说, 骨架屏就是填充了背景等特效的真实页面手稿轮廓图。 它可以是精确/粗略的描述了页面各个元素大小,形状,位置占位的一种页面真实数据渲染加载前的排版。 目的是加载页面过程中给用户一种较好体验的过渡效果,降低用户的焦灼情绪。避免页面过大/网络过慢长时间白屏或者闪烁。

二. 骨架屏的实现方案

目前生成骨架屏的技术方案大概有三种:

  1. 使用图片,svg 或者手动编写骨架屏代码: 使用 HTML + CSS 的方式可以很快的完成骨架屏效果, 但是面对视觉设计的改变及需求的更迭, 对骨架屏的跟进修改会非常被动, 这种机械化重复劳作的方式就显得机动性不足;
  2. 通过预渲染手动书写的代码生成相应的骨架屏: 该方案做的比较成熟的是 vue-skeleton-webpack-plugin , 通过vueSSR 结合 webpack 在构建时渲染写好的vue 骨架屏组件, 将预渲染生成的Dom 节点和相关样式插入到最终输出的 HTML 中;
    该方案与vue 技术直接关联, 在当今前端架构三分天下的环境下,不是一个很灵活,可控的方案
  3. 饿了么内部的生成骨架页面工具: 该方案通过一个webpack 插件 page-skeleton-webpack-plugin 的方式与项目开发无缝集成, 属于自动生成骨架屏方面做得非常完善的一种。并且可以启动UI界面专门调整骨架屏, 但是在面对复杂的页面也会有不尽人意的地方,他生成的骨架屏节点是基于页面本身的结构和css, 存在嵌套比较深的情况, 体积不会太小, 并且只支持history 模式。

如果你的项目Webpack构建,且非SSR:
通过wbpack插件方式快速构建粗暴骨架屏也许你会感兴趣: 传送门

四. 一个基于方案二没有使用任何第三方骨架屏插件的粗暴快捷方案

方案前提:

既然是解决首屏效果。 考虑到效率和成本, 骨架屏给大致轮廓即可,忽略细节上的设计。

方案设计

一般开发流程是这样的: 给出设计稿/静态html -> 开发 -> 测试 -> …
其中设计稿/静态HTML, 可能是UED手写/第三方UI库 。

这里我们的方案是:

  1. 开发一个提供:占位标签动画, 背景色及关闭骨架屏开关等属性的组件;
  2. 根据个人需求,在需要展示骨架屏效果的页面/标签上设置组件提供的属性即可;
  3. 通过vue ssr server build后, 会自动生成相关静态标签/css 到其配置文件中(这是webpack自动做的知道即可);

这里在设置占位高度有个小技巧: min-height

注: 本方案基于VUE SSR, 这里不对SSR的相关实现及设计做讲解。只要你的项目已支持SSR 即可。

方案优点

  1. 简单快捷;
  2. 依赖少;
  3. 门槛低;
  4. 较灵活;
  5. 控制权交给开发者;
  6. 支持自定义骨架屏展示时间;
  7. 支持根据实际数据返回,控制骨架屏展示

方案缺点

  • 需要根据自己的需求,手动设置标签盒子的背景色/高/宽度;

走进源码及实例

  • 骨架屏组件源码:
<template>
<div :class="[openSkeleton? 'skeleton-animate':'']"><slot :openSkeleton="openSkeleton"></slot>
</div>
</template><script>
// 骨架屏计时器
let skeletonTimeoutIns = null
@Component
export default class Dialoglogin extends Vue {// 手动控制骨架屏 关闭@Prop({default: false})closeSkeleton// 骨架屏自动关闭秒数 (3秒:  3000 关闭)@Prop({default: 1000})timeOutSecond// 是否为自动模式(setTimeout 来自动控制开/关)@Prop({default: false})isAuto@Watch('isAuto', {immediate: true})watchIsAuto(newVal, oldVal) {if (!!newVal) {!!skeletonTimeoutIns && clearTimeout(skeletonTimeoutIns)skeletonTimeoutIns = setTimeout(() => {this.openSkeleton = false}, this.timeOutSecond)} else {clearTimeout(skeletonTimeoutIns)skeletonTimeoutIns = null}}@Watch('closeSkeleton', {immediate: true})watchCloseSkeleton(newVal, oldVal) {if (!!newVal) {clearTimeout(skeletonTimeoutIns)skeletonTimeoutIns = nullthis.openSkeleton = false}}// 开启骨架屏openSkeleton = truemounted() {}
}
</script>
<style scoped>
.skeleton-animate {-webkit-animation: van-skeleton-blink 1.2s ease-in-out infinite;animation: van-skeleton-blink 1.2s ease-in-out infinite;
}
.skeleton-bgcolor {background-color: rgb(231, 230, 230);/*#f2f3f5;*/
}
</style>

上面即为骨架屏的主要源码, 优化空间还是很大的,比如开放背景色API, 动画API 等等。

  • 在页面中使用骨架屏组件
 <template>.....................<SkeletonAll v-slot:default="slotProps" :is-auto="true" :time-out-second="4000"><div class="special skeleton-bgcolor" style="margin-bottom: 6px; border-top: 1px solid #eee; min-height: 200px;"><van-tabs v-model="activeSpecial" animated v-show="!slotProps.openSkeleton"><van-tab style="height:200px" v-for="(item, index) in specialInfoList" :key="index" :title="item.title"><van-image style="width:100%; height: 211px;" :src="item.img" @click="handleTabsItemClick"><template v-slot:loading><van-loading type="spinner" size="30" color="#1989fa" /></template></van-image></van-tab></van-tabs></div></SkeletonAll>......................................</template><script>.........import SkeletonAll from '@/components/skeleton-all'.........
</script>

细心的同学应该留意到, 这里在骨架屏标签盒子上控制切换用的是 v-show 而非 v-if 。 为什么? 哈哈~

最终实现效果

骨架屏:

加载数据后:

如果想看真实效果可以可以访问我的个人网址(快到期了),二维码下方:

后续后空在梳理总结一些比较高级的骨架屏方案分享!
如果本文章对你有帮助,别忘了赞一个哟 ~~~~

骨架屏 之 Vue SSR(快捷简易版本解决方案)相关推荐

  1. 一种自动化生成骨架屏的方案

    今天分享的主题是:「一种自动化生成骨架屏的方案」, 先看下市场上常见的骨架屏优化效果. 今天的分享主要分为三个部分: 首屏加载状态演进 如何构建骨架屏 将骨架屏打包的项目中 首屏加载的演进 我们先来看 ...

  2. 步步提高网站体验系列之——骨架屏

    前言 最近周末有点时间想着把博客网站再折腾一下,上点流行的技术,提高一下网站交互体验,准备从以下几点入手,也算立个flag,提醒自己不要偷懒: 骨架屏 PWA (Progressive Web App ...

  3. react骨架屏自动生成_前端骨架屏方案小结

    骨架屏 最近在项目不时有用到骨架屏的需求,所以抽时间对骨架屏的方案作了一下调研,骨架屏的实践已经有很多了,也有很多人对自己的方案作了介绍.在这里按照个人的理解做了一个汇总和分类,分享给大家. 关于骨架 ...

  4. 微信小程序---骨架屏实现,实现起来超级简单

    一.什么是骨架屏? 骨架屏是页面的一个空白版本,通常会在页面完全渲染之前,通过一些灰色的区块大致勾勒出轮廓,待数据加载完成后,再替换成真实的内容.通常在小程序中,我们需要手工维护骨架屏的代码,当业务变 ...

  5. 微信小程序:骨架屏的实现方法

    为了优化用户体验,骨架屏一直是开发者比较喜欢的表现方式,也就是首屏占位的一种表现方式,不会让浏览者因为长时间的等待而焦躁.小程序中骨架屏的实现还是比较简单的,但是没用过的同学难免会误入歧途,今天就分享 ...

  6. Vue SSR 服务端渲染原理(简易版本)

    前言 在了解Vue SSR之前,我们要搞明白两个东西先:SSR 和 浏览器的渲染, 涉及到的技术: Vue vue-server-renderer Nodejs Express 1. 什么是SSR S ...

  7. 【骨架屏】【vue】如何在webpack+vue+vue-cli下搭建多模块/单模块多路由骨架屏

    如何在webpack+vue+vue-cli下搭建多模块/单模块多路由骨架屏 前言 骨架屏的用户感知比loading更好,此前看过很多专栏以及文章,此次实践中还是遇到需要学习的部分. 对于骨架屏或者占 ...

  8. vue 浏览器调试 样式如何定位样式_Vue项目骨架屏注入实践和方法总结

    相比于早些年前后端代码紧密耦合.后端工程师还得写前端代码的时代,如今已发展到前后端分离,这种开发方式大大提升了前后端项目的可维护性与开发效率,让前后端工程师关注于自己的主业.然而在带来便利的同时,也带 ...

  9. Vue中实现骨架屏的多种方式

    vue-cli项目首页加载缓慢想要使用骨架屏效果,经过几天的实践,这里学习并记录一下vue项目自动生成骨架屏方法.  前言:骨架屏的作用主要是在网络请求较慢时,提供基础占位,当数据加载完成,恢复数据展 ...

最新文章

  1. 网络安全导论课程-windows开启远程
  2. 迁移学习——使用Tensorflow和VGG16预训模型进行预测
  3. 权限操作-springSecurity快速入门
  4. Python学习笔记:创建进程
  5. python和uipath区别_Uipath中调用Python的方法
  6. 为什么民营银行,农村商业银行存款,定期存款利率比五大行还高?
  7. django orm 操作表
  8. 管理感悟:要想到自己脖子后面有灰
  9. 线性代数笔记5——平面方程与矩阵
  10. 阮兄弟的致远OAa8v5移动端增加功能和OEM实例
  11. Eclipse的MAT的支配树
  12. The server encountered an internal error () that prevented it from fulfilling this request
  13. 西游记笔记与想法(5)
  14. Codeforces Round #829 cf1753A Cowardly Rooks
  15. 数据研发工程师面试全过程(个人面试)
  16. 狂神说Spring笔记(全网最全)
  17. canvas实现3D魔方
  18. 查询网卡MAC地址.bat
  19. Gitlab CI/CD教程以及实战docker自动部署前端项目(全)
  20. Java web学习——Spring MVC项目实例,三层架构通过JDBC链接SQLServer2012

热门文章

  1. 微信开放平台和公总平台关系图
  2. 测试四年工作心得:如何追求卓越
  3. flickr php,php – 获取Flickr集
  4. 读文献——一些专有名词的学习记录
  5. 解决小米喷墨打印机一直提示离线的解决办法
  6. JavaScript游戏之连连看连线算法实例
  7. AI Talk | AI工业质检之以图搜图引擎
  8. LeetCode179:最大数
  9. 洛天依 Chrome 主题
  10. 电脑的网络,一会通一会不通,一般是IP冲突