使用echo.js实现图片懒加载

页面代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
  <title>使用echo.js实现图片懒加载</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      font-family: "微软雅黑";
      list-style: none;
    }
    ul{
      width: 320px;
      margin: 20px auto;
    }
    ul li{
      width: 150px;
      float: left;
      margin-right: 20px;
    }
    ul li:nth-of-type(2n){
      margin-right: 0;
    }
    ul li img {
      display: block;
      width: 150px;
      height: 152px;
      background: url(img/loading.gif) 50% no-repeat;
    }
    ul li p{
      text-align: center;
      height: 30px;
      line-height: 30px;
    }
  </style>
</head>
<body>
    <!-- 注意事项:最好给图片设置宽度和高度
      img中src是起到占位的作用,指向默认加载图片路径 真正加载的图片是data-echo里面定义的 -->
    <ul>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第1个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第2个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第3个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第4</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第5个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第6个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第7个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第8个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第9个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第10个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第11个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第12个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第13个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第14个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第15个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第16个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第17个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第18个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第19个</p>
      </li>
      <li>
        <img src="img/blank.gif" data-echo="img/ig.jpg" />
        <p>第20个</p>
      </li>
    </ul>
    <script type="text/javascript" src="js/echo.js"></script>
    <script>
      echo.init({
        offset: 0,//离可视区域多少像素的图片可以被加载
        throttle: 0,//图片延时多少毫秒加载
      });
    </script>
</body>
</html>

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;

});

详情请戳链接: https://github.com/lijinbin/echo.js

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值