Maison > Article > interface Web > JavaScript encapsule une fonction avec des effets de fondu d'entrée et de sortie
En ce qui concerne l'affichage du dégradé et la disparition de js, la plupart des amis penseront à fadeIn(), fadeOut() ou fadeToggle() dans JQuery. Mais que se passerait-il si l’immense bibliothèque JQuery était appelée uniquement pour introduire un tel effet ? En d'autres termes, je me suis amélioré en utilisant du js natif pour implémenter certaines fonctions~
Ainsi, j'ai brièvement étudié l'effet de l'écriture de fondus d'entrée et de sortie dans du code js pur.
S'il y a une erreur, merci de me la signaler dans les commentaires afin que je puisse corriger mes propres erreurs
(1 ) FadeIn L'effet de fondu de la fonction
est en fait un setInterval(), couplé à des opérations DOM cycliques, cet effet peut être obtenu en modifiant la transparence du nœud objet de l'élément.
Nous extrayons donc deux choses nécessaires : setInterval(), l'opacité et la vitesse.
vitesse : Il s'agit de la vitesse de changement de la valeur flottante lorsque nous définissons la valeur d'opacité de 0 à 1.
La logique du fondu entrant : la valeur d'opacité passe de la valeur Float passe de 0 à 1.
Regardons d'abord l'implémentation du code !
html :
<p id="p1"></p> <span id="span1">123</span> <button>fadein</button> <button>fadeOut</button>
style CSS
<style> p { width: 100px; height: 100px; background-color: #1d7db1; opacity:0; } </style>
Prenons d'abord un regarde Comment écrire la première version de la fonction fadeIn : Comprenez d'abord l'idée de mise en œuvre
function fadeIn(ele, speed) { let num = 0; let time = setInterval(() => { num += speed; ele.style.opacity = num / 100; if (num >= 100) { clearInterval(time); // 清楚定时器 } }, 30); } }
Lorsque cet effet est temporairement réalisé, certaines choses ne le sont pas simple. Si plusieurs effets de déclenchement se produisent, setInterval sera utilisé plusieurs fois en même temps, provoquant des BUG gênants.
Pour résoudre ce problème, il existe actuellement une solution : ajouter un état global pour éviter que setInterval soit déclenché plusieurs fois.
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); } }
Problème de compatibilité ! ! !
Regardez d'abord le code
set: function(elem, num) { elem.style.opacity !== undefined ? elem.style.opacity = num / 100 : elem.style.filter = 'alpha(opacity = '+ num +')'; }
Remarque : Le code définit num/100 car nous utilisons ie comme standard pour être compatible avec ff et GG
L'attribut de fonction pour définir la transparence des nœuds DOM dans js : filter= "alpha(opacity=" + value+ ")" (compatible avec IE)
La plage de filtres d'IE est 0~100
opacity=value/100 (compatible avec FF et GG).
L'opacité de FF et GG est de 0~1 (afin d'être compatible avec la plage de filtre, c'est-à-dire, nous utilisons num/100)
(2) Fonction FadeOut
vitesse : Il s'agit de la vitesse de changement de la valeur flottante à laquelle nous définissons la valeur d'opacité de 1 à 0 (n'oubliez pas de prendre en compte la compatibilité)
fondu Logique : La valeur de l'opacité passe de 1 à 0 en tant que valeur flottante.
Fonction d'emballage
(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; })();
Exemple de test :
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(); }
Recommandations associées :
JQuery implémente l'exemple d'effet de fonction d'invite de fondu entrant et sortant d'IE6
exemple de code h5+css3 pour implémenter l'effet de fondu d'entrée et de fondu de sortie d'image
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!