4 644 Codepen

Анимация смены дня и ночи

Анимация смены дня и ночи в режиме реального времени, так и с ползунком, который ускорит этот процесс. Луна и ночь сменяются солнцем и днем.


HTML

<div id="world">
    <div id="sun">
        <div class="sunbeams">
          <div class="beam beam1"></div>
          <div class="beam beam2"></div>
          <div class="beam beam3"></div>
          <div class="beam beam4"></div>
          <div class="beam beam5"></div>
          <div class="beam beam6"></div>
          <div class="beam beam7"></div>
          <div class="beam beam8"></div>
        </div>
        <div class="eyes">
            <div class="eyes-l"></div>
            <div class="eyes-r"></div>
        </div>
    </div>
    <div id="moon">
        <div class="crater crater1"></div>
        <div class="crater crater2"></div>
        <div class="crater crater3"></div>
        <div class="crater crater4"></div>
        <div class="crater crater5"></div>
        <div class="crater crater6"></div>
        <div class="eyes">
            <div class="eyes-l"></div>
            <div class="eyes-r"></div>
        </div>
    </div>
</div>

<div id="slidecontainer">
  <input type="range" min="0" max="24" value="1" class="slider" id="myRange">
  <p class="simtime">Simulated time: <span id="demo"></span>:00</p>
</div>

<div id="toggle-label-left">Real-time animation</div>
<div class="toggle">
  <div class="switch"></div>
</div>
<div id="toggle-label-right">Slider-based animation</div>

CSS

body {
    width:100%;
  height:100%;
    margin:0;
    padding:0;
    background-color:#eee;
  transition: background-color 0.5s ease;
  padding-bottom:100px;
  text-align:center;
}
#world {
    width:400px;
    height:400px;
    display: inline-block;
    position:relative;
    overflow:hidden;
    border-bottom: 5px solid #7a6021;
    transition: border 0.5s ease;
}
#sun {
    height: 200px;
    width: 200px;
    background-color: #f4c042;
    border-radius: 50%;
    display: inline-block;
    position:absolute;
    top:50px;
    left:90px;
    border:5px solid #7a6021;
    transition: top 0.1s ease;
}
#moon {
    height: 200px;
    width: 200px;
    background-color: #95c7fa;
    border-radius: 50%;
    display: inline-block;
    position:absolute;
    top:50px;
    left:90px;
    border:5px solid #67a8f1;
    transition: top 0.1s ease;
}
.crater {
    position:absolute;
    border-radius:50%;
    background:#67a8f1;
}
.crater1 {
    width:30px;
    height:30px;
    top:40px;
    left:40px;
}
.crater2 {
    width: 15px;
    height: 15px;
    top: 20px;
    left: 110px;
}
.crater3 {
    width: 25px;
    height: 25px;
    top: 50px;
    left: 150px;
}
.crater4 {
    width: 35px;
    height: 35px;
    top: 130px;
    left: 30px;
}
.crater5 {
    width: 25px;
    height: 25px;
    top: 160px;
    left: 100px;
}
.crater6 {
    width: 20px;
    height: 20px;
    top: 140px;
    left: 150px;
}
.beam {
    width:5px;
    height:30px;
    background:#7a6021;
    position:absolute;
}

.beam1 {
    transform: rotate(0deg);
    top:-20px;
    left:120px;
}
.beam2 {
    transform: rotate(45deg);
    top:20px;
    left:220px;
}
.beam3 {
    transform: rotate(90deg);
    top:110px;
    left:250px;
}
.beam4 {
    transform: rotate(135deg);
    top:200px;
    left:220px;
}
.beam5 {
    transform: rotate(180deg);
    top:240px;
    left:120px;
}
.beam6 {
    transform: rotate(225deg);
    top:200px;
    left:20px;
}
.beam7 {
    transform: rotate(270deg);
    top:110px;
    left:-10px;
}
.beam8 {
    transform: rotate(315deg);
    top:20px;
    left:20px;
}
.sunbeams {
    width: 250px;
    height: 250px;
    position: absolute;
    top: -25px;
    left: -25px;
    animation: spin 28s linear 0s infinite;
}
@keyframes spin {
    from { transform: rotate(0deg); }
    to { transform: rotate(360deg); }
}
@keyframes blink {
    0% { height: 15px; top:0; }
    99% { height: 15px; top:0; }
    100% { height: 0px; top:7px; }
}
.eyes {
    position: absolute;
    width: 110px;
    height: 20px;
    top: 90px;
    left: 45px;
}
.eyes-l {
    width:15px;
    height:15px;
    border-radius:50%;
    position:absolute;
    top:0;
    left:0;    
    animation: blink 7s linear 0s infinite;
}
.eyes-r {
    width:15px;
    height:15px;
    border-radius:50%;
    position:absolute;
    top:0;
    right:0;
    animation: blink 7s linear 0s infinite;
}
#moon .eyes-l, #moon .eyes-r {
    background:#0f2964;
}
#sun .eyes-l, #sun .eyes-r {
    background:#4f0504;
}
/* Slider */
#slidecontainer {
    margin-top: 30px;
    margin-bottom: 30px;
    width: 100%;
    height: auto;
    max-height: 0px;
    overflow:hidden;
    transition: max-height 0.8s ease;
}
.slider {
    -webkit-appearance: none;
    width: 90%;
    max-width:650px;
    height: 4px;
    background: #d3d3d3;
    outline: none;
    opacity: 0.7;
    -webkit-transition: .2s;
    transition: opacity .2s;
}
.slider:hover {
    opacity: 1;
}
.slider::-webkit-slider-thumb {
    -webkit-appearance: none;
    appearance: none;
    width: 25px;
    height: 25px;
    background: lightblue;
    cursor: pointer;
    border-radius:50%;
}
.slider::-moz-range-thumb {
    width: 25px;
    height: 25px;
    background: lightblue;
    cursor: pointer;
}
.simtime {
    color: #d3d3d3;
    font-family: sans-serif;
    font-weight: bold;
    text-transform: uppercase;
    letter-spacing: 1px;
    font-size: 90%;
}
/* Toggle switch */
.toggle {
    background-color: #eee;
    border: 1px solid #fff;
    border-radius: 42px;
    box-shadow: 0 0 5px #ddd;
    box-sizing: border-box;
    height: 42px;
    transition: 400ms cubic-bezier(0, 0, 0, 1);
    width: 70px;
    display: inline-block;
    vertical-align: middle;
}
.toggle.on {
    background: lightblue;
    padding-left: 28px;
}
.switch {
    background: #fff;
    border: 1px solid gray;
    border-radius: 100%;
    height: 36px;
    margin: 2px;
    position: relative;
    width: 36px;
    z-index: 9;
} 
#toggle-label-left, #toggle-label-right {
    display: inline;
    color: #d3d3d3;
    font-family: sans-serif;
    font-weight: bold;
    text-transform: uppercase;
    letter-spacing: 1px;
    font-size: 90%;
    margin:0 10px;
}
#toggle-label-right {
    opacity:0.2;
}

JS

//this for slider based - setting up slider
var slider = document.getElementById("myRange");
var output = document.getElementById("demo");
output.innerHTML = slider.value;

slider.oninput = function() {
  output.innerHTML = this.value;
}

//Get time funtion - it passes time to the animation control function gettimeofday
function updatetime() {
    var now = new Date();
    gettimeofday(now.getHours());
    //reset the slider to the actual time
    slider.value = now.getHours();  
    output.innerHTML = now.getHours();
}

//Animation control function - you could split these into rise and set funtions but I have'nt done that yet
function gettimeofday(now) {
    hour = now;
    if (hour >= 0 && hour < 5) {
        timeofdaypercent = hour - 0;
        timeofdaypercent = (timeofdaypercent / 4) * 100;
        var moon = document.getElementById('moon');
        var moonheight = (timeofdaypercent * 2.5) + 50;
        moon.style.top = moonheight + "px";
        var sun = document.getElementById('sun');
        sun.style.top = "450px";
        document.body.style.backgroundColor = "#002551";
        var world = document.getElementById('world');
        world.style.borderBottom = "5px solid #67a8f1";
        document.getElementById('toggle-label-left').style.color = "#d3d3d3";
        document.getElementById('toggle-label-right').style.color = "#d3d3d3";
        document.getElementsByClassName('simtime')[0].style.color = "#d3d3d3";
    }
    if (hour >= 5 && hour < 12) {
        timeofdaypercent = hour - 5;
        timeofdaypercent = (timeofdaypercent / 7) * 100;
        var sun = document.getElementById('sun');
        var sunheight = 300 - (timeofdaypercent * 2.9);
        sun.style.top = sunheight + "px";
        var moon = document.getElementById('moon');
        moon.style.top = "400px";
        document.body.style.backgroundColor = "#f4c042";
        var world = document.getElementById('world');
        world.style.borderBottom = "5px solid #7a6021";
        document.getElementById('toggle-label-left').style.color = "#7a6021";
        document.getElementById('toggle-label-right').style.color = "#7a6021";
        document.getElementsByClassName('simtime')[0].style.color = "#7a6021";
    }
    if (hour >= 12 && hour < 19) {
        timeofdaypercent = hour - 12;
        timeofdaypercent = (timeofdaypercent / 7) * 100;
        var sun = document.getElementById('sun');
        var sunheight = (timeofdaypercent * 2.9) + 50;
        sun.style.top = sunheight + "px";
        var moon = document.getElementById('moon');
        moon.style.top = "400px";
        document.body.style.backgroundColor = "#f4c042";
        var world = document.getElementById('world');
        world.style.borderBottom = "5px solid #7a6021";
        document.getElementById('toggle-label-left').style.color = "#7a6021";
        document.getElementById('toggle-label-right').style.color = "#7a6021";
        document.getElementsByClassName('simtime')[0].style.color = "#7a6021";
    }
    if (hour >= 19 && hour <= 24) {
        timeofdaypercent = hour - 20;
        timeofdaypercent = (timeofdaypercent / 5) * 100;
        var moon = document.getElementById('moon');
        var moonheight = 200 - (timeofdaypercent * 2.5) + 50;
        moon.style.top = moonheight + "px";
        var sun = document.getElementById('sun');
        sun.style.top = "450px";
        document.body.style.backgroundColor = "#002551";
        var world = document.getElementById('world');
        world.style.borderBottom = "5px solid #67a8f1";
        document.getElementById('toggle-label-left').style.color = "#d3d3d3";
        document.getElementById('toggle-label-right').style.color = "#d3d3d3";
        document.getElementsByClassName('simtime')[0].style.color = "#d3d3d3";
    }
}


//Start the loop going based of real time
updatetime();
var timeloop = setInterval(updatetime, 1000);

//Toggle switch functions
var togglestate=0;
document.getElementsByClassName('toggle')[0].onclick = function() {
  this.classList.toggle('on');
  if (togglestate == 0) {
      togglestate = 1;
      clearInterval(timeloop);
      slider.oninput = function() {
      output.innerHTML = this.value;
      gettimeofday(this.value);
    }
    document.getElementById('slidecontainer').style.maxHeight = "300px";
    document.getElementById('toggle-label-left').style.opacity = "0.2";
    document.getElementById('toggle-label-right').style.opacity = "1";
  } else if (togglestate == 1) {
      togglestate = 0;
      updatetime();
      timeloop = setInterval(updatetime, 1000);
      slider.oninput = null;
    document.getElementById('slidecontainer').style.maxHeight = "0px";
    document.getElementById('toggle-label-left').style.opacity = "1";
    document.getElementById('toggle-label-right').style.opacity = "0.2";
  }
}

Комментарии

  • Facebook
  • Вконтакте

Похожие статьи