实际项目开放中,特别是电商项目,因为有大量的图片加载必然会影响性能,因此实现图片的懒加载是很是有必要的。javascript
标签的data-属性 可视区域的监听
<img alt="loading..." data-src="images/1.jpg"> 当咱们监听到图片进入可视区域后,就将data-src到值赋值给src属性 <script> var images = document.querySelectorAll('img'); //ES6方法,也能够直接使用for语句 Array.from(images).forEach((el)=>{ el.src = el.dataset.src; }) </script>
rectObject = object.getBoundingClientRect();
返回值是一个 DOMRect 对象,这个对象是由该元素的 getClientRects()
方法返回的一组矩形的集合, 即:是与该元素相关的CSS 边框集合 。DOMRect 对象包含了一组用于描述边框的只读属性——left、top、right和bottom,单位为像素。除了 width 和 height 外的属性都是相对于视口的左上角位置而言的。java
经过这个API,咱们就很容易获取img元素相对于视口的顶点位置"rectObject.top",只要这个值小于浏览器的高度(window.innerHeight)就说明进入可视区域。若是要提早加载,能够添加将浏览器的高度加值。浏览器
function isInSight(el){ const bound = el.getBoundingClientRect(); const clientHeight = window.innerHeight; return bound.top <= clientHeight + 100; }
实现图片加载函数
function loadImg(el){ if(!el.src){ const source = el.dataset.src; el.src = source; } }
将判断进入可视区域的函数与加载图片的函数放入页面函数,在页面加载与滚动的时候调用函数性能
function checkImgs(){ const imgs = document.querySelectorAll('li img'); Array.from(imgs).forEach(el =>{ if (isInSight(el)){ loadImg(el); } }) } window.onload = function(){ checkImgs(); } document.onscroll = function () { checkImgs(); }
到这里就完成了图片懒加载,但会存在一些性能问题,好比:加载过的图片不须要在遍历了、两次滚动时间间隔很短(抖动问题)。这些优化问题就不在这儿写了,之后有时间再补上去。接下来会写另外一个ES6实现图片懒加载的API——“IntersectionObserver
”,这个API实现性能会更好。优化