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 相关文章推荐
javascript数组快速打乱重排的方法
Jan 02 Javascript
jQuery在ul中显示某个li索引号的方法
Mar 17 Javascript
浅谈JavaScript异常处理语句
Jun 26 Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
Oct 27 Javascript
js实现图片上传预览原理分析
Jul 13 Javascript
JS时间控制实现动态效果的实例讲解
Jul 31 Javascript
在vue中使用css modules替代scroped的方法
Mar 10 Javascript
vue和webpack安装命令详解
Jun 15 Javascript
详解Angular6学习笔记之主从组件
Sep 05 Javascript
Vue+Openlayers自定义轨迹动画
Sep 24 Javascript
Vue Elenent实现表格相同数据列合并
Nov 30 Vue.js
浅谈Vue使用Elementui修改默认的最快方法
Dec 05 Vue.js
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+javascript实现二级级联菜单的制作
2008/05/06 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
php实现微信分享朋友链接功能
2019/02/18 PHP
javascript引用对象的方法
2007/01/11 Javascript
javascript获取当前ip的代码
2009/05/10 Javascript
JavaScript制作简易的微信打飞机
2015/03/31 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
基于JavaScript实现新增内容滚动播放效果附完整代码
2017/08/24 Javascript
ionic2懒加载配置详解
2017/09/01 Javascript
Vue的轮播图组件实现方法
2018/03/03 Javascript
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
vue.js实现二级菜单效果
2019/10/19 Javascript
jQuery实现聊天对话框
2020/02/08 jQuery
[03:52]DOTA2英雄基础教程 酒仙
2013/12/23 DOTA
python基于pygame实现响应游戏中事件的方法(附源码)
2015/11/11 Python
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
2017/11/01 Python
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
python实现寻找最长回文子序列的方法
2018/06/02 Python
python3 打开外部程序及关闭的示例
2018/11/06 Python
python 自定义对象的打印方法
2019/01/12 Python
利用ImageAI库只需几行python代码实现目标检测
2019/08/09 Python
Django 查询数据库并返回页面的例子
2019/08/12 Python
如何基于Python创建目录文件夹
2019/12/31 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
python regex库实例用法总结
2021/01/03 Python
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
经济实惠的豪华家具:My-Furniture
2019/03/12 全球购物
讲文明树新风公益广告宣传方案
2014/02/25 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
简洁的英文求职信范文
2014/05/03 职场文书
生日答谢词
2015/01/05 职场文书
校本培训个人总结
2015/02/28 职场文书