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 相关文章推荐
Using the TextRange Object
Oct 14 Javascript
北京奥运官方网站幻灯切换效果flash版打包下载
Jan 30 Javascript
Domino中运用jQuery读取视图内容的方法
Oct 21 Javascript
javascript中打印当前的时间实现思路及代码
Dec 18 Javascript
jquery 隐藏与显示tr标签示例代码
Jun 06 Javascript
JS实现的网页背景闪电闪烁效果代码
Oct 17 Javascript
基于JavaScript代码实现自动生成表格
Jun 15 Javascript
Canvas 制作动态进度加载水球详解及实例代码
Dec 09 Javascript
vue.js树形组件之删除双击增加分支实例代码
Feb 28 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
Jun 05 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
Mar 02 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
Sep 13 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
火影忍者:三大瞳力之一的白眼,为什么没有写轮眼那么出色?
2020/03/02 日漫
使用 eAccelerator加速PHP代码的方法
2007/09/30 PHP
php多线程并发实现方法
2016/09/30 PHP
Javascript实现页面跳转的几种方式分享
2013/10/26 Javascript
jQuery源码分析之jQuery中的循环技巧详解
2014/09/06 Javascript
推荐8款jQuery轻量级树形Tree插件
2014/11/12 Javascript
Javascript实现鼠标右键特色菜单
2015/08/04 Javascript
jQuery实现的Div窗口震动效果实例
2015/08/07 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
AngularJS表单详解及示例代码
2016/08/17 Javascript
bootstrap datetimepicker日期插件使用方法
2017/01/13 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
微信小程序中多个页面传参通信的学习与实践
2017/05/05 Javascript
原生js轮播特效
2017/05/18 Javascript
Angular4 中常用的指令入门总结
2017/06/12 Javascript
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
nodejs搭建本地服务器并访问文件操作示例
2019/05/11 NodeJs
js通过canvas生成图片缩略图
2020/10/02 Javascript
vue 虚拟DOM的原理
2020/10/03 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
Python字符串及文本模式方法详解
2020/09/10 Python
CSS教程:CSS3圆角属性
2009/04/02 HTML / CSS
牦牛毛户外探险服装:Kora
2019/02/08 全球购物
Bose美国官网:购买Bose耳机和音箱
2019/03/10 全球购物
极度干燥澳大利亚官方网站:Superdry澳大利亚
2019/03/28 全球购物
RealTek面试题
2016/06/28 面试题
优秀研究生自我鉴定
2013/12/04 职场文书
采购主管的岗位职责
2013/12/17 职场文书
《小儿垂钓》教学反思
2014/02/23 职场文书
家长对孩子的评语
2014/04/18 职场文书
商务经理岗位职责
2014/08/03 职场文书
党员演讲稿
2014/09/04 职场文书
nginx实现发布静态资源的方法
2021/03/31 Servers
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏