千家信息网

如何使用CSS 、JS实现浪漫流星雨动画

发表于:2024-09-21 作者:千家信息网编辑
千家信息网最后更新 2024年09月21日,小编给大家分享一下如何使用CSS 、JS实现浪漫流星雨动画,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!HTML由于节点很
千家信息网最后更新 2024年09月21日如何使用CSS 、JS实现浪漫流星雨动画

小编给大家分享一下如何使用CSS 、JS实现浪漫流星雨动画,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

  HTML

  由于节点很多,并且我想尽量做得逼真有趣有点,还给节点加了随机位置。所以节点的输出都是用JS控制的,HTML这边只写了几个父元素盒子,加上相应的ID名和类类名,结构相对简单。

  CSS

  CSS部分的难点就是流星的样式和用圈圈画云层,然后将云层堆叠出立体效果。

  首先说一下流星的样式:

  #sky.star{position:absolute;

  不透明度:0;

  z-index:10000;

  }

  .star::after{content:"";

  显示:块;

  边界:坚固;border-width:2px02px80px;

  /*流星随长度逐渐缩小*/

  border-color:透明透明透明rgba(255,255,255,1);border-radius:2px002px;transform:rotate(-45deg);transform-origin:000;

  盒子阴影:0020pxrgba(255,255,255,.3);

  }

  先提取了公共样式,添加定位属性;

  然后在星后通过后伪类添加流星,用边界特性画:

  1)模型绘制:border-width的顺序为四边top,right,bottom,left,同理border-color的顺序也为四边top,right,bottom,left。这样将border-width与border-color一一对应后,就能看出2px的是流星的宽度,80px是流星的长度,而0像素流星就是尾巴的这样就形成了一个。头部2px的宽,尾部0像素,长度80px的流星模型;

  2)稍微逼真:通过边界半径?给流星的头部增加个圆角,让它看起来更逼真最后通过roteta旋转一个角度,让它看起来像是往下掉;

  3)增加闪光:通过箱阴影给流星增加一点光晕,让它看起来有闪光的效果;

  通过以上3步,一个流星就画好了。

  然后是画云:

  因为云的代码比较长,这里就不贴出来了方法无非是通过一个一个的圆,相互叠加覆盖,完成一个云朵的形状。

  完成一个云层之后,copy一个,然后多个云层通过rotate,opacity,left定位等,做出一个渐隐叠加的立体效果;

  JS

  JS部分以流星举例说明:

  setInterval(function(){

  constobj=addChild("#sky","div",2,"star");//插入流星

  for(leti=0;i

  consttop=-50+Math.random()*200+"px",

  left=200+Math.random()*1200+"px",

  scale=0.3+Math.random()*0.5;

  consttimer=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","left","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);

  这里边用到了我自己封装的两个方法,一个是基于requestAnimationFrame的requestAnimation,以及基于appendChild的addChild。

  为了达成星星位置随机的效果,通过定时器的setInterval的不停插入与删除流星:

  首先,每次添加2个流星到页面,但是定时器的间隔时间小于流星的动画时间,这样就能保证页面中的流星的数量不是一个固定值,但肯定是大于2的。不然一次2个流星略显冷清;

  然后,通过对循环(也可以用为式,换的,都行。对于-的最简单)给每个新添加到页面中的流星一个随机的位置(顶部,左侧),随机的大小(规模),随机的动画执行时间(定时器);

  最后,在用于循环中,给每个新添加到页面中的流星加上动画,并通过回调函数在执行完动画后删除节点。这里要注意的是,要动画分成两个阶段(出现与消失,主要是opacity控制)。另外我这里的处理,每个流星都移动相同的距离300px,这个距离我觉得也可以通过随机数控制,但我犯了个懒,就没有做。

  附上代码:

  HTML:

  

  

  

  

  

  

  

  

  

  

  

  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:0020pxrgba(251,255,25,0.5);

  z-index:9999;

  }

  /*闪烁星星*/

  .blink{position:absolute;background:rgb(255,255,255);border-radius:50%;box-shadow:005pxrgb(255,255,255);

  不透明度:0;

  z-index:10000;

  }

  /*流星*/

  .star{position:absolute;

  不透明度:0;

  z-index:10000;

  }

  .star::after{content:"";

  显示:块;

  边界:坚固;border-width:2px02px80px;

  /*流星随长度逐渐缩小*/

  border-color:透明透明透明rgba(255,255,255,1);border-radius:2px002px;transform:rotate(-45deg);transform-origin:000;

  盒子阴影:0020pxrgba(255,255,255,.3);

  }

  /*云*/

  .cloud{position:absolute;

  宽度:100%;

  身高:100px;

  }

  .cloud-1{

  bottom:-100px;

  z-index:1000;

  不透明度:1;

  变换:规模(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;

  变换:旋转(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(){

  constobj=addChild("#sky","div",2,"star");for(leti=0;i

  consttop=-50+Math.random()*200+"px",

  left=200+Math.random()*1200+"px",scale=0.3+Math.random()*0.5;

  consttimer=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","left","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(){

  constobj=addChild("#stars","div",2,"blink");for(leti=0;i

  consttop=-50+Math.random()*500+"px",

  left=200+Math.random()*1200+"px",round=1+Math.random()*2+"px";

  consttimer=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,

  });

  //添加云

  constclouds=addChild("。cloud","div",14,"circle",true);for(leti=0;i

  clouds.children[i][j].classList.add(`circle-${++j}`);

  }

  }

  //云动画letflag=1;

  的setInterval(

  功能(){

  constclouds=document.querySelectorAll("。cloud");

  constleft=Math.random()*5;

  bottom=Math.random()*5;lettimer=0;for(leti=0;i

  requestAnimation({

  ele:clouds[i],

  attr:["left","bottom"],

  value:flag%2?[-left,-bottom]:[left,bottom],time:timer+=500,

  flag:false,

  fn:function(){

  requestAnimation({

  ele:clouds[i],

  attr:["left","bottom"],

  value:flag%2?[left,bottom]:[-left,-bottom],time:timer,

  flag:false

  })

  }

  });

  }

  标志++;

  },2000)

以上是"如何使用CSS 、JS实现浪漫流星雨动画"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

很赞哦!
流星 身高 动画 时间 透明度 定时器 宽度 节点 云层 位置 效果 边界 长度 页面 逼真 星星 标志 样式 盒子 篇文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发项目进度确认 安徽软件开发服务五星服务 mc不是服务器怎么清理掉落物 服务器运行的几种方式 国家网络安全采取的措施 恩施好的软件开发团队 物竞数据库罗丹明6G 给服务器上传文件协议 配置服务器向导在哪 聊天服务器暂时无法连接 数据库增删改查的思维导图 峰行网络技术工作室 计算机网络世界网络安全管理 怎么检查网络安全设置 石家庄游戏软件开发公司 数据库的系统软件 方舟生存进化怎么攻击服务器 linux网络安全库 数据库物理表依赖表 数据库6.0spl是什么 全州网络安全 网络安全王营康 网络技术习题4答案 怎样通过软件开发新客户 部队网络安全教育内容 17年国家网络安全周主题 网络技术与应用 评课 测试网络安全方案 苏州塑胶零件加工管理软件开发 网络安全未来增长情况
0