图片懒加载

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


废话不多说 直接撸代码

第一种 使用 IntersectionObserver()API

		//获取所有带自定义属性的img
       const imgs = document.querySelectorAll('img[data-src]')
       //	定义IntersectionObserver(callback,options)的options参数
       /*	options 可选
					一个可以用来配置observer实例的对象。如果options未指定,observer实例默认使用文档视口作为
					root,并且没有margin,阈值为0%(意味着即使一像素的改变都会触发回调函数)。你可以指定以下
					配置:
			root
					监听元素的祖先元素Element对象,其边界盒将被视作视口。目标在根的可见区域的的任何不可见部分
					都会被视为不	可见。
			rootMargin
					一个在计算交叉值时添加至根的边界盒(bounding_box (en-US))中的一组偏移量,类型为字符串
					(string),可以有效的缩小或扩大根的判定范围从而满足计算需要。语法大致和CSS 中的margin 属
					性等同; 可以参考 The root element and root margin in Intersection Observer API来深入了
					解margin的工作原理及其语法。默认值是"0px 0px 0px 0px"。
			threshold
					规定了一个监听目标与边界盒交叉区域的比例值,可以是一个具体的数值或是一组0.0到1.0之间的数
					组。若指定值为0.0,则意味着监听元素即使与根有1像素交叉,此元素也会被视为可见. 若指定值为
					1.0,则‘’意味着整个元素都在可见范围内时才算可见。可以参考Thresholds in Intersection 
					Observer API 
					来深入了解阈值是如何使用的。阈值的默认值为0.0。
		*/
        const options= {
            rootMargin: '0px',
            threshold: 0
        }
        let observer = new IntersectionObserver((entries, self) => {
        // 		entries  是所有图片的集合   self   是当前处于可视区域的自身元素
            entries.forEach(entry => {
          	//	使用forEach遍历   
          	// 	entry.isIntersecting元素是否进入可视区域  进入为true,未进入为false
                if (entry.isIntersecting) {
                //	如果进入就获取当前元素
                    let img = entry.target
                    //	获取当前图片的额自定义属性src
                    let src = img.dataset.src
                    //	判断src属性是否存在   如果存在就赋值   不存在说明没有地址
                    if (src) {
                    	//	设置一个定时器
                        setTimeout(() => {
                        //	让img的src=src
                            img.src = src
                            //	然后再移除它自身绑定的src   
                            img.removeAttribute('data-src')
                        }, 300);
                    }
                    //	消除
                    self.unobserve(entry.target)
                }
            })
        }, options)
        //	为每一个img都绑定IntersectionObserver
        imgs.forEach(img => {
            observer.observe(img)
        })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值