Cosmic Canvas: インタラクティブな深宇宙 CSS アート
これは、Frontend Challenge v24.09.04、CSS アート: スペースへの提出物です。
インスピレーション
このプロジェクト「Cosmic Canvas: インタラクティブな深宇宙 CSS アート」は、宇宙の広大な美しさと、CSS と JavaScript だけを使用して天体現象を再現するという挑戦に触発されました。目標は、重いグラフィックス ライブラリを必要とせずに、複雑で視覚的に素晴らしいアートを作成する最新の Web テクノロジーの力を実証する、没入型のアニメーション化された宇宙シーンを作成することでした。
デモ
Github リポジトリ リンク: https://github.com/ZibrasIsmail/Interactive-Deep-Space-CSS-Art
Github でホストされているリンク: https://zibrasismail.github.io/Interactive-Deep-Space-CSS-Art
旅
このプロジェクトは、高度な CSS 技術の探求として始まり、包括的な宇宙シーンに成長しました。この旅の重要な側面をいくつか紹介します:
- 複雑な CSS アニメーション: 衛星や小惑星の現実的な軌道運動を作成することは、大きな課題でした。複数の変換を含む複雑な CSS アニメーションを使用して、滑らかな円軌道を実現する方法を学びました。
動的要素の作成: JavaScript を使用して星、銀河、小惑星を動的に作成することで、DOM の操作と、さまざまなプロパティを持つ多くの要素を効率的に生成する方法について多くのことを学びました。
色とテクスチャ: 天体に適切な色とテクスチャを作成することは、創造性の訓練でした。奥行き感とリアル感を実現するために、さまざまなグラデーションとボックス シャドウを試してみました。
HTMLの構造
HTML ファイルは、宇宙シーンの基本構造を設定します。
<div class="space-scene"> <div class="stars"></div> <div class="galaxies"></div> <div class="shooting-stars"></div> <div class="nebula"></div> <div class="planet-system"> <div class="planet main-planet"></div> <div class="planet-ring"></div> <div class="moon moon1"></div> <div class="moon moon2"></div> <div class="moon moon3"></div> </div> <div class="asteroid-belt"></div> </div>
この構造は、さまざまな空間要素のコンテナを作成します。これらのコンテナは、CSS を使用してスタイル設定およびアニメーション化され、JavaScript で設定されます。
CSS スタイルとアニメーション
CSS コードは、さまざまな天体要素を含む視覚的に豊かな宇宙シーンを作成します。宇宙シーンの全画面の暗い背景を設定し、さまざまな宇宙オブジェクトのスタイルとアニメーションを定義します。星や銀河は絶対的に配置され、きらきらと光るアニメーションが与えられます。星雲効果は、複数の放射状グラデーションを使用して作成されます。主惑星は放射状のグラデーションとグロー効果でスタイル設定され、惑星リングは境界線を使用して作成され、3D 外観のために回転されます。 3 つの衛星は異なる色でスタイル設定され、回転および移動変換を使用して周回するアニメーションが与えられます。流れ星は線形グラデーションで作成され、画面上を移動するようにアニメーション化されます。小惑星帯は惑星の周りに配置されており、個々の小惑星が回転するようにアニメーション化されています。 CSS はキーフレーム アニメーションを広範囲に使用して動きと視覚効果を作成し、静的な HTML 要素に命を吹き込みます。
body, html { margin: 0; padding: 0; height: 100%; overflow: hidden; } .space-scene { width: 100%; height: 100%; background: #000000; position: relative; overflow: hidden; } .stars, .galaxies { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .star { position: absolute; background-color: #fff; border-radius: 50%; animation: twinkle 4s infinite ease-in-out; } .galaxy { position: absolute; border-radius: 50%; animation: glow 4s infinite alternate; } @keyframes twinkle { 0%, 100% { opacity: 0.5; transform: scale(1); } 50% { opacity: 1; transform: scale(1.2); } } @keyframes glow { 0% { box-shadow: 0 0 2px 1px rgba(255, 255, 255, 0.1); } 100% { box-shadow: 0 0 10px 2px rgba(255, 255, 255, 0.3); } } .nebula { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: radial-gradient( circle at 20% 80%, rgba(255, 0, 100, 0.1) 0%, transparent 50% ), radial-gradient( circle at 80% 20%, rgba(0, 100, 255, 0.1) 0%, transparent 50% ), radial-gradient( circle at 40% 40%, rgba(255, 100, 0, 0.1) 0%, transparent 60% ), radial-gradient( circle at 60% 60%, rgba(100, 0, 255, 0.1) 0%, transparent 60% ); filter: blur(20px); opacity: 0.5; } .planet-system { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 300px; height: 300px; } .main-planet { width: 150px; height: 150px; background: radial-gradient(circle at 30% 30%, #4a89dc, #1c3c78); border-radius: 50%; box-shadow: 0 0 50px rgba(74, 137, 220, 0.8); position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .planet-ring { width: 225px; height: 225px; border: 10px solid rgba(255, 255, 255, 0.2); border-radius: 50%; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) rotateX(75deg); } .moon { width: 20px; height: 20px; border-radius: 50%; position: absolute; top: 50%; left: 50%; } .moon1 { animation: orbit 30s linear infinite; /* Increased from 10s to 30s */ background: radial-gradient(circle at 30% 30%, #ffd700, #ffa500); box-shadow: inset -2px -2px 4px rgba(0, 0, 0, 0.3), 0 0 8px rgba(255, 215, 0, 0.6); } .moon2 { animation: orbit 45s linear infinite reverse; /* Increased from 15s to 45s */ background: radial-gradient(circle at 30% 30%, #add8e6, #4169e1); box-shadow: inset -2px -2px 4px rgba(0, 0, 0, 0.3), 0 0 8px rgba(65, 105, 225, 0.6); } .moon3 { animation: orbit 60s linear infinite; /* Increased from 20s to 60s */ background: radial-gradient(circle at 30% 30%, #f0e68c, #daa520); box-shadow: inset -2px -2px 4px rgba(0, 0, 0, 0.3), 0 0 8px rgba(218, 165, 32, 0.6); } @keyframes orbit { 0% { transform: rotate(0deg) translateX(100px) rotate(0deg); } 100% { transform: rotate(360deg) translateX(100px) rotate(-360deg); } } .shooting-stars { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .shooting-star { position: absolute; height: 2px; background: linear-gradient(90deg, #ffffff, transparent); animation: shoot 3s ease-out infinite; } @keyframes shoot { 0% { transform: translateX(-100px) translateY(100px); opacity: 1; } 70% { opacity: 1; } 100% { transform: translateX(1000px) translateY(-1000px); opacity: 0; } } .asteroid-belt { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%) rotateX(75deg); width: 350px; height: 350px; border-radius: 50%; } .asteroid { position: absolute; background: #555; border-radius: 50%; top: 50%; left: 50%; transform-origin: 175px 0; animation: rotate 20s linear infinite; } @keyframes rotate { 0% { transform: rotate(0deg) translateX(175px) rotate(0deg); } 100% { transform: rotate(360deg) translateX(175px) rotate(-360deg); } }
JavaScript コードは、宇宙シーンを構成する多数の小さな要素を動的に作成して配置します。メイン関数の天体オブジェクトの作成では、コンテナ要素を選択し、ループして指定された数の星、銀河、流れ星、小惑星を作成します。作成された要素ごとに、適切な CSS クラスを設定し、サイズや位置などのプロパティをランダムに決定し、より自然な外観にするためにアニメーションの遅延と継続時間を追加します。銀河の場合は、事前定義された配列から色もランダムに選択されます。作成された各要素は、DOM 内のそれぞれのコンテナーに追加されます。この動的な作成により、多数の要素を効率的に追加でき、各オブジェクトを手動でコーディングすることなく詳細な空間シーンを作成できます。ウィンドウの読み込み時にスクリプトが実行され、天体を追加する前にすべての HTML 要素が配置されていることを確認します。
function createCelestialObjects() { const starsContainer = document.querySelector(".stars"); const galaxiesContainer = document.querySelector(".galaxies"); const shootingStarsContainer = document.querySelector(".shooting-stars"); const asteroidBelt = document.querySelector(".asteroid-belt"); const starCount = 1000; const galaxyCount = 50; const shootingStarCount = 5; const asteroidCount = 100; const galaxyColors = ["#FFD700", "#87CEEB", "#FFA500", "#FF69B4", "#00CED1"]; for (let i = 0; i < starCount; i++) { const star = document.createElement("div"); star.className = "star"; star.style.width = star.style.height = `${Math.random() * 2}px`; star.style.left = `${Math.random() * 100}%`; star.style.top = `${Math.random() * 100}%`; star.style.animationDuration = `${Math.random() * 2 + 2}s`; star.style.animationDelay = `${Math.random() * 4}s`; starsContainer.appendChild(star); } for (let i = 0; i < galaxyCount; i++) { const galaxy = document.createElement("div"); galaxy.className = "galaxy"; const size = Math.random() * 20 + 5; galaxy.style.width = `${size}px`; galaxy.style.height = `${size / 2}px`; galaxy.style.left = `${Math.random() * 100}%`; galaxy.style.top = `${Math.random() * 100}%`; galaxy.style.backgroundColor = galaxyColors[Math.floor(Math.random() * galaxyColors.length)]; galaxy.style.transform = `rotate(${Math.random() * 360}deg)`; galaxiesContainer.appendChild(galaxy); } for (let i = 0; i < shootingStarCount; i++) { const shootingStar = document.createElement("div"); shootingStar.className = "shooting-star"; shootingStar.style.left = `${Math.random() * 100}%`; shootingStar.style.top = `${Math.random() * 100}%`; shootingStar.style.animationDelay = `${Math.random() * 5}s`; shootingStarsContainer.appendChild(shootingStar); } for (let i = 0; i < asteroidCount; i++) { const asteroid = document.createElement("div"); asteroid.className = "asteroid"; asteroid.style.width = asteroid.style.height = `${Math.random() * 3 + 1}px`; asteroid.style.animationDuration = `${Math.random() * 10 + 10}s`; asteroid.style.animationDelay = `${Math.random() * 10}s`; asteroidBelt.appendChild(asteroid); } } window.addEventListener("load", createCelestialObjects);
以上がCosmic Canvas: インタラクティブな深宇宙 CSS アートの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

Autoprefixerは、ターゲットブラウザスコープに基づいてCSS属性にベンダープレフィックスを自動的に追加するツールです。 1.エラーで接頭辞を手動で維持する問題を解決します。 2. PostCSSプラグインフォーム、CSSを解析し、プレフィックスする必要がある属性を分析し、構成に従ってコードを生成する属性を分析します。 3.使用手順には、プラグインのインストール、ブラウザーリストの設定、ビルドプロセスでそれらを有効にすることが含まれます。 4。メモには、接頭辞を手動で追加しない、構成の更新を保持すること、すべての属性ではなくプレフィックスを維持することが含まれ、プリプロセッサでそれらを使用することをお勧めします。

to CreateStickyheadersandfooterswithcss、使用ポジション:Stickyforheaderswithtopvalueandz-index、ParentContainersdon’trestrictit.1.forstickyheaders:Setposition:Sticky、Top:0、Z-Index、およびBackgroundColor.2

TheConic-Gradient()functionsscreateScular勾配の勾配は、測定されていることを確認してください

CSSロード回転子を作成するには3つの方法があります。1。境界の基本回転子を使用して、HTMLとCSSを介してシンプルなアニメーションを実現します。 2。複数のポイントのカスタム回転子を使用して、異なる遅延時間を経てジャンプ効果を実現します。 3.ボタンに回転子を追加し、JavaScriptを介してクラスを切り替えて、読み込みステータスを表示します。各アプローチは、ユーザーエクスペリエンスを向上させるために、色、サイズ、アクセシビリティ、パフォーマンスの最適化などのデザインの詳細の重要性を強調しています。

Mobile-firstcsssdesignRequiresTtingtheviewportatatag、使用、stylumsmallscreensup、optimingTouchTargets.first.second、cecond、em、orreminsteadofpixelseders.ths.thsthird、writebasethirdird、addtocontrolscaling.second、addtocontrolscaling.second

本質的な応答性のあるグリッドレイアウトを作成するために、COREメソッドはCSSGridのRepeat(auto-fit、minmax())モードを使用することです。 1.グリッドテンプレートコラムの設定:繰り返し(Auto-Fit、MinMax(200PX、1FR))繰り返して、ブラウザが列の数を自動的に調整し、各列の最小幅と最大幅を制限します。 2。ギャップを使用してグリッド間隔を制御します。 3.コンテナは、幅などの相対ユニットに設定する必要があります。100%、およびボックスサイズを使用してください。幅の計算エラーを回避し、マージンで中央に配置する必要があります。 4.オプションで、行の高さとコンテンツのアライメントを設定して、行などの視覚的な一貫性を向上させます

グリッドレイアウト全体をビューポートの中心にするには、次の方法で実現できます。1。マージンを使用して水平センタリングを実現し、固定レイアウトに適した固定幅を設定するためにコンテナを設定する必要があります。 2。FlexBoxを使用して、外側の容器内のJustify-ContentおよびAlign-Itemsプロパティを設定し、Min-Height:100VHを組み合わせて、フルスクリーンディスプレイシナリオに適した垂直および水平センタリングを実現します。 3. CSSGridのPlace-ITEMSプロパティを使用して、親コンテナをすばやく中央に集中させます。これは、シンプルで最新のブラウザからの適切なサポートがあり、同時に、親コンテナが十分な高さを確保する必要があります。各方法には、適用されるシナリオと制限があります。実際のニーズに応じて適切なソリューションを選択するだけです。

featuredEtectionincssusing@supportscheckcksifabrowssaspificfeatureforeapplyingStyles.1.itusesconditionalcssalcssbasedsbasedonproperty-valuepairsなど、supports(display:grid).2.thismethodensuresuresuresuresuresurecompativitionivitionivitionaindavoidavoidsrioushsriasiondrell
