javascript原生封装一个淡入淡出效果的函数测试实例代码


Posted in Javascript onMarch 19, 2018

说到js的渐变显示与消失,多数朋友会想到JQuery里面的fadeIn()、fadeOut()或fadeToggle()。但如果仅仅是为了引入这样的一个效果,而去调用了庞大JQuery库?或者说我通过用原生js实现一些函数来提高自己~

所以,我简单的研究了一下纯js代码写淡入淡出的效果。

如果出现错误,请在评论中指出,我也好自己纠正自己的错误

javascript原生封装一个淡入淡出效果的函数测试实例代码 

(一)FadeIn淡入函数

淡入淡出的效果,其实就是一个setInterval(),加上循环的DOM操作,通过改变element对象节点的透明度,即可实现这种效果。

所以我们提取出两个必要的东西:setInterval()、opacity、以及speed。

  • speed : 这个是我们设置opacity的值从0到1的float数值变化速度
  • 淡入的逻辑:opacity的值从0到1的float数值变化。

我们来先看代码实现!

html:

<div id="div1"></div>
<span id="span1">123</span>
<button>fadein</button>
<button>fadeOut</button>

css样式

<style>
 div {
  width: 100px;
  height: 100px;
  background-color: #1d7db1;
  opacity:0;
 }
 </style>

首先我们来看fadeIn函数的第一版的写法:先了解一下实现的思路

function fadeIn(ele, speed) {
  let num = 0;
  let time = setInterval(() => {
    num += speed;
    ele.style.opacity = num / 100;
    if (num >= 100) {
     clearInterval(time); // 清楚定时器
    }
  }, 30);
  }
}

当这个效果暂时实现以后,有些东西并没有那么简单。如果发生多次的触发效果,会出现setInterval被多次同时使用,出现一些让人头疼的BUG。

要解决这个问题,目前有一个方案:添加一个全局状态,防止多次触发setInterval。

let Fadeflag = true;
function fadeIn(ele, speed) {
  let num = 0;
  if (Fadeflag) {
  let time = setInterval(() => {
    num += speed;
    Fadeflag = false;
    ele.style.opacity = num / 100;
    if (num >= 100) {
     clearInterval(time);
     Fadeflag = true;
    }
  }, 30);
  }
}

兼容性问题!!!

先看代码

set: function(elem, num) {
  elem.style.opacity !== undefined ? elem.style.opacity = num / 100 : elem.style.filter = 'alpha(opacity = '+ num +')';
}

注:代码设置num/100是因为我们以ie为标准去兼容ff和GG

js里面设置DOM节点透明度的函数属性:filter= "alpha(opacity=" + value+ ")"(兼容ie)

ie的filter范围是0~100

opacity=value/100(兼容FF和GG)。

FF和GG的opacity是0~1 (为了兼容ie的filter范围,我们用num/100)

(二)FadeOut淡出函数

speed : 这个是我们设置opacity的值从1到0的float数值变化速度(记得考虑兼容性)

淡出的逻辑:opacity的值从1到0的float数值变化。

封装函数

(function() {
  let fadeFlag = true;
  function Fade(selector) {
    this.elem = typeof selector == 'Object' ? selector : document.getElementById(selector);
  }
  Fade.prototype = {
   constructor: Fade,
    setOpacity: (elem, opacity) => { // 兼容ie10—
      elem.filters ? elem.style.filter = 'alpha(opacity = '+ opacity +')':  elem.style.opacity = opacity / 100;
      return true;
   },
   setOpacity: function(num) {
      this.elem.style.opacity !== undefined ? this.elem.style.opacity = num / 100 : this.elem.style.filter = 'alpha(opacity = '+ num +')';
   },
    fadeIn: function(speed, opacity){
   /*
   speed ==>淡入的速度,正整数(可选);
   opacity ==>淡入到指定的透明度,0~100(可选);
      */
      speed = speed || 2;
      opacity = opacity || 100;
      let num = 0; // 初始化透明度变化值为0
      if (fadeFlag) {
        let time = setInterval(() => {
          num += speed;
          fadeFlag = false;
          this.setOpacity(num);
          this.elem.style.opacity !== undefined ? this.elem.style.opacity = num / 100 : this.elem.style.filter = 'alpha(opacity = '+ num +')';
          if (num >= opacity) {
            clearInterval(time);
            fadeFlag = true;
          }
        }, 20);
      }
    },
    fadeOut: function(speed, opacity) {
   /*
   speed ==>淡入的速度,正整数(可选);
   opacity ==>淡入到指定的透明度,0~100(可选);
   */
      speed = speed || 2;
      opacity = opacity || 0;
      let num = 100; // 初始化透明度变化值为0
      if (fadeFlag) {
        let time = setInterval(() => {
          num -= speed;
          fadeFlag = false;
          this.set(num);
          this.elem.style.opacity !== undefined ? this.elem.style.opacity = num / 100 : this.elem.style.filter = 'alpha(opacity = '+ num +')';
          if (num <= opacity) {
          clearInterval(time);
          fadeFlag = true;
          }
        }, 20);
      }
    }
  };
window.Fade = Fade;
})();

测试实例:

let btn = document.getElementsByTagName('button')[0];
 let btn2 = document.getElementsByTagName('button')[1];
 btn.onclick = () => {
  let fade = new Fade('div1');
 fade.fadeIn();
 };
 btn2.onclick = () => {
  let fade = new Fade('div1');
  fade.fadeOut();
 }

总结

以上所述是小编给大家介绍的javascript原生封装一个淡入淡出效果的函数测试实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JS组件Bootstrap Select2使用方法详解
Apr 17 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
Jun 07 Javascript
d3.js实现简单的网络拓扑图实例代码
Nov 06 Javascript
Javascript之面向对象--接口
Dec 02 Javascript
基于jquery二维码生成插件qrcode
Jan 07 Javascript
微信小程序 出现错误:{&quot;baseresponse&quot;:{&quot;errcode&quot;:-80002,&quot;errmsg&quot;:&quot;&quot;}}解决办法
Feb 23 Javascript
详解Vue 开发模式下跨域问题
Jun 06 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
Sep 18 Javascript
jQuery EasyUI 折叠面板accordion的使用实例(分享)
Dec 25 jQuery
vue中promise的使用及异步请求数据的方法
Nov 08 Javascript
详解vue 图片上传功能
Apr 30 Javascript
AJAX学习笔记
May 18 Javascript
react-native-video实现视频全屏播放的方法
Mar 19 #Javascript
vue实现树形菜单效果
Mar 19 #Javascript
VUE重点问题总结
Mar 19 #Javascript
p5.js入门教程之键盘交互
Mar 19 #Javascript
vue 实现的树形菜的实例代码
Mar 19 #Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
Mar 18 #Javascript
jQuery替换节点元素的操作方法
Mar 18 #jQuery
You might like
php图片加水印原理(超简单的实例代码)
2013/01/18 PHP
php中利用explode函数分割字符串到数组
2014/02/08 PHP
PHP中读取文件的8种方法和代码实例
2014/08/05 PHP
php检查日期函数checkdate用法实例
2015/03/19 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
js模拟实现Array的sort方法
2007/12/11 Javascript
JAVASCRIPT style 中visibility和display之间的区别
2010/01/22 Javascript
Javascript 面向对象 继承
2010/05/13 Javascript
jquery动画3.创建一个带遮罩效果的图片走廊
2012/08/24 Javascript
动态的改变IFrame的高度实现IFrame自动伸展适应高度
2012/12/28 Javascript
JS中prototype关键字的功能介绍及使用示例
2013/07/21 Javascript
JavaScript获取对象在页面中位置坐标的方法
2016/02/03 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
python实现批量修改文件名代码
2017/09/10 Python
Python机器学习之SVM支持向量机
2017/12/27 Python
django反向解析和正向解析的方式
2018/06/05 Python
Python logging模块用法示例
2018/08/28 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
python使用python-pptx删除ppt某页实例
2020/02/14 Python
python脚本实现mp4中的音频提取并保存在原目录
2020/02/27 Python
CSS3动画之利用requestAnimationFrame触发重新播放功能
2019/09/11 HTML / CSS
新加坡航空官方网站:Singapore Airlines
2016/10/13 全球购物
瑞典Happy Socks美国官网:购买色彩斑斓的快乐袜子
2016/10/19 全球购物
罗技美国官网:Logitech美国
2020/01/22 全球购物
学习标兵获奖感言
2014/02/20 职场文书
竞选班干部的演讲稿
2014/04/24 职场文书
公司股份合作协议书
2014/12/07 职场文书
颐和园英文导游词
2015/01/30 职场文书
高中优秀作文(范文)
2019/08/15 职场文书
一文搞懂Python Sklearn库使用
2021/08/23 Python
python脚本框架webpy模板控制结构
2021/11/20 Python
Windows 11上手初体验:任务栏和开始菜单等迎来大改
2021/11/21 数码科技