canvas画雨滴下落

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <canvas id="canvas"></canvas>

    <script>
        var canvas = document.getElementById('canvas')
        var ctx = canvas.getContext('2d')

        var cw = canvas.width = window.innerWidth
        var ch = canvas.height = window.innerHeight
        var rainArr = []

        function random (min, max) {
            return Math.random() * (max - min) + min
        }

        class Rain {
            init () {
                this.x = random(0, cw);// 初始的x,y值
                this.y = 0;
                this.my = random(0.8 * ch, 0.9 * ch)
                this.speed = random(4, 5);// 雨点下落速度
                this.r = 1;//初始的圆半径
                this.sr = 1;// 圆增长半径的速度
            }
            draw () {
                if (this.y < this.my) {
                    ctx.beginPath();
                    ctx.fillStyle = 'white'
                    ctx.fillRect(this.x, this.y, 4, 10)
                } else {
                    ctx.beginPath();
                    ctx.strokeStyle = 'white'
                    ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2)
                    ctx.stroke();
                }
            }
            move () {
                if (this.y < this.my) {
                    this.y += this.speed
                } else {
                    // 到最底部了,就开始画圆
                    if (this.r < 70) {
                        this.r += this.sr
                    } else {
                        // 到最底部了,恢复到初始状态
                        this.init()
                    }
                }
                this.draw()
            }
        }

        function createRain (num) {
            for (var i = 0; i < num; i++) {
                // 这样就不会用时生成
                setTimeout(() => {
                    var rain = new Rain();
                    rain.init();
                    rain.draw();
                    rainArr.push(rain)
                }, 300 * i)
            }
        }
        createRain(60)
        setInterval(() => {
            ctx.beginPath();
            ctx.fillStyle = 'rgba(0,0,0,0.05)'
            ctx.fillRect(0, 0, cw, ch)
            for (var item of rainArr) {
                item.move()
            }
        }, 1000 / 80)

        // 监听屏幕大小,屏幕发生变化让画布也跟着改变大小
        window.onresize = function () {
            ch = canvas.height = window.innerHeight
            cw = canvas.width = window.innerWidth
        }
    </script>
</body>

</html>

 从下往上。。。。

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <canvas id="canvas"></canvas>

  <script>
    var canvas = document.getElementById('canvas')
    var ctx = canvas.getContext('2d')

    var cw = canvas.width = window.innerWidth
    var ch = canvas.height = window.innerHeight
    var rainArr = []

    function random(min, max) {
      return Math.random() * (max - min) + min
    }

    class Rain {
      init() {
        this.x = random(0, cw);// 初始的x,y值 ,起点位置
        this.y = ch * 0.9;
        this.my = random(0.1 * ch, 0.2 * ch)
        this.speed = random(4, 5);// 雨点下落速度
        this.r = 1;//初始的圆半径
        this.sr = 1;// 圆增长半径的速度
      }
      draw() {
        if (this.y > this.my) {
          ctx.beginPath();
          ctx.fillStyle = 'white'
          ctx.fillRect(this.x, this.y, 4, 10)
        } else {
          ctx.beginPath();
          ctx.strokeStyle = 'white'
          ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2)
          ctx.stroke();
        }
      }
      move() {
        if (this.y > this.my) {
          this.y -= this.speed
        } else {
          // 到最上面了,就开始画圆
          if (this.r < 70) {
            this.r += this.sr
          } else {
            // 画完圆,恢复到初始状态
            this.init()
          }
        }
        this.draw()
      }
    }

    function createRain(num) {
      for (var i = 0; i < num; i++) {
        // 这样就不会用时生成
        setTimeout(() => {
          var rain = new Rain();
          rain.init();
          rain.draw();
          rainArr.push(rain)
        }, 300 * i)
      }
    }
    createRain(60)
    setInterval(() => {
      ctx.beginPath();
      ctx.fillStyle = 'rgba(0,0,0,0.05)'
      ctx.fillRect(0, 0, cw, ch)
      for (var item of rainArr) {
        item.move()
      }
    }, 1000 / 80)

    // 监听屏幕大小,屏幕发生变化让画布也跟着改变大小
    window.onresize = function () {
      ch = canvas.height = window.innerHeight
      cw = canvas.width = window.innerWidth
    }
    canvas.rotate(Math.PI/2)
  </script>
</body>

</html>

............

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值