Mobile plugin-lazy loading of images, pre-loading echo.js

Mobile plugin-lazy loading and preloading of pictures

echo.js

/*! echo-js v1.7.3 | (c) 2016 @toddmotto | https://github.com/toddmotto/echo */
(function (root, factory) {
  if (typeof define === 'function' && define.amd) {
    define(function() {
      return factory(root);
    });
  } else if (typeof exports === 'object') {
    module.exports = factory;
  } else {
    root.echo = factory(root);
  }
})(this, function (root) {

  'use strict';

  var echo = {};

  var callback = function () {};

  var offset, poll, delay, useDebounce, unload;

  var isHidden = function (element) {
    return (element.offsetParent === null);
  };
  
  var inView = function (element, view) {
    if (isHidden(element)) {
      return false;
    }

    var box = element.getBoundingClientRect();
    return (box.right >= view.l && box.bottom >= view.t && box.left <= view.r && box.top <= view.b);
  };

  var debounceOrThrottle = function () {
    if(!useDebounce && !!poll) {
      return;
    }
    clearTimeout(poll);
    poll = setTimeout(function(){
      echo.render();
      poll = null;
    }, delay);
  };

  echo.init = function (opts) {
    opts = opts || {};
    var offsetAll = opts.offset || 0;
    var offsetVertical = opts.offsetVertical || offsetAll;
    var offsetHorizontal = opts.offsetHorizontal || offsetAll;
    var optionToInt = function (opt, fallback) {
      return parseInt(opt || fallback, 10);
    };
    offset = {
      t: optionToInt(opts.offsetTop, offsetVertical),
      b: optionToInt(opts.offsetBottom, offsetVertical),
      l: optionToInt(opts.offsetLeft, offsetHorizontal),
      r: optionToInt(opts.offsetRight, offsetHorizontal)
    };
    delay = optionToInt(opts.throttle, 250);
    useDebounce = opts.debounce !== false;
    unload = !!opts.unload;
    callback = opts.callback || callback;
    echo.render();
    if (document.addEventListener) {
      root.addEventListener('scroll', debounceOrThrottle, false);
      root.addEventListener('load', debounceOrThrottle, false);
    } else {
      root.attachEvent('onscroll', debounceOrThrottle);
      root.attachEvent('onload', debounceOrThrottle);
    }
  };

  echo.render = function (context) {
    var nodes = (context || document).querySelectorAll('[data-echo], [data-echo-background]');
    var length = nodes.length;
    var src, elem;
    var view = {
      l: 0 - offset.l,
      t: 0 - offset.t,
      b: (root.innerHeight || document.documentElement.clientHeight) + offset.b,
      r: (root.innerWidth || document.documentElement.clientWidth) + offset.r
    };
    for (var i = 0; i < length; i++) {
      elem = nodes[i];
      if (inView(elem, view)) {

        if (unload) {
          elem.setAttribute('data-echo-placeholder', elem.src);
        }

        if (elem.getAttribute('data-echo-background') !== null) {
          elem.style.backgroundImage = 'url(' + elem.getAttribute('data-echo-background') + ')';
        }
        else if (elem.src !== (src = elem.getAttribute('data-echo'))) {
          elem.src = src;
        }

        if (!unload) {
          elem.removeAttribute('data-echo');
          elem.removeAttribute('data-echo-background');
        }

        callback(elem, 'load');
      }
      else if (unload && !!(src = elem.getAttribute('data-echo-placeholder'))) {

        if (elem.getAttribute('data-echo-background') !== null) {
          elem.style.backgroundImage = 'url(' + src + ')';
        }
        else {
          elem.src = src;
        }

        elem.removeAttribute('data-echo-placeholder');
        callback(elem, 'unload');
      }
    }
    if (!length) {
      echo.detach();
    }
  };

  echo.detach = function () {
    if (document.removeEventListener) {
      root.removeEventListener('scroll', debounceOrThrottle);
    } else {
      root.detachEvent('onscroll', debounceOrThrottle);
    }
    clearTimeout(poll);
  };

  return echo;

});


use

  1. Introduce echo.js
  2. Join on the dom node picture
  3. data-echo = 'Image path to load'
  4. echo.init()
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    *{
      margin:0;
      padding: 0;
    }
    img{
      width:100%;
    }
  </style>
</head>
<body>
  <!-- src 源是默认未加载的替代图片,一般是白色图片 -->
  <img  alt="" data-echo="./img/1.jpg" src="xxx.jpg">
  <img alt="" data-echo="./img/2.jpg">
  <img  alt="" data-echo="./img/3.jpg">
  <img  alt="" data-echo="./img/4.jpg">
  <img alt="" data-echo="./img/1.jpg">
  <img alt="" data-echo="./img/2.jpg">
  <img alt="" data-echo="./img/3.jpg">
  <img alt="" data-echo="./img/4.jpg">
  <img alt="" data-echo="./img/1.jpg">
  <img alt="" data-echo="./img/2.jpg">
  <img alt="" data-echo="./img/3.jpg">
  <img alt="" data-echo="./img/4.jpg">
  <img alt="" data-echo="./img/1.jpg">
  <img alt="" data-echo="./img/2.jpg">
  <img alt="" data-echo="./img/3.jpg">
  <img alt="" data-echo="./img/4.jpg">
  <img alt="" data-echo="./img/1.jpg">
  <img alt="" data-echo="./img/2.jpg">
  <img alt="" data-echo="./img/3.jpg">
  <img alt="" data-echo="./img/4.jpg">
</body>
<script src="./echo.js">

</script>
<script>
  echo.init({
    offset: 100, //offset: 100,
    throttle: 250, //离可视区域多少像素的图片可以被加载
    unload: false, //告诉echo是加载还是卸载视图中的图片,当图片离开视图区域时触发
    callback: function (element, op) {//回调函数,用来检测图片是否加载
    console.log('loaded ok.')
    }
  });
  // echo.render();//防止图片加载卡顿白屏等现象
</script>
</html>
49 original articles published · Like 3 · Visits 5101

Guess you like

Origin blog.csdn.net/weixin_43487066/article/details/105431376