JavaScript が Jingdong のカルーセル効果を模倣

JavaScript が Jingdong のカルーセル効果を模倣

この記事では、JD.comのカルーセル効果の表示を実現するためのJavaScriptの具体的なコードを参考までに共有します。具体的な内容は次のとおりです。

JD.com を真似てカルーセルを作りましたが、もちろん公式サイトほど美しくはありません。

主な技術的ポイント:

  • 3秒ごとに画像を自動的に切り替えます。
  • マウスが画像内に移動すると、切り替えは自動的に一時停止され、マウスが画像外に移動すると、切り替えが続行されます。
  • 左矢印ボタンと右矢印ボタンをクリックして、手動で写真を切り替えます。
  • マウスを灰色の点に移動すると、対応する画像が表示され、強調表示されます。

HTMLコード:

<本文>
 <h1>スライドショー表示</h1>
 <div id="did">

 <!-- 画像 -->
 <div id="img-div" onmouseover="doStop()" onmouseout="doStart()">
  <img src="./1.jpg">
  <img src="./2.jpg">
  <img src="./3.jpg">
  <img src="./4.jpg">
  <img src="./5.jpg">
  <img src="./6.jpg">
  <img src="./7.jpg">
  <img src="./8.jpg">
 </div>

 <!-- 左ボタンと右ボタン -->
 <div id="btn-div">
  <div id="left-btn" onclick="doLeftClick()">
  <h3> < </h3>
  </div>
  <div id="right-btn" onclick="doRightClick()">
  <h3> > </h3>
  </div>
 </div>

 <!-- ドット -->
 <div id="cir-div">
  <div onmouseover="doMove(1)"></div>
  <div onmouseover="doMove(2)"></div>
  <div onmouseover="doMove(3)"></div>
  <div onmouseover="doMove(4)"></div>
  <div onmouseover="doMove(5)"></div>
  <div onmouseover="doMove(6)"></div>
  <div onmouseover="doMove(7)"></div>
  <div onmouseover="doMove(8)"></div>
 </div>
 </div>

</本文>

CSSコード:

<スタイル>
 * {
 マージン: 0px;
 パディング: 0px;
 }

 体 {
 背景色: rgb(255, 249, 249);
 }

 h1 {
 テキスト配置: 中央;
 パディング上部: 40px;
 色: rgba(250, 54, 129, 0.562);
 }

 #した {
 位置: 相対的;
 幅: 590ピクセル;
 高さ: 470ピクセル;
 マージン: 30px 自動;
 }

 #画像div {
 位置: 絶対;
 }

 #画像div 画像 {
 幅: 590ピクセル;
 表示: なし;
 カーソル: ポインタ;
 Zインデックス: -1;
 }

 /* これら 2 つの段落は省略できます */
 /* 最初の画像を表示する */
 #img-div img:最初の子 {
 表示: ブロック;
 }

 /* 最初のドットを点灯します */
 #cir-div div:最初の子 {
 背景: #fff;
 }

 #サークルdiv {
 位置: 絶対;
 /* 画像に対する相対位置 */
 左: 40px;
 下: 25px;
 }

 /* 下のドット*/
 #cir-div div {
 幅: 8px;
 高さ: 8px;
 フロート: 左;
 /* 50% は切り捨て*/
 境界線の半径: 50%;
 右マージン: 6px;
 境界線: 1px実線 rgba(0, 0, 0, .05);
 背景: rgba(255, 255, 255, .4);
 }

 #左ボタン{
 位置: 絶対;
 /* 画像に対する相対位置 */
 上位: 45%

 /*左半円ボタン*/
 幅: 27px;
 高さ: 38px;
 背景: rgba(119, 119, 119, 0.5);
 境界線の半径: 0 20px 20px 0;
 /* アニメーション効果。変更前に配置され、マウスがその上に移動すると、色がゆっくりと変化します*/
 トランジション: 背景色 0.3 秒のイーズアウト;
 }

 #右ボタン{
 位置: 絶対;
 /* 画像に対する相対位置 */
 上位: 45%
 右: 0px;

 /* 右半円ボタン */
 幅: 27px;
 高さ: 38px;
 背景色: rgba(119, 119, 119, 0.5);
 境界線の半径: 20px 0 0 20px;
 /* アニメーション効果。変更前に配置され、マウスがその上に移動すると、色がゆっくりと変化します*/
 トランジション: 背景色 0.3 秒のイーズアウト;
 }

 #左ボタン:ホバー{
 背景色: rgba(32, 32, 32, 0.5);
 カーソル: ポインタ;
 }

 #右ボタン:ホバー{
 背景色: rgba(32, 32, 32, 0.5);
 カーソル: ポインタ;
 }

 #左ボタン h3 {
 色: #fff;
 上マージン: 4px;
 左マージン: 2px;
 }

 #右ボタン h3 {
 色: #fff;
 上マージン: 4px;
 左マージン: 8px;
 }
</スタイル>

JavaScript コード:

<スクリプト>
 //最初の画像を表示します。var count = 1;
 //時間 var time = null;
 //画像リスト var imglist = document.getElementById("img-div").getElementsByTagName("img");
 //ドットリスト var cirlist = document.getElementById("cir-div").getElementsByTagName("div");

 //対応する画像を表示し、対応するドットを点灯します。 function show(x) {
 (var i = 0; i < imglist.length; i++) の場合 {
  (x == i + 1)の場合{
  //画像を表示します imglist[i].style.display = "block";
  //ドットが点灯します upcirlist[i].style.backgroundColor = "#fff";
  } それ以外 {
  imglist[i].style.display = "なし";
  cirlist[i].style.background = "rgba(255, 255, 255, .4)";
  }
 }
 }

 // 時間指定カルーセル画像(3 秒ごとに画像を切り替える)
 関数doStart() {
 時間 == null の場合 {
  時間 = setInterval(関数() {
  カウント++;
  表示(カウント);
  (カウント>=8)の場合
   カウント = 0;
  }
  }, 3000);
 }
 }

 //カルーセルを停止する関数doStop() {
 (時間!= null)の場合{
  クリア間隔(時間);
  時間 = null;
 }
 }

 //マウスがドットに移動すると、それに応じて画像が切り替わり、移動前の次のドットではなく次のドットが点灯します。 function doMove(x) {
 表示(x);
 //count に位置を割り当てると、画像は次の画像から切り替わります。count = x;
 //マウスが最後のドットに移動したら、count を 0 に変更する必要があります。そうしないと、doStart() の count++ が実行され、count が 9 になり、範囲外になります。if (count == 8) {
  カウント = 0;
 }
 }

 /*
 show(x) の i、count、x の関係について:
  私 = [0,7];
  x = [1,8];
  カウント = [1,8];
 */
 //左ボタンをクリックして画像を左に切り替える function doLeftClick() {
 (var i = 0; i < imglist.length; i++) の場合 {
  //現在表示されている画像を判断する if (imglist[i].style.display == "block") {
  (i == 0) の場合 {
   表示(8);
   // この文を忘れると、break は直接終了します。左ボタンが右端のドットに押されると、ドット 1 は無視され、ドット 2 に直接ジャンプします。
   カウント = 0;
   //スイッチが 3 秒であることを確認します doStop();
   実行を開始します。
   壊す;
  }
  表示(i);
  カウント = i;
  //スイッチが 3 秒であることを確認します doStop();
  実行を開始します。
  壊す;
  }
 }
 }

 //右ボタンをクリックして画像を右に切り替えます function doRightClick() {
 (var i = 0; i < imglist.length; i++) の場合 {
  //現在表示されている画像を判断する if (imglist[i].style.display == "block") {
  もし (i == 7) {
   表示(1);
   カウント = 1;
   停止します。
   実行を開始します。
   壊す;
  }
  表示(i + 2);
  カウント = i + 2;
  //画像がない状況への切り替えは行われません if (count >= 8) {
   カウント = 0;
  }
  停止します。
  実行を開始します。
  壊す;
  }
 }
 }

 実行を開始します。
 // デフォルトのオープニング ページには最初の画像が表示されます // (追加されていない場合は最初の円が点灯します。これは、ページを開いたばかりのときに左ボタンが反応しないことを意味します)
 1 を移動します。
</スクリプト>

遭遇した困難:

カルーセルは非常にシンプルに見えますが、実装にはまだ多くの問題があります。しかし、私が見つけた問題はすべて解決しました。

  • 画像上にドットやボタンを配置
  • 画像は自動的に切り替わりますが、対応するドットは点灯しません
  • マウスをドットに移動すると画像が切り替わりますが、次に自動的に点灯するドットは、移動したドットの 1 つ前のドットになります。
  • ページを開いたばかりのときに最初の円が点灯し、左ボタンは反応しません
  • 左ボタンを右端のドットまで押すと、ドット 1 は無視され、ボタンはドット 2 に直接ジャンプします。
  • 最後のドットで右ボタンをクリックすると、画像が写真のない状態に切り替わります。
  • 左ボタンをクリックした場合の切り替え時間は約 2 秒、右ボタンをクリックした場合の切り替え時間は約 5 秒と、標準の 3 秒に達していません。

でも解決しました!

最も大きな感情は、バグを解決したばかりで誇らしい気持ちになっているときに、別のバグが出現することです。

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

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

<<:  InnoDB のアーキテクチャと機能の詳細な説明 (InnoDB ストレージ エンジンの読書メモの要約)

>>:  Apache Web サーバーを使用して 2 つ以上のサイトを構成する方法

推薦する

MySQL に配列を保存するサンプルコードと方法

多くの場合、ストアド プロシージャを作成するときに配列がよく使用されますが、MySQL ではストアド...

ウィンドウ内のさまざまな距離/スクロール距離の正確な計算の概要

通常、プロジェクト開発では、マージン、位置、座標などを扱う必要があります。悲劇なのは、これらの概念が...

Vue で親コンポーネントから子コンポーネントにデータを渡すいくつかの方法

最近、Vue のソースコードを勉強していて、Vue で親コンポーネントと子コンポーネント間でデータを...

Logrotate は 2 時間ごとに Catalina.out ログローテーションを実装します

1. Logrotateツールの紹介Logrotate はログファイル管理ツールです。Linux に...

Docker-compose を使用して GitLab をデプロイする方法

Docker-compose は GitLab をデプロイします1. Dockerをインストールする...

Prometheusコンテナのデプロイメントのための実用的なソリューション

環境ホスト名IPアドレス仕えるプロメテウス192.168.237.137プロメテウス、グラファナノー...

JavaScriptプロトタイプチェーンの詳細な説明

目次1. コンストラクタとインスタンス2. プロパティプロトタイプ3. プロパティ __proto_...

MySQL 8.0.11 圧縮版のインストールチュートリアル

この記事では、MySQL 8.0.11のインストールチュートリアルを参考までに紹介します。具体的な内...

Nginx で HTTPS 証明書を構成する詳細なプロセス

1. HttpとHttpsの違いHTTP: インターネットで最も広く使用されているネットワーク プロ...

MySQL データベースの操作とデータ型

目次1. データベース操作1.1 データベースの表示1.2 データベースを作成する1.3 データベー...

JavaScript の手ぶれ補正とスロットリングの説明

目次安定スロットリング要約する安定自動ドアは人を感知してドアを開け、5 秒間のカウントダウンを開始し...

MySQLクラスタのDockerデプロイメントの実装

シングルノードデータベースの欠点大規模なインターネットプログラムはユーザーベースが大きいため、アーキ...

VSCode 開発 UNI-APP 構成チュートリアルとプラグイン

目次前面に書かれた予防開発環境構築開発構成に関する注意事項前面に書かれたuni-app は、Vue....

Vue3でカルーセルコンポーネントをカプセル化する方法

目的カルーセルコンポーネントをカプセル化して直接使用します。具体的な内容は以下のとおりです。一般的な...