loading随处可见,比如一个app经常会有下拉刷新,上拉加载的功能,在刷新和加载的过程中为了让用户感知到 load 的过程,我们会使用一些过渡动画来表达。最常见的比如“转圈圈”,“省略号”等等。
网页loading有很多用处,比如页面的加载进度,数据的加载过程等等,数据的加载loading很好做,只需要在加载数据之前(before ajax)显示loading效果,在数据返回之后(ajax completed)结束loading效果,就可以了。
但是页面的加载进度,需要一点技巧。
页面加载进度一直以来都是一个常见而又晦涩的需求,常见是因为它在某些“重”网页(特别是网页游戏)的应用特别重要;晦涩是因为web的特性,各种零散资源决定它很难是“真实”的进度,只能是一种“假”的进度,至少在逻辑代码加载完成之前,我们都不能统计到进度,而逻辑代码自身的进度也无法统计。另外,我们不可能监控到所有资源的加载情况。
所以页面的加载进度都是“假”的,它存在的目的是为了提高用户体验,使用户不至于在打开页面之后长时间面对一片空白,导致用户流失。
既然是“假”的,我们就要做到“仿真”才有用。仿真是有意义的,事实上用户并不在乎某一刻你是不是真的加载到了百分之几,他只关心你还要load多久。所以接下来我们就来实现一个页面加载进度loading。
首先准备一段loading的html:
<!DOCTYPE html><html><head> <title>动手实现一个网页加载进度loading</title></head><body> <div class="loading" id="loading"> <div class="progress" id="progress">0%</div> </div></body></html>
来点样式装扮一下:
.loading { display: table; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: #fff; z-index: 5;}.loading .progress { display: table-cell; vertical-align: middle; text-align: center;}
我们先假设这个loading只需要在页面加载完成之后隐藏,中间不需要显示进度。那么很简单,我们第一时间想到的就是window.onload:
(以下内容为了方便演示,默认使用jQuery,语法有es6的箭头函数)
var $loading = $('#loading')var $progress = $('#progress')window.onload = () => { $loading.hide()}
ok,这样基本的loading流程就有了,我们增加一个进度的效果,每隔100ms就自增1,一直到100%为止,而另一方面window loaded的时候,我们把loading给隐藏。
我们来补充一下进度:
var $loading = $('#loading')var $progress = $('#progress')var prg = 0 // 初始化进度var timer = window.setInterval(() => { // 设置定时器 if (prg >= 100) { // 到达终点,关闭定时器 window.clearInterval(timer) prg = 100 } else { // 未到终点,进度自增 prg++ } $progress.html(prg + '%') console.log(prg)}, 100)window.onload = () => { $loading.hide()}
新闻热点
疑难解答
图片精选