JavaScript はフェードインおよびフェードアウト効果を備えた関数をカプセル化します。

小云云
リリース: 2018-03-20 09:13:02
オリジナル
2112 人が閲覧しました

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 = &#39;alpha(opacity = &#39;+ num +&#39;)&#39;;
}
ログイン後にコピー

注: 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 == &#39;Object&#39; ? selector : document.getElementById(selector);
  }
  Fade.prototype = {
   constructor: Fade,
    setOpacity: (elem, opacity) => { // 兼容ie10—
      elem.filters ? elem.style.filter = &#39;alpha(opacity = &#39;+ opacity +&#39;)&#39;:  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 = &#39;alpha(opacity = &#39;+ num +&#39;)&#39;;
   },
    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 = &#39;alpha(opacity = &#39;+ num +&#39;)&#39;;
          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 = &#39;alpha(opacity = &#39;+ num +&#39;)&#39;;
          if (num <= opacity) {
          clearInterval(time);
          fadeFlag = true;
          }
        }, 20);
      }
    }
  };
window.Fade = Fade;
})();
ログイン後にコピー

テスト例:


let btn = document.getElementsByTagName(&#39;button&#39;)[0];
 let btn2 = document.getElementsByTagName(&#39;button&#39;)[1];
 btn.onclick = () => {
  let fade = new Fade(&#39;p1&#39;);
 fade.fadeIn();
 };
 btn2.onclick = () => {
  let fade = new Fade(&#39;p1&#39;);
  fade.fadeOut();
 }
ログイン後にコピー

関連推奨事項:

IE6のフェードインおよびフェードアウトプロンプト関数の効果例のjQuery実装

フェードイン表示CSS フェードアウト トランジション効果の例

画像のフライイン効果とフェードアウト効果を実装するための h5+css3 コード例

以上がJavaScript はフェードインおよびフェードアウト効果を備えた関数をカプセル化します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート