写一个网页进度loading

≯℡__Kan透↙ 提交于 2020-01-06 01:54:39

作者:jack_lo

www.jianshu.com/p/4c93f5bd9861

如有好文章投稿,请点击 → 这里了解详情

 

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()

}

 

效果不错,但是有个问题,万一window loaded太慢了,导致进度显示load到100%了,loading还没有隐藏,那就打脸了。所以,我们需要让loading在window loaded的时候才到达终点,在这之前,loading可以保持一个等待的状态,比如在80%的时候,先停一停,然后在loaded的时候快速将进度推至100%。这个做法是目前绝大部份进度条的做法。

 

var $loading = $('#loading')

var $progress = $('#progress')

var prg = 0

 

var timer = window.setInterval(() => {

  if (prg >= 80) {  // 到达第一阶段80%,关闭定时器,保持等待

    window.clearInterval(timer)

    prg = 100

  } else {

    prg++

  }

 

  $progress.html(prg + '%')

  console.log(prg)

}, 100)

 

window.onload = () => {

  window.clearInterval(timer)

  window.setInterval(() => {

    if (prg >= 100) {  // 到达终点,关闭定时器

      window.clearInterval(timer)

      prg = 100

      $loading.hide()

    } else {

      prg++

    }

 

    $progress.html(prg + '%')

    console.log(prg)

  }, 10)  // 时间间隔缩短

}

 

ok,这差不多就是我们想要的功能了,我们来提炼一下代码,把重复的代码给封装一下:

 

var $loading = $('#loading')

var $

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!