Skip to content

PreloadJS 预加载及实现进度加载效果

前言

在 H5 的开发过程中,我们不难发现在首次打开 H5 时,会有一个进度条表示当前页面全部文件的加载进度,并且当加载到 100%的时候会跳转显示出首页的这一整个流程。这个流程我们可以通过 preload.js 插件来完成,下面我们先来介绍一下这个插件已经常用的监听事件。

一、preload.js

它是一个一致的方式预先加载在 HTML 应用的内容,以及预加载可以使用 HTML 标签作为 XHR 完成。 我们将要实现的功能,主要是在 LoadQueue 类中实现的, 其中包括如何加载文件和处理结果的简要概述。

LoadQueue 类 中的监听事件:

事件名描述
complete当队列完成加载所有文件时。(返回 number,在 0 到 1 之间,表示加载状态)
error当队列与任何文件遇到错误时。
progress对于整个队列进展已经改变。
fileload单个文件已完成加载。
fileprogress单个文件进度变化。注意,只有文件装载 XHR(或可能通过插件)将 file 事件进展除了 0 或 100%。

二、Demo

通过上述的 LoadQueue 类,以及相关的事件,我们可以快速地实现 H5 的加载效果。

  • html:文档结构中,创建了两个页面,分别用 article 作为承载,在第一个 article 盒子当中,用 .progress 作为进度条的显示盒子,并且通过 .progress-status 实际显示当前进度条的状态,通过 span 标签显示具体的数值;在第二个 article 盒子中主要作为首页的展示,没有过多的样式装饰。
html
<div class="container">
  <article class="article-box article-one">
    <div class="progress">
      <span>0 %</span>
      <div class="progress-status"></div>
    </div>
  </article>
  <article class="article-box article-two">
    <h1>首页</h1>
  </article>
</div>
  • css:作为页面样式的调整,在这里我是先编写 scss 样式文件了之后,再通过 live sass compiler 插件编译而成,这样对于那些需要浏览器前缀的样式属性会自动生成的。
css
body {
  margin: 0;
  padding: 0;
  color: #fff;
}

body .container {
  width: 100vw;
  height: 100vh;
  overflow: hidden;
}

body .container .article-box {
  display: none;
  -webkit-box-pack: center;
  -ms-flex-pack: center;
  justify-content: center;
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;
  position: absolute;
  width: 100%;
  height: 100%;
}

body .container .article-box .progress {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;
  position: relative;
  width: 50vw;
  height: 10vw;
  background: transparent;
  border: 3px solid #fff;
  border-radius: 3vw;
  -webkit-box-shadow: 2px 3px 4px 0px #505050;
  box-shadow: 2px 3px 4px 0px #505050;
  overflow: hidden;
}

body .container .article-box .progress span {
  position: absolute;
  left: 50%;
  -webkit-transform: translateX(-50%);
  transform: translateX(-50%);
  z-index: 20;
  -webkit-animation: progressAnimate 1s linear 0s infinite alternate;
  animation: progressAnimate 1s linear 0s infinite alternate;
}

@-webkit-keyframes progressAnimate {
  from {
    opacity: 0.2;
  }
  to {
    opacity: 1;
  }
}

@keyframes progressAnimate {
  from {
    opacity: 0.2;
  }
  to {
    opacity: 1;
  }
}

body .container .article-box .progress .progress-status {
  position: absolute;
  -webkit-transition: 0.1s;
  transition: 0.1s;
  left: 0;
  width: 0%;
  height: 100%;
  background: #f39c12;
}

body .container .article-one {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  background: #1abc9c;
}

body .container .article-two {
  background: #16a085;
}
  • js:含义见代码后面的注释
html
<!-- 先引入preload.js 插件库 -->
<script src="https://cdn.bootcdn.net/ajax/libs/PreloadJS/1.0.1/preloadjs.js"></script>
js
// 获取需要操作的DOM节点。
let articleOne = document.getElementsByClassName("article-one")[0]; // 第一个article
let articleTwo = document.getElementsByClassName("article-two")[0]; // 第二个article
let span = document.querySelector(".progress span"); // 数值展示位置
let progressStatus = document.getElementsByClassName("progress-status")[0]; // 进度条实际状态效果

// 实例 LoadQueue 类,得到实例对象 queue。
let queue = new createjs.LoadQueue(true);

// 加载进度条,监听文件的加载在全部文件中的占比,并回调 handleProgress 函数。
queue.on("progress", handleProgress);
// 加载完成时,监听全部文件加载完成的那一刻,并回调 handleComplete 函数。
queue.on("complete", handleComplete);

// 需要监测的文件,文件可以是图片、js文件、json文件等都可以。
queue.loadManifest([
  // 这里使用的链接纯做测试,实际开发中添加项目中的全部文件链接即可。
  "https://dss2.bdstatic.com/6Ot1bjeh1BF3odCf/it/u=1451575657,3505068488&fm=218&app=92&f=JPEG?w=121&h=75&s=FAA3716CC61A22770344000A0300E091",
  "https://dss2.bdstatic.com/6Ot1bjeh1BF3odCf/it/u=1451575657,3505068488&fm=218&app=92&f=JPEG?w=121&h=75&s=FAA3716CC61A22770344000A0300E091",
  "https://dss2.bdstatic.com/6Ot1bjeh1BF3odCf/it/u=1451575657,3505068488&fm=218&app=92&f=JPEG?w=121&h=75&s=FAA3716CC61A22770344000A0300E091",
  "https://dss2.bdstatic.com/6Ot1bjeh1BF3odCf/it/u=1451575657,3505068488&fm=218&app=92&f=JPEG?w=121&h=75&s=FAA3716CC61A22770344000A0300E091",
  "https://dss2.bdstatic.com/6Ot1bjeh1BF3odCf/it/u=1451575657,3505068488&fm=218&app=92&f=JPEG?w=121&h=75&s=FAA3716CC61A22770344000A0300E091",
  "https://dss2.bdstatic.com/6Ot1bjeh1BF3odCf/it/u=1451575657,3505068488&fm=218&app=92&f=JPEG?w=121&h=75&s=FAA3716CC61A22770344000A0300E091",
  "https://dss2.bdstatic.com/6Ot1bjeh1BF3odCf/it/u=1451575657,3505068488&fm=218&app=92&f=JPEG?w=121&h=75&s=FAA3716CC61A22770344000A0300E091",
  "https://dss2.bdstatic.com/6Ot1bjeh1BF3odCf/it/u=1451575657,3505068488&fm=218&app=92&f=JPEG?w=121&h=75&s=FAA3716CC61A22770344000A0300E091",
  // js文件
  "https://cdn.bootcdn.net/ajax/libs/PreloadJS/1.0.1/preloadjs.js",
]);

// 进度条回调函数
function handleProgress() {
  let num = `${Math.floor(queue.progress * 100)}%`; // queue.progress 是 'progress' 监听事件所返回的,它介于0到1之间,全部加载完成的时候结果为1,这里主要是处理这个数值按比例在1-100之间呈百分比显示。
  span.innerHTML = num; // 设置span中显示的数值。
  progressStatus.style.width = num; // 这里是通过控制 .progress-status盒子的 width所显示的加载效果的。
}

// 加载完成回调函数
function handleComplete() {
  articleOne.style.display = "none";
  articleTwo.style.display = "flex";
}

总结

最后,如果您有更好的方法,欢迎在留言区中分享;或者实际操作中遇到什么问题均可留言或者私信我,感谢您的观看! 官方文档:PreloadJs

Released under the MIT License.