CSS-Driven Solar System
Ein kleines Universum, gebaut nur mit Code
Dieses Projekt begann mit dem Gedanken: „Ich animiere kurz mal einen Planeten“ und entwickelte sich still und leise zu einem kompletten Sonnensystem mit Monden, Schatten und einem prozedural erzeugten Asteroidengürtel. Gebaut nur mit HTML und SCSS, ganz ohne JavaScript, aber mit einer ziemlich großen Portion Enthusiasmus.
Genau solche Dinge mache ich gern in meiner Freizeit: mit Code kleine Welten bauen, mit Bewegung experimentieren und ausprobieren, wie weit man CSS treiben kann, bevor es ins Schwitzen kommt.
See the Pen Solar System - Revised with Moons and Asteroids by Chad Danford (@cmd1209) on CodePen. Fork das Projekt gern und schick mir einen Link, wenn du etwas Eigenes daraus gemacht hast.
Die Simulation enthält:
- Planeten, die in ihren jeweiligen relativen Positionen kreisen
- Monde wie unser Mond oder die vier galileischen Monde, die ihren Planeten folgen
- Dynamische Schatten, je nachdem welche Seite zur Sonne zeigt
- Einen vollständig generierten Asteroidengürtel, der überraschend natürlich wirkt
- Orbits, Größen und Geschwindigkeiten, die komplett über Variablen steuerbar sind
Der schwierigste und zugleich schönste Teil: der Asteroidengürtel
CSS kennt keine echte Zufälligkeit. Um mehr als 100 Asteroiden glaubwürdig chaotisch wirken zu lassen, also mit unterschiedlichen Abständen, Geschwindigkeiten und Startpositionen, musste ich die pseudozufälligen Möglichkeiten von SCSS ziemlich kreativ nutzen. Der entscheidende Moment war die Erkenntnis, dass sich eine natürliche Verteilung überzeugend vortäuschen lässt, wenn man diese Werte variiert:- Orbitalradius
- Animationsgeschwindigkeit
- Startversatz
/* Primary Palette */
//asteroids variables
$asteroid-number: 100
$asteroid-start: $au * 1.8
$asteroid-end: $au * 2.9
@for $i from 1 through $asteroid-number
$randN: (random(10000) - 1) / 1000
$asteroid-spread: random($asteroid-end - $asteroid-start) + $asteroid-start
.orbit--asteroids:nth-of-type(#{$i})
position: absolute
top: 50%
left: 50%
border-radius: 50%
transform-origin: center center
width: #{$asteroid-spread * 2}
height: #{$asteroid-spread * 2}
margin-left: -#{$asteroid-spread}
margin-top: -#{$asteroid-spread}
animation: orbit (#{$ceres-year * (0.9 + random(20)/100)}) linear infinite
animation-delay: -#{$randN * $earth-year}
.asteroid
width: 2px
height: 2px
background-color: grey