图片懒加载
JavaScript实现方式
<html> <head> <title>lazyLoad</title> </head> <style> div{ height:120px; width:100px; overflow-y: auto; } img{ width:80px; height:70px; } </style> <body> <div> <img data-zjy='https://dgss1.baidu.com/6ONXsjip0QIZ8tyhnq/it/u=3810555211,2918796770&fm=173&app=49&f=JPEG?w=312&h=208&s=C9231F7244A1D7173F4C11CD0300E0E0'> <img data-zjy='https://dgss0.baidu.com/6ONWsjip0QIZ8tyhnq/it/u=2871332316,5387476&fm=173&app=49&f=JPG?w=312&h=208&s=88F070845221BF555A554D9703003080'> <img data-zjy='https://dgss1.baidu.com/6ONXsjip0QIZ8tyhnq/it/u=1208071780,1778912703&fm=173&app=49&f=JPEG?w=312&h=208&s=7A90428F4C010D476C28B9380300C008'> <img data-zjy='https://dgss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=2663639687,3262356824&fm=173&app=49&f=JPEG?w=312&h=208&s=191A6BD94E533ECA42B90558030040D3'> </div> <script> let observer = new IntersectionObserver((entries,observer)=>{ entries.forEach((entry)=>{ entry.target.src = entry.target.dataset.zjy; observer.unobserve(entry.target) }) },{ rootMargin:'0px 0px -10px 0px' }) document.querySelectorAll('img').forEach(img=>{ observer.observe(img) }) </script> </body> </html>
原生HTML <img /> lazy loading(Chrome 76支持)
- lazy loading加载数量与屏幕高度有关,高度越小加载数量越少,但并不是线性关系。
- lazy loading加载数量与网速有关,网速越慢加载数量越多,但不是线性关系。
- lazy loading加载没有缓冲,滚动即会触发新的图片资源加载
- lazy loading所在视口resize尺寸变化会触发图片懒加载(屏幕从小变大)。
- lazy loading根据滚动位置不同,lazy loading会忽略头尾的图片请求。
滚动记忆与跳过加载
浏览器普通刷新的时候会记住上一次滚动的位置,如果页面之前滚动位置在很下方,这个时候刷新页面,上方的图片并不会加载,只会加载下面的图片。
语法和参数
- lazy
- 图片或框架懒加载,也就是元素资源快要被看到的时候加载。
- eager
- 图片或框架无视一切进行加载。
- auto
- 默认值。图片或框架基于浏览器自己的策略进行加载。
如果HTMLImageElement或者HTMLIFrameElement元素没有显式地设置loading
属性或者loading
属性的值不合法,则都被当作'auto'
处理。
JavaScript相关
如何判断当前浏览器是否支持loading='lazy'?
const isSupportLoading = 'loading' in document.createElement('img') const isSupportLoading = 'loading' in new Image() const isSupportLoading = 'loading' in HTMLImageElement.prototype
如何获取loading属性值?
<img id='img' loading='lazy' /> const loadingValue = document.getElementById('img').loading // 如果浏览器并不支持原生的loading懒加载,则会返回undefined
loading自定义扩展并不会被覆盖,HTMLImageElement.prototype.loading会报错Illegal invocation
<img loading="lazy"> HTMLElement.prototype.loading = function(){} const img = document.querySelector('[loading]') img.loading // lazy
以自己现在的努力程度,还没有资格和别人拼天赋