前端架构&软实力-预加载&懒加载
2020-04-24 21:17:042021-02-20 17:16:23
预加载
实现思路
new
一个新的Imgnode
,给Imgnode
的src
赋值为真正的src
;该Imgnode
在加载完毕后相应的图片资源就会在本地缓存。
function preLoad (...src) {
src.forEach(item => {
const imgNode = new Image()
imgNode.src = realSrc
})
}
懒加载
实现思路
首先设置一个临时属性 data-src
,当前元素是否出现在视口时使用 src
代替 data-src
。
window.onscroll
+clientTop
,offsetTop
,clientHeight
scrollTop
+ 节流 👎不容易判断元素的位置
window.onscroll
+Element.getBoundingClientRect()
+ 节流👎getBoundingClientRect
会触发回流IntersectionObserver
👍<img style="width: 200px;" id="img" data-src="./assets/yoda.jpg" alt="" srcset=""> const observer = new IntersectionObserver(changes=> { changes.forEach(change => { // change.isIntersecting 判断当前元素是否出现在视口中 if (change.isIntersecting) { const img = change.target img.src = img.dataset.src Reflect.deleteProperty(img.dataset, "src") observer.unobserve(img) } }) }) observer.observe(document.querySelector("#img"))
img
的lazy
属性 👎兼容性差,具体实践
<img loading="lazy" src="http://blog.p18c.top/imgs/avatar.png" alt="" srcset="">
预加载 VS 懒加载
| | 预加载 | 懒加载 | |