delayLoad新组件
可以实现动态加载第二屏幕以下的图片,即随用户滚动页面的时候加载图片,该组件适用以下场景,当你想能尽量的触发页面onload,不想加载临时用户不会用的数据时候:
- 滚动加载图片、iframe等;
- 滚动加载DOM元素背景图片,动态插入class;
- 页面滚动到某个dom的时候执行一个事件,可以动态载入数据、html等等
与旧的版本,这个组件有哪些改变:
- 使用IntersectionObserver替换了原来的scroll事件和getBoundingClientRect;
- 使用更合理的dataset,delayload => data-delay;
- 新增了加载超级大图decode和多线程web worker载入形式;
- 如果浏览器不支持IntersectionObserver会切换到旧版本,旧版本只修改了自定义属性,兼容了新版的data-delay;
- 其他代码上的适应时代的优化;
有考虑未来可能会加入的,随缘:
- 模块化支持;
- 对视频video、source、picture的动态加载支持;
- 对srcset、poster的支持;
- 可自定义,对每个监控dom绑定自定义事件;
[warning] 注意
- 新旧版本不兼容,对IntersectionObserver不支持的浏览器会做降级处理,但也不支持新版的新特性;
delyload组件无须依赖
组件CDN
<script src="//game.gtimg.cn/images/js/comm/delayload-min.js"></script>
<script>delyLoad.init()</script>
常规图片
data-dely="图片地址"
- 图片建议需要先定义宽高,注意,目标暂时不支持srcset、poster
<img
data-dely="https://ossweb-img.qq.com/images/cf/act/a2009101national_day/nd_s_top.jpg"
width="1600" height="92" >
<img
data-dely="//ossweb-img.qq.com/images/cf/act/a2009101national_day/nd_s_bg01.jpg"
width="1600" height="137" >
<img
data-dely="https://picsum.photos/id/1003/1181/1772"
width="916" height="611"/>
超大图片
data-dely="图片地址" data-dely-configs="{...}"
- load:'decode' ----表示用decode模式载入图片,超大图可以打开此配置,比常规加载稍快一点点且不那么容易阻塞后续资源加载。注意一般常规图片没必要开启,如果decode不支持或加载失败,会切换到常规加载
- thumb:'小图地址' ----可选,在decode的时候图片会显示空白,可先加载一张小图,超大图加载后替换;
- 缺陷:有小许浏览器兼容性问题,和加载的时候目标图片dom会显示空白,所以建议一起把thumb写上。
<img
data-dely="https://usdawatercolors.nal.usda.gov/pom/download.xhtml?id=POM00007435"
data-dely-configs="{load:'decode',thumb:'https://usdawatercolors.nal.usda.gov/download/POM00007435/thumbnail'}"
width="1000"
height="2000"/>
<img
data-dely="https://picsum.photos/id/10/2500/1667"
data-dely-configs="{load:'decode'}"
width="1600"
height="1000"
/>
web worker加载
data-dely="图片地址"
data-dely-configs="{...}"
- load:'worker' ----表示启用多线程方式载入图片,超大图、超多图、容易卡屏的时候可以打开此配置,注意一般常规图片完全没必要开启;
- thumb:'小图地址' ----可选,在decode的时候图片会显示空白,可先加载一张小图,源图加载后替换;
- 缺陷:仅限同源,xx效果可能大于实际效果,使用场景有限。
<img
data-dely="POM00000120.jpg"
data-dely-configs="{load:'worker',thumb:'https://usdawatercolors.nal.usda.gov/download/POM00000120/thumbnail'}"
width="1000"
height="2000">
<img
data-dely="POM00007435.jpg"
data-dely-configs="{load:'worker',thumb:'https://usdawatercolors.nal.usda.gov/download/POM00007435/thumbnail'}"
width="1000"
height="2000">
css图片加载
data-dely="class name" data-dely-configs="{...}"
- type:'cls' ----把结构css和背景css分开,有背景图片的css等in view的时候在插入加载图片
<style>
.b1{height:119px}.b2{height:144px}.b3{height:137px}.b4{height:137px}.b5{height:253px}
.d1{background:url(//ossweb-img.qq.com/images/qqgame/act/20100827seventh/i_pic_01.jpg) no-repeat 0 0}
.d2{background:url(//ossweb-img.qq.com/images/qqgame/act/20100827seventh/i_pic_02.jpg) no-repeat 0 0}
.d3{background:url(//ossweb-img.qq.com/images/qqgame/act/20100827seventh/i_pic_03.jpg) no-repeat 0 0}
.d4{background:url(//ossweb-img.qq.com/images/qqgame/act/20100827seventh/i_pic_04.jpg) no-repeat 0 0}
.d5{background:url(https://ossweb-img.qq.com/images/qqgame/act/20100827seventh/i_pic_05.jpg) no-repeat 0 0}
</style>
<div class="b1" data-dely="d1" data-dely-configs="{type:'cls'}"></div>
<div class="b2" data-dely="d2" data-dely-configs="{type:'cls'}"></div>
<div class="b3" data-dely="d3" data-dely-configs="{type:'cls'}"></div>
<div class="b4" data-dely="d4" data-dely-configs="{type:'cls'}"></div>
<div class="b5" data-dely="d5" data-dely-configs="{type:'cls'}"></div>
in view 的时候执行某个方法(function)
data-dely="function name" data-dely-configs="{...}"
- type:'func' ----定义一个函数,当目标dom in view的时候执行。如可以在页面上把某些数据、dom等装载到某个自定义标签或textarea里面,定义一个函数当屏幕滚动到目标dom的时候,执行函数,把前面标签里面的文本innerHTML,当然,也可以干点别的
<div
data-dely="hi('hihihihihi')"
data-dely-configs="{type:'func'}">这里会把hi('hihihihihi')里面的字符串写入到后面的div中:</div>
<div style="height:200px;" id="my"></div>
<script>
function hi(s){
document.getElementById("my").innerHTML=s
}
</script>
其他src
data-dely="src"
- data-dely="iframe的src,等,也是可行的,不过video暂时不支持,这些都有成熟的插件载入,意义不大"
<iframe
width="202"
scrolling="no"
height="170"
frameborder="0"
data-dely="//cf.qq.com/web200905/inc/ifr_shop_new.htm"
allowtransparency="true"></iframe>