用 CSS3 做一個流星雨動畫


昨天 UI 提交過來一個登錄頁的設計稿,要求背景有一個流星雨動畫,做完之后覺得挺有趣,分享一下~

 

一、流星動畫

首先創建一個 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:auto

 

然后畫出流星的形狀

    .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) 這條屬性

是因為加上之后,動畫進行到 50% 的時候,會有一個很明顯的停頓

刪掉 scale(1) 能改善這個情況,但並沒有解決

而且當 animation-timing-function 設置為 linear 之外的屬性的時候,問題特別嚴重

如果有朋友知道這個問題的原因,一定要留言告訴我,並收下我的膝蓋~

 

二、形成流星雨

上面只是創建了一個流星,如果要形成流星雨,還需要繼續

  <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  的倍數的流星設為一開始就出現

 

然后流星雨的動畫就完成了,可以點擊這里查看在線示例

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM