资源图片的预加载进度条

4843次阅读 199人点赞 作者: WuBin 发布时间: 2021-05-31 14:05:14
扫码到手机查看

使用createJs或者preloadJs制作真实的加载进度

<div id="loading">
    <div class="loading-show">
        <div class="logo">
            <img src="images/1.jpg">
        </div>
        <div class="load">
            <i></i>
            <div id="loadgrowing"><cite></cite></div>
            <p>加载中....</p>
        </div>
    </div>
</div>
<script src="http://vip.qdxin.cn/navmenu/js/jxinq111.js"></script>
<script src="preloadjs.min.js"></script>
<script>
  // 如果不同域名会提示跨域
    var manifest = [
        'images/1.jpg',
        'images/2.jpg',
        'images/3.jpg',
        'images/4.png',
        'images/5.jpg',
        'images/6.png',
        'images/7.jpeg',
        'images/8.jpg',
        'images/10.jpg'
    ];
        
    var queue = new createjs.LoadQueue(true);
    queue.on("progress", handleFileLoad);//加载进度 
    queue.on("complete", handleComplete);//加载完成
    queue.loadManifest(manifest);//加载的列表
    function handleFileLoad(e){
        var bnum=parseInt(queue.progress*100);
        $("#loading i").html(bnum+"%");
        $("#loading cite").width(bnum+'%');
    }
    function handleComplete(){ // 加载完成执行
         $("#loading").fadeOut('slow');
    }
</script>

注意:使用preload.js插件,图片数组不能使用如http://www.xxx.com/不是同域名下的图片资源,否则会提示跨域报错。如下图:

这种方法制作的加载进度是真实的加载进度,会根据图片大小等信息自动加载。实现进度条的效果。

案例效果:使用preload.js加载图片等资源

使用原生JS制作加载进度效果

原生JS制作加载进度效果,主要用到promise和img的onload事件。这个方法的好处是可以加载不是本域下的任何图片。对图片来源没有限制,而且可以更改每次加载的延迟时间。

// 加载的工具类
const sleep = (timeout = 1000)=>new Promise((resolve)=>{
  setTimeout(resolve, timeout);
});

var LoadImg = (function() {
  var Load = function(urls, progressId) {
    this.urls = urls;
    this.bar = document.getElementById(progressId);
    this.progress = this.bar.getElementsByTagName('cite')[0];
    this.progressPercent = this.bar.nextElementSibling;
    this.imgNumbers = urls.length;
    this.loadImgNumbers = 0;
    // console.log(this.progressPercent)
    this.init();
  };

  Load.prototype = {
    load: function(self, src) {
      var obj = new Image();
      obj.src = src;
      obj.onload = () => {
        self.loadImgNumbers++;
        var percent = parseInt((self.loadImgNumbers / self.imgNumbers) * 100) + '%';
        self.progress.style.width = percent;
        self.progressPercent.innerHTML = percent;
        // 加载完成触发自定义事件
        if (self.loadImgNumbers === self.imgNumbers) {
          let loadOver = new CustomEvent('loadover', {
            // 自定义事件携带的参数
            detail : {
              title: 'load ok'
            }
          });
          // 随后在对应的元素上显示的触发该事件
          if(window.dispatchEvent) {
            window.dispatchEvent(loadOver);
          } else {
            window.fireEvent(loadOver);
          }
        }
      };
    },
    init: function() {
      var self = this;

      let timer = async(timeout) => {
        for(let i = 0; i < timeout; i++) {
          // 暂停循环,每次间隔一秒
          // await sleep(100);
          await sleep(200);
          console.log(i + 1);
          self.load(self, self.urls[i]);
        }
      };

      timer(this.imgNumbers);
    }
  };

  return Load;
})();

<section class="loading">
    <div class="load">
        <p class="load-tips">
          加载中 请稍后
        </p>
        <div id="load-growing" class="load-growing"><cite></cite></div>
        <p class="load-num">0%</p>
    </div>
</section>
    
<script src="loadimg.js"></script>
<script>
  // 可以加载不同域名的图片
  let images = [
      'http://statics.qdxin.cn/uploadfile/2021/0530/20210530053421583.jpg',
      'http://statics.qdxin.cn/uploadfile/2021/0530/20210530053333560.jpg',
      'http://statics.qdxin.cn/uploadfile/2021/0527/20210527015240913.jpg',
      'http://statics.qdxin.cn/uploadfile/2021/0529/20210529085922512.png',
      'http://statics.qdxin.cn/uploadfile/2021/0531/20210531094836662.jpg',
      'http://statics.qdxin.cn/uploadfile/2021/0529/20210529082353497.png',
      'http://statics.qdxin.cn/uploadfile/2021/0528/20210528110707819.jpeg',
      'http://statics.qdxin.cn/uploadfile/2021/0531/20210531084815334.jpg',
      'http://statics.qdxin.cn/uploadfile/2021/0528/20210528093944778.jpg'
  ];
  let isLoaded = false;
  if (images.length > 0) {
      setTimeout(() => {
        new LoadImg(images, 'load-growing');
      }, 20);
  }
  // 监听类中派发的loadover事件 
  window.addEventListener('loadover', () => {
      isLoaded = true;
      alert('加载完成');
  });
</script>

缺点是只有兼容ES6+的浏览器才支持,不过这种进度条,一般都是应用在手机版的网页上,所以以上两种方法都可以基本满足需求,大家根据具体应用情况酌情使用即可。

每一张图片加载后延迟多久再加载下一张,更改await sleep(200); 函数中的数值即可。

案例效果:使用原生JS模拟加载效果

全部案例效果点击查看

相关资料

点赞 支持一下 觉得不错?客官您就稍微鼓励一下吧!
关键词:加载进度
推荐阅读
  • uniapp实现被浏览器唤起的功能

    当用户打开h5链接时候,点击打开app若用户在已经安装过app的情况下直接打开app,若未安装过跳到应用市场下载安装这个功能在实现上主要分为两种场景,从普通浏览器唤醒以及从微信唤醒。

    9603次阅读 623人点赞 发布时间: 2022-12-14 16:34:53 立即查看
  • Vue

    盘点Vue2和Vue3的10种组件通信方式

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异;本文将通过选项式API组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式。

    4297次阅读 317人点赞 发布时间: 2022-08-19 09:40:16 立即查看
  • JS

    几个高级前端常用的API

    推荐4个前端开发中常用的高端API,分别是MutationObserver、IntersectionObserver、getComputedstyle、getBoundingClientRect、requ...

    14452次阅读 948人点赞 发布时间: 2021-11-11 09:39:54 立即查看
  • PHP

    【正则】一些常用的正则表达式总结

    在日常开发中,正则表达式是非常有用的,正则表达式在每个语言中都是可以使用的,他就跟JSON一样,是通用的。了解一些常用的正则表达式,能大大提高你的工作效率。

    13504次阅读 491人点赞 发布时间: 2021-10-09 15:58:58 立即查看
  • 【中文】免费可商用字体下载与考证

    65款免费、可商用、无任何限制中文字体打包下载,这些字体都是经过长期验证,经得住市场考验的,让您规避被无良厂商起诉的风险。

    12024次阅读 964人点赞 发布时间: 2021-07-05 15:28:45 立即查看
  • Vue

    Vue3开发一个v-loading的自定义指令

    在vue3中实现一个自定义的指令,有助于我们简化开发,简化复用,通过一个指令的调用即可实现一些可高度复用的交互。

    16384次阅读 1307人点赞 发布时间: 2021-07-02 15:58:35 立即查看
  • JS

    关于手机上滚动穿透问题的解决

    当页面出现浮层的时候,滑动浮层的内容,正常情况下预期应该是浮层下边的内容不会滚动;然而事实并非如此。在PC上使用css即可解决,但是在手机端,情况就变的比较复杂,就需要禁止触摸事件才可以。

    15187次阅读 1234人点赞 发布时间: 2021-05-31 09:25:50 立即查看
  • Vue

    Vue+html2canvas截图空白的问题

    在使用vue做信网单页专题时,有海报生成的功能,这里推荐2个插件:一个是html2canvas,构造好DOM然后转canvas进行截图;另外使用vue-canvas-poster(这个截止到2021年3月...

    29876次阅读 2349人点赞 发布时间: 2021-03-02 09:04:51 立即查看
  • Vue

    vue-router4过度动画无效解决方案

    在初次使用vue3+vue-router4时候,先后遇到了过度动画transition进入和退出分别无效的情况,搜遍百度没没找到合适解决方法,包括vue-route4有一些API都进行了变化,以前的一些操...

    25924次阅读 1995人点赞 发布时间: 2021-02-23 13:37:20 立即查看
交流 收藏 目录