当前位置: 首页 > news >正文

转一个简单的vue.js的图片懒加载的插件代码!

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

直接上源代码:

export default (Vue , options = {})=>{
  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 init = {
    lazyLoad: false,
    default: '/static/img/yes.png'
  }
 
  var listenList = [];
  var imageCatcheList = [];
 
  const isAlredyLoad = (imageSrc) => {
    if(imageCatcheList.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 + 10 已经进入了可视区域10像素
    if(top + 10 < window.innerHeight){
      var image = new Image();
      image.src = src;
      image.onload = function(){
        ele.src = src;
        imageCatcheList.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 = init.default;
    //再看看是否可以显示此图片
    if(isCanShow(item)){
      return
    }
    //否则将图片地址和元素均放入监听的lisenList里
    listenList.push(item);
     
    //然后开始监听页面scroll事件
    onListenScroll();
  }
 
  Vue.directive('lazyload',{
    inserted:addListener,
    updated:addListener
  })
}

调用方法:

import LazyLoad from 'lazyLoad.js'
Vue.use(LazyLoad);

转载于:https://my.oschina.net/u/3105272/blog/909183

相关文章:

  • 学渣的逆袭:他叛逆狂妄,却搞出不少大新闻
  • MySQL 数据库分表分区
  • LVS+keepalived 下部署RTSP负载均衡
  • Android DatePickerDialog样式不一致的问题
  • js变量作用域和闭包的示例
  • 王小川分享AI
  • 从源代码编译 Vim 8.0
  • 2015年北京大学软件project学科优秀大学生夏令营上机考试---C:单词翻转面试题...
  • Ubuntu 安装chrome
  • Java:对象的强、软、弱和虚引用
  • Linux转发性能评估与优化(转发瓶颈分析与解决方式)
  • MFC Wizard创建的空应用程序中各个文件内容的解析
  • Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister
  • CloudXNS API PHP SDK V1.0,增加DDNS等特性
  • Firefox 表示不计划开发 Windows 10 手机 APP
  • “大数据应用场景”之隔壁老王(连载四)
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 4个实用的微服务测试策略
  • Docker 笔记(2):Dockerfile
  • github从入门到放弃(1)
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Javascript设计模式学习之Observer(观察者)模式
  • JS笔记四:作用域、变量(函数)提升
  • js正则,这点儿就够用了
  • Python爬虫--- 1.3 BS4库的解析器
  • Unix命令
  • vuex 学习笔记 01
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 构建工具 - 收藏集 - 掘金
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 思否第一天
  • 用Python写一份独特的元宵节祝福
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 回归生活:清理微信公众号
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​插件化DPI在商用WIFI中的价值
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (007)XHTML文档之标题——h1~h6
  • (11)MATLAB PCA+SVM 人脸识别
  • (12)Hive调优——count distinct去重优化
  • (4)STL算法之比较
  • (翻译)terry crowley: 写给程序员
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (一) storm的集群安装与配置
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)ABI是什么
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .FileZilla的使用和主动模式被动模式介绍
  • .net 发送邮件
  • .Net 高效开发之不可错过的实用工具
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET(C#) Internals: as a developer, .net framework in my eyes