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 三种不同位置代码的写法
Oct 25 Javascript
json 入门基础教程 推荐
Oct 31 Javascript
两个Javascript小tip资料
Nov 23 Javascript
Javascript 判断是否存在函数的方法
Jan 03 Javascript
js仿百度有啊通栏展示效果实现代码
May 28 Javascript
Js获取数组最大和最小值示例代码
Oct 29 Javascript
jQuery设置与获取HTML,文本和值的简单实例
Feb 26 Javascript
从数据库读取数据后将其输出成html标签的三种方法
Oct 13 Javascript
webpack学习笔记之优化缓存、合并、懒加载
Aug 24 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
Sep 21 Javascript
浅析webpack-bundle-analyzer在vue-cli3中的使用
Oct 23 Javascript
vue 给数组添加新对象并赋值
Apr 20 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
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
PHP函数import_request_variables()用法分析
2016/04/02 PHP
利用switch语句进行多选一判断的实例代码
2016/11/14 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
浅析JavaScript动画
2015/06/10 Javascript
jQuery EasyUI Dialog拖不下来如何解决
2015/09/28 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
2016/06/21 Javascript
jQuery css() 方法动态修改CSS属性
2016/09/25 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
d3.js入门教程之数据绑定详解
2017/04/28 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
Node.js如何对SQLite的async/await封装详解
2019/02/14 Javascript
js实现动态时钟
2020/03/12 Javascript
利用Psyco提升Python运行速度
2014/12/24 Python
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
在Python中使用列表生成式的教程
2015/04/27 Python
Python 模块EasyGui详细介绍
2017/02/19 Python
python中的print()输出
2019/04/12 Python
详解Python3中的 input() 函数
2020/03/18 Python
对python pandas中 inplace 参数的理解
2020/06/27 Python
Django model class Meta原理解析
2020/11/14 Python
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
以色列的身体护理及家居香薰品牌:Sabon NYC
2018/02/23 全球购物
企划经理的岗位职责
2013/11/17 职场文书
经营理念口号
2014/06/21 职场文书
初中教师德育工作总结2015
2015/05/12 职场文书
大队委员竞选演讲稿
2015/11/20 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书
Python爬虫之爬取最新更新的小说网站
2021/05/06 Python
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android