用 CSS3 作一個流星雨動畫

昨天 UI 提交過來一個登陸頁的設計稿,要求背景有一個流星雨動畫,作完以後以爲挺有趣,分享一下~html

 

1、流星動畫web

首先建立一個 div 做爲畫布瀏覽器

<div id="stars">
    <div class="star" style="top: 0px;left: 500px;"></div>
</div>
    html, body {
      width: 100%;
      height: 100%;
      margin: 0;
      overflow: hidden;
      background: linear-gradient(rgba(0, 108, 172, 1), rgba(0, 122, 195, .7));
    }
    
    #stars {
      margin: 0 auto;
      max-width: 1600px;
      position: fixed;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      z-index: 2;
    }

爲了防止瀏覽器分辨率太大而影響視覺效果,給畫布加了 max-width 和 margin:autoapp

 

而後畫出流星的形狀dom

    .star {
      display: block;
    width: 1px;
background: transparent; position: relative; opacity: 0; /*過渡動畫*/ animation: star-fall 3s linear infinite; -webkit-animation: star-fall 3s linear infinite; -moz-animation: star-fall 3s linear infinite; } .star:after { content: ''; display: block; border: 0px solid #fff; border-width: 0px 90px 2px 90px; border-color: transparent transparent transparent rgba(255, 255, 255, .5); box-shadow: 0 0 1px 0 rgba(255, 255, 255, .1); /*變形*/ transform: rotate(-45deg) translate3d(1px, 3px, 0); -webkit-transform: rotate(-45deg) translate3d(1px, 3px, 0); -moz-transform: rotate(-45deg) translate3d(1px, 3px, 0); transform-origin: 0% 100%; -webkit-transform-origin: 0% 100%; -moz-transform-origin: 0% 100%; }

 

建立動畫,實現流星劃過、漸入漸隱的效果動畫

    @keyframes star-fall { 0% {
        opacity: 0;
        transform: scale(0.5) translate3d(0, 0, 0);
        -webkit-transform: scale(0.5) translate3d(0, 0, 0);
        -moz-transform: scale(0.5) translate3d(0, 0, 0);
      }
      50% {
        opacity: 1;
        transform: translate3d(-200px, 200px, 0);
        -webkit-transform: translate3d(-200px, 200px, 0);
        -moz-transform: translate3d(-200px, 200px, 0);
      }
      100% {
        opacity: 0;
        transform: scale(1.2) translate3d(-300px, 300px, 0);
        -webkit-transform: scale(1.2) translate3d(-300px, 300px, 0);
        -moz-transform: scale(1.2) translate3d(-300px, 300px, 0);
      }
    }

在50%的節點上,我沒有加上 scale(1) 這條屬性spa

是由於加上以後,動畫進行到 50% 的時候,會有一個很明顯的停頓設計

刪掉 scale(1) 能改善這個狀況,但並無解決3d

並且當 animation-timing-function 設置爲 linear 以外的屬性的時候,問題特別嚴重code

若是有朋友知道這個問題的緣由,必定要留言告訴我,並收下個人膝蓋~

 

2、造成流星雨

上面只是建立了一個流星,若是要造成流星雨,還須要繼續

  <div id="stars"></div>
  var stars = document.getElementById('stars')

  // js隨機生成流星
  for (var j=0;j<30;j++) {
    var newStar = document.createElement("div")
    newStar.className = "star"
    newStar.style.top = randomDistance(500, -100) + 'px'
    newStar.style.left = randomDistance(1300, 300) + 'px'
    stars.appendChild(newStar)
  }
  
  // 封裝隨機數方法
  function randomDistance (max, min) {
    var distance = Math.floor(Math.random() * (max - min + 1) + min)
    return distance
  }

 經過 js 動態生成流星,保證 left 和 top 的值在某一範圍內隨機,就能產生較好的效果

 

而後用 js 添加動畫延時,讓流星不會同時出現

  var star = document.getElementsByClassName('star')

  // 給流星添加動畫延時
  for (var i = 0, len = star.length; i < len; i++)
  {
   star[i].style.animationDelay = i % 6 == 0 ? '0s' : i * 0.8 + 's'
}

爲了防止一開始只有一個流星的尷尬場面,我將 index 爲 6  的倍數的流星設爲一開始就出現

 

而後流星雨的動畫就完成了,能夠點擊這裏查看在線示例

相關文章
相關標籤/搜索