js のグラデーション表示と消滅といえば、ほとんどの友人は JQuery の fadeIn()、fadeOut()、fadeToggle() を思い浮かべるでしょう。しかし、そのような効果を導入するためだけに巨大な JQuery ライブラリが呼び出された場合はどうなるでしょうか?つまり、ネイティブ js を使用していくつかの機能を実装することで自分自身を改善しました~
そこで、純粋な js コードでフェードインとフェードアウトを記述する効果を簡単に調べました。
間違いがある場合は、私自身の間違いを修正できるようにコメントで指摘してください
(1) FadeIn フェードイン機能
フェードインとフェードアウト効果は実際には setInterval() です。追加 この効果は、前のループの DOM 操作を通じて要素オブジェクト ノードの透明度を変更することで実現できます。
そこで、setInterval()、不透明度、速度という 2 つの必要なものを抽出します。
速度: これは、不透明度値の float 値が 0 から 1 に変化するように設定する速度です。
フェードインのロジック: 不透明度値の float 値が 0 から 1 に変化します。
まずコードの実装を見てみましょう!
html:
<p id="p1"></p> <span id="span1">123</span> <button>fadein</button> <button>fadeOut</button>
css スタイル
<style> p { width: 100px; height: 100px; background-color: #1d7db1; opacity:0; } </style>
まず、fadeIn 関数の最初のバージョンの書き方を見てみましょう: まず実装のアイデアを理解してください
function fadeIn(ele, speed) { let num = 0; let time = setInterval(() => { num += speed; ele.style.opacity = num / 100; if (num >= 100) { clearInterval(time); // 清楚定时器 } }, 30); } }
この効果が一時的である場合物事によってはそれほど単純ではないことに気づきました。複数のトリガー効果が発生した場合、setInterval が同時に複数回使用されることになり、いくつかの厄介な BUG が発生します。
この問題を解決するには、現在、グローバル状態を追加して setInterval が複数回トリガーされないようにするという解決策があります。
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); } }
互換性の問題! ! !
最初にコードを見てください
set: function(elem, num) { elem.style.opacity !== undefined ? elem.style.opacity = num / 100 : elem.style.filter = 'alpha(opacity = '+ num +')'; }
注: ff および GG と互換性を持たせるための標準として ie を使用しているため、コードは num/100 を設定します
js で DOM ノードの透明度を設定する関数属性: filter= "alpha(opacity=" + value+ ")" (ieと互換性があります)
ieのフィルター範囲は0~100です
opacity=value/100 (FFおよびGGと互換性があります)。
FFとGGの不透明度は0~1です(ieのフィルタ範囲と互換性を持たせるため、num/100を使用します)
(2)フェードアウト機能
speed:これは不透明度を設定する値 float 値が 1 から 0 に変化する速度 (互換性を考慮することを忘れないでください)
フェードアウト ロジック: 不透明度値は float 値から 1 から 0 に変化します。
カプセル化された関数
(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; })();
テスト例:
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(); }
関連推奨事項:
IE6のフェードインおよびフェードアウトプロンプト関数の効果例のjQuery実装
フェードイン表示CSS フェードアウト トランジション効果の例
画像のフライイン効果とフェードアウト効果を実装するための h5+css3 コード例
以上がJavaScript はフェードインおよびフェードアウト効果を備えた関数をカプセル化します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。