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 let’s look at the fadeIn function The first version of writing: 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
The function attribute for setting the transparency of DOM nodes in js: 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.
Encapsulated 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(); }
Related recommendations:
jQuery implements the fade-in and fade-out prompt function effect example of IE6
Example of display in CSS to implement the fade-in and fade-out transition effect
h5+css3 code example to implement image fly-in and fade-in and fade-out effects
The above is the detailed content of JavaScript encapsulates a function with fade-in and fade-out effects. For more information, please follow other related articles on the PHP Chinese website!