首页 web前端 css教程 Cosmic Canvas:交互式深空 CSS 艺术

Cosmic Canvas:交互式深空 CSS 艺术

Sep 07, 2024 pm 10:30 PM

这是前端挑战 v24.09.04,CSS 艺术:空间的提交。

灵感

这个项目“Cosmic Canvas:交互式深空 CSS 艺术”的灵感来自于外太空的广阔美景以及仅使用 CSS 和 JavaScript 重建天体现象的挑战。目标是创建一个身临其境的动画空间场景,展示现代网络技术的力量,无需繁重的图形库即可创建复杂的、视觉上令人惊叹的艺术。

演示

Github 仓库链接:https://github.com/ZibrasIsmail/Interactive-Deep-Space-CSS-Art
Github 托管链接:https://zibrasismail.github.io/Interactive-Deep-Space-CSS-Art
Cosmic Canvas: Interactive Deep Space CSS Art

旅行

这个项目最初是对先进 CSS 技术的探索,后来发展成为一个综合性的太空场景。以下是旅程的一些关键方面:

  1. 复杂的 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 外观。三个卫星具有不同的颜色,并使用旋转和平移变换给出轨道动画。流星是用线性渐变创建的,并以动画方式在屏幕上移动。小行星带位于地球周围,各个小行星都以动画方式旋转。 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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何使用CSS创建垂直线 如何使用CSS创建垂直线 Aug 11, 2025 pm 12:49 PM

使用带边框的div可快速创建垂直线,通过设置border-left和height定义样式和高度;2.利用::before或::after伪元素可在无额外HTML标签的情况下添加垂直线,适合装饰性分隔;3.在Flexbox布局中,通过设置divider类的宽度和背景色,可实现弹性容器间的自适应垂直分隔线;4.在CSSGrid中,将垂直线作为独立列(如auto宽度列)插入网格布局,适用于响应式设计;应根据具体布局需求选择最合适的方法,确保结构简洁且易于维护。

如何使用CSS创建玻璃塑料效应 如何使用CSS创建玻璃塑料效应 Aug 22, 2025 am 07:54 AM

要创建CSS的玻璃拟态效果,需使用backdrop-filter实现背景模糊,设置半透明背景如rgba(255,255,255,0.1),添加细微边框和阴影以增强层次感,并确保元素背后有足够视觉内容;1.使用backdrop-filter:blur(10px)模糊背景内容;2.采用rgba或hsla定义透明背景控制通透程度;3.添加1pxsolidrgba(255,255,255,0.3)边框及box-shadow提升立体感;4.确保容器具有丰富背景如图片或纹理以呈现模糊穿透效果;5.为兼容旧浏

如何在CSS中创建虚线边框 如何在CSS中创建虚线边框 Aug 15, 2025 am 04:56 AM

使用CSS创建点状边框只需设置border属性为dotted即可,例如“border:3pxdotted#000”可为元素添加3像素宽的黑色点状边框,通过调整border-width可改变点的大小,较宽的边框产生更大的点,且可单独为某一边设置点状边框如“border-top:2pxdottedred”,点状边框适用于div、input等块级元素,常用于焦点状态或可编辑区域以提升可访问性,需注意颜色对比度,同时区别于dashed的短线样式,dotted呈现圆形点状,该特性在所有主流浏览器中均被广泛

如何在CSS中使用过滤器属性 如何在CSS中使用过滤器属性 Aug 11, 2025 pm 05:29 PM

ThecssfilterPropertyAllowSeffectSlikeSlikeBlur,亮度,亮度和格雷斯级倾向于directliectlytohtmlelements.1)usethesyntaxfilter:filter-finction(value)to applyfeffs.2)to applyeffeffss.2)combinemultfielterspacepacepacepacepaceepaceepaceepaceepaceeparity,e.g.g.g.,blimtrur(2px)blirtrur(2px),2pxcx e.g.2pxcx,blimur(2pxcx)

如何更改CSS中的列表样式 如何更改CSS中的列表样式 Aug 17, 2025 am 10:04 AM

要更改CSS列表样式,首先使用list-style-type改变项目符号或编号样式,1.使用list-style-type设置ul的项目符号为disc、circle或square,ol的编号为decimal、lower-alpha、upper-alpha、lower-roman或upper-roman,2.用list-style:none完全移除标记,3.使用list-style-image:url('bullet.png')替换为自定义图像,4.通过list-style-position:in

如何使用CSS实现黑暗模式主题 如何使用CSS实现黑暗模式主题 Aug 22, 2025 am 09:55 AM

实现暗黑模式有两种主要方式:一是使用prefers-color-scheme媒体查询自动适配系统偏好,二是通过JavaScript添加手动切换功能。1.使用prefers-color-scheme可自动根据用户系统设置应用暗黑主题,无需JavaScript,只需定义媒体查询内的样式;2.实现手动切换需定义light-theme和dark-themeCSS类,添加切换按钮,并用JavaScript管理主题状态和localStorage保存用户偏好;3.可结合两者,在页面加载时优先读取localSt

如何更改CSS中的光标 如何更改CSS中的光标 Aug 16, 2025 am 05:00 AM

Usebuilt-incursortypeslikepointer,help,ornot-allowedtoprovideimmediatevisualfeedbackfordifferentinteractiveelements.2.ApplycustomcursorimageswiththecursorpropertyusingaURL,optionallyspecifyingahotspotandalwaysincludingafallbacklikeautoorpointer.3.Fol

如何在CSS中使用网格 - 板序列 如何在CSS中使用网格 - 板序列 Aug 22, 2025 am 07:56 AM

Grid-template-areaspropertyallowsdevelopspocrockearteeintuitive,ReadableLayoutsByDefiningNemedGridareas; everystringrepresentsarowresentsarowandeashwordeachwordaColumnCell,withGrid-areanamesonamesonameSonemaneMeAnemesonChildEllementsMatchingThoseNoseNementsMatchingTheSoseIntheTemplate,suchans'headerheaderheaderheaderheaderheaderheaderheaderheader for for for for for for

See all articles