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 相关文章推荐
js中判断用户输入的值是否为空的简单实例
Dec 23 Javascript
jquery将一个表单序列化为一个对象的方法
Jan 03 Javascript
JS去掉第一个字符和最后一个字符的实现代码
Feb 20 Javascript
jQuery之简单的表单验证实例
Jul 07 Javascript
javascript实现根据汉字获取简拼
Sep 25 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
Nov 24 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
Jun 13 Javascript
AngularJS表单验证功能
Oct 19 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
Mar 08 Javascript
Vue引用Swiper4插件无法重写分页器样式的解决方法
Sep 27 Javascript
Vue CL3 配置路径别名详解
May 30 Javascript
微信小程序实现时间进度条功能
Nov 17 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 之入门篇
2006/12/04 PHP
php检测文件编码的方法示例
2014/04/25 PHP
Laravel如何友好的修改.env配置文件详解
2017/06/07 PHP
js中把JSON字符串转换成JSON对象最好的方法
2014/03/21 Javascript
js使用html()或text()方法获取设置p标签的显示的值
2014/08/01 Javascript
JavaScript中Function()函数的使用教程
2015/06/04 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
2017/02/24 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
windows实现npm和cnpm安装步骤
2019/10/24 Javascript
在vue中把含有html标签转为html渲染页面的实例
2019/10/28 Javascript
JS实现放烟花效果
2020/03/10 Javascript
小程序实现录音功能
2020/09/22 Javascript
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
django模型中的字段和model名显示为中文小技巧分享
2014/11/18 Python
详解Python中的join()函数的用法
2015/04/07 Python
图文详解WinPE下安装Python
2016/05/17 Python
Python采用Django开发自己的博客系统
2020/09/29 Python
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
pytorch获取vgg16-feature层输出的例子
2019/08/20 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
Django多进程滚动日志问题解决方案
2019/12/17 Python
Python Gluon参数和模块命名操作教程
2019/12/18 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
2020/04/08 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
英国最大的线上保健品零售商之一:Vitamin Planet
2016/12/01 全球购物
韩国演唱会订票网站:StubHub韩国
2019/01/17 全球购物
迪拜领先运动补剂零售品牌中文站:Sporter商城
2019/08/20 全球购物
会计助理的岗位职责
2013/11/29 职场文书
求职推荐信范文
2013/12/01 职场文书
手机业务员岗位职责
2013/12/13 职场文书
促销活动策划方案
2014/01/12 职场文书
大学英语演讲稿(中英文对照)
2014/01/14 职场文书
高中教师个人总结
2015/02/10 职场文书
python基础之错误和异常处理
2021/10/24 Python