1.背景:

前几天项目需求实现了图片瀑布流布局,就想着自己再实现图片的懒加载,瀑布流布局配合图片懒加载。

2.懒加载的意义

图片懒加载为的是提升网页性能,减少图片在同一时间请求很多网络图片资源,当然是页面一次性展示了很多图片的情况,所以在这种情况下,为了提升网页性能,提高用户体验我们可以用懒加载来实现。

3.实现原理

主要思路就是在可视区域内得图片进行加载,反之默认不做图片得请求,可以用我们本地自己定义得比较小得loading图代替(当然这个loading图片也会做网络请求,但是是我们自己定义的,那便可空,选的图会比较小,而且在同一时刻,相同图片只会请求一次),本次实现,源码里没有给默认的loading图片,而是把图片加载之前的样式,以及图片加载失败后的样式交给使用者自己定义

这里尝试了两种方案:

方案1: 传统实现图片懒加载,会去监听滚动条的变化,当图片进入可视区域内,通过监听当前图片以及滚动条位置,判断是否已经进入可视区域

主要用到:

window.addEventListener("scroll", (e) => {});  // 监听滚动Element.getBoundingClientRect() // 方法会返回一个DOMRect对象,其包含了当前元素的大小,以及相对于视窗的位置信息

方案1 代码走起:

<template><div><img v-for="(item,i) in lazyImgs" style="width: 180px;height:240px;margin- top:40px;display: inline-block;" :data-src="item"  :key="i" src=""   alt=""></div>
</template>async mounted() {window.addEventListener("scroll", (e) => {// 这里做一个 节流 操作if (this.timer) return;this.timer = setTimeout(() => {this.query("img[data-src]").forEach((img) => {const rect = img.getBoundingClientRect();if (rect.top < window.innerHeight) {img.src = img.dataset.src;// 我们是通过img[data-src]查找所有img标签的,渲染后就删除data-src可减少forEach循环的计算成本img.removeAttribute("data-src"); }});clearTimeout(this.timer);// 这里一定要把定时器置为 nullthis.timer = null}, 300);});
},methods: {query(selector) {return Array.from(document.querySelectorAll(selector));},
}

上面方法是传统方法通过监听滚动条来实现

方案2: 利用监听器实现

用到的api       IntersectionObserver    不了解的小伙伴自行百度一下 就是一个监听器,学名叫交叉观测器,可以监听任何元素,当元素进入可视区域内,便会触发回调函数

我这里封装成了组件 不多说上代码

<template><div class="img-box"><imgv-lazy="lazy":data-src="src"src=""@load="loadImg"@error="error"alt=""/><slot v-if="slotShow"></slot><slot name="err" v-if="!errFlag"></slot></div>
</template>
<script>
export default {props: {src: {type: String,default: ''},// 是否懒加载lazy: {type: Boolean,default: false}// errorImg: {//   type: String,//   default: ''// }},data() {return {slotShow: true,errFlag: true}},// 定义指令directives: {'lazy':{inserted(el,{value}) {// 如果指令传过来得值是 false 就不做懒加载处理if(!value) return// el.style.backgroundColor = '#f9ccd4'// const imgSrc = el.src;const imgSrc = el.dataset.src;// el.src = "";// 观察者const observer = new IntersectionObserver(([{ isIntersecting }]) => {// console.log(aaa[0].boundingClientRect.top,'这是个啥');// 如果元素出现在可视区域内,和离开可视区域的时候被触发if (isIntersecting) {// 出现在可视区域,再加载图片el.src = imgSrc;el.dataset.flag = true// 停止观察observer.unobserve(el);}});// 开启观察(传入要观察的dom元素)observer.observe(el);},}},methods: {loadImg() {this.slotShow = false},error(e) {if(!e.srcElement.dataset.flag||!this.errFlag) return falseconsole.log(e.srcElement.src,'这加载错误了');// 这里我们就不给设置失败后的图片了,留给使用者自行设置样式// e.srcElement.src = this.errorImgthis.errFlag = falsethis.slotShow = false}}
}
</script>
<style lang="less" scoped>
.img-box {display: flex;position: relative;overflow: hidden;
}
img {width: 100%;height: 100%;object-fit: cover;
}
</style>

需要用到的地方 引入组件

<template><div><!-- 图片懒加载最好设置图片高度,因为不管你是监听滚动条的方式,还是利用监听器api实现,都跟元素可视区域有关系,而高度就影响是否在可视区域内 --><lazyImg style="width: 180px;height:240px;display: inline-block;" v-for="(item,i) in lazyImgs" :key="i" :src="item" lazy><!-- 图片加载之前默认在图片元素上方展示的样式--自由发挥 --><div class="slot-txt">加载中</div><template #err><!-- 图片加载失败后在上面展示的样式--- 自由发挥 --><div class="slot-txt"><img src="@/assets/images/loading.gif" alt=""></div></template></lazyImg></div>
</template>
<script>
import lazyImg from './components/lazyImg'
export default {components: {lazyImg},data: {return {lazyImgs: ['https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg','https://fuss10.elemecdn.com/1/34/19aa98b1fcb2781c4fba33d850549jpeg.jpeg','https://fuss10.elemecdn.com/0/6f/e35ff375812e6b0020b6b4e8f9583jpeg.jpeg','https://fuss10.elemecdn.com/9/bb/e27858e973f5d7d3904835f46abbdjpeg.jpeg','https://fuss10.elemecdn.com/d/e6/c4d93a3805b3ce3f323f7974e6f78jpeg.jpeg','https://fuss10.elemecdn.com/3/28/bbf893f792f03a54408b3b7a7ebf0jpeg.jpeg','https://fuss10.elemecdn.com/2/11/6535bcfb26e4c79b48ddde44f4b6fjpeg.jpeg']}}
}
</script>
<style lang="scss" scoped>
.slot-txt {position: absolute;top: 0;left: 0;width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;color: #fff;background: #f9ccd4;z-index: 100;
}
</style>

好了,今天时间有些仓促,就到这里,完结,撒花,后期再润色,嘿嘿

经过反复测试,发现有点小坑,二期已解决,需要得小伙伴移步二期

vue中实现图片懒加载的方法(一)相关推荐

  1. vue中ztree使用懒加载的方法

    vue中ztree使用懒加载的方法 正常引用过后使用: import tree from "vue-giant-tree"; <tree:setting="sett ...

  2. React中实现图片懒加载

    1. 下载安装懒加载模块     cnpm i react-lazyload --save 2. 在src/assets/目录下放入懒加载占位图 placeholder.gif 3. 在需要使用懒加载 ...

  3. JavaScript两个实用的图片懒加载优化方法

    文章目录 一.方法一 二.方法二 InterSectionObserver 一.方法一 重点: 1.getBoundingClientRect().top > window.innerHeigh ...

  4. vue 2.0 图片懒加载

    1 vue官网 https://v2.cn.vuejs.org/ 2. vue找到官网推进的项目与插件(Awesome Vue) https://github.com/vuejs/awesome-vu ...

  5. vue中的路由懒加载

    文章目录 路由懒加载 vue异步组件 ES import 常用 路由懒加载 懒加载本质是延迟加载或按需加载,即在需要的时候的时候进行加载. 首页不用设置懒加载,一个页面加载过后再次访问不会重复加载. ...

  6. jQuery 图片懒加载的方法 以及用$('.lazyImg').each()出错的地方,记录一下~

    我高小莫,今天在这里发誓,如果以后能不用jQuery 的我绝不再用,做习惯了前后端分离的项目,再次回到jQuery ,发现异常的恶心~~~~· 不怪谁,怪就怪当初我,选择项目架构的时候为了省力,竟然选 ...

  7. element ui el-carousel 滚动图 vue 基于vue-lazyload图片懒加载、延迟加载 解决方案

    vue-lazyload插件github地址:https://github.com/hilongjw/vue-lazyload#requirements 效果是默认不加载图片,先用一个占位符图来代替, ...

  8. vue中的图片预加载

    1.首先添加一个loading加载页,给一张加载的图片 <div class="load" v-if="load"><img src=&quo ...

  9. Vue中背景图片无法加载

    遇到过这种情况,调试的时候图片是存在的,能够在style中看到图片的,但是背景就是无法显示.特别奇怪的是如果不是给整个body加background或者对最外层的div的class加backgroun ...

最新文章

  1. iOS-----Xcode-Debug尝试
  2. 内核功能导致重启_诊断修复 TiDB Operator 在 K8s 测试中遇到的 Linux 内核问题
  3. 7-28晚复习 虚继承与地址分配
  4. Patent Writing and cultivation of innovation thinking
  5. makefile obj文件路径_Makefile一问:如何修改.o输出文件的输出路径 Linux/Unix社区 / 程序开......
  6. Ps胶片颗粒效果插件:Imagenomic Realgrain for Mac
  7. cnn卷积核参数如何确定_如何确定肉脯软塑包装的热封参数?
  8. Kanas.net Framework 入门介绍
  9. 46. Define non-member functions inside templates when type conversions are desired.
  10. SQL SERVER—修改时不允许保存修改
  11. cmmi3级和5级之间的区别是什么?
  12. Redis常用命令大全
  13. 袁亚湘院士谈如何做好研究生:如果不思考,人再聪明也无济于事
  14. DM8 Linux服务注册
  15. 数学三次方的计算机符号,数学符号三次方
  16. 《算法零基础100讲》(第20讲) 进制转换(二) - 进阶[C语言题解]
  17. 颜色恒常性评价指标——角度误差【弧度角度】避坑
  18. day08学习 Python文件函数、CSV文件读写
  19. 什么是元数据?为何需要元数据?
  20. 开源 安卓项目汇总

热门文章

  1. react + antd 表格排序(服务端返回数据)
  2. 传统热度算法与AI技术的结合:探索更精准的热点分析方法
  3. 2023年南京航空航天大学英语笔译专业考研上岸前辈备考经验
  4. 十进制转化为其他进制
  5. 英雄联盟手游主页---rem布局
  6. CSUSTOJ-伊井野弥子是风纪委员(简单BFS)
  7. 用计算机能开通余利宝吗,余利宝在哪里打开 普通用户怎么开通余利宝?
  8. [Mac M1]Android Studio运行模拟器
  9. 大爆料!京东T7全新开创“新算法宝典”,图文并茂 Github上获赞已破百万
  10. 【动态ppt制作软件】Focusky教程 | 添加背景音乐