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的ajax基础上的超强GridView展示
Sep 18 Javascript
单独使用CKFinder选择图片的方法
Aug 21 Javascript
基于JQuery实现鼠标点击文本框显示隐藏提示文本
Feb 23 Javascript
浅析BootStrap模态框的使用(经典)
Apr 29 Javascript
Winform客户端向web地址传参接收参数的方法
May 17 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
Sep 24 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
Feb 19 Javascript
微信小程序实现定位及到指定位置导航的示例代码
Aug 20 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
Oct 27 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
Oct 30 Javascript
基于Vue+Webpack拆分路由文件实现管理
Nov 16 Javascript
前端canvas中物体边框和控制点的实现示例
Aug 05 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使用curl存储cookie的示例
2014/03/31 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
2014/10/20 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
Mozilla中显示textarea中选择的文字
2006/09/07 Javascript
Prototype的Class.create函数解析
2011/09/22 Javascript
jQuery实现下拉框功能实例代码
2016/05/06 Javascript
js实现多图左右切换功能
2016/08/04 Javascript
搭建Bootstrap离线文档的方法
2016/12/02 Javascript
Bootstrap表单制作代码
2017/03/17 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
2017/07/31 Javascript
浅谈ElementUI中switch回调函数change的参数问题
2018/08/24 Javascript
微信小程序实现星星评价效果
2018/11/02 Javascript
JS获取本地地址及天气的方法实例小结
2019/05/10 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
js canvas实现5张图片合成一张图片
2019/07/15 Javascript
用Python的pandas框架操作Excel文件中的数据教程
2015/03/31 Python
Python中easy_install 和 pip 的安装及使用
2017/06/05 Python
Python语言实现将图片转化为html页面
2017/12/06 Python
谈一谈基于python的面向对象编程基础
2019/05/21 Python
python如何删除文件中重复的字段
2019/07/16 Python
详解PyTorch手写数字识别(MNIST数据集)
2019/08/16 Python
python 输出列表元素实例(以空格/逗号为分隔符)
2019/12/25 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
2020/11/25 Python
flask项目集成swagger的方法
2020/12/09 Python
帕克纽约:PARKER NY
2018/12/09 全球购物
DataList 能否分页,请问如何实现?
2015/05/03 面试题
关于奉献的演讲稿
2014/05/21 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
公积金贷款承诺书
2015/04/30 职场文书
刮痧观后感
2015/06/05 职场文书
毕业典礼致辞
2015/07/29 职场文书
教师岗位说明书
2015/09/30 职场文书
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server