Home  >  Article  >  Web Front-end  >  JS encapsulates the fade-in and fade-out function

JS encapsulates the fade-in and fade-out function

php中世界最好的语言
php中世界最好的语言Original
2018-06-15 15:12:071465browse

This time I will bring you the JS encapsulated fade-in and fade-out function. What are the precautions for the JS encapsulated fade-in and fade-out function. The following is a practical case, let’s take a look.

When it comes to 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.

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 = 'alpha(opacity = '+ num +')';
}

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 speed at which the float value changes when we set the opacity value from 1 to 0 (remember to consider compatibility)

Fade out logic: the opacity value changes from 1 to 0 The float value changes.

Encapsulation function

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

Test example:

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

I believe you have mastered the method after reading the case in this article. For more exciting information, please pay attention to other related articles on the PHP Chinese website!

Recommended reading:

vue storejs processing to obtain data

##How to handle the dynamic parameter passing of query in vue-router

The above is the detailed content of JS encapsulates the fade-in and fade-out function. 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