为什么要图片懒加载?
为了避免一次性向服务器发送大量请求而造成页面阻塞,我们需要控制请求数量,按照我们需要的量去加载图片。
原理
图片的加载是依赖于img标签的src路径,我们可以设置一个暂存器,把图片的路径放到暂存器中,当我们需要这个图片加载显示时,再把路径赋值给src,这样就能实现按需加载,也就是图片懒加载。(html5中常把data-属性作为暂存器)
优点
提高前端性能,按需加载图片可以减轻服务器压力,防止页面因加载而导致的阻塞,提高页面加载速度。
实现
jQuery
-
准备工作
使用懒加载时,我们把src设置为默认的图片,data-img是自定义属性,用于存放图片真实的路径。 -
什么时候加载图片?什么时候又不需要?
在可视区域中,加载图片 -
怎样判断图片是否在可视区域?
利用元素的偏移高度(offsetTop),对比设备宽度(window.height)+滚动条高度(scrollTop)来判断是否处于可视区域内
图片在可视区域如下:
图片不在可视区域如下:
-
根据上面的图片总结:
图片的offsetTop基本不变,如果设备高度加上滚动条与顶部的距离大于或等于图片的偏移高度,则图片就在可视区内。即:img.offset().top<=window.height()+window.scrollTop()
-
html:
<div class="img">
<img src="./loading.png" data-lazyload="https://dpic3.tiankong.com/67/cn/QJ6226943363.jpg@!350h">
<img src="./loading.png" data-lazyload="https://dpic1.tiankong.com/zt/sg/QJ6235849453.jpg@!350h">
<img src="./loading.png" data-lazyload="https://dpic1.tiankong.com/ul/ac/QJ6479383109.jpg@!350h">
<img src="./loading.png" data-lazyload="https://dpic2.tiankong.com/1z/kb/QJ6401246638.jpg@!350h">
<img src="./loading.png" data-lazyload="https://dpic1.tiankong.com/ut/zj/QJ6634256101.jpg@!350h">
</div>
- javascript
// 第一次加载
getImg();
// 设置一个延时函数节流
var clock;
// 滚动事件
$(window).on('scroll', () => {
if (clock) {
// 如果拉动滚动条时,延时函数还未执行完,则清除
clearTimeout(clock);
}
clock = setTimeout(() => {
getImg();
}, 2000)
// 2秒加载一次图片
})
function getImg() {
// 返回没有data-isLoaded的img标签
// [1,2,3].not(1) => 返回不含有1的数组 [2,3]
$('.img img').not('[data-isLoading]').each((index,item) => {
if(isShow(item)) loading(item);
})
}
// 判断图示是否在可视区域
function isShow(img) {
return $(img).offset().top <= $(window).height() + $(window).scrollTop()
}
// 将img的src换成data-isLoaded的值
function loading(img) {
$(img).attr('src', $(img).attr('data-lazyload'));
// 为已经加载的图片加一个标识,上面遍历图片的时候就会跳过已经加载了的图片,防止加载过的图片再加载
$(img).attr('data-isLoaded', 1);
}
JQuery插件(jquery.lazyload)
- html
// img图片
<img class='img' data-original="https://dpic3.tiankong.com/67/cn/QJ6226943363.jpg@!350h">
// 背景图懒加载
<div data-original="图片的地址" class='img'>
- javascript
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/jquery_lazyload/1.9.3/jquery.lazyload.min.js"></script>
<script type="text/javascript">
$(".img").lazyload({
placeholder : "./loading.gif", //用图片提前占位,加载时显示的图片
// placeholder,值为某一图片路径.此图片用来占据将要加载的图片的位置,待图片加载时,占位图则会隐藏
effect: "fadeIn", // 载入使用何种效果
// effect(特效),值有show(直接显示),fadeIn(淡入),slideDown(下拉)等,常用fadeIn
event:'click', // 事件触发时才加载
container:$('#container'), // 对容器中的图片实现效果
// container,值为某容器.lazyload默认在拉动浏览器滚动条时生效,这个参数可以让你在拉动某DIV的滚动条时依次加载其中的图片
threshold: 200, // 提前开始加载
// threshold,值为数字,代表页面高度.如设置为200,表示滚动条在离目标位置还有200的高度时就开始加载图片,可以做到不让用户察觉
});
</script>
Vue中的vue_lazyload
- 插件地址:codechina.csdn.net/mirrors/hil…
- 安装
npm install vue-lazyload --save
- 全局注册(main.js)
// 引入插件
import VueLazyLoad from 'vue-lazyload'
// 注册插件
Vue.use(VueLazyLoad, {
preLoad: 1, //距离页面底部距离的百分比,默认值为1.3
error: require('./assets/img/error.jpg'), // 加载错误时,显示的图片
loading: require('./assets/img/homePage_top.jpg'), // 加载时显示的图片
attempt: 2, // 加载错误后最大尝试次数
})
- lazyloadDemo.vue(组件中)使用
<div class="lazyLoad">
<ul>
<li v-for="img in 图片地址数组">
<img v-lazy="img" :key='img'>
// :key="" 必须要加,否则就会出现,页面刷新,其他内容都刷新了,但是只有图片不刷新的情况 。因为key可能相同,所以页面不会更新
</li>
</ul>
</div>
- 总结
img标签中使用懒加载:v-lazy代替v-bind:src
背景图片中使用懒加载:v-lazy:background-image=''
最后
参考博客:www.cnblogs.com/Raincost-Z/… blog.csdn.net/halo1416/ar…
本文章仅为自己学习时的笔记,仅从参考,对博客文章的参考,若原文章博主介意,请联系我删除!!!