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 相关文章推荐
根据分辨率不同,调用不同的css文件
Jul 07 Javascript
使用jQuery的ajax功能实现的RSS Reader 代码
Sep 03 Javascript
javascript 当前日期转化为中文的实现代码
May 13 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
Jan 08 Javascript
form表单只提交数据而不进行页面跳转的解决方案
Sep 18 Javascript
关于删除时的提示处理(确定删除吗)
Nov 03 Javascript
基于jQuery.Hz2Py.js插件实现的汉字转拼音特效
May 07 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
Aug 15 Javascript
详解Vue 全局引入bass.scss 处理方案
Mar 26 Javascript
Angular封装表单控件及思想总结
Dec 11 Javascript
npx create-react-app xxx创建项目报错的解决办法
Feb 17 Javascript
ES6 async、await的基本使用方法示例
Jun 06 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读写文件的方法(生成HTML)
2006/11/27 PHP
了解PHP的返回引用和局部静态变量
2015/06/04 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
PHP中两个float(浮点数)比较实例分析
2015/09/27 PHP
php 使用mpdf实现指定字段配置字体样式的方法
2019/07/29 PHP
Ctrl+Enter提交内容信息
2006/06/26 Javascript
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
JavaScript 保存数组到Cookie的代码
2010/04/14 Javascript
js获取php变量的实现代码
2013/08/10 Javascript
javaScript实现浮点数转十六进制字符
2013/10/29 Javascript
javascript中创建对象的几种方法总结
2013/11/01 Javascript
javascript 常见功能汇总
2015/06/11 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
jquery计算鼠标和指定元素之间距离的方法
2015/06/26 Javascript
javascript实现Email邮件显示与删除功能
2015/11/21 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
2016/03/08 Javascript
JS实现消息来时让网页标题闪动效果的方法
2016/04/20 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
ASP.NET jquery ajax传递参数的实例
2016/11/02 Javascript
jquery获取table指定行和列的数据方法(当前选中行、列)
2016/11/07 Javascript
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
angularJS的radio实现单项二选一的使用方法
2018/02/28 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
2019/01/18 jQuery
探索node之事件循环的实现
2020/10/30 Javascript
[52:22]EG vs VG Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
python3生成随机数实例
2014/10/20 Python
Python从数据库读取大量数据批量写入文件的方法
2018/12/10 Python
Python lambda表达式filter、map、reduce函数用法解析
2019/09/11 Python
python进度条显示之tqmd模块
2020/08/22 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
彪马日本官网:PUMA日本
2019/01/31 全球购物
C#笔试题
2015/07/14 面试题
高中综合实践活动总结
2014/07/07 职场文书
2015年小学教师培训工作总结
2015/07/21 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang
详解Python flask的前后端交互
2022/03/31 Python