ネイティブ 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 オペレーティング システムをインストールする

推薦する

ウェブページのエンコードにおける GB2312、GBK、UTF-8 の違い

まず、GB2312、GBK、UTF-8 はすべて文字エンコーディングであることを理解する必要がありま...

DockerがElasticsearch7.xを起動してエラーを報告する問題を解決する

Docker実行コマンドの使用docker run -d -p 9200:9200 -p 9300:...

Linux カーネル デバイス ドライバー カーネル時間管理に関する注意事項

/****************** * Linux カーネルの時間管理 ***********...

Dockerコンテナの構築と実行のプロセスの詳細な説明

イメージをプルし、コンテナを作成してコンテナを実行するだけです。 docker run -d --r...

Win7 での Mysql 5.7.17 winx64 インストール チュートリアル

ソフトウェア バージョンとプラットフォーム: MySQL-5.7.17-winx64、win7 Ho...

Vue でコミュニケーションを実装する 8 つの方法

目次1. コンポーネント通信1. Props 親コンポーネント ---> 子コンポーネント通信...

WeChatアプレットのサイレントログインとカスタムログイン状態の維持の詳細な説明

目次1. 背景2. サイレントログインとは何ですか? 3. カスタムログイン状態を維持する方法4. ...

HTML でよく使われるメタ百科事典 (推奨)

メタタグは、HTML言語のヘッド領域にある補助タグです。HTML文書のヘッダーにあるヘッドタグとタイ...

iOS スタイルの選択ボックスの開閉機能を実装するための純粋な CSS

1 効果デモアドレス: https://www.albertyy.com/2020/7/check...

Vuexはセッションストレージデータを結合して、ページを更新するときにデータが失われる問題を解決します

目次序文1. 理由: 2. 解決策のアイデア: 1. ローカル保存方法: 2. 実装手順: 3. 最...

MySQL 完全折りたたみクエリ正規マッチングの詳細な説明

概要前の章では、クエリのフィルター条件について学習しました。MySQL では、like % ワイルド...

Centos6.9 インストール Mysql5.7.18 ステップ記録

インストール手順 rpm -ivh mysql-コミュニティ-共通-5.7.18-1.el7.x86...

古い Vue プロジェクトに Vite サポートを追加する方法

1. はじめに会社のプロジェクトを引き継いで2年になります。今では毎回プロジェクトを起動するのに1分...

2 級コンピュータ試験のための MySQL の知識ポイントとよく使用される MYSQL コマンド

2級コンピュータ試験のMySQL知識ポイントの基礎、一般的なMYSQLコマンドは次のとおりです。よく...

VMware Workstation と vSphere 間で仮想マシンを移行する (画像とテキスト)

1. Workstationで仮想マシンのハードウェアバージョンを変更するWorkstation ...