html5给页面添加雨滴特效,JavaScript canvas实现雨滴特效

本文实例为大家分享了canvas实现雨滴特效的具体代码,供大家参考,具体内容如下

一、雨滴特效需求

雨滴从窗口顶部随机下落到达底部将呈现波纹逐渐散开变淡直到消失,雨滴特效随窗口变化自适应

二、雨滴实现思路

1. 用面向对象的思维 首先创建canvas画布 ,绘制一个雨滴的初始化形状

2. 在给雨滴添加运动的方法

3. 通过定时器让雨滴运动起来

三、具体分析

1.雨滴初始化需要的属性有哪些?

坐标x,y 宽高w,h 。

2.雨滴下落是逐渐加速下落不是匀速需要给一个加速度的属性,也就是y轴坐标不断加上加速度的值

3.雨滴下落到底部某一个区域后开始呈现波纹逐渐散开,也就是到达底部某个范围内开始画圆,圆逐渐变大并且变淡加上透明度

4.雨滴下落拖尾效果需要绘制一层阴影覆盖之前运动的雨滴

四、代码

canvas

* {

margin: 0;

padding: 0;

}

canvas {

vertical-align: middle;

background: #000;

}

// 创建画布

let myCanvas = document.getElementById('myCanvas')

let ctx = myCanvas.getContext('2d')

// 自适应窗口

let width = myCanvas.width = window.innerWidth

let height = myCanvas.height = window.innerHeight

window.addEventListener('resize', () => {

width = myCanvas.width = window.innerWidth

height = myCanvas.height = window.innerHeight

})

// 绘制雨滴

let raindropArr = []

function Raindrop(x, y, w, h, l, r, dr, maxR, a, va) {

this.x = rand(0, window.innerWidth) // 雨滴的x轴

this.y = y || 0 // 雨滴的y轴

this.dy = rand(2, 4) // 雨滴的加速度

this.w = w || 2 // 雨滴的宽度

this.h = h || 10 // 雨滴的高度

this.l = rand(0.8 * height, 0.9 * height) // 雨滴的下落高度

this.r = r || 1 // 波纹半径

this.dr = dr || 1 // 波纹增加半径

this.maxR = maxR || 50 // 波纹最大半径

this.a = a || 1 // 波纹透明度

this.va = 0.96 // 波纹透明度系数

}

Raindrop.prototype = {

draw: function (index) { // 绘制雨滴

if (this.y > this.l) {

ctx.beginPath()

ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2)

ctx.strokeStyle = `rgba(0,191,255,${this.a})`

ctx.stroke()

} else {

ctx.fillStyle = 'skyBlue'

ctx.fillRect(this.x, this.y, this.w, this.h)

}

this.update(index)

},

update: function (index) { // 更新雨滴坐标 运动起来

if (this.y > this.l) {

if (this.a > 0.03) {

this.r += this.dr

if (this.r > this.maxR) {

this.a *= this.va

}

} else {

this.a = 0

raindropArr.splice(index, 1)

}

} else {

this.y += this.dy

}

}

}

function rand(min, max) {

return Math.random() * (max - min) + min

}

setInterval(() => {

let raindrop = new Raindrop()

raindropArr.push(raindrop)

}, 100)

setInterval(() => {

ctx.fillStyle = 'rgba(0, 0, 0, 0.1)'

ctx.fillRect(0, 0, myCanvas.width, myCanvas.height)

for (let i = 0; i < raindropArr.length; i++) {

raindropArr[i].draw(i)

}

}, 30)

五、总结

canvas基本上任何运动,特效,都是通过js定时器改变坐标的方式实现。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值