const element = document.querySelector('.Observed'); // 拿到要被监视的元素
let io = new IntersectionObserver((entries) => {
//do something when the element come into/out the viewport
},option) // 实例化一个IntersectionObserver对象
io.observe(element); //监听多个element的位置
io.observe(element1);
io.observe(element1);
类似Medium网站中的图片是我见过的最优雅的图片加载方式,记得第一次见到这种用模糊图片做placeholder的图片加载方式是在一个国外大神的博客里,当时就被惊艳到了,这种看起来很有逼格的交互其实实现起来并不复杂,这里就记录一下我从零开始一步步实现图片渐进式加载和懒加载的过程。
Intrinsic Placeholders——百分比Padding的妙用
在开始实现Progressive Image Loading之前,我们需要解决我们在加载图片是经常会遇见的一个问题:
一个优雅的解决这个问题的方案是Intrinsic Placeholders,其实现就是依靠将padding设置成百分比值。我们知道,当padding设置为百分比时,其值是相对于父元素的宽度的,假设我们的图片是一个宽高比为3:2的图片,我们希望他的的容器在图片加载出来之前能够正确地以3:2的比例占据那个位置,这时我们只需要设置一个子容器(可以用伪元素实现)的padding值为66.6%就可以了。
实现模糊效果的的渐进加载
在实现了图片占位符后,我们就要去实现图片的渐进式加载,这里我们需要准备一大一小两张图片,然后对
HTML
代码做一点点小的改动。我们用
img
标签去直接加载小图片,并将大图片的地址存储在自定义属性data-large
,方便以后js调用。实现的思路是先加载显示小图片,在大图完全加载完成后再将其添加进picture
中覆盖小图,两个图片在加载过程中我们都让其完全透明,在加载完成后再逐渐显现出来,实现起来都很简单。唯一值得一提的是模糊效果的实现,有两个可选的方案,使用CSS3的blur
属性或者使用canvas
,第一种方法明显更加简单。下面是这一部分实现的主要代码:filter
属性可以支持Chrome18+,FireFox35+,Webkit6.0+
所以,如果你想获得更好的兼容性,可以尝试用canvas实现,你可以在这里找到实现的方法。实现图片的Lazyloading 延迟加载
option中
下面是使用IntersectionObserver实现的懒加载的写法,十分简洁:
这里我设置了图片在进入视窗前100xp开始加载,以获得更好的体验。
参考资料