JS でカルーセル画像を実装するいくつかの方法

JS でカルーセル画像を実装するいくつかの方法

カルーセル

主なアイデアは次のとおりです。

大きなコンテナには、コンテナの幅の整数倍の非常に長いテーブルがあります。

次に、リスト スタイルの left 属性を変更して、左右のスライドを実現します。

この記事では5 枚の画像のスライドを制御することを目的としていますが、HTML では7 枚の画像が使用されています。最初と最後の画像が重複しています。理由は後述します。

ここに画像の説明を挿入

コンテナに overflow:hidden 属性を設定することで、コンテナのビューポートのサイズの画像が 1 つだけ表示されるようになります。

<本文>
 <div id="コンテナ"> /*コンテナ*/
  <div id="wrap" style="left: -400px;"> /*画像リスト*/
   <div class="item item5">l5</div>
   <div class="item item1">1</div>
   <div class="item item2">2</div>
   <div class="item item3">3</div>
   <div class="item item4">4</div>
   <div class="item item5">5</div>
   <div class="item item1">r1</div>
  </div>
 </div>
 <div id="key"> /*ボタンを設定*/   
  <div id="list"> /*小さな円をクリックすると固定画像に切り替わります*/
   <div class="btn1 btnNum">1</div>
   <div class="btn2 btnNum">2</div>
   <div class="btn3 btnNum">3</div>
   <div class="btn4 btnNum">4</div>
   <div class="btn5 btnNum">5</div>
  </div>
  <div id="btn"> /*左右を切り替えるボタン*/
   <button class="left">←</button>
   <button class="right">→</button>
  </div>
 </div>
</本文>

CS: ...

ラップ リストの flex プロパティを設定すると、画像を 1 行に表示できます。ニーズに応じて他のレイアウトも作成できます。

id="wrap" のノードではインライン スタイル left が設定されていることに注意してください。なぜなら、画像を切り替えるときに left 属性を使用するのですが、 left 属性を設定しないと、DOM でスタイルを設定するときに left 属性を見つけることができないからです。

<スタイル>
  #容器 {
   幅: 400ピクセル;
   高さ: 300px;
   境界線: 8px rgb(8, 8, 8) 実線;
   マージン: 0 自動;
   上マージン: 150px;
   オーバーフロー: 非表示;
   位置: 相対的;
  }
  #包む {
   幅: 2800ピクセル;
   高さ: 300px;
   ディスプレイ: フレックス;
   位置: 相対的;
  }
  。アイテム {
   フレックス: 1;
   幅: 400ピクセル;
   高さ: 300px;
  }
  .item1 {
   背景色: ローズブラウン;
  }
  .item2 {
   背景色: rgb(12, 226, 37);
  }
  .item3 {
   背景色: rgb(212, 221, 29);
  }
  .item4 {
   背景色: rgb(61, 27, 182);
  }
  .item5 {
   背景色: rgb(221, 23, 145);
  }
  #鍵 {
   幅: 400ピクセル;
   高さ: 300px;
   マージン: 0 自動;
  }
  #リスト{
   幅: 400ピクセル;
   高さ: 40px;
   ディスプレイ: フレックス;
   コンテンツの中央揃え: 中央;
  }
  #リストdiv{
   上マージン: 10px;
   左マージン: 10px;
   幅: 20px;
   高さ: 20px;
   背景色: rgb(13, 162, 221);
   テキスト配置: 中央;
   境界線の半径: 45%;
   不透明度: 0.6;
  }
  #リスト div:hover {
   カーソル: ポインタ;
   不透明度: 1;
  }
  #ボタン{
   幅: 400ピクセル;
   テキスト配置: 中央;
  }
 </スタイル>

これが完全なスタイルです

ここに画像の説明を挿入

各色は絵を表し、順番に番号が付けられています。開始位置は2枚目の写真です。

最初と最後の画像の両端に余分な重複画像が配置されている理由は、スライド効果を作成するときに、最後の画像(最後から2番目の画像、ピンクと紫)が最初の画像(実際にはこの画像では2番目の画像、薄茶色)に向かって右にスムーズにスライドし続けることができるようにするためです。最初の画像(この画像では2番目、薄茶色)を左にスライドすると、最後の画像(実際には最後から2番目の画像)までスムーズにスライドできます。以下を読み続けてください。

1. 複数のカルーセルモード

カルーセルを配置し、ラップ リストの left 属性を変更してカルーセルを移動する必要があります。

まずデータを初期化する

var wrap = document.getElementById('wrap');
var nowleft = -400; //現在のリストの left の値を格納するために使用されますvar currIndex = 1; //現在の画像番号を格納するために使用されます//複数のボタンを検索var btnNum = document.getElementsByClassName('btnNum'); //小さな円var right = document.getElementsByClassName('right')[0]; //右にスライドするボタンvar left = document.getElementsByClassName('left')[0]; //左にスライドするボタン

1.1 自動カルーセル効果のタイミング

自動左スライドの効果についてのみ話す

自動回転なので、連続回転を維持するためには setInterval() タイマーが不可欠です。

関数 next() {
  setInterval(function() { // 画像を 2 秒ごとに切り替えます wrap.style.transition = 'left 1s' // トランジションのスライド効果を設定します nowleft = parseInt(wrap.style.left) - 400; // 一度切り替えた後、nowleft は画像 1 枚分の幅だけ縮小されます (つまり、左にスライドします) wrap.style.left = nowleft + 'px'; // 次に、nowleft を wrap の left 属性に割り当てますif(parseInt(wrap.style.left) == -2400) { // 最後の 1 つを判断した後、こっそりと最初に戻ります setTimeout(() => {
       wrap.style.transition = 'none' // こっそりと元に戻るので、トランジション効果をキャンセルする必要があります nowleft = -400;
       wrap.style.left = nowleft + 'px'
      },1200) // タイマー時間が遷移時間より大きく、各回転の時間より短いことを確認します}
  },2000)
}

/ wrap.style.left は px を含む文字列を返すので、parseInt を使用して前の値を取得できます/

1.2 右スライドボタンを押す

right.addEventListener('click',function() {
  if(nowleft >= -2000){ //最後の画像かどうかを判断し、そうでない場合はスライドを開始します nowleft -= 400;
   wrap.style.transition = '左1秒';
   wrap.style.left = nowleft + 'px';
  }
  if(nowleft == -2400) { //最後の画像に到達したら、秘密裏に最初の画像に戻ります setTimeout(() => {
    wrap.style.transition = 'なし';
    今左 = -400;
    wrap.style.left = nowleft + 'px';
   },1020)
  }
})

1.3 小さな円の切り替え画像

for(i = 0; i < btnNum.length; i++) {
  btnNum[0].style.opacity = 1;
  btnNum[i].addEventListener('click',function() {
   wrap.style.transition = '左1秒';
   for(j = 0; j < btnNum.length; j++) {
    btnNum[j].style.opacity = '0.6';
   }
   btnNum[i].style.opacity = 1;
   nowleft = nowleft - (i+1 - currIndex)*400;
   currIndex = i + 1;
   wrap.style.left = nowleft + 'px';
})

実は、この記事の最後の画像から最初の画像にこっそり切り替える操作には欠陥があり、シーケンス番号 5 の画像をシーケンス番号 r1 の画像にスライドさせるのに 1 秒かかりますが、wrap.style.left は直接変化し、遷移期間中の変位に応じて変化しません。したがって、シーケンス番号 5 を r1 に完全にスライドさせてから、シーケンス番号 1 に秘密裏に切り替える時間を制御することは、やや困難です。

たとえば、シーケンス番号 1 から 3 回連続してクリックすると、シーケンス番号 4 に切り替えることができます。もちろん、シーケンス番号 5 から 3 回連続でクリックすることはできません。R1 がシーケンス番号 1 に切り替わると、クリック効果に反応がないため、ここでのインタラクションの違いは違和感を感じやすくなります。

この厄介なバグを改善したい場合は、手ぶれ補正機能を使用して改善することができます。

これで、カルーセル画像を JS でネイティブに実装するいくつかの方法についての記事は終了です。より関連性の高い JS ネイティブ カルーセル コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript で円形カルーセルを実装する
  • カルーセル効果を書くためのjs
  • JavaScript ベースのシンプルなカルーセルの実装
  • JavaScript が Jingdong のカルーセル効果を模倣
  • JavaScript Domはカルーセルの原理と例を実装します
  • シームレスなカルーセル効果を実現するネイティブ js
  • モバイルカルーセルスライドスイッチを実現する js
  • スクロールホイールカルーセル画像を実現するための JavaScript
  • ネイティブ Js で実装されたシンプルなシームレス スクロール カルーセルのサンプル コード

<<:  新しいカーネルをLinuxシステムに移植する手順

>>:  Python3.6-MySql 挿入ファイルパス、バックスラッシュをなくす解決策

推薦する

mysql 更新ケース更新フィールド値が固定されていない操作

特定のデータの一括更新処理において、特定のステータスが固定値に更新されるなど、更新するフィールドの値...

js の toString メソッドの 3 つの機能

目次1. toStringメソッドの3つの機能2. オブジェクトを表す文字列を返す3. カスタム t...

mysql 10進データ型変換の実装

最近、次のデータ型のデータベースに遭遇しました:decimal(14,4)発生した問題は次のとおりで...

MySQL の条件文で 1 つの情報しか読み取れない問題に対する 2 つの解決策

今日、私の同僚が MYSQL クエリ ステートメントの作成時に非常に奇妙な問題に遭遇しました。MyS...

Vue バックグラウンドでステータス ラベルをエレガントに記述する例

目次序文最適化変数の抽出二次包装 el-tag コンポーネント使用要約する序文バックエンドシステムの...

VMware WorkStation 14 pro インストール Ubuntu 17.04 チュートリアル

この記事では、VMware Workstation14 ProにUBuntu17.04をインストール...

MySQL 分離列とプレフィックスインデックスの使用の概要

目次データ列を分離するプレフィックスインデックスとインデックスの選択性データ列を分離するMySQL ...

MySQL 8.0 をインストールした後、初めてログインするときにパスワードを変更する問題を解決する

MySQL 8.0.16で初回ログイン時のパスワードを変更する方法を紹介します。 MySQLデータベ...

JavaScript でシンプルな Web 時計を実装する

JavaScript を使用して Web ページ クロックを実装します。効果は次の図に示されています...

CSS3 でテキストマーキーを実装するためのサンプルコード

背景何が起こったかというと、Luzhu は偶然、宇宙で最高の外部スピーカーを備えた携帯電話について知...

HTMLテーブルではテーブルの外側の境界線のみが表示されます

質問があります。Dreamweaver で、3 行 1 列のログイン フォーム (ログイン、登録、パ...

docker compose を使用して FastDfs ファイル サーバーをインストールする詳細な例

ドッカーの作成 バージョン: '2' サービス: fastdfsトラッカー: ホスト...

node.js が大規模プロジェクトに適さない理由

目次序文1. アプリケーションコンポーネント2. アプリケーションの種類3. アプリケーションサービ...

Linux での rpm、yum、ソースコードの 3 つのインストール方法の詳細な紹介

第1章 ソースコードのインストールRPM パッケージは特定のシステムとプラットフォームに応じて指定さ...

MySQL がデフォルト値を持つ NULL 列の使用を推奨しない理由

よく聞かれる答えは、列に NULL 値を使用するとインデックスが無効になるというものですが、実際にテ...