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 相关文章推荐
jQuery简单实现图片预加载
Apr 20 Javascript
javascript实现禁止鼠标滚轮事件
Jul 24 Javascript
jQuery+css实现非常漂亮的水平导航菜单效果
Jul 27 Javascript
基于百度地图实现产品销售的单位位置查看功能设计与实现
Oct 21 Javascript
React-router v4 路由配置方法小结
Aug 08 Javascript
jQuery EasyUI Layout实现tabs标签的实例
Sep 26 jQuery
javascript实现Emrips反质数枚举的示例代码
Dec 06 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
Dec 27 Javascript
JavaScript代码调试方法实例小结
Jan 05 Javascript
jQuery实现聊天对话框
Feb 08 jQuery
手把手教您实现react异步加载高阶组件
Apr 07 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
May 23 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实现通过正则表达式替换回调的内容标签
2015/06/15 PHP
基于ThinkPHP实现的日历功能实例详解
2017/04/15 PHP
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
用JavaScript对JSON进行模式匹配(Part 1-设计)
2010/07/17 Javascript
基于jquery的动态创建表格的插件
2011/04/05 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
js与applet相互调用的方法
2016/06/22 Javascript
jQuery实现最简单的切换图效果【可兼容IE6、火狐、谷歌、opera等】
2016/09/04 Javascript
JS使用正则截取两个字符串之间的字符串实现方法详解
2017/01/06 Javascript
vue.js开发环境搭建教程
2017/05/04 Javascript
ionic实现底部分享功能
2017/05/11 Javascript
vue使用keep-alive实现数据缓存不刷新
2017/10/21 Javascript
Nodejs Express 通过log4js写日志到Logstash(ELK)
2018/08/30 NodeJs
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python中的引用和拷贝浅析
2014/11/22 Python
Python随机生成信用卡卡号的实现方法
2015/05/14 Python
浅析Python中将单词首字母大写的capitalize()方法
2015/05/18 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
2018/02/24 Python
Django框架多表查询实例分析
2018/07/04 Python
Python3如何使用tabulate打印数据
2020/09/25 Python
TensorFlow2.0使用keras训练模型的实现
2021/02/20 Python
基于html5 canvas做批改作业的小插件
2020/05/20 HTML / CSS
Bibloo罗马尼亚网站:女装、男装、童装及鞋子和配饰
2019/07/20 全球购物
女大学生自我鉴定
2013/12/09 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
董事长开业致辞
2015/07/29 职场文书
创业计划书之酒厂
2019/10/14 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
MongoDB balancer的使用详解
2021/04/30 MongoDB
MySQL5.7并行复制原理及实现
2021/06/03 MySQL
CSS实现单选折叠菜单功能
2021/11/01 HTML / CSS