ホームページ >ウェブフロントエンド >jsチュートリアル >CSSとJavaScriptを使用して3D回転カルーセルを構築します
CSS 3D変換とJavaScriptを使用して、Web画像またはコンテンツの動的表示を強化するインタラクティブな3D回転カルーセルを構築します。この記事では、このコンポーネントを作成する方法を段階的にガイドします。
このCodepenには、さまざまなバージョンのコンポーネントが表示されます。それらを構築する方法を示します。
CSS 3D変換の設定を説明するために、コンポーネントの純粋なCSSバージョンを示します。次に、JavaScriptを使用してそれを強化して、シンプルなコンポーネントスクリプトを開発する方法を紹介します。
キーポイント
マークアップの場合、コンポーネント内の画像は要素にラップされています。これは、基本的なフレームワークを提供します。
これが私たちの出発点になります。 <figure></figure>
カルーセル図の幾何学的構造
<code class="language-html"><div class="carousel"> <figure> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/" class="lazy" alt="Building a 3D Rotating Carousel with CSS and JavaScript "> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/" class="lazy" alt="Building a 3D Rotating Carousel with CSS and JavaScript "> ... <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/" class="lazy" alt="Building a 3D Rotating Carousel with CSS and JavaScript "> </figure> </div></code>
CSSを見る前に、次のセクションで開発される計画の概要を説明します。
このポリゴンの数は、カルーセル図の数と同じです
カルーセルに3つの画像がない場合はどうなりますか?ポリゴンは定義できず、次のプロセスをそのまま適用することはできません。いずれにせよ、2つの画像がわずかに可能性が高く、直径のある2つのポイントに配置できます。簡単にするために、これらの特別なケースは処理されず、少なくとも3つの画像があると仮定します。ただし、関連するコードの変更は難しくありません。この想像上の参照ポリゴンは、ビューポートの平面に垂直な3Dスペースにあり、その中心を画面に向かって後ろに押します。 、下の図に示すように、
カルーセルグラフの幾何学的構造を構築します このセクションでは、重要なCSSルールを紹介します。これについては、段階的に説明します。
次のコードスニペットでは、いくつかのSASS変数を使用して、コンポーネントの構成を容易にします。カルーセルの画像数を表して
を使用し、を使用して画像の幅を指定します。 $n
$item-width
<figure></figure>
<code class="language-html"><div class="carousel"> <figure> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/" class="lazy" alt="Building a 3D Rotating Carousel with CSS and JavaScript "> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/" class="lazy" alt="Building a 3D Rotating Carousel with CSS and JavaScript "> ... <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/" class="lazy" alt="Building a 3D Rotating Carousel with CSS and JavaScript "> </figure> </div></code>要素には、カルーセルのアイテム幅が処方されており、画像と同じ高さを持っています(サイズは異なりますが、同じアスペクト比が必要です)。このようにして、カルーセル容器の高さは、画像の高さに応じて自動的に調整されます。また、
は、カルーセル容器の水平に中心です。 <figure></figure>
<figure></figure>
最初の画像は、ターゲット位置、つまりカルーセルの前面に既にあるため、追加の変換を必要としません。
回転変換を
要素に適用することにより、3D空間でカルーセルを回転させることができます。この回転はポリゴンの中心にある必要があるため、:<figure></figure>
のデフォルト変換オリジンを変更します。
<figure></figure>
<code class="language-css">.carousel { display: flex; flex-direction: column; align-items: center; > * { flex: 0 0 auto; } .figure { width: $item-width; transform-style: preserve-3d; img { width: 100%; &:not(:first-of-type) { display: none /* Just for now */ } } } }</code>要素の参照システムを変換した後、カルーセル全体をその(新しい)y軸回転で回転させることができます:
<figure></figure>
<code class="language-css">.carousel figure { transform-origin: 50% 50% (-$apothem); }</code>
他の画像を変換し続けましょう。絶対的なポジショニングを使用して、画像は内部に積み重ねられています
:
<figure></figure>
これは、その後の変換の予備ステップにすぎないため、
<code class="language-css">.carousel figure { transform: rotateY(/* some amount here */rad); }</code>要素と同様に、画像のデフォルト変換オリジンを変更し、ポリゴンの中心に移動します。
<code class="language-html"><div class="carousel"> <figure> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/" class="lazy" alt="Building a 3D Rotating Carousel with CSS and JavaScript "> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/" class="lazy" alt="Building a 3D Rotating Carousel with CSS and JavaScript "> ... <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/" class="lazy" alt="Building a 3D Rotating Carousel with CSS and JavaScript "> </figure> </div></code>
画像は、新しいy軸について量を回転させることができます。これは($i - 1) * $theta
radiansによって与えられます。ここで、$i
は画像のインデックス(1から始まる)、$theta = 2 * $PI / $n
、ここで$PI
数学定数πを意味します。したがって、2番目の画像は$theta
を回転させ、3番目の画像は2 * $theta
を回転させ、最後の画像が回転するまで($n - 1) * $theta
になります。
ネストされたCSS変換の階層的性質により、この画像の相対的な配置は、カルーセルマップの回転中に保存されます(つまり、<figure></figure>
の修正されたy軸についての回転)。
コントロールコマンドを使用して割り当てることができます:@for
<code class="language-css">.carousel { display: flex; flex-direction: column; align-items: center; > * { flex: 0 0 auto; } .figure { width: $item-width; transform-style: preserve-3d; img { width: 100%; &:not(:first-of-type) { display: none /* Just for now */ } } } }</code>これは、
の代わりにfor...through
構造を使用することです。for...to
の場合、インデックス変数に割り当てられた最後の値はnの代わりにn-1になるためです。 for...to
$i
SASS '
#{}
:nth-child()
パラセントリック距離を計算します
ポリゴンのパラセンティック距離の計算は、エッジの数とエッジの幅、つまりおよび変数に依存します。式は次のとおりです
ここで、$n
は接線の三角関数です。 $item-width
<code class="language-css">.carousel figure { transform-origin: 50% 50% (-$apothem); }</code>
tan()
インターバルカルーセルアイテム
この時点で、カルーセルの画像は並んで「ステッチ」されており、望ましいポリゴン形状を形成します。しかし、ここでは、それらはしっかりと積み重ねられており、3Dカルーセルには通常、それらの間にスペースがあります。この距離は、3D空間の知覚を高めます。これにより、カルーセルの後ろを向いている画像を見ることができます。
画像間のこのギャップは、別の構成変数を導入し、それぞれ要素の水平塗りつけとして使用することにより、オプションで追加できます。より正確には、この値の半分を左と右の塗りつぶしとして取得します:
最終結果は、次のデモで見ることができます。
画像は$item-separation
属性を使用して半透明になり、カルーセル構造をよりよく説明し、カルーセルルート要素のフレックスレイアウトを使用して、ビューポートで垂直に中央に配置します。 <img alt="CSSとJavaScriptを使用して3D回転カルーセルを構築します" >
<code class="language-css">.carousel figure { transform: rotateY(/* some amount here */rad); }</code>ローテーションカルーセル画像
テストカルーセル画像の回転を容易にするために、UIコントロールを追加して画像間で前後にナビゲートします。 (CodePenリンクをここに挿入して、回転するカルーセル画像を表示する必要があります)opacity
currImage
integer変数を使用して、どの画像がカルーセルの前にあるかを示します。この変数は、ユーザーが前/次のボタンと対話すると、1つのユニットによって増加または減少します。
更新の後、currImage
、カルーセル画像の回転は次の方法で実行されます。
<code class="language-html"><div class="carousel"> <figure> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/" class="lazy" alt="Building a 3D Rotating Carousel with CSS and JavaScript "> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/" class="lazy" alt="Building a 3D Rotating Carousel with CSS and JavaScript "> ... <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/" class="lazy" alt="Building a 3D Rotating Carousel with CSS and JavaScript "> </figure> </div></code>(ここおよび次のコードスニペットで、ES6テンプレートリテラルを使用して文字列に式を挿入します。必要に応じて、従来の「連結演算子を使用できます)
ここで、
は以前と同じです:theta
<code class="language-css">.carousel { display: flex; flex-direction: column; align-items: center; > * { flex: 0 0 auto; } .figure { width: $item-width; transform-style: preserve-3d; img { width: 100%; &:not(:first-of-type) { display: none /* Just for now */ } } } }</code>回転は
です。次のアイテムに移動するには、反時計回りの回転が必要であり、CSS変換ではこの回転値は負です。 -theta
値はcurrImage
範囲に限定されないが、プラス方向と負の両方で無限に成長する可能性があることに注意してください。実際、フロントイメージが最後の(SO [0, numImages – 1])で、ユーザーが次のボタンをクリックした場合、最初のカルーセル画像の前にcurrImage == n-1
>を0にリセットすると、回転角度はcurrImage
の変換から0になります。 、以前のすべての画像でカルーセルを反対方向に回転させます。前のボタンが最初の画像である場合、前のボタンがクリックされたときに同様の問題が発生します。 (n-1)*theta
データ型が任意に大きな値をとることができないため、currentImage
の潜在的なオーバーフローを確認する必要があります。これらのチェックは、デモコードには実装されていません。 Number
JavaScript カルーセルグラフのコアを形成する基本的なCSSを見た後、次のようなJavaScriptを使用してさまざまな方法でコンポーネントを強化することが可能になりました。
任意の数の画像
幅画像パーセント ページ上の複数のカルーセルインスタンス
ギャップサイズやバック可視性など、各インスタンスの構成同じページに複数のコンポーネントをインスタンス化するために、コードはすべての画像がロードされるのを待機し、
オブジェクトのcarousel()
イベントのリスナーを登録し、各要素の
<code class="language-css">.carousel figure { transform-origin: 50% 50% (-$apothem); }</code>:
root
3つの主要なタスクを実行します
変換設定コードをチェックする前に、いくつかの重要な変数と、インスタンス構成に基づいてそれらを初期化する方法をカバーします:
<code class="language-html"><div class="carousel"> <figure> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/" class="lazy" alt="Building a 3D Rotating Carousel with CSS and JavaScript "> <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/" class="lazy" alt="Building a 3D Rotating Carousel with CSS and JavaScript "> ... <img src="/static/imghwm/default1.png" data-src="https://img.php.cn/" class="lazy" alt="Building a 3D Rotating Carousel with CSS and JavaScript "> </figure> </div></code>
画像数(n)は、<figure></figure>
要素の子要素の数に従って初期化されます。スライド間の間隔(ギャップ)は、HTML5 data-gap
プロパティ(設定されている場合)から初期化されます。バック可視性フラグ(BFC)は、html5のdataset
APIを使用して読み取られます。これは、後でカルーセルの背面にある画像が表示されているかどうかを判断するために使用されます。
CSS変換を設定
CSS変換関連属性を設定するためのコードは、setupCarousel()
にカプセル化されています。このネストされた関数には2つのパラメーターがあります。 1つ目は、Carouselグラフのアイテムの数、つまり上記のn変数です。 2番目のパラメーターsは、カルーセルポリゴンの辺の長さです。先に述べたように、これは画像の幅に等しいので、getComputedStyle()
:
<code class="language-css">.carousel { display: flex; flex-direction: column; align-items: center; > * { flex: 0 0 auto; } .figure { width: $item-width; transform-style: preserve-3d; img { width: 100%; &:not(:first-of-type) { display: none /* Just for now */ } } } }</code>この方法では、パーセンテージ値を使用して画像幅を設定できます。
カルーセルグラフを適応するために、私はウィンドウサイズのイベントのリスナーを登録しました。
setupCarousel()
簡単にするために、私はリスナーのサイズを変更しませんでした。
<code class="language-css">.carousel figure { transform-origin: 50% 50% (-$apothem); }</code>
私が最初に行うことは、渡されたパラメーターと前述の式を使用して、ポリゴンの傍帯距離を計算することです。
この値を使用して、setupCarousel()
要素の
<code class="language-css">.carousel figure { transform: rotateY(/* some amount here */rad); }</code>
次に、画像スタイルを適用してください:<figure></figure>
transform-origin
<code class="language-css">.carousel figure img:not(:first-of-type) { position: absolute; left: 0; top: 0; }</code>
最後に、
を呼び出して、現在の画像を前面に移動します。これは小さなヘルパー関数であり、表示する画像のインデックスを考えると、Y軸の<code class="language-css">.img:not(:first-of-type) { transform-origin: 50% 50% (-$apothem); }</code>要素を回転させてターゲット画像を前面に移動します。ナビゲーションコードは、それを使用して前後に移動します。
これは最終結果であり、複数のカルーセルがインスタンス化され、それぞれが異なる構成を備えたデモンストレーションです。
rotateCarousel()
ソースと結論<figure></figure>
<code class="language-sass">.carousel figure img { @for $i from 2 through $n { &:nth-child(#{$i}) { transform: rotateY(#{($i - 1) * $theta}rad); } } }</code>最後に、このチュートリアルを調査してくれた情報源に感謝したいだけです。
コードまたはカルーセル図の機能について質問やコメントがある場合は、以下にメッセージを残してください。
CSSとJavaScriptを使用した3Dロータリーカルーセル図の構築に関するFAQ 3D回転カルーセル図を適応させる方法は?
3D回転カルーセルグラフの適応には、CSSでメディアクエリを使用することが含まれます。メディアクエリを使用すると、デバイスの画面サイズに応じて、異なるデバイスに異なるスタイルを適用できます。カルーセルグラフ要素のサイズと位置を、小さな画面に合わせて調整できます。また、デスクトップコンピューターのようなホバー状態がないため、モバイルデバイスのタッチイベントも検討してください。
カルーセル図に自動再生機能を追加する方法は?
属性に適用できます。 スライドにテキストを追加できますか? カルーセルチャートにフェードエフェクトを追加する方法は? 属性と組み合わせて、フェード効果をアニメーション化できます。スライドショーを調整して、カルーセルの位置を調整して、目的の効果を作成します。 はい、異なる形状をカルーセルとして使用できます。カルーセルグラフの形状は、CSSの
はい、カルーセルにさらにスライドを追加できます。 HTML構造では、順序付けられていないリストにリスト項目を追加できます。各リスト項目はスライドを表します。 CSSの各スライドの回転角を調整して、3Dスペースに正しく配置することを忘れないでください。
HTMLとJavaScriptを使用して、カルーセル図にナビゲーションボタンを追加できます。 HTMLでは、前後のナビゲーションに2つのボタンを追加します。 JavaScriptで、これらのボタンにイベントリスナーを追加します。クリックすると、カルーセルの回転を更新して、前または次のスライドを表示する必要があります。
もちろん、画像をスライドショーとして使用できます。 CSSで背景色を設定する代わりに、スライドごとに背景画像を設定できます。最良の視覚効果のために、画像に正しいサイズと解像度があることを確認してください。
自動再生を追加できます。一定期間後、
関数を使用して、カルーセル図の回転を自動的に更新できます。ユーザーがカルーセルと対話して、予期しない動作を防ぐときに間隔をクリアすることを忘れないでください。 setInterval
カルーセルに移行効果を追加できますか? はい、CSSを使用してカルーセルに遷移効果を追加できます。
プロパティを使用すると、指定された期間にわたってCSSプロパティのアニメーションの変更が可能になります。カルーセルマップの回転をアニメーション化するために、transition
transform
カルーセルマップループを無限にする方法は? Carouselグラフを無限ループにするには、いくつかのJavaScriptが含まれます。カルーセルが最後のスライドに到達すると、最初のスライドに回転をリセットできます。これにより、人々は無限のループの幻想を与えます。
はい、スライドにテキストを追加できます。 HTMLでは、各リスト項目にテキスト要素を追加できます。 CSSでは、スライドの位置に応じてテキスト要素を見つけて、必要に応じてスタイルを設定します。
CSSを使用してフェードエフェクトを追加できます。
属性を使用してopacity
異なる形状をカルーセルとして使用できますか?
transform
属性によって決定されます。 transform
プロパティの値を調整することにより、キューブ、シリンダー、またはその他の3D形状のカルーセルを作成できます。
以上がCSSとJavaScriptを使用して3D回転カルーセルを構築しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。