JavaScript による Web ページ カルーセルの超詳細な実装

JavaScript による Web ページ カルーセルの超詳細な実装

序文:

Web ページでは、さまざまなカルーセル効果をよく見かけます。これらはどのようにして実現されるのでしょうか?今日は一緒に見てみましょう!まず、いくつかの写真を用意する必要があります。ここでは 5 枚の写真を準備しました。

機能要件:

  • マウスがカルーセル モジュール上を通過すると、左ボタンと右ボタンが表示され、モジュールから離れると、左ボタンと右ボタンは非表示になります。
  • 右側のボタンを 1 回クリックすると、画像が 1 つ左側に再生されます。左側のボタンについても同様です。
  • 画像の再生中は、下の小さな円モジュールもそれに応じて変化します。
  • 小さな円をクリックすると、対応する画像が再生されます。
  • マウスがカルーセル上を通過しなくても、カルーセルは自動的に写真を再生します。
  • マウスをカルーセル モジュール上に移動すると、自動再生が停止します。

ページのレイアウトは次のとおりです。

次に、段階的に機能を実装します。

HTML ページの作成

実装プロセスは次のとおりです。まず大きなボックスを指定し、次に相対位置を指定して、後続のボックスの配置操作を容易にします。順序なしリストの形式で、画像を大きなボックスに追加します。実現したいカルーセル効果は水平方向であるため、画像にfloat: left属性を追加できます。画像が配置されている ul の大きさが十分でないため、他の画像が下に押し込まれてしまうため、画像が配置されている ul のサイズを手動で変更できます。次に、順序なしリストを記述して小さな円を配置し、絶対位置指定によって大きなボックスの下に配置します。次に、小さな円を追加して、対応する小さな円をクリックすると対応する画像にジャンプする効果を実現できるようにします。次に、絶対配置を使用して、大きなボックスの両側の適切な位置に左矢印と右矢印を配置します。最後に、大きなボックスの外側のコンテンツを非表示にします。

<!DOCTYPE html>
<html lang="ja">
<ヘッド>
    <メタ文字セット="UTF-8">
    <meta http-equiv="X-UA-compatible" content="IE=edge">
    <meta name="viewport" content="width=デバイス幅、初期スケール=1.0">
    <title>ドキュメント</title>
    <link rel="スタイルシート" href="index.css" rel="外部nofollow" >
</head>
<本文>
    <div class="box">
        <a href="" class = 'left jiantou'>&lt;</a>
        <a href="" class = 'right jiantou'>&gt;</a>
        <ul クラス = 'pic'>
            <li>
                <a href="#" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" ><img src="./images/1.jpg" alt=""></a>
            </li>
            <li>
                <a href="#" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" ><img src="./images/2.jpg" alt=""></a>
            </li>
            <li>
                <a href="#" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" ><img src="./images/3.jpg" alt=""></a>
            </li>
            <li>
                <a href="#" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" ><img src="./images/4.jpg" alt=""></a>
            </li>
             <li>
                <a href="#" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" rel="外部 nofollow" ><img src="./images/5.jpg" alt=""></a>
            </li>
        </ul>
        <ul class="lis">
            <li></li>
            <li class = '選択済み'></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </div>
</本文>
</html>


cssファイル

*{
    マージン: 0;
    パディング: 0;
}
li{
    リストスタイル: なし;
}
。箱{
    位置: 相対的;
    オーバーフロー: 非表示;
    マージン: 100px 自動;
    幅: 520ピクセル;
    高さ: 280px;
    背景色: 赤;
}
.jiantou{
    フォントサイズ: 24px;
    テキスト装飾: なし;
    表示: ブロック;
    テキスト配置: 中央;
    幅: 20px;
    高さ: 30px;
    行の高さ: 30px;
    背景: rgba(158, 154, 154, 0.7);
    色: 白;
    zインデックス: 999;
}
。左{
    位置: 絶対;
    上: 125px;
    左: 0px;
    右上の境界線の半径: 15px;
    右下の境界線の半径: 15px;
}
。右{
    位置: 絶対;
    上:125px;
    左: 500ピクセル;
    左上の境界線の半径: 15px;
    左下の境界線の半径: 15px;
}
画像{
    幅: 520ピクセル;
    高さ: 280px;
}
.box .pic{
    幅: 600%;
}
.pic li {
    フロート: 左;
}
.lis{
   位置: 絶対;
   下: 15px;
   左: 50%;
   左マージン: -35px;
   幅: 70ピクセル;
   高さ:13px;
   境界線の半径: 7px; 
   背景: rgba(158, 154, 154, 0.7);
}
.lis li {
    フロート: 左;
    幅: 8px;
    高さ: 8px;
    マージン: 3px;
    境界線の半径: 50%;
    背景色: #fff;
   
}
.lis .selected{
    背景色: シアン;
}


ページ効果は次のようになります。

js部分の機能を実装する

1. 左ボタンと右ボタン

マウスがカルーセル モジュール上を通過すると、左ボタンと右ボタンが表示され、モジュールを離れると、左ボタンと右ボタンが非表示になります。

まず、 display:none使用して最初の 2 つの矢印を非表示にします。次に、2 つの矢印と大きなボックスを取得し、マウスオーバー イベントとマウス リーブ イベントを大きなボックスに追加します。

以下のように表示されます。

 var left = document.querySelector('.left');
    var right = document.querySelector('.right');
    var box = document.querySelector('.box');
    box.addEventListener('mouseenter',function(){
        left.style.display = 'ブロック';
        right.style.display = 'ブロック';
    })
    box.addEventListener('mouseleave',function(){
        left.style.display = 'なし';
        right.style.display = 'なし';
    })


効果は次のとおりです。

2. 小さな円を動的に生成する

まず、図に示すように、小さな円 li をすべて削除します。

作成する小さな円は写真の数によって決まるため、私たちの基本的な考え方は、小さな円の数は写真の数と一致するべきであるということです。まず、ul 内の写真の数を取得し (写真は li に配置されるため、li の数になります)、次にループを使用してノードcreateElement ('li') を動的に作成し、ノードul. appendChild(li)を挿入して小さな円を生成します (この小さな円は ul に配置する必要があります)。最初の小さな円には、選択したクラスを追加する必要があることに注意してください。

実装コードは次のとおりです。

var pic = document.querySelector('.pic');
    var lis = document.querySelector('.lis');
    for(var i = 0;i<pic.children.length;i++){
        var li = document.createElement('li');
        lis.appendChild(li);
    }
    lis.children[0].className = '選択済み';


効果は次のとおりです。

3. 小さな円をクリックすると色が変わります。

小さな円を生成する際に、排他的なアイデアに基づいて小さな円にクリック イベントを追加します。対応する小さな円がクリックされると、 selectedクラスがその小さな円に追加され、残りの小さな円からselectedクラスが削除されます。

コードは次のとおりです:

li.addEventListener('クリック',function(){
            (var i =0;i<lis.children.length;i++){
                lis.childern[i].className = '';
            }
            this.className = '選択済み';
        })


効果は次のとおりです。

4. 小さな円をクリックして画像をスクロールします

ここではアニメーション関数が使用されています。アニメーション関数をカプセル化する方法についてはすでに説明しました。ここでは繰り返さず、そのまま引用します。ただし、アニメーション関数の js ファイルを index.js の上に置くように注意してください。また、アニメーション機能は配置された要素が追加された後にのみ使用できるため、pic ul に配置も追加する必要があります。次に、ルールに従って、小さな円をクリックすると、ul のスクロール距離は、小さな円のインデックス番号に画像の幅を掛けたものになることがわかりました。 (画像は左に移動しているので、負の値です) そのため、小さな円のインデックス番号を知る必要があります。小さな円を生成するときにカスタム属性を設定し、クリックするとこのカスタム属性を取得できます。

まず、li を生成するときにインデックスを設定します。

li.setAttribute('index',i);


次に、li にクリック イベントを追加するときに、インデックスを取得し、画像の幅を取得し、アニメーション関数を呼び出します。

li.addEventListener('クリック',function(){
    var boxWidth = box.offsetWidth;
    //インデックス番号を取得します。var index = this.getAttribute('index');
    for(var i = 0;i<lis.children.length;i++){
        lis.children[i].className = '';
    }
    this.className = '選択済み';
    アニメーション(pic,-index*boxWidth)
})


効果は次のとおりです。

5. 右側のボタンを 1 回クリックすると、一度に 1 枚ずつ画像がスクロールします。

右ボタンにクリック イベントを直接追加し、変数numを宣言して 1 回クリックし、1 ずつ増やすことができます。この変数に画像の幅 (ul のスクロール距離) を掛けます。

var 数値 = 0;
    right.addEventListener('click',function(){
        数値++;
        アニメーション化(pic,-num*boxWidth);
    })


効果は次のとおりです。

右側のボタンをクリックすると、画像切り替え効果が得られますが、最後の画像をクリックすると、表示ページの初期の背景にとどまり、美しくないことがわかりました。そこで、画像のシームレススクロールの原理を使用して、画像をシームレスにスクロールさせることができます。操作方法は次のとおりです。 cloneNode(true)を介してpicリストの最初の li のコピーを追加し、 appendChild()を介してそれをリストの末尾にコピーします。次に、js ページのnumに判定条件を追加します。つまり、 num の値が「このリストの要素数 - 1」に等しい場合、 ul が移動した距離が 0 になり、 num が 0 になるようにします。

コードは次のとおりです:

var first = pic.children[0].cloneNode(true);
    pic.appendChild(最初の子);
    //右ボタンの機能 var num = 0;
    right.addEventListener('click',function(){
        if(num == pic.children.length-1){
            pic.style.left = 0;
            数値 = 0;
        }
        数値++;
        アニメーション化(pic,-num*boxWidth);
    })


効果は次のとおりです。

成功しました。

6. 右側のボタンをクリックすると、小さな円がそれに応じて変化します。

必要なことは、別の変数circleを宣言し、右ボタンがクリックされるたびにそれを1ずつ増やすことです。この効果は左ボタンをクリックしたときにも達成されるため、この変数も必要なので、グローバル変数を宣言する必要があります。しかし、絵は5枚あり、小さい円は1つ少ない4つしかないので、判定条件を追加する必要があります。円==4の場合は、0に戻ります。

 var 数値 = 0;
var 円 = 0;
  right.addEventListener('click',function(){
      if(num == pic.children.length-1){
          pic.style.left = 0;
          数値 = 0;
      }
      数値++;
      アニメーション化(pic,-num*boxWidth);
      サークル++;
      if(circle == lis.children.length){
          円 = 0;
      }
      (var i =0;i<lis.children.length;i++){
          lis.children[i].className = '';
      }
      lis.children[circle].className = '選択済み';
  })


実行結果は次のとおりです。

しかし、まだいくつか小さな問題があります。小さな円を右側のボタンと組み合わせると、次のようなエラーが発生します。

小さな点をクリックすると、対応する画像ページにジャンプすることもできますが、右側のボタンをクリックし続けると、下の小さな点が対応する画像に対応していないことがわかります。これは、右ボタンをクリックしたときに変数 num によって制御されますが、num 変数は小さな円のクリック イベントとは関係がないため、違いがあります。
私たちの解決策は、小さな li がクリックされるたびにインデックス番号を取得し、 numcircleの値を取得したインデックス番号の値に変更することです。コードは次のとおりです。

var index = this.getAttribute('index');
num = インデックス;
円 = インデックス;


効果は次のとおりです。

7. 左ボタンの機能作成

方法は右側のボタンと似ているので、詳細は説明しません。コードは次のとおりです。

left.addEventListener('click',function(){
        if(数値 == 0){
            num = pic.children.length-1;
            pic.style.left = -num*boxWidth+'px';
            
        }
        数値--;
        アニメーション化(pic,-num*boxWidth);
        丸 - ;
        if(円 <0){
            円 = lis.children.length-1;
        }
        (var i =0;i<lis.children.length;i++){
            lis.children[i].className = '';
        }
        lis.children[circle].className = '選択済み';
    })


効果は次のとおりです。

8. 自動再生機能

実際、カルーセルを自動的に再生するタイマーを追加することは、右側のボタンをクリックするのと似ています。このとき、右ボタンのクリック イベントright.click(),マウスが画像の上を通過するとタイマーが停止し、マウスが画像から離れるとタイマーが開始されます。

var タイマー = this.setInterval(function(){
  右クリック();
 },2000)


効果は次のとおりです。

完全な index.js コードは次のとおりです。

window.addEventListener('load',function(){
    var left = document.querySelector('.left');
    var right = document.querySelector('.right');
    var box = document.querySelector('.box');
    box.addEventListener('mouseenter',function(){
        left.style.display = 'ブロック';
        right.style.display = 'ブロック';
    })
    box.addEventListener('mouseleave',function(){
        left.style.display = 'なし';
        right.style.display = 'なし';
    })
    var pic = document.querySelector('.pic');
    var lis = document.querySelector('.lis');
    var boxWidth = box.offsetWidth;
    for(var i = 0;i<pic.children.length;i++){
        
        var li = document.createElement('li');
        lis.appendChild(li);
        //インデックス番号を設定します li.setAttribute('index',i);
        li.addEventListener('クリック',function(){
            //インデックス番号を取得します。var index = this.getAttribute('index');
            num = インデックス;
            円 = インデックス;
            for(var i = 0;i<lis.children.length;i++){
                lis.children[i].className = '';
            }
            this.className = '選択済み';
            アニメーション(pic,-index*boxWidth)
        })
    }
    lis.children[0].className = '選択済み';
    //最初のliを複製する
    var first = pic.children[0].cloneNode(true);
    pic.appendChild(最初の子);
    var 数値 = 0;
    var 円 = 0;
    //右ボタンの機能right.addEventListener('click',function(){
        if(num == pic.children.length-1){
            pic.style.left = 0;
            数値 = 0;
        }
        数値++;
        アニメーション化(pic,-num*boxWidth);
        サークル++;
        if(circle == lis.children.length){
            円 = 0;
        }
        (var i =0;i<lis.children.length;i++){
            lis.children[i].className = '';
        }
        lis.children[circle].className = '選択済み';
    })
    //左ボタン関数 left.addEventListener('click',function(){
        if(数値 == 0){
            num = pic.children.length-1;
            pic.style.left = -num*boxWidth+'px';
            
        }
        数値--;
        アニメーション化(pic,-num*boxWidth);
        丸 - ;
        if(円 <0){
            円 = lis.children.length-1;
        }
        (var i =0;i<lis.children.length;i++){
            lis.children[i].className = '';
        }
        lis.children[circle].className = '選択済み';
    })
    var タイマー = this.setInterval(function(){
        右クリック();
    },2000)
})

これで、JavaScript を使用した Web ページ カルーセルの超詳細な実装に関するこの記事は終了です。JavaScript を使用した Web ページ カルーセルの実装に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援してください。

以下もご興味があるかもしれません:
  • JavaScriptカルーセルの実装について
  • カルーセル例の JS 実装
  • JS でカルーセル効果を実現する 3 つの簡単な方法
  • カルーセル効果を実現するための純粋なjs
  • ブリージングカルーセルを実装するネイティブJS
  • JavaScript を使用してカルーセル効果を実装する

<<:  MySQL トリガーの使用方法と利点と欠点の紹介

>>:  CSS3 タブアニメーションの例 背景切り替えの動的効果

推薦する

ウェブページ要素の完全な分析

相対的な長さの単位それら説明: 相対的な長さの単位。現在のオブジェクト内のテキストのフォント サイズ...

JavaScript スタイル オブジェクトと CurrentStyle オブジェクトのケース スタディ

1. スタイルオブジェクトスタイル オブジェクトは単一のスタイル宣言を表し、スタイルが適用されている...

ミニプログラム開発ツールのソースコードからの基本実装の分析

目次ミニプログラム開発者ツールのソースコードを表示する方法ミニプログラムアーキテクチャ設計1. ミニ...

実際のプロジェクトでElementUIを使用する手順の詳細な説明

目次1. テーブル自動ソート2. ページング機能3.el-checkbox-group 複数選択ボッ...

クールなバーコードエフェクトの作り方を教えます

声明:この記事では、Web ページ制作技術を使用して問題を包括的に解決するという考え方を反映して、W...

ウェブページの右下隅に「いいね!」カード効果を実現するための CSS (サンプルコード)

効果 HTML を実装するには、まずクリーンな HTML ページを準備し、ノードを記述します。 &l...

CSS3の新しい背景プロパティの詳細な説明

これまで、CSS の背景の属性には、color、image、repeat、attachment、po...

CSSプロパティに基づいたボタンホバーボーダーと背景アニメーションのコレクション

ハートの属性不透明度: .999 は要素のスタッキングコンテキストを作成し、ボタン6と8のアニメーシ...

Nodeはリクエスト追跡にasync_hooksモジュールを使用します

async_hooks モジュールは、Node.js バージョン 8.0.0 に正式に追加された実験...

Mysqlの自動増分IDについて知らないことがあるかもしれません

導入: MySQL を使用してテーブルを作成する場合、通常は自動インクリメント フィールド (AUT...

uniappがインターフェースドメイン名を動的に取得する方法を分析する

背景インターフェイス ドメイン名はハードコードされておらず、動的に取得されます。具体的な実装は、静的...

1 つの記事で JSON (JavaScript Object Notation) を理解する

目次JSONが登場JSON構造JSONオブジェクトJson オブジェクトと JavaScript オ...

Dockerコンテナを閉じずに終了する方法の詳細な説明

Docker コンテナに入った後、コンテナを終了すると、コンテナは Exited 状態に変わります。...

MySQL 5.7.27 winx64 のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 5.7.27 winx64のインストールと設定方法を参考までに紹介します。...

Nodejs での WeChat アプレット メッセージ プッシュの実装

サブスクリプションメッセージテンプレートを選択または作成するWeChat アプレットにログインし、「...