昨天 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 的倍數的流星設爲一開始就出現
而後流星雨的動畫就完成了,能夠點擊這裏查看在線示例