js实现图片加载淡入淡出效果


Posted in Javascript onApril 07, 2017

本文实例为大家分享了js图片加载淡入淡出效果展示的具体代码,供大家参考,具体内容如下

HTML代码

首先是图片标记的写法:

<img data-src="/path/to/image.jpg" alt="">

需要将图片的地址放到 data-src 属性里,而src值填写默认的一张图片。

CSS代码

所有具有data-src属性的图片,我们将其初始显示状态为不可见,通过透明度来调节:

img {
 opacity: 1;
 transition: opacity 0.3s;
}

img[data-src] {
 opacity: 0;
}

这样写的作用是什么?等当图片加载时,你就能看的效果了。

JavaScript代码

我们最终会将 data-src 属性去掉,换成src属性,但这是图片加载成功后的动作:

[].forEach.call(document.querySelectorAll('img[data-src]'), function(img) {
 img.setAttribute('src', img.getAttribute('data-src'));
 img.onload = function() {
  img.removeAttribute('data-src');
 };
});

相比起其它各种的图片延迟加载技术,这种方法非常的简单,它几乎不要求其它任何条件,可以用在任何地方,使用起来非常灵活。

当然,简单有简单的好坏,也会因为简单而不足。它不具有图片图片滚动到可视窗口内再加载的功能。最终使用哪种技术,还是要看场景而定。

下面是lazyload.js

var lazyLoad = {
 init: function() {
  var that = this;
  that.onerrorImgUrl = "data-error"; //图片加载失败用什么图片替换
  that.srcStore = "data-src"; //图片真实地址存放的自定义属性
  that.class = "lazy-img"; //惰性加载的图片需要添加的class
  that.sensitivity = 50; //该值越小,惰性越强(加载越少)
  minScroll = 5,
  slowScrollTime = 200;

  document.addEventListener("scroll", function() {
   that.changeimg();
  });

  setTimeout(function() {
   that.trigger();
  }, 100);

 },
 scanImage: function() {
  var that = this;
  var imgList = [];
  var allimg = [].slice.call(document.querySelectorAll('img.' + that.class + ''));
  allimg.forEach(function(ele) {
   if (!that.isLoadedImageCompleted(ele)) {
    imgList.push(ele);
   }
  });

  that.imglistArr = imgList;
 },
 isLoadedImageCompleted: function(ele) {
  return (ele.getAttribute('data-loaded') == '1')
 },
 trigger: function() {
  var that = this;
  eventType = that.isPhone && "touchend" || "scroll";
  that.fireEvent(document, eventType);
  //$(window).trigger(eventType);
 },
 fireEvent: function(element, event) {
  // 其他标准浏览器使用dispatchEvent方法
  var evt = document.createEvent('HTMLEvents');
  // initEvent接受3个参数:
  // 事件类型,是否冒泡,是否阻止浏览器的默认行为
  evt.initEvent(event, true, true);
  return !element.dispatchEvent(evt);
 },
 changeimg: function() {
  function loadYesOrno(img) {
   var windowPageYOffset = window.pageYOffset,
    windowPageYOffsetAddHeight = windowPageYOffset + window.innerHeight,
    imgOffsetTop = img.getBoundingClientRect().top + window.pageYOffset;
   return imgOffsetTop >= windowPageYOffset && imgOffsetTop - that.sensitivity <= windowPageYOffsetAddHeight;
  }

  function loadImg(img, index) {

   var imgUrl = img.getAttribute(that.srcStore);

   img.setAttribute("src", imgUrl);

   img.onload || (img.onload = function() {
     img.classList.remove(that.class);
     img.setAttribute('data-loaded', 1)
     img.removeAttribute('data-src');
     //$(this).removeClass(that.class).getAttribute('data-loaded',1),
     that.imglistArr[index] = null;
     img.onerror = img.onload = null;
    },
    img.onerror = function() {
     img.src = img.getAttribute(that.onerrorImgUrl);
     img.classList.remove(that.class);
     img.classList.add("lazy-err");
     img.setAttribute('data-loaded', 0);
     //$(this).removeClass(that.class).getAttribute('data-loaded',0),
     that.imglistArr[index] = null,
      img.onerror = img.onload = null
    });

   var newImgStack = [];
   that.imglistArr.forEach(function(ele) {

    //img标签可见并且加载未完成
    if (!that.isLoadedImageCompleted(ele)) {
     newImgStack.push(ele);
    }
   });
   that.imglistArr = newImgStack;
  }

  var that = this;
  that.scanImage();
  that.imglistArr.forEach(function(val, index) {

   if (!val) return;
   var img = val;
   if (!loadYesOrno(img) || that.isLoadedImageCompleted(img)) return;

   if (!img.getAttribute(that.srcStore)) return;

   loadImg(img, index);
  })

 }
};

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript学习笔记6 prototype的提出
Jan 11 Javascript
jquery 问答知识整理
Feb 11 Javascript
浏览器窗口大小变化时使用resize事件对框架不起作用的解决方法
May 11 Javascript
javascript与Python快速排序实例对比
Aug 10 Javascript
js判断当前页面用什么浏览器打开的方法
Jan 06 Javascript
dul无法加载bootstrap实现unload table/user恢复
Sep 29 Javascript
vue组件实现文字居中对齐的方法
Aug 23 Javascript
详解为Bootstrap Modal添加拖拽的方法
Jan 05 Javascript
35个最好用的Vue开源库(史上最全)
Jan 03 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
Jan 06 Javascript
优化Vue中date format的性能详解
Jan 13 Javascript
vue.js页面加载执行created,mounted的先后顺序说明
Nov 07 Javascript
AngularJS中的拦截器实例详解
Apr 07 #Javascript
Vue.js如何优雅的进行form validation
Apr 07 #Javascript
详解Node.js实现301、302重定向服务
Apr 07 #Javascript
Express URL跳转(重定向)的实现方法
Apr 07 #Javascript
微信小程序 首页制作简单实例
Apr 07 #Javascript
微信小程序 商城开发(ecshop )简单实例
Apr 07 #Javascript
js控制文本框禁止输入特殊字符详解
Apr 07 #Javascript
You might like
PHP中去除换行解决办法小结(PHP_EOL)
2011/11/27 PHP
PHP 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
php实现微信分享朋友链接功能
2019/02/18 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
php中对象引用和复制实例分析
2019/08/14 PHP
javascript 弹出层组件(升级版)
2011/05/12 Javascript
jquery刷新页面的实现代码(局部及全页面刷新)
2011/07/11 Javascript
浅谈Javascript中的Function与Object
2015/01/26 Javascript
js检测判断日期大于多少天的方法
2015/05/04 Javascript
jquery自定义表格样式
2015/11/23 Javascript
jQuery+formdata实现上传进度特效遇到的问题
2016/02/24 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
2016/05/30 Javascript
es6学习笔记之Async函数的使用示例
2017/05/11 Javascript
Vue中之nextTick函数源码分析详解
2017/10/17 Javascript
详解webpack + react + react-router 如何实现懒加载
2017/11/20 Javascript
JavaScript数据结构之单链表和循环链表
2017/11/28 Javascript
JS遍历DOM文档树的方法实例详解
2018/04/03 Javascript
javaScript产生随机数的用法小结
2018/04/21 Javascript
Vue.js的复用组件开发流程完整记录
2018/11/29 Javascript
jQuery实现的点击图片居中放大缩小功能示例
2019/01/16 jQuery
原生JS实现留言板功能
2020/02/08 Javascript
vue项目中使用多选框的实例代码
2020/07/22 Javascript
js面试题之异步问题的深入理解
2020/09/20 Javascript
python求素数示例分享
2014/02/16 Python
python如何定义带参数的装饰器
2018/03/20 Python
pandas将numpy数组写入到csv的实例
2018/07/04 Python
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
Python之Sklearn使用入门教程
2021/02/19 Python
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
事业单位竞聘上岗实施方案
2014/03/28 职场文书
综艺节目策划方案
2014/06/13 职场文书
邹越感恩父母演讲稿
2014/08/28 职场文书
入党积极分子学习优秀共产党员先进事迹思想汇报
2014/09/13 职场文书
2014年绿化工作总结
2014/12/09 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书