最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

CSS、JS實現(xiàn)浪漫流星雨動畫

來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 16:50:21
文檔

CSS、JS實現(xiàn)浪漫流星雨動畫

CSS、JS實現(xiàn)浪漫流星雨動畫:本篇文章給大家?guī)淼膬?nèi)容是關(guān)于CSS 、JS實現(xiàn)浪漫流星雨動畫,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。效果如下:HTML由于節(jié)點很多,并且我想盡量做得逼真有趣有點,還給節(jié)點加了隨機位置。所以節(jié)點的輸出都是用JS控制的,HTML這
推薦度:
導讀CSS、JS實現(xiàn)浪漫流星雨動畫:本篇文章給大家?guī)淼膬?nèi)容是關(guān)于CSS 、JS實現(xiàn)浪漫流星雨動畫,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。效果如下:HTML由于節(jié)點很多,并且我想盡量做得逼真有趣有點,還給節(jié)點加了隨機位置。所以節(jié)點的輸出都是用JS控制的,HTML這
本篇文章給大家?guī)淼膬?nèi)容是關(guān)于CSS 、JS實現(xiàn)浪漫流星雨動畫,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。效果如下:

微信截圖_20181113172841.png

HTML

由于節(jié)點很多,并且我想盡量做得逼真有趣有點,還給節(jié)點加了隨機位置。所以節(jié)點的輸出都是用JS控制的,HTML這邊只寫了幾個父元素盒子,加上相應(yīng)的ID名和類類名,結(jié)構(gòu)相對簡單。

CSS

CSS部分的難點就是流星的樣式和用圈圈畫云層,然后將云層堆疊出立體效果?!就扑]閱讀:CSS堆疊上下文是什么?有什么作用?】

首先說一下流星的樣式:

#sky .star { position:absolute;
 不透明度:0 ;
 z-index:10000 ;
 }
 
 .star :: after { content:“” ;
 顯示:塊;
 邊界:堅固; border-width:2px 0 2px 80px ;
 / *流星隨長度逐漸縮小* / 
 border-color:透明透明透明rgba(255,255,255,1); border-radius:2px 0 0 2px ; transform:rotate(-45deg); transform-origin:0 0 0 ;
 盒子陰影:0 0 20px rgba(255,255,255,.3);
 }

先提取了公共樣式,添加定位屬性;

然后在星后通過后偽類添加流星,用邊界特性畫:

1)模型繪制:border-width的順序為四邊top,right,bottom,left,同理border-color的順序也為四邊top,right,bottom,left。這樣將border-width與border-color一一對應(yīng)后,就能看出2px的是流星的寬度,80px是流星的長度,而0像素流星就是尾巴的這樣就形成了一個。頭部2px的寬,尾部0像素,長度80px的流星模型 ;

2)稍微逼真:通過邊界半徑?給流星的頭部增加個圓角,讓它看起來更逼真最后通過roteta旋轉(zhuǎn)一個角度,讓它看起來像是往下掉;

3)增加閃光:通過箱陰影給流星增加一點光暈,讓它看起來有閃光的效果;

通過以上3步,一個流星就畫好了。

然后是畫云:

因為云的代碼比較長,這里就不貼出來了方法無非是通過一個一個的圓,相互疊加覆蓋,完成一個云朵的形狀。
完成一個云層之后,copy一個,然后多個云層通過rotate,opacity,left定位等,做出一個漸隱疊加的立體效果;

JS

JS部分以流星舉例說明:

setInterval(function() {
 const obj = addChild(“#sky”,“div”,2,“star”); //插入流星
 for(let i = 0 ; i <obj.children.length; i ++){ //隨機位置
 const top = -50 + Math .random()* 200 + “px”,
 left = 200 + Math .random()* 1200 + “px”,
 scale = 0.3 + Math .random()* 0.5 ;
 const timer = 1000 + Math .random()* 1000 ;
 obj.children [i] .style.top = top;
 obj.children [i] .style.left = left;
 obj.children [i] .style.transform = `scale($ {scale})` ; 
 //添加動畫
 requestAnimation({
 ele:obj.children [i],
 attr:[ “top”,“l(fā)eft”,“opacity” ],
 值:[ 150,-150,.8 ],
 time:timer,
 flag:false,
 fn:function() {
 requestAnimation({
 ELE:obj.children [I],
 ATTR:“頂”,“左”,“不透明” ],
 值:[ 150,-150,0 ],
 時間:定時器,
 標志:假,
 FN:() => {
 obj.parent.removeChild(obj.children [I]); //動畫結(jié)束刪除節(jié)點
 }
 })
 }
 });
 }
},1000);

這里邊用到了我自己封裝的兩個方法,一個是基于requestAnimationFrame的requestAnimation,以及基于appendChild的addChild。

為了達成星星位置隨機的效果,通過定時器的setInterval的不停插入與刪除流星:

首先,每次添加2個流星到頁面,但是定時器的間隔時間小于流星的動畫時間,這樣就能保證頁面中的流星的數(shù)量不是一個固定值,但肯定是大于2的。不然一次2個流星略顯冷清;

然后,通過對循環(huán)(也可以用為式,換的,都行。對于-的最簡單)給每個新添加到頁面中的流星一個隨機的位置(頂部,左側(cè)),隨機的大小(規(guī)模),隨機的動畫執(zhí)行時間(定時器);

最后,在用于循環(huán)中,給每個新添加到頁面中的流星加上動畫,并通過回調(diào)函數(shù)在執(zhí)行完動畫后刪除節(jié)點。這里要注意的是,要動畫分成兩個階段(出現(xiàn)與消失,主要是opacity控制)。另外我這里的處理,每個流星都移動相同的距離300px,這個距離我覺得也可以通過隨機數(shù)控制,但我犯了個懶,就沒有做。

附上代碼:

HTML:

< body > 
 < div class = “container” > 
 < div id = “mask” > </ div > 
 < div id = “sky” > </ div > 
 < div id = “moon” > </ div > 
 < div id = “stars” > </ div > 
 < div class = “cloud cloud-1” ></ div > 
 <div class = “cloud cloud-2” > </ div > 
 < div class = “cloud cloud-3” > </ div > 
 </ div > 
</ body >

css:

/* - - - - - - 重啟 - - - - - - */
 
 * {
 保證金:0 ;
 填充:0 ;
 }
 
 html,
 body { width:100% ;
 最小寬度:1000px ;
 身高:100% ;
 最小高度:400px ;
 溢出:隱藏;
 }
 / * ------------畫布------------ * / 
 .container { position:relative;
 身高:100% ;
 }
 / *遮罩層* /
 
 #mask { position:absolute;
 寬度:100% ;
 身高:100% ; background:rgba(0,0,0,.8);
 z-index:900 ;
 }
 / *天空背景* /
 
 #sky { width:100% ;
 身高:100% ; background:線性漸變(rgba(0,150,255,1),rgba(0,150,255,.8),rgba(0,150,255,.5));
 }
 / *月亮* /
 
 #moon { position:absolute;
 上:50px ;
 右:200px ;
 寬度:120px ;
 身高:120px ;
 背景:rgba(251,255,25,0.938); border-radius:50% ; box-shadow:0 0 20px rgba(251,255,25,0.5);
 z-index:9999 ;
 }
 / *閃爍星星* /
 
 .blink { position:absolute; background:rgb(255,255,255); border-radius:50% ; box-shadow:0 0 5px rgb(255,255,255);
 不透明度:0 ;
 z-index:10000 ;
 }
 / *流星* /
 
 .star { position:absolute;
 不透明度:0 ;
 z-index:10000 ;
 }
 
 .star :: after { content:“” ;
 顯示:塊;
 邊界:堅固; border-width:2px 0 2px 80px ;
 / *流星隨長度逐漸縮小* / 
 border-color:透明透明透明rgba(255,255,255,1); border-radius:2px 0 0 2px ; transform:rotate(-45deg); transform-origin:0 0 0 ;
 盒子陰影:0 0 20px rgba(255,255,255,.3);
 }
 / *云* /
 
 .cloud { position:absolute;
 寬度:100% ;
 身高:100px ;
 }
 
 .cloud-1 {
 bottom: - 100px ;
 z-index:1000 ;
 不透明度:1 ;
 變換:規(guī)模(1.5);
 -webkit-transform:scale(1.5);
 -moz-transform:scale(1.5);
 -ms-transform:scale(1.5);
 -o-transform:scale(1.5);
 }
 
 .cloud-2 {
 left: - 100px ;
 底部: - 50px ;
 z-index:999 ;
 不透明度:。5 ;
 變換:旋轉(zhuǎn)(7deg);
 -webkit-transform:rotate(7deg);
 -moz-transform:rotate(7deg);
 -ms-transform:rotate(7deg);
 -o-transform:rotate(7deg);
 }
 
 .cloud-3 {
 left:120px ;
 底部: - 50px ;
 z-index:999 ;
 不透明度:。1 ; transform:rotate(-10deg);
 -webkit-transform:rotate(-10deg);
 -moz-transform:rotate(-10deg);
 -ms-transform:rotate(-10deg);
 -o-transform:rotate(-10deg);
 }
 
 .circle { position:absolute; border-radius:50% ;
 背景:#fff ;
 }
 
 .circle-1 { width:100px ;
 身高:100px ;
 上: - 50px ;
 左:10px ;
 }
 
 .circle-2 { width:150px ;
 身高:150px ;
 上: - 50px ;
 左:30px ;
 }
 
 .circle-3 { width:300px ;
 身高:300px ;
 上: - 100px ;
 左:80px ;
 }
 
 .circle-4 { width:200px ;
 身高:200px ;
 上: - 60px ;
 左:300px ;
 }
 
 .circle-5 { width:80px ;
 身高:80px ;
 上: - 30px ;
 左:450px ;
 }
 
 .circle-6 { width:200px ;
 身高:200px ;
 上: - 50px ;
 左:500px ;
 }
 
 .circle-7 { width:100px ;
 身高:100px ;
 上: - 10px ;
 左:650px ;
 }
 
 .circle-8 { width:50px ;
 身高:50px ;
 上:30px ;
 左:730px ;
 }
 
 .circle-9 { width:100px ;
 身高:100px ;
 上:30px ;
 左:750px ;
 }
 
 .circle-10 { width:150px ;
 身高:150px ;
 上:10px ;
 左:800px ;
 }
 
 .circle-11 { width:150px ;
 身高:150px ;
 上: - 30px ;
 左:850px ;
 }
 
 .circle-12 { width:250px ;
 身高:250px ;
 上: - 50px ;
 左:900px ;
 }
 
 .circle-13 { width:200px ;
 身高:200px ;
 上: - 40px ;
 左:1000px ;
 }
 
 .circle-14 { width:300px ;
 身高:300px ;
 上: - 70px ;
 左:1100px ;

JS:

//流星動畫 
setInterval(function() {
 const obj = addChild(“#sky”,“div”,2,“star”); for(let i = 0 ; i <obj.children.length; i ++){
 const top = -50 + Math .random()* 200 + “px”,
 left = 200 + Math .random()* 1200 + “px”, scale = 0.3 + Math .random()* 0.5 ;
 const timer = 1000 + Math .random()* 1000 ;
 obj.children [i] .style.top = top;
 obj.children [i] .style.left = left;
 obj.children [i] .style.transform = `scale($ {scale})` ;
 requestAnimation({
 ele:obj.children [i],
 attr:[ “top”,“l(fā)eft”,“opacity” ],
 值:[ 150,-150,.8 ], time:timer,
 flag:false,
 fn:function() {
 requestAnimation({
 ELE:obj.children [I],
 ATTR:“頂”,“左”,“不透明” ],
 值:[ 150,-150,0 ],
 時間:定時器,
 標志:假,
 FN:() => {
 obj.parent.removeChild(obj.children [I]);
 }
 })
 }
 });
 }
},1000);
//閃爍星星動畫 
setInterval(function() {
 const obj = addChild(“#stars”,“div”,2,“blink”); for(let i = 0 ; i <obj.children.length; i ++){
 const top = -50 + Math .random()* 500 + “px”,
 left = 200 + Math .random()* 1200 + “px”, round = 1 + Math .random()* 2 + “px” ;
 const timer = 1000 + Math .random()* 4000 ;
 obj.children [i] .style.top = top;
 obj.children [i] .style.left = left;
 obj.children [i] .style.width = round;
 obj.children [i] .style.height = round;
 requestAnimation({
 ele:obj.children [i],
 attr:“opacity”,
 值:.5, time:timer,
 flag:false,
 fn:function() {
 requestAnimation({
 ele:obj.children [i],
 attr:“opacity”,
 value:0, time:timer,
 flag:false,
 fn:function() {
 obj.parent.removeChild(obj.children [I]);
 }
 });
 }
 });
 }
},1000);
//月亮移動
requestAnimation({
 ele:“#moon”,
 attr:“right”,
 值:1200,
 時間:10000000,
});
//添加云
const clouds = addChild(“。cloud”,“div”,14,“circle”,true);for(let i = 0 ; i <clouds.children.length; i ++){ for(let j = 0 ; j <clouds.children [i] .length;){
 clouds.children [i] [j] .classList.add(`circle- $ {++ j} `);
 }
}
//云動畫let flag = 1 ;
的setInterval(
 功能() {
 const clouds = document .querySelectorAll(“。cloud”);
 const left = Math .random()* 5 ;
 bottom = Math .random()* 5 ; let timer = 0 ; for(let i = 0 ; i <clouds.length; i ++){
 requestAnimation({
 ele:clouds [i],
 attr:[ “l(fā)eft”,“bottom” ],
 value:flag%2?[-left,-bottom]:[left,bottom], time:timer + = 500,
 flag:false,
 fn:function() {
 requestAnimation({
 ele:clouds [i],
 attr:[ “l(fā)eft”,“bottom” ],
 value:flag%2?[left,bottom]:[ - left,-bottom], time:timer,
 flag:false
 })
 }
 });
 }
 標志++;
 },2000)

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

CSS、JS實現(xiàn)浪漫流星雨動畫

CSS、JS實現(xiàn)浪漫流星雨動畫:本篇文章給大家?guī)淼膬?nèi)容是關(guān)于CSS 、JS實現(xiàn)浪漫流星雨動畫,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。效果如下:HTML由于節(jié)點很多,并且我想盡量做得逼真有趣有點,還給節(jié)點加了隨機位置。所以節(jié)點的輸出都是用JS控制的,HTML這
推薦度:
標簽: 動畫 js 流星
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top