1、基于原生JS中的IntersectionObserver对象实现的图片懒加载
基本思想:
- 把图片地址先存入到data-src这个自定义属性中,并且不设置img元素的src属性。
- 当监听到img元素出现在视口中了,将该img的data-src属性赋值给src属性,实现
懒加载。
实例如下所示:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758<body><div><img alt="loading..." data-src="rand0.jpg"></div><div><img alt="loading..." data-src="rand1.jpg"></div><div><img alt="loading..." data-src="rand2.jpg"></div><div><img alt="loading..." data-src="rand3.jpg"></div></body><script>// IntersectionObserver实例可以自动观察元素是否在视口内var io = new IntersectionObserver(function(ioes) {// 遍历观察对象数组(img对象)ioes.forEach(function(ioe) {// 获得被观察的目标元素,是一个 DOM 节点对象var el = ioe.target;// 获得目标元素的可见比例,完全可见时为1,完全不可见时小于等于0var intersectionRatio = ioe.intersectionRatio;if (intersectionRatio > 0 && intersectionRatio <= 1) {loadImg(el);}});el.onload = el.onerror = function(){io.unobserve(el);};});/*** 检查图片是否在窗口内* @author yijin*/(function checkImgs() {// 获得所有的img元素列表,返回对象是NodeListvar imgs = document.querySelectorAll("img");// 遍历img元素列表,监听每一个img元素imgs.forEach(function(item) {// 开始观察io.observe(item);});}());/*** 加载图片* @param el 传入的元素对象* @author yijin*/function loadImg(el) {if (!el.src) {var source = el.dataset.src;el.src = source;}}</script>