认识Skeleton Screen【屏幕加载骨架】

一直以来,无论是web还是iOS、android的应用中,为了提升应用的加载等待这段时间的用户感知体验,各种奇门遁甲之术层出不穷。其中,菊花图以及由它衍生各种加载动画是一个非常大的流派,如下图所示:

由它衍生而出的各种加载动画也是遍地开花:

在很多的应用的交互中,这种菊花的加载的设计已然要一统江湖了。

不过,现在对于加载的设计体验有了比菊花加载体验更棒的方法,即本文要讲的Skeleton Screen Loading,中文一般叫做骨架屏。骨架屏听起来总觉得怪怪的,本文还是沿用英文的叫法Skeleton Screen Loading

所谓Skeleton Screen Loading即表示在页面完全渲染完成之前,用户会看到一个样式简单,描绘了当前页面的大致框架,感知到页面正在逐步加载,加载完成后,最终骨架屏中各个占位部分将被真实的数据替换。

一图胜千言,来看看微信阅读的客户端,它就使用了Skeleton Screen Loading来提升它的加载体验,可以下载它的客户端实际感受下:

现在好多web和客户端都已经放弃了以前的那种菊花的加载体验,转而使用Skeleton Screen Loading,比如Facebook、medium以及slack等。国内的饿了么、掘金等也都使用Skeleton Screen Loading来提升它们的加载体验。

下面这段话,是iOS中关于加载体验的交互设计标准的一个说明:

Don’t make people wait for content to load before seeing the screen they’re expecting. Show the screen immediately, and use placeholder text, graphics, or animations to identify where content isn’t available yet. Replace these placeholder elements as the content loads. — Apple iOS Human Interface Guidelines

使用Skeleton Screen Loading也充分遵循了iOS人机交互设计指南。本文就来讲讲如何使用vue来实现Skeleton Screen Loading。

VUE实现思路

在本文中,我们将会使用vue组件 (Component) 功能来实现一个Skeleton Screen Loading,如下图所示:

具体vue组件 (Component) 功能这里就不详讲了,可以去官方的文档看看详细的信息。

这里推荐一个模拟开发数据的开源服务jsonplaceholder,类似经常使用的图片占位服务一样,它提供了在web开发中一些常见数据类型的api服务,比如文章、评论、用户系统等,都提供了对应的接口,在开发调试阶段还是非常方便的。

比如我们做的这个例子要用到用户系统,直接使用这个用户数据接口就行了。

首先,主要的工作是实现Skeleton Screen Loading加载动画,先使用常规的html和css来实现这个动画。

动画效果如下所示:

先定义好html结构:

 <div class="timeline-item"><div class="animated-background"><div class="background-masker header-top"></div><div class="background-masker header-left"></div><div class="background-masker header-right"></div><div class="background-masker header-bottom"></div><div class="background-masker subheader-left"></div><div class="background-masker subheader-right"></div><div class="background-masker subheader-bottom"></div></div>
</div>

下面来说说实现动画的主要思路:

要实现这样的效果,需要使用一点点小技巧。先在图层animated-background定义一个大的渐变背景,然后在不需要显示背景图的位置,定义几个占位的结构填充为白色就可以实现上图所示的UI展现形式。最后使用background-position来移动背景图片的位置,就可以实现图中的动画效果。

详细的代码可以去这里查看,demo。

主要的效果实现了,下面就可以正式开工来定义我们的Skeleton Screen Loading组件。

Vue.component('user-item', {props: ['email', 'name'],template: `<div><h2 v-text="name"></h2><p v-text="email"></p></div>`
})Vue.component('loading-item', {template: `<div class="animated-background"><div class="background-masker header-top"></div><div class="background-masker header-left"></div><div class="background-masker header-right"></div><div class="background-masker header-bottom"></div><div class="background-masker subheader-left"></div><div class="background-masker subheader-right"></div><div class="background-masker subheader-bottom"></div></div>`
})

上面定义了两个组件,一个是用来显示用户信息数据的组件user-item;一个在加载完之前来显示Skeleton Screen Loading效果的loading-item组件。

定义好组件后,然后在主文件定义好对应的结构来注册使用组件:

<div id="app"><div v-for="user in users" class="items" v-if="loading"><user-item :name="user.name" :email="user.email"></user-item></div><div v-for="load in loades" v-if="!loading"><loading-item></loading-item></div>
</div>

根据上面定义好的组件,上面的代码表示,当数据加载完后,显示用户数据。当还没有加载完用户数据,则显示预先定义好的加载组件即loading-item。

var app = new Vue({el: '#app',data: {users: [],loading: false,loades: 10},methods: {getUserDetails: function() {fetch(`https://jsonplaceholder.typicode.com/users`).then(result => result.json()).then(result => {this.users = resultthis.loading = true});}},created: function() {setTimeout(() => {this.getUserDetails()}, 1000);}
});

一个简单优雅的Skeleton Screen Loading就完成了。

通过上面简单的实例,可以明显感受到当使用Skeleton Screen Loading来代替传统的菊花图在体验上更加好一些。

使用Skeleton Screen Loading,可以利用一些视觉元素来将内容的轮廓更快显示在屏幕上,让用户在等待加载的过程中对将要加载的内容有一个更加清晰的预期,特别是在弱网络的场景下,Skeleton Screen Loading的体验无疑是更好的,用起来吧。

对于Skeleton Screen Loading,你有什么样的看法呢?欢迎在评论区留言一起分享你的看法。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一日三项令人兴奋的Lucene功能

昨天是富有成效的一天&#xff1a;突然&#xff0c;Lucene有了三个令人兴奋的新功能。 表达式模块 昨天提交的第一个功能是新的expressions模块 。 这使您可以使用任意String表达式定义用于排序的动态字段。 内置了对JavaScript解析的支持&#xff0c;但是如果您想创建自己的语…

php date当天,php5中date()获得的时间不是当前时间的解决方法

自php5.10起加入了时区的设置&#xff0c;在php中显示的时间都是格林威治标准时间&#xff0c;因此便与中国的用户会差八个小时。修改php.ini中的 date.timezone 参数&#xff1a;复制代码 代码如下:[Date]; Defines the default timezone used by the date functions;date.tim…

listening for variable changes in javascript

https://stackoverflow.com/questions/1759987/listening-for-variable-changes-in-javascript转载于:https://www.cnblogs.com/wangjixianyun/p/9115336.html

JPA EntityListeners中的Spring注入的Bean

在使用JPA侦听器进行数据库加密中&#xff0c;我讨论了使用JPA EntityListener进行透明加密。 从某种意义上说&#xff0c;这种方法是透明的&#xff0c;因为JPA实体&#xff08;几乎&#xff09;完全不知道正在加密&#xff0c;而JPA EntityListener本身也不知道细节。 有一个…

php sql 去除重复数据,MSSQL_快速删除重复记录,SQL Server如何实现?,如果一张表的数据达到上百万 - phpStudy...

如果一张表的数据达到上百万条&#xff0c;用游标的方法来删除简直是个噩梦&#xff0c;因为它会执行相当长的一段时间……开发人员的噩梦——删除重复记录想必每一位开发人员都有过类似的经历&#xff0c;在对数据库进行查询或统计的时候不时地会碰到由于表中存在重复的记录而…

Python运行的方式

Python的运行方式多种多样&#xff0c;下面列举几种: 交互式 在命令行中输入python&#xff0c;然后在>>>提示符后面输入Python语句&#xff0c;这里需要注意: 1 语句前面不能有空格&#xff0c;否则会报错 2 对于符合语句&#xff0c;前面会有...提示符&#xff0c;结…

使用Apache Zookeeper进行协调和服务发现

面向服务的设计已被证明是针对各种不同的分布式系统的成功解决方案。 如果使用得当&#xff0c;它会带来很多好处。 但是随着服务数量的增加&#xff0c;了解部署什么以及部署在何处变得更加困难。 而且&#xff0c;由于我们正在构建可靠且高度可用的系统&#xff0c;因此还需要…

微信小程序无埋点数据采集方案

作者&#xff1a;lxj&#xff0c;点餐终端团队成员前言 相信业务团队对这样的场景不会太陌生&#xff1a;打点需求&#xff1a; 每新上一个功能&#xff0c;数据产品便会同步加上打点需求&#xff0c;当数据打点上线后一段时间&#xff0c;数据产品/业务产品便会针对数据的转化…

php 状态码302,HTTP状态码302、303和307的故事

今日读书&#xff0c;无法理解HTTP302、303、307状态码的来龙去脉&#xff0c;决定对其做深究并总结于本文。《HTTP权威指南》第3章在讲解30X状态码时&#xff0c;完全没有讲清楚为什么要有302、303、307&#xff0c;以及他们的关系&#xff0c;一句“问题出在HTTP/1/1”让我一…

Codeforces 1070A Find a Number(BFS) 2018-2019 ICPC, NEERC, Southern Subregional Contest Problem A

Description You are given two positive integers ddd and sss. Find minimal positive integer nnn which is divisible by ddd and has sum of digits equal to sss.Input The first line contains two positive integers ddd and sss(1≤d≤500,1≤s≤5000)(1≤d≤500,1≤s…

luogu3807 【模板】 卢卡斯定理

题目大意 对于一个很大的$n,m,p$如何求$C_{nm}^m\mod p$&#xff1f; Lucas定理 若$n_i,m_i$分别是$n,m$在$p$进制下第$i$位的数字&#xff0c;则有 $$C_n^m\mod p\prod_{i0}^{\log_p m}C_{n_i}^{m_i}\mod p$$ 求法 按照定理式一个一个求组合数即可。 组合数并不用批量求。故预…

防止System.exit调用

在开发运行其他开发人员编写的代码的容器时&#xff0c;请谨慎防范System.exit调用。 如果开发人员无意间调用了System.exit并将其代码部署为由您的容器运行&#xff0c;则它将完全降低容器进程。 可以使用SecurityManager中的checkExit函数调用来控制。 根据SecurityManager …

php异步请求$.post,如何用PHP实现异步请求、忽略返回值

本篇文章的主要内容是用PHP实现异步请求、忽略返回值&#xff0c;具有一定的参考价值&#xff0c;有需要的朋友可以看看&#xff0c;希望能对你有帮助。项目需要&#xff0c;场景如下&#xff1a;某个条件下需要调用接口发送多个请求执行脚本&#xff0c;但是由于每个请求下的脚…

JavaScript函数式编程学习

本文是我在函数式编程学习过程中&#xff0c;总结的笔记&#xff0c;也分享给想学函数式编程的同学。 函数式编程可能对于初学者来说&#xff0c;概念难以理解&#xff0c;入门比较难。所以本文从两部分去学习。 在你身边你左右 --函数式编程别烦恼 第一部分&#xff0c;你身…

读书印记 - 《沟通的艺术:一本手把手教你社交沟通的书》

一个教训是没上过榜也没什么好推荐的书有挺大概率不是本好书。我现在不太能耐心的去读这种指导手册&#xff0c;一是谈话的技巧需要在实战中才能有效提升&#xff0c;二是这方面对我来说不是关注的重点。所以几乎是刷刷的翻完了整本书。当然也不能说这本书就是烂书&#xff0c;…

Linux NTP

ntpd服务的设置: ntpd服务的相关设置文件如下&#xff1a; /etc/ntp.conf&#xff1a;这个是NTP daemon的主要设文件&#xff0c;也是 NTP 唯一的设定文件。/usr /share/zoneinfo/:在这个目录下的文件其实是规定了各主要时区的时间设定文件&#xff0c;例如北京地区的时区设定文…

Java Web项目的保存和刷新

如何配置计算机以保存并刷新Java Web项目&#xff1f; 当您向开发人员提出此问题时&#xff0c;答案以“哦&#xff0c;好吧……”开头&#xff0c;并以某种可行的方式继续描述。 每个人都有自己的方式。 首先–为什么需要这个&#xff1f; 因为执行复制和重新启动服务器是生产…

mysql alter怎么用,mysql alter话语用法

mysql alter语句用法//主键ALTER TABLE tablename add new_field_id int(5) UNSIGNED DEFAULT 0 NOT NULL anto_increment,ADD PRIMARY KEY (new_field_id);//增加一个新列mysql>ALTER TABLE tablename ADD fieldname fieldtype如&#xff1a;ALTER TABLE t2 ADD d TIMESTAM…

《React 学习之道》The Road to learn React (简体中文版)

通往 React 实战大师之旅&#xff1a;掌握 React 最简单&#xff0c;且最实用的教程。 前言 《React 学习之道》这本书使用路线图中的精华部分用于传授 React&#xff0c;并将其融入一个独具吸引力的真实世界 App的具体代码实现。 如何掌握 React 存在特别多的路线图。本书提…

Linux下设置和查看环境变量

Linux的变量种类 按变量的生存周期来划分&#xff0c;Linux变量可分为两类&#xff1a; 1 永久的&#xff1a;需要修改配置文件&#xff0c;变量永久生效。 2 临时的&#xff1a;使用export命令声明即可&#xff0c;变量在关闭shell时失效。 设置变量的三种方法 1 在/etc/profi…