前言这两天闺蜜经常光顾的设计网站页面出现了下雪效果,所以问我网站能不能下雪,作为程序员的我一般都是这么说的做不到,但是作为男朋友,也不能说做不到。SnowSnow我们可以用span标签和css的径向渐变做一个简单的意思:.snow{display:block;宽度:100px;高度:100px;背景图像:径向渐变(#fff0%,rgba(255、255、255、0)60%);border-radius:50%;}效果如下:多雪不够一场雪,千千万万的浪漫,世界上没有两片一模一样的雪花,所以每一场雪都有自己的大小,位置,速度等属性,首先创建一个雪花类:|80//最小直径this.minWidth=opt.minWidth||2//透明度this.opacity=0//水平位置this.x=0//重置位置this.y=0//速度this.speed=0//最大速度this.maxSpeed=opt.maxSpeed||4//最小速度this.minSpeed=opt.minSpeed||1//浏览器窗口大小this.windowWidth=window.innerWidththis.windowHeight=window.innerHeightthis.init()}//初始化各种属性init(){this.width=Math.floor(Math.random()*this.maxWidth+this.minWidth)this.opacity=Math.random()this.x=Math.floor(Math.random()*(this.windowWidth-this.width))this.y=Math.floor(Math.random()*(this.windowHeight-this.width))this.speed=Math.random()*this.maxSpeed+this.minSpeed}//设置样式setStyle(){this.el.style.cssText=`位置:固定;左:0;顶部:0;显示:块;宽度:${this.width}px;高度:${this.width}px;不透明度:${this.opacity};背景图像:径向渐变(#fff0%,rgba(255、255、255、0)60%);边界半径:50%;z-索引:9999999999999;指针事件:无;转换:翻译(${this.x}px,${this.y}px);`}//renderrender(){this.el=document.createElement('div')this.setStyle()document.body.appendChild(this.el)}}init方法用于生成随机初始大小、位置、速度和其他属性,在浏览器窗口中尝试new100个切片:letsnowList=[]for(leti=0;i<100;i++){letsnow=newSnow()snow.render()snowList.push(snow)}效果如下:只有雪在动,才叫下雪。移动很简单,不断改变x和y坐标,在snow类中添加一个移动方法:classsnow{move(){this.x+=this.speedthis.y+=this.speedthis.el.style.left=this.x+'px'this.el.style.top=this.y+'px'}}接下来使用requestAnimationFrame保持刷新:moveSnow(){window.requestAnimationFrame(()=>{snowList.forEach((item)=>{item.move()})moveSnow()})}效果如下,因为速度是正数,所以整个向右倾斜:是的,我看到它动了,但是当我离开屏幕时它就消失了,所以雪会消失,对吧?让雪停下来很简单,检测雪的位置,如果超出屏幕,就让它回到顶部,修改move方法:move(){this.x+=this.speedthis.y+=this.speed//调整完全离开窗口后的初始化方法,还需要修改init方法,因为我们希望它重新出现时y坐标为0或者小于0,这样就不会出现出来了又是稀薄的空气,但是从天而降()}this.el.style.left=this.x+'px'this.el.style.top=this.y+'px'}init(reset){//...this.width=Math.floor(Math.random()*this.maxWidth+this.minWidth)this.y=重置?-this.width:Math.floor(Math.random()*this.windowHeight)//...}所以能源不是下雪了:优化1.水平速度水平速度和垂直速度是一样的,但是看起来有点太斜了,所以调整一下区分水平速度和垂直速度:classSnow{constructor(opt={}){//...//水平速度this.sx=0//垂直速度this.sy=0//...}init(reset){//...this.sy=Math.random()*this.maxSpeed+this.minSpeedthis.sx=this.sy*Math.random()}move(){this.x+=this.sxthis.y+=this.sy//...}}2.左下角没有雪,因为整体向右倾斜,所以左下角大概率不会有雪。这可以通过让雪随机出现在左边来解决:init(reset){//...this.x=Math.floor(Math.random()*(this.windowWidth-this.width))this.y=Math.floor(Math.random()*(this.windowHeight-this.width))if(reset&&Math.random()>0.8){//初始化左边的一小部分雪this.x=-this.width}elseif(reset){this.y=-this.width}//...}3.立即snow随机选取了一点雪,赋予它更大的体积、透明度和速度,然后利用css3的3D透视效果,增加它的z轴值,让它有一种在你眼前掠过的感觉。:
