Home  >  Article  >  Web Front-end  >  JavaScript native encapsulation function test for fade-in and fade-out effect

JavaScript native encapsulation function test for fade-in and fade-out effect

不言
不言Original
2018-07-02 15:42:201449browse

This article mainly introduces the function of javascript native encapsulation of a fade-in and fade-out effect. It mainly includes the FadeIn fade-in function and the FadeOut fade-out function. Friends in need can refer to the following

Speaking of the gradient display and disappearance of js, Most friends will think of fadeIn(), fadeOut() or fadeToggle() in JQuery. But what if the huge JQuery library is called just to introduce such an effect? In other words, I improved myself by using native js to implement some functions~

So, I briefly studied the effect of writing fade-in and fade-out in pure js code.

If there is an error, please point it out in the comments so that I can correct my own mistakes

(1) FadeIn Function

The fade-in and fade-out effect is actually a setInterval(), coupled with cyclic DOM operations, this effect can be achieved by changing the transparency of the element object node.

So we extract two necessary things: setInterval(), opacity, and speed.

  • speed: This is the float value change speed when we set the opacity value from 0 to 1.

  • The logic of fading in: the opacity value changes from 0 to 1. Float value changes from 0 to 1.

Let’s look at the code implementation first!

html:

<p id="p1"></p>
<span id="span1">123</span>
<button>fadein</button>
<button>fadeOut</button>

css style

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

First of all, let’s look at how to write the first version of the fadeIn function: first understand the idea of ​​​​implementation

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

When this effect is temporarily achieved, some things are not that simple. If multiple trigger effects occur, setInterval will be used multiple times at the same time, causing some troublesome BUGs.

To solve this problem, there is currently a solution: add a global state to prevent setInterval from being triggered multiple times.

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);
  }
}

Compatibility issue! ! !

Look at the code first

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

Note: The code sets num/100 because we use ie as the standard to be compatible with ff and GG

js to set the function attribute of DOM node transparency :filter= "alpha(opacity=" value ")" (compatible with ie)

The filter range of ie is 0~100

opacity=value/100 (compatible with FF and GG).

The opacity of FF and GG is 0~1 (in order to be compatible with the filter range of ie, we use num/100)

(2) FadeOut function

speed: This is the float value change speed at which we set the opacity value from 1 to 0 (remember to consider compatibility)

Fade out Logic: The value of opacity changes from 1 to 0 as a float value.

Encapsulation function

(function() {
  let fadeFlag = true;
  function Fade(selector) {
    this.elem = typeof selector == &#39;Object&#39; ? selector : document.getElementById(selector);
  }
  Fade.prototype = {
   constructor: Fade,
    setOpacity: (elem, opacity) => { // 兼容ie10—
      elem.filters ? elem.style.filter = &#39;alpha(opacity = &#39;+ opacity +&#39;)&#39;:  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 = &#39;alpha(opacity = &#39;+ num +&#39;)&#39;;
   },
    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 = &#39;alpha(opacity = &#39;+ num +&#39;)&#39;;
          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 = &#39;alpha(opacity = &#39;+ num +&#39;)&#39;;
          if (num <= opacity) {
          clearInterval(time);
          fadeFlag = true;
          }
        }, 20);
      }
    }
  };
window.Fade = Fade;
})();

Test example:

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

The above is the entire content of this article. I hope it will be helpful to everyone's learning. Please pay attention to more related content. PHP Chinese website!

Related recommendations:

Introduction to the realization of $.fn and image scrolling effects in jquery

jQuery realizes drag-and-drop The wishing wall effect

The above is the detailed content of JavaScript native encapsulation function test for fade-in and fade-out effect. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn