I have a a div with a sun and moon. Currently there is an animation that changes color of the background and animates the sun and moon. How can I make this animation sync to realtime so that the animation reflects the time of the day and the position of the sun and moon.
@keyframes sunrise {
from {
transform: rotate(-45deg);
}
to {
transform: rotate(315deg);
}
}
@keyframes moonrise {
from {
transform: rotate(0deg);
}
to {
transform: rotate(180deg);
}
}
@keyframes dawn {
0% {
opacity: 0;
}
10% {
opacity: 1;
}
60% {
opacity: 0;
}
}
@keyframes noon {
0% {
opacity: 0;
}
50% {
opacity: 1;
}
75% {
opacity: 0;
}
}
@keyframes dusk {
0% {
opacity: 0;
}
50% {
opacity: 0;
}
70% {
opacity: 1;
}
90% {
opacity: 0;
}
}
@keyframes midnight {
0% {
opacity: 1;
}
25% {
opacity: 0;
}
50% {
opacity: 0;
}
80% {
opacity: 1;
}
}
body {
--animation-speed: 4s;
background-color: rgb(37, 29, 24);
}
.sky {
width: 100vw;
height: 100vh;
top: 0;
left: 0;
max-height: 600px;
overflow: hidden;
}
.sky__phase {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
transition: opacity 0.2s;
}
.sky__dawn {
background: linear-gradient(
0deg,
rgba(254, 215, 102, 1) 0%,
rgba(205, 237, 246, 1) 100%
);
animation: linear dawn infinite var(--animation-speed);
}
.sky__noon {
background: linear-gradient(
0deg,
rgba(205, 237, 246, 1) 0%,
rgba(36, 123, 160, 1) 100%
);
animation: linear noon infinite var(--animation-speed);
}
.sky__dusk {
background: linear-gradient(
0deg,
rgba(255, 32, 110, 1) 0%,
rgba(10, 0, 94, 1) 100%
);
animation: linear dusk infinite var(--animation-speed);
}
.sky__midnight {
background: linear-gradient(
0deg,
rgba(2, 0, 20, 1) 0%,
rgba(10, 0, 94, 1) 100%
);
animation: linear midnight infinite var(--animation-speed);
}
.orbit {
position: relative;
width: 500px;
height: 500px;
margin: 200px auto;
transform: rotate(-45deg);
animation: linear sunrise infinite var(--animation-speed);
}
@media (min-width: 768px) {
.sky {
max-height: 600px;
}
.orbit {
width: 100px;
height: 700px;
margin: 150px auto;
}
}
@media screen and (min-width: 1080px) and (max-width: 1920px) {
.sky {
max-height: 1920px;
}
.orbit {
width: 600px;
height: 1100px;
margin: 1000px auto;
}
}
.sun {
position: absolute;
top: -40px;
left: -40px;
width: 80px;
height: 80px;
background-color: rgb(254, 215, 102);
border-radius: 50%;
box-shadow: 0 0 14px 14px rgba(254, 215, 102, 0.2);
}
.moon {
position: absolute;
bottom: -40px;
right: -40px;
width: 80px;
height: 80px;
border-radius: 50%;
background-color: #fff;
box-shadow: 0 0 7px 7px rgba(255, 255, 255, 0.2);
}
<div class="sky">
<div class="sky__phase sky__dawn"></div>
<div class="sky__phase sky__noon"></div>
<div class="sky__phase sky__dusk"></div>
<div class="sky__phase sky__midnight"></div>
<div class="orbit">
<div class="sun"></div>
<div class="moon"></div>
</div>
</div>
Added a css animation to animate gradient and revolve the sun. The animation time is 4 seconds at the moment.