图片懒加载 川长思鸟来 2021-09-30 00:24 818阅读 0赞 \[外链图片转存失败(img-vbwUXXxJ-1563574134995)([https://upload-images.jianshu.io/upload\_images/11158618-9e2d91116eebe601.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240][https_upload-images.jianshu.io_upload_images_11158618-9e2d91116eebe601.png_imageMogr2_auto-orient_strip_imageView2_2_w_1240])\] <view wx:for="{ {list}}" class='item item-{ {index}}' wx:key="{ {index}}"> <image class="{ {item.show ? 'active': ''}}" src="{ {item.show ? item.src : item.def}}"></image> </view> image{ transition: all .3s ease; opacity: 0; } .active{ opacity: 1; } \[外链图片转存失败(img-xPdtLwfr-1563574134999)([https://upload-images.jianshu.io/upload\_images/11158618-5b01e88ab809b553.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240][https_upload-images.jianshu.io_upload_images_11158618-5b01e88ab809b553.png_imageMogr2_auto-orient_strip_imageView2_2_w_1240])\] 数据的异步加载 开始时把一部分数据加载出来,后面滚动时才对应的加载。 给需要懒加载的图片外层放置一个容器: <div class="banner"> <img src="" alt="" trueImg=""> </div> .banner { margin: 10px auto; width: 350px; height; 200px; border: 1px solid green; background: url("../img/default.gif") no-repeat center ; } .banner img { dispaly: noene; width: 100%; height: 100%; } 用JavaScript实现图片懒加载 new Image()来暂时存放一个图片 onload方法判断图片是否加载成功 var banner = document.querySelector('.banner'); var imgFir = banner.getElementsByTagName('img')[0]; window.setTimeout(function() { var oImg = new Image(); // 创建一个临时的img标签 oImg.src = imgFir.getAttribute('trueImg'); oImg.onload=function() { // 当图片能够正常加载就执行 imgFir.src = this.src; imgFir.style.dispaly = "block"; oImg = null; console.log('图片加载完成'): var now = new Date(); } var time = new Date(); }, 500); 懒加载技术 \[外链图片转存失败(img-BTMcSqGM-1563574135001)([https://upload-images.jianshu.io/upload\_images/11158618-c4d6d40acd90b397.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240][https_upload-images.jianshu.io_upload_images_11158618-c4d6d40acd90b397.png_imageMogr2_auto-orient_strip_imageView2_2_w_1240])\] \[外链图片转存失败(img-HzLOj11b-1563574135003)([https://upload-images.jianshu.io/upload\_images/11158618-d29542bd1e5cc00d.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240][https_upload-images.jianshu.io_upload_images_11158618-d29542bd1e5cc00d.png_imageMogr2_auto-orient_strip_imageView2_2_w_1240])\] Vue实现一个图片懒加载插件 Vue.use()、Vue.direction、Vue图片懒加载插件实现 // 注册一个全局自定义指令 `v-focus` Vue.directive('focus', { // 当被绑定的元素插入到 DOM 中时…… inserted: function (el) { // 聚焦元素 el.focus() } }) 局部注册 directives: { focus: { // 指令的定义 inserted: function (el) { el.focus() } } } bind:只调用一次,指令第一次绑定到元素时调用 inserted:被绑定元素插入父节点时调用 update:所在组件的 VNode 更新时调用 unbind:只调用一次 Vue图片懒加载插件实现 // 引入Vue构造函数 import Vue from 'vue' var lazyload = { // Vue.use() 默认加载install,并且将Vue当做第一个参数传递过来 install(vue,payload) { // 数组扩展移除元素 if(!Array.prototype.remove){ Array.prototype.remove = function(item){ if(!this.length) return var index = this.indexOf(item); if( index > -1){ this.splice(index,1); return this } } } // 默认值图片 var defaultImage = payload.defaultImage || 'https://.png'; var errorImage = payload.errorImage || 'https://.png'; // 默认离可视区10px时加载图片 var distanece = payload.scrollDistance || 10; // 收集未加载的图片元素和资源 var listenList = []; // 收集已加载的图片元素和资源 var imageCacheList = []; // 是否已经加载完成的图片 const isAlredyLoad = (imageSrc) => { if(imageCacheList.indexOf(imageSrc) > -1){ return true; }else{ return false; } } //检测图片是否可以加载,如果可以则进行加载 const isCanShow = (item) =>{ var ele = item.ele; var src = item.src; //图片距离页面顶部的距离 var top = ele.getBoundingClientRect().top; //页面可视区域的高度 var windowHeight = window.innerHight; // top - distance 距离可视区域还有distance像素 if(top - distanece < window.innerHeight){ var image = new Image(); image.src = src; image.onload = function() { ele.src = src; imageCacheList.push(src); listenList.remove(item); } image.onerror = function() { ele.src = errorImage; imageCacheList.push(src); listenList.remove(item); } return true; }else{ return false; } }; const onListenScroll = () => { window.addEventListener('scroll',function(){ var length = listenList.length; for(let i = 0;i<length;i++ ){ isCanShow(listenList[i]); } }) } //Vue 指令最终的方法 const addListener = (ele,binding) =>{ //绑定的图片地址 var imageSrc = binding.value; // 防止重复加载。如果已经加载过,则无需重新加载,直接将src赋值 if(isAlredyLoad(imageSrc)){ ele.src = imageSrc; return false; } var item = { ele: ele, src: imageSrc } //图片显示默认的图片 ele.src = defaultImage; //再看看是否可以显示此图片 if(isCanShow(item)){ return } //否则将图片地址和元素均放入监听的lisenList里 listenList.push(item); //然后开始监听页面scroll事件 onListenScroll(); } Vue.directive('lazyload',{ inserted: addListener, updated: addListener }) } } export default lazyload; 插件的调用: import Vue from 'vue' import App from './App' import router from './router' import Lazyload from './common/js/lazyload' // 参数均为可选 Vue.use(Lazyload,{ scrollDistance: 15, // 距离可视区还有15px时开发加载资源 defaultImage: '', // 资源图片未加载前的默认图片(绝对路径) errorImage:'' // 资源图片加载失败时要加载的资源(绝对路径) }) -------------------- ## 请点赞!因为你们的赞同/鼓励是我写作的最大动力! ## ### 欢迎关注[达叔小生][Link 1]的简书! ### **这是一个有质量,有态度的博客** \[外链图片转存失败(img-yeZKFnz9-1563574135011)([https://upload-images.jianshu.io/upload\_images/11158618-9ab0d3fef85d80ce?imageMogr2/auto-orient/strip|imageView2/2/w/1240][https_upload-images.jianshu.io_upload_images_11158618-9ab0d3fef85d80ce_imageMogr2_auto-orient_strip_imageView2_2_w_1240])\] [https_upload-images.jianshu.io_upload_images_11158618-9e2d91116eebe601.png_imageMogr2_auto-orient_strip_imageView2_2_w_1240]: https://upload-images.jianshu.io/upload_images/11158618-9e2d91116eebe601.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 [https_upload-images.jianshu.io_upload_images_11158618-5b01e88ab809b553.png_imageMogr2_auto-orient_strip_imageView2_2_w_1240]: https://upload-images.jianshu.io/upload_images/11158618-5b01e88ab809b553.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 [https_upload-images.jianshu.io_upload_images_11158618-c4d6d40acd90b397.png_imageMogr2_auto-orient_strip_imageView2_2_w_1240]: https://upload-images.jianshu.io/upload_images/11158618-c4d6d40acd90b397.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 [https_upload-images.jianshu.io_upload_images_11158618-d29542bd1e5cc00d.png_imageMogr2_auto-orient_strip_imageView2_2_w_1240]: https://upload-images.jianshu.io/upload_images/11158618-d29542bd1e5cc00d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 [Link 1]: https://www.jianshu.com/u/c785ece603d1 [https_upload-images.jianshu.io_upload_images_11158618-9ab0d3fef85d80ce_imageMogr2_auto-orient_strip_imageView2_2_w_1240]: https://upload-images.jianshu.io/upload_images/11158618-9ab0d3fef85d80ce?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240
相关 图片懒加载 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Nvbmds 青旅半醒/ 2022年11月16日 13:41/ 0 赞/ 305 阅读
相关 图片懒加载 function lazyLoadImg() { var img = document.getElementsByTagName('img'); s 谁践踏了优雅/ 2022年09月28日 13:05/ 0 赞/ 367 阅读
相关 图片懒加载 在一个项目中,如果同时加载的图片太多的话,会导致页面卡顿,这个时候就会用到懒加载。懒加载的实现原理是监听浏览器的滚动条事件,先加载出前面几张图片,然后当滚动条滚动的时候再依次加 分手后的思念是犯贱/ 2022年06月17日 13:49/ 0 赞/ 142 阅读
相关 图片懒加载 1.引入js jquery.lazyload.js(如下) / Lazy Load - jQuery plugin for lazy loading 缺乏、安全感/ 2022年06月16日 06:44/ 0 赞/ 465 阅读
相关 图片懒加载 懒加载的意义[(在线demo预览)][demo] 尽管很多公司的网页都有一些限制,比如页面的最大的图片大小不得大于50k,也有很多图片优化工具fis3、gulp等等,但是 痛定思痛。/ 2022年06月04日 07:58/ 0 赞/ 508 阅读
相关 图片懒加载 在实际的项目开发中,我们通常会遇见这样的场景:一个页面有很多图片,而首屏出现的图片大概就一两张,那么我们还要一次性把所有图片都加载出来吗?显然这是愚蠢的,不仅影响页面渲染速度, 偏执的太偏执、/ 2022年05月28日 02:07/ 0 赞/ 536 阅读
相关 图片懒加载 <!--<!doctype html>--> <!--<html lang="en">--> <!--<head>--> <!--<me 亦凉/ 2022年05月23日 12:19/ 0 赞/ 467 阅读
相关 图片懒加载 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> r囧r小猫/ 2022年05月21日 06:54/ 0 赞/ 504 阅读
相关 图片懒加载 \[外链图片转存失败(img-vbwUXXxJ-1563574134995)([https://upload-images.jianshu.io/upload\_images/ 川长思鸟来/ 2021年09月30日 00:24/ 0 赞/ 819 阅读
还没有评论,来说两句吧...