カルーセル効果を実現するための純粋なjs

カルーセル効果を実現するための純粋なjs

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

これまでに学んだこと、つまりマウスの監視イベント(出入り、クリック)、ノードの作成、排他的なアイデア、タイマーなどを組み合わせることで、手動および自動で再生できるカルーセルを実現できます。

レンダリング

コード

1. CSS

 /*要素のデフォルトの内側と外側の余白をクリアします*/
* {
    マージン: 0;
    パディング: 0
}
体{
    幅: 1000ピクセル;
    マージン: 0 自動;
}
/*リストの前のドットを削除します*/
li {
    リストスタイル: なし;
}
/*画像に枠線がなく、画像の下部の空白部分が削除されます*/
画像 {
    境界: 0; /*ie6*/
    垂直位置合わせ: 中央;
}
/*リンクの下線を削除します*/
{
    色: #666;
    テキスト装飾: なし;
}

ホバー{
    色: #e33333;
}
.fl {
    フロート: 左;
}
.fr {
    フロート: 右;
}
。集中 {
    位置: 相対的;
    幅: 721ピクセル;
    高さ: 455px;
    背景色: 紫;
    オーバーフロー: 非表示;
    上マージン: 20px;
}

.focus ul {
    位置: 絶対;
    上: 0;
    左: 0;
    幅: 600%;
}

.focus ul li {
    フロート: 左;
}

.矢印-l,
.矢印-r {
    表示: なし;
    位置: 絶対;
    上位: 50%;
    上マージン: -20px;
    幅: 24px;
    高さ: 40px;
    背景: rgba(0, 0, 0, .3);
    テキスト配置: 中央;
    行の高さ: 40px;
    色: #fff;
    フォントファミリー: 'icomoon';
    フォントサイズ: 18px;
    zインデックス: 2;
}

.矢印-r {
    右: 0;
}

。丸 {
    位置: 絶対;
    下: 10px;
    左: 50px;
}

.circle li {
    フロート: 左;
    幅: 8px;
    高さ: 8px;
    /*背景色: #fff;*/
    境界線: 2px実線 rgba(255, 255, 255, 0.5);
    マージン: 0 3px;
    境界線の半径: 50%;
    /*マウスが通過するときに小さな手を表示します*/
    カーソル: ポインタ;
}

。現在 {
    背景色: #fff;
}

2.html

<div class="focus fl">
    <!-- 左ボタン -->
    <a href="javascript:;" class="arrow-l arrow"> < </a>
    <!-- 右ボタン -->
    <a href="javascript:;" class="arrow-r arrow"> > </a>
    <!-- コアスクロール領域 -->
    <ul>
        <li>
            <a href="#" ><img src="images/focus.jpg" alt=""></a>
        </li>
        <li>
            <a href="#" ><img src="images/focus1.jpg" alt=""></a>
        </li>
        <li>
            <a href="#" ><img src="images/focus2.jpg" alt=""></a>
        </li>
        <li>
            <a href="#" ><img src="images/focus3.jpg" alt=""></a>
        </li>
    </ul>
    <!-- 小さな円 -->
    <ol class="circle">

    </ol>
</div>

3. JavaScript

window.addEventListener('load', 関数() {
    // 1. 要素を取得する var arrow_l = document.querySelector('.arrow-l');
    var arrow_r = document.querySelector('.arrow-r');
    var focus = document.querySelector('.focus');
    focusWidth を focus.offsetWidth に設定します。
    // 2. マウスがフォーカスを通過すると、左ボタンと右ボタンが表示され、非表示になります focus.addEventListener('mouseenter', function() {
        arrow_l.style.display = 'ブロック';
        arrow_r.style.display = 'ブロック';
        タイマーの間隔をクリアします。
        timer = null; // タイマー変数をクリアします });
    focus.addEventListener('mouseleave', 関数() {
        arrow_l.style.display = 'なし';
        arrow_r.style.display = 'なし';
        タイマー = setInterval(関数() {
            //クリック イベントを手動で呼び出します arrow_r.click();
        }, 2000);
    });
    // 3. 小さな円を動的に生成します。写真は複数あるので、小さな円をいくつか生成します。var ul = focus.querySelector('ul');
    var ol = focus.querySelector('.circle');
    // console.log(ul.children.length);
    (var i = 0; i < ul.children.length; i++) の場合 {
        // 小さなliを作成する 
        var li = document.createElement('li');
        // カスタム属性を通じて現在の小さな円のインデックス番号を記録します li.setAttribute('index', i);
        // 小さな li を ol に挿入します ol.appendChild(li);
        // 4. 小さな円の独自のアイデア 小さな円を生成するときにクリックイベントを直接バインドできます li.addEventListener('click', function() {
            // 全員を殺し、すべての小さいli現在のクラス名をクリアします for (var i = 0; i < ol.children.length; i++) {
                ol.children[i].className = '';
            }
            // 現在の小さな li を残します。現在のクラス名を設定します。this.className = 'current';
            // 5. 小さな円をクリックして画像を移動します。もちろん、ul も移動します。 
            // ul の移動距離は、小さな円のインデックス番号に画像の幅を掛けた値です。負の値であることに注意してください。// 小さな li をクリックすると、現在の小さな li のインデックス番号が取得されます。var index = this.getAttribute('index');
            // 小さな li をクリックしたとき、この li のインデックス番号を num に渡す必要があります。  
            num = インデックス;
            // 小さな li をクリックしたとき、この li のインデックス番号を円に渡す必要があります。  
            円 = インデックス;
            // num = 円 = インデックス;
            console.log(フォーカス幅);
            コンソールログ(インデックス);

            アニメーション化(ul, -index * focusWidth);
        })
    }
    // olの最初の小さなliのクラス名を現在のものに設定します
    ol.children[0].className = '現在の';
    // 6. 最初の画像 (li) を複製し、ul の末尾に配置します。var first = ul.children[0].cloneNode(true);
    ul.appendChild(最初の子);
    // 7. 右側のボタンをクリックして 1 枚の画像をスクロールします。var num = 0;
    //circle は小さな円の再生を制御します var circle = 0;
    // フラグスロットル var flag = true;
    arrow_r.addEventListener('クリック', 関数() {
        if (フラグ) {
            flag = false; // スロットルを閉じる // 最後にコピーしたイメージに到達したら、ul はすぐに left を 0 に戻す必要があります
            num == ul.children.length - 1の場合{
                ul.style.left = 0;
                数値 = 0;
            }
            数値++;
            アニメーション(ul, -num * focusWidth, 関数() {
                flag = true; // スロットルを開く });
            // 8. 右側のボタンをクリックすると、それに応じて小さい円が変化します。別の変数を宣言して、小さい円の再生を制御することができます。circle++;
            //circle == 4 の場合、クローンされたイメージの終わりに到達したことを意味し、復元します if (circle == ol.children.length) {
                円 = 0;
            }
            //関数circleChange()を呼び出します。
        }
    });

    // 9. 左ボタンメソッド arrow_l.addEventListener('click', function() {
        if (フラグ) {
            フラグ = false;
            数値 == 0 の場合
                num = ul.children.length - 1;
                ul.style.left = -num * focusWidth + 'px';

            }
            数値--;
            アニメーション(ul, -num * focusWidth, 関数() {
                フラグ = true;
            });
            // 左側のボタンをクリックすると、それに応じて小さな円が変化します。別の変数を宣言して、小さな円の再生を制御することができます。circle--;
            // 円 < 0 の場合、最初の画像を示し、小さな円を 4 番目の小さな円に変更する必要があります (3)
            // 円が 0 未満の場合
            // 円 = ol.children.length - 1;
            // }
            円 = 円 < 0 ? ol.children.length - 1 : 円;
            //関数circleChange()を呼び出します。
        }
    });

    関数circleChange() {
        // 最初に残りの小さな円の現在のクラス名をクリアします for (var i = 0; i < ol.children.length; i++) {
            ol.children[i].className = '';
        }
        //現在の小さな円の現在のクラス名をそのままにします ol.children[circle].className = 'current';
    }
    // 10. カルーセルを自動的に再生する var timer = setInterval(function() {
        //クリック イベントを手動で呼び出します arrow_r.click();
    }, 2000);

})

肝心なところ! ! !

画像の動きを実現するためのアニメーションファイル、 animate.js

関数 animate(obj, target, callback) {
    // console.log(callback); callback = function() {} callback() を呼び出すとき

    // まず前のタイマーをクリアし、現在のタイマーのみを保持して実行します clearInterval(obj.timer);
    obj.timer = setInterval(関数() {
        // ステップ値をタイマーに書き込みます // 小数点の問題を回避するためにステップ値を整数に変更します // var step = Math.ceil((target - obj.offsetLeft) / 10);
        var ステップ = (ターゲット - obj.offsetLeft) / 10;
        ステップ = ステップ > 0 ? Math.ceil(step) : Math.floor(step);
        obj.offsetLeft == ターゲットの場合 {
            // アニメーションを停止すると、基本的にタイマーも停止します。clearInterval(obj.timer);
            //タイマーの最後にコールバック関数を記述します // if (callback) {
            // // 関数を呼び出す // callback();
            // }
            コールバック && コールバック();
        }
        // 1ずつ増加するステップ値を徐々に減少する値に変更します。ステップ式: (目標値 - 現在位置) / 10
        obj.style.left = obj.offsetLeft + ステップ + 'px';

    }, 15);
}

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

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

<<:  MySQL で JSON 形式のフィールドをクエリする詳細な説明

>>:  CSS マージンの折りたたみの詳細な説明

推薦する

CSSレイアウトで中央揃えレイアウトを実現する方法

1. 親コンテナーをテーブルに設定し、子をインライン要素に設定します。テキストを表示するサブコンテン...

vue+echartsチャートの使用に関する問題記録

序文echarts は私が最もよく使用するチャート作成ツールであり、非常に完全なエコシステムとコンテ...

Vue コンポーネントの構成構造とコンポーネント登録の詳細

目次1. コンポーネントの構成2. コンポーネント名2.1 コンポーネントの命名3. グローバル登録...

Baidu デッドリンクファイルを作成する方法

Baidu によって定義されているデッドリンク形式には 2 種類あります。 1: XML形式のデッド...

MySql ページングで limit+order by を使用する場合のデータ重複の解決策

目次まとめ問題の説明問題を分析する問題を解決するまとめ複雑な知識をシンプルに説明できることは重要です...

Linux で killall コマンドを使用してプロセスを終了する 8 つの例

Linux コマンドラインには、プロセスを強制終了するためのコマンドが多数用意されています。たとえば...

スタイルを書く際の背景色宣言の重要性

タイトルの通り、ページを修正すると以下のような状況が発生する可能性があります。現在、古いページを改修...

Vue Element UIの使用時に遭遇した問題をまとめる

目次1. DateTimePickerの日付選択範囲は現在時刻とそれ以前です2. DateTimeP...

Vueは大画面ページのスクリーン適応を実現します

この記事では、大画面ページのスクリーンアダプテーションを実現するためのVueの具体的なコードを参考ま...

MySQL で中国語の文字をピンインでソートする簡単な例

名前を格納するフィールドが GBK 文字セットを使用している場合、GBK 内部コード自体がエンコード...

Javascript を使用して、スライドバー効果のあるスライドナビゲーション プラグインを開発します。

目次1. はじめに2. 使用方法3. 開発プロセス1. モデル例2. イベントとアニメーション4. ...

nginx ウェブサイト サービスのアンチホットリンクを設定する方法 (推奨)

1. ホットリンクの原則1.1 Webページの準備Web ソース ホスト (192.168.153...

MySQL シリーズ 10 同時実行制御を実装するための MySQL トランザクション分離

目次1.同時アクセス制御2. 取引1. トランザクションは ACID 原則に従います。 2. トラン...

スケルトン スクリーンの読み込みプレースホルダー アニメーション効果を実装するための CSS + HTML (アニメーション付き)

効果上から下へフェードアウト ソースコードhtml、Angular構文を使用して、必要な構文を取得す...

XHTMLコードの一般的なアプリケーション問題をまとめる

<br />しばらくの間、多くの人が XHTML の使い方を知らないことに気付きました。...