この記事では、カルーセルマップの効果を実現するための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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: MySQL で JSON 形式のフィールドをクエリする詳細な説明
1. ASP.NET Web アプリケーションのテンプレートとは何ですか? それらの違いは何ですか?...
この記事では、画像を読み込むためのJavaScriptキャンバスの具体的なコードを参考までに紹介しま...
目次ナンセンス文章最初ルーター/index.js 2番目1. プラグインをインストールする2.mai...
目次序文始める序文サーバーのデフォルトの SSH ポート番号は通常 22 であるため、ほとんどのユー...
目次文章1. 機械を準備する2. Dockerをインストールする1. 依存パッケージをインストールす...
<br />私が住んでいる地域では、コミュニティに出入りする車両を管理するために、コミュ...
最近、フロントエンドの vue.js ドッキング機能モジュールに取り組んでいたとき、画像をダウンロー...
1.1 MySQL マルチインスタンスとは何ですか?簡単に言うと、MySQL マルチインスタンスとは...
目次導入クッキークッキーとはクッキー生成方法クッキーの適用シナリオクッキーのデメリット回避策ローカル...
数日前、Server2019の正式版がリリースされたことを知り、面白半分でインストールしてみることに...
1. デフォルトでインストールされているMySQLの文字セットを確認するmysql> '...
1. CSSをアルファベット順に並べるアルファベット順ではありません:コードをコピーコードは次のとお...
実際、Apacheクラスタを構築するのは難しくありません。私もインターネットで情報を見つけて自分で設...
1) 適用範囲:読み取り専用:input[type="text"],input[...
要件は次のとおりですテーブル構造、フィールドコメント情報、テーブル名などをエクスポートします。これは...