Cosmic Canvas:交互式深空 CSS 艺术
这是前端挑战 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
旅行
这个项目最初是对先进 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 外观。三个卫星具有不同的颜色,并使用旋转和平移变换给出轨道动画。流星是用线性渐变创建的,并以动画方式在屏幕上移动。小行星带位于地球周围,各个小行星都以动画方式旋转。 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中文网其他相关文章!

热AI工具

Undress AI Tool
免费脱衣服图片

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

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

Clothoff.io
AI脱衣机

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

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

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

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

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列表样式,首先使用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

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

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

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