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 = '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 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 == '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('button')[0]; let btn2 = document.getElementsByTagName('button')[1]; btn.onclick = () => { let fade = new Fade('p1'); fade.fadeIn(); }; btn2.onclick = () => { let fade = new Fade('p1'); 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!