ネイティブ js カプセル化シームレスカルーセル機能

ネイティブ js カプセル化シームレスカルーセル機能

ネイティブjsカプセル化シームレスカルーセルプラグイン、参考までに、具体的な内容は次のとおりです。

例:

これは、ネイティブ js および es5 構文で記述されたシームレスなカルーセル プログラムです。関連する API はコードにカプセル化されているため、カルーセル js ファイルを導入した後は、独自の js ファイルに 2 行のコードを追加するだけで、Web ページで基本的なシームレスなカルーセル効果を実現できます。

基本的な使用手順は、DOM 要素配列を取得し、カルーセル オブジェクトにパラメータを渡し、カルーセル オブジェクトが自動カルーセル メソッドを呼び出すことです。

基本的なタイマー自動カルーセル機能に加えて、プログラムは、遷移アニメーション時間の設定、マウスが要素に移動したときのカルーセルの自動停止の設定、左側と右側のボタンをクリックしたときのカルーセルの設定、および下部のボタンをクリックしたときのカルーセルの設定もサポートしています。

このプログラムは CSS または HTML ファイルに依存する必要はありませんが、CSS および HTML レイアウトが特定のルールに従う必要があります。

なお、このプログラムはカーブ遷移速度をサポートしていないため、ブラウザウィンドウを切り替えた後にカルーセル画像が乱れるバグが発生する場合があります。現時点では問題は見つかっていません。

このプログラムは、私のような初心者がシームレス カルーセル機能を単純にカプセル化したものであり、学習と参照目的でのみ使用できます。

カルーセルコードに加えて、サンプルプログラムも以下に示します。

操作効果:

アイデア:

すべてのスライドショー要素の配置順序は、スライドショーの方向に応じて決定されます。現在のスライドショーがすべてのスライドショーの境界に達した場合、相対方向の最後のスライドショーが対応する位置に即座に移動されます。
この方法でカルーセル画像を実装するために必要なカルーセル画像の最小数は 3 です。カルーセル画像が 1 つまたは 2 つの場合は、個別に処理する必要があります。1 つの場合は、現在のカルーセル画像と同じカルーセル画像要素を 2 つコピーして追加します。2 つの場合は、現在のカルーセル画像を順番にコピーして追加します。

コンパイル環境:

クローム 86.0.4240.183

コード:

slide.jsはスライドショーのコードをカプセル化します

(関数(ウィンドウ、未定義) {
 
 // 要素のCSS属性値を取得する function getCss(elem, attr) {
  elem.currentStyle を返しますか? 
   要素.currentStyle[属性]: 
   window.getComputedStyle(要素、null)[属性];
 }
 
 // 文字列から数字以外の部分を削除します(負の符号は除く)。function toInt(str) {
  var rex = /[^0-9]/ig;
  Numberを返します((str[0] === '-' && str[1] !== '=') ? '-' + str.replace(rex, '') : str.replace(rex, ''));
 }
 
 // アニメーション関数をカプセル化します。パラメータ: dom オブジェクト、css 属性値オブジェクト、アニメーション実行時間、アニメーション完了後のコールバック function animation(elem, params, speed, callback) {
  (var param in params) の場合 {
   (関数(パラメータ) {
    
    var elemValue = toInt(getCss(elem, param))、
     ターゲット値 = toInt(params[param])、
     currentDis = 要素値、
     単位 = params[param].substr(params[param].indexOf('[A-Za-z]+') - 1);
    
    パラメータ[パラメータ].長さ>2の場合{
     var prefix = params[param].substr(0, 2);
     
     if (プレフィックス === '+=')
      ターゲット値 = 要素値 + ターゲット値;
     そうでない場合 (プレフィックス === '-=')
      ターゲット値 = 要素値 - ターゲット値;
    }
    
    var dis = (targetValue - elemValue) / 速度、
     sizeFlag = ターゲット値 < 要素値;
    
    var タイマー = setInterval(関数() {
     
     要素の値 = toInt(getCss(要素、パラメータ));
     
     if (サイズフラグ) {
      (現在のDis <= ターゲット値)の場合{
       タイマーの間隔をクリアします。
       elem.style[param] = ターゲット値 + 単位;
      } それ以外 {
       現在のDis + = dis;
       elem.style[param] = currentDis + 単位;
      }
     }
     それ以外 {
      (現在のDis >= ターゲット値)の場合{
       タイマーの間隔をクリアします。
       elem.style[param] = ターゲット値 + 単位;
      } それ以外 {
       現在のDis + = dis;
       elem.style[param] = currentDis + 単位;
      }
     }
    }, 1);
    
   })(パラメータ);
  }
  
  if (typeof コールバック === 'function')
   折り返し電話();
 };
 
 
 // カルーセル配列を右に移動する function rightRoundArrayMove() {
  
  var winsLen = wins.length;
  var lastWin = wins[winsLen - 1];
  
  (var i = winsLen - 1; i > 0; i--) の場合 
   勝利[i] = 勝利[i - 1];
  
  勝利数[0] = 最後の勝利;
 }
 
 // 左に回転する function rightRound(time) {
  
  右ラウンド配列移動();
  
  wins.forEach(関数(win, インデックス) {
   (インデックス === 0) ? 
    win.style.left = インデックス * winWidth - winWidth + 'px' :
    アニメーション(win, {left: '+=' + winWidth + 'px'}, time ? time : animationTime);
  });
 }
 
 //右に回転する function leftRound(time) {
  
  var winsLen = wins.length;
  var firstWin = wins[0];
  
  (var i = 0; i < winsLen - 1; i++) の場合
   勝利[i] = 勝利[i + 1];
   
  勝利数[勝利数Len - 1] = firstWin;
  
  wins.forEach(関数(win, インデックス) {
   (インデックス === wins.length - 1) ? 
    win.style.left = インデックス * winWidth - winWidth + 'px' :
    アニメーション(win, {left: '-=' + winWidth + 'px'}, time ? time : animationTime);
  });
 }
 
 
 var 
  // wins、btns、sbtnsはコンストラクタパラメータwinsを保存するために使用されます。 
  ボタン、 
  sbtns、 
  // ウィンドウ幅 winWidth,
  // 遷移アニメーション時間(ミリ秒)、デフォルトは 100
  アニメーション時間 = 100、
  // ボタンをクリックして間隔を回転します clickInterval = animationTime << 2,
  // 自動回転タイマー、タイマー間隔、右に回転するかどうかを保存する autoRoundTimer、
  q間隔、
  そうですね、
  //スライドコンストラクター、パラメーター: ウィンドウ配列、ボタン配列、サイドボタン配列 slide = function(wins, btns, sbtns) {
   新しい slide.prototype.init(wins, btns, sbtns) を返します。
  };
  
 
 スライド.プロトタイプ = {
  
  // ウィンドウ要素を初期化する init: function(awins, abtns, asbtns) {
   
   もし (!awins)
    throw new Error('ウィンドウ配列は空にできません。');
   
   wins = Object.values(awins)、btns = abtns、sbtns = asbtns;
   
   // ウィンドウが3つ未満の状況を処理する if (wins.length === 1) {
    var winParent = wins[0].parentNode;
    var winHTML = wins[0].outerHTML;
    winParent.innerHTML + = winHTML + winHTML;
    wins = Object.values(winParent.children);
   }
   そうでない場合 (wins.length === 2) {
    var winParent = wins[0].parentNode;
    winParent.innerHTML += wins[0].outerHTML + wins[1].outerHTML;
    wins = Object.values(winParent.children);
   }
   
   winWidth = wins[0].offsetWidth;
   
   wins.forEach(関数(win, インデックス) {
    win.style.position = '絶対';
    win.index = インデックス;
   });
   
   右ラウンド配列移動();
   
   wins.forEach(関数(win, インデックス) {
    win.style.left = インデックス * winWidth - winWidth + 'px';
   });
  },
  
  // 遷移アニメーション時間を設定する setAnimationTime: function(time) {
   アニメーション時間 = 時間;
   クリック間隔 = アニメーション時間 << 2;
  },
  
  // 自動回転、パラメータ: 回転時間間隔、右回転するかどうか autoRound: function(interval, isRight) {
   autoRoundTimer = setInterval(関数() {
        isRight ? rightRound() : leftRound();
       }, 間隔);
   qinterval = 間隔;
   右向き矢印
  },
  
  // サイドボタンのクリック、パラメータはサイドボタン要素の配列で、コンストラクタで渡すことも、すぐに渡すこともできます。sideBtnClickRound: function(sabtns) {
   
   var leftBtn = sabtns ? sabtns[0] : sbtns[0],
    rightBtn = sabtns ? sabtns[1] : sbtns[1];
   
   var isclick = true;
   leftBtn.onclick = 関数(){
    if(isclick) {
     isclick=false;
     右丸め();
     setTimeout(関数() { 
      クリック = true;
     }, クリック間隔);
    }
   };
   
   rightBtn.onclick = 関数(){
    if(isclick) {
     isclick=false;
     左ラウンド();
     setTimeout(関数() {
      クリック = true;
     }, クリック間隔);
    }
   };
  },
  
  // 通常のボタンクリック、パラメータ: 通常のボタン配列、コールバック btnsClickRound: function(abtns, callback) {
   
   var ibtns = abtns ? abtns : btns;
   
   var isclick = true;
   
   ibtns.forEach(関数(btn, インデックス) {
    btn.onclick = 関数() {
     if(isclick) {
      isclick=false;
      
      if (typeof コールバック === 'function')
       コールバック(ibtns、btn、インデックス);
      
      var poor = index - wins[1].index;
      var count = Math.abs(poor);
      (悪い<0)の場合{
       var absPoor = count;
       var タイマー = setInterval(関数() {
        console.log((absPoor + 1))
           rightRound(アニメーション時間 / (absPoor + 2));
           ((--count) === 0 の場合) 
            タイマーの間隔をクリアします。
          }, アニメーション時間);
      }
      そうでない場合(poor > 0){
       var タイマー = setInterval(関数() {
           leftRound(アニメーション時間 / (poor + 2));
           ((--count) === 0 の場合) 
            タイマーの間隔をクリアします。
          }, アニメーション時間);
      }
      
      setTimeout(関数() {
       クリック = true;
      }, クリック間隔 << 1);
     }
    }
   });
  },
  
  // マウスを移動させて自動回転をキャンセルするように設定します。パラメータ: 移動する要素、移動する要素のコールバック、移動する要素のコールバック setOverStop: function(box, overCallback, outCallback) {
   box.onmouseover = 関数(e) {
    自動ラウンドタイマーの間隔をクリアします。
    
    if (typeof overCallback === 'function')
     オーバーコールバック(e);
   }
   box.onmouseout = 関数(e) {
    slide.prototype.autoRound(qinterval, qisRight);
    
    if (typeof outCallback === 'function')
     アウトコールバック(e);
   }
  }
 }
 
 slide.prototype.init.prototype = slide.prototype;
 window.slide = _slide = スライド;
 
})(ウィンドウ);

test.js テスト例の js コード:

onload = 関数() {
 
 var wins = document.querySelectorAll('.wins > li');
 var btns = document.querySelectorAll('.btns > li');
 var sideBtns = document.querySelectorAll('.side-btns > div');
 var box = document.querySelector('.box');
 
 var s = slide(wins, btns, sideBtns); // カルーセルオブジェクトを作成します。パラメータ: ウィンドウDOM配列、下部ボタンDOM配列(オプション)、
 s.autoRound(2000); // 自動回転を設定します s.setAnimationTime(200); // 遷移アニメーション時間を設定します s.setOverStop(box); // マウスが要素内に入ったときに自動回転を停止するように設定、パラメータ: 移動した DOM 要素、移動した要素のコールバック、移動した要素のコールバック s.sideBtnClickRound(); // サイドボタンをクリックしたときの回転を設定します、パラメータ: ボタンの DOM 配列 (オプション)
 s.btnsClickRound(); // 下のボタンがクリックされたときの回転を設定します。パラメータ: ボタン DOM 配列 (オプション)、コールバック}

HTML、CSS サンプルコード

<!DOCTYPE html>
<html>
 <ヘッド>
  <メタ文字セット="utf-8" />
  <タイトル></タイトル>
  <スタイル タイプ="text/css">
   * {
    マージン: 0;
    パディング: 0;
   }
   
   li {
    リストスタイル: なし;
   }
   
   。箱 {
    幅: 1000ピクセル;
    高さ: 400px;
    マージン: 20px 自動;
    ディスプレイ: フレックス;
    アイテムの位置を中央揃えにします。
    位置: 相対的;
    オーバーフロー: 非表示;
   }
   
   .box > * {
    位置: 絶対;
   }
   
   .サイドボタン{
    幅: 継承;
    高さ: 100px;
    ディスプレイ: フレックス;
    コンテンツの両端揃え: スペースの間;
    zインデックス: 2;
   }
   
   .side-btns > div {
    幅: 50px;
    高さ: 継承;
    テキスト配置: 中央;
    行の高さ: 100px;
    フォントサイズ: 18px;
    背景色: rgba(0, 0, 0, .3);
    色: 白;
    カーソル: ポインタ;
    ユーザー選択: なし;
   }
   
   .btns{
    幅: 継承;
    高さ: 20px;
    ディスプレイ: フレックス;
    コンテンツの端揃え: flex-end;
    zインデックス: 2;
    位置: 絶対;
    下: 20px;
   }
   
   .btns > li {
    幅: 16px;
    高さ: 16px;
    境界線の半径: 50%;
    右マージン: 12px;
    カーソル: ポインタ;
    背景色: rgba(0, 0, 0, .2);
   }
   
   .勝つ {
    幅: 継承;
    高さ: 継承;
    ディスプレイ: フレックス;
   }
   
   .wins > li {
    幅: 継承;
    高さ: 継承;
    フレックス成長:0;
    フレックス収縮:0;
   }
  </スタイル>
  <script src="js/slide.js"></script>
  <script src="js/test.js"></script>
 </head>
 
 <本文>
  <div class="box">
   <div class="side-btns">
    <div class="left-btn">&lt;</div>
    <div class="right-btn">&gt;</div>
   </div>
   
   <ul class="btns">
    <li></li>
    <li></li>
    <li></li>
    <li></li>
   </ul>
   
   <ul class="勝つ">
    <li style="background-color: anti-white;">あ</li>
    <li style="background-color: アクアマリン;">b</li>
    <li style="background-color: green;">c</li>
    <li style="background-color: brown;">d</li>
   </ul>
  </div>
 </本文>
</html>

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • JavaScript axiosのインストールとパッケージ化のケースの詳細な説明
  • 相同性とクロスドメイン、jsonp(関数カプセル化)、CORS原則の詳細な分析
  • Vue.jsは背景テーブルコンポーネントのカプセル化を管理します
  • JavaScript オブジェクト指向の実践の詳細説明: カプセル化とオブジェクトのドラッグ
  • ネイティブ JS カプセル化 vue タブ切り替え効果
  • jsはjQueryをカプセル化する簡単な方法とチェーン操作の詳細な説明を実装します
  • js は、Element の入力コンポーネントのいくつかの機能を実装し、それをコンポーネントにカプセル化します (サンプルコード)
  • JavaScript はプロトタイプのカプセル化カルーセルを実装します
  • JavaScriptスローモーションアニメーション機能のカプセル化方法
  • JavaScript キャンバスカプセル化動的クロック
  • Jackson の JSON ツールクラスのカプセル化について JsonUtils の使用
  • 単一リンクリストの JavaScript カプセル化のサンプルコード
  • 一般的なフロントエンドJavaScriptメソッドのカプセル化

<<:  MySQL 8.0.12 インストール設定方法とパスワード変更

>>:  仮想マシンに Windows Server 2008 オペレーティング システムをインストールする

推薦する

あまり一般的ではないが便利な CSS 属性操作の完全ガイド

1. カスタムテキスト選択 ::選択{ 背景: 赤; 色: 黒; } 2. ビデオコントロールからダ...

Java は Apache.POI を使用して HSSFWorkbook を Excel にエクスポートします

Apache.POI の HSSFWorkbook を使用して Excel にエクスポートします。具...

MySQLのデッドロックとログに関する詳細な説明

最近、MySQL オンラインでいくつかのデータ異常が発生しましたが、すべて早朝に発生しました。ビジネ...

Macシステムをインストールした後にVMWareがフルスクリーンで表示できない問題を解決する

システム: VMTOOLs ダウンロード:リンク: https://pan.baidu.com/s/...

MySQL での find_in_set() 関数の使用に関する詳細な説明

まず、例を見てみましょう。記事テーブルにはタイプフィールドがあり、1 見出し、2 おすすめ、3 ホッ...

3列レイアウトを実現するCSS3フレキシブルボックスフレックス

タイトルの通り、高さは既知で、左と右の列の幅は 300 ピクセル、中央は適応型です。弾性ボックス自体...

Centos6.5 に zabbix2.4 をインストールするチュートリアル図

centos-DVD1バージョンシステムの固定IPアドレスは192.168.159.128で、cen...

CentOS 上の Docker に Jupyter をインストールしてポートを開く方法

目次jupyterをインストールするDocker ポートマッピングjupyterをインストールするp...

仮想マシンに Linux rhel7.3 オペレーティング システムをインストールする (具体的な手順)

仮想化ソフトウェアをインストールする仮想マシンにオペレーティング システムをインストールする前に、ホ...

Windows Server 2012 リモート デスクトップ ライセンス サーバーがライセンスを提供できず、リモート セッションが切断される

本日、会社の内部サーバーにログインしたところ、リモートアクセスができませんでした。エラー メッセージ...

Linux コマンド クエリ アプレットでの WePY クラウド開発の実践

みなさんこんにちは。今日は Linux コマンド クエリ アプレットでの WePY クラウド開発の実...

MySQLデータベースの圧縮バージョンのインストールと設定に関する詳細なチュートリアル

目次1. MySQLをダウンロードする2. 圧縮パッケージを解凍する3. MySQLを初期化する4....

Iframe 適応高さコードに関する 3 つの議論

B/S システム インターフェースを構築する場合、メイン ページ index.html 内に他のペー...

html リンク タグ タイトル属性 改行 マウス ホバー プロンプト コンテンツ 改行効果

オブジェクト上にマウスを移動したときにコンテンツ(タイトル属性の内容)を折り返す方法、HTML タイ...

vitrualBox+ubuntu16.04 python3.6 最新チュートリアルと詳細な手順のインストール

最近ディープラーニングを学ぶためにUbuntu+Python 3.6バージョンを使う必要があるため、...