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 JavaScript获取Url参数,src属性参数
Mar 09 Javascript
jquery $(document).ready()和window.onload的区别浅析
Feb 04 Javascript
js HTML5 Ajax实现文件上传进度条功能
Feb 13 Javascript
JS跨域解决方案之使用CORS实现跨域
Apr 14 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
Sep 19 jQuery
vue2单元测试环境搭建
May 24 Javascript
JS实现的汉字与Unicode码相互转化功能分析
May 25 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
Sep 27 Javascript
详解webpack打包第三方类库的正确姿势
Oct 20 Javascript
ES6 对象的新功能与解构赋值介绍
Feb 05 Javascript
JavaScript中的函数式编程详解
Aug 22 Javascript
类和原型的设计模式之复制与委托差异
Jul 07 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实现图象锐化代码
2007/06/14 PHP
php gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
2010/05/15 PHP
PHP 7的一些引人注目的新特性简单介绍
2015/11/08 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
js setTimeout 常见问题小结
2013/08/13 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
2016/06/08 Javascript
AngularJS中比较两个数组是否相同
2016/08/24 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
js实现图片懒加载效果
2017/07/17 Javascript
jquery tmpl模板(实例讲解)
2017/09/02 jQuery
js 获取json数组里面数组的长度实例
2017/10/31 Javascript
浅谈vue加载优化策略
2019/03/19 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
[01:08:17]2018DOTA2亚洲邀请赛3月29日 小组赛B组 EG VS VGJ.T
2018/03/30 DOTA
python解析xml模块封装代码
2014/02/07 Python
Python常用库Numpy进行矩阵运算详解
2020/07/21 Python
基于Python爬取搜狐证券股票过程解析
2020/11/18 Python
python wsgiref源码解析
2021/02/06 Python
味多美官网:蛋糕订购,100%使用天然奶油
2017/11/10 全球购物
继电保护工岗位职责
2014/01/05 职场文书
决心书范文
2014/03/11 职场文书
中学生期中自我鉴定
2014/04/20 职场文书
区政府领导班子个人对照检查材料
2014/09/25 职场文书
2015年爱国卫生月活动总结
2015/03/26 职场文书
收银员岗位职责范本
2015/04/07 职场文书
公务员处分决定书
2015/06/25 职场文书
董事长致辞
2015/07/29 职场文书
朋友聚会祝酒词
2015/08/10 职场文书
MySQL锁机制
2021/04/05 MySQL
数据库连接池
2021/04/06 MySQL
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL
docker 制作mysql镜像并自动安装
2022/05/20 Servers