【canvas水波纹进度条】

目录

  1. 简介
  2. 代码实现
  3. 使用方法
  4. 总结

简介

在这里插入图片描述

在本篇文章中,我们将介绍如何使用Canvas来实现水波纹进度条效果。通过绘制波浪形状和动态变化的水位,我们可以创建出具有动感和视觉效果的进度条。

代码实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" name="viewport">
    <title>水波纹进度条实现原理</title>
</head>
<style type="text/css">
    body{
        background: #dbeff2;
    }
    canvas{
        position: fixed;
        top:50%;
        left:50%;
        transform:translate3d(-50%,-50%,0);
        -webkit-transform:translate3d(-50%,-50%,0);
    }
    .proNum{
        font-size:3rem;
        position: fixed;
        top:50%;
        left:50%;
        color:#fff;
        transform:translate3d(-50%,-50%,0);
        -webkit-transform:translate3d(-50%,-50%,0);
        font-weight: bold;
    }
</style>
<body>
    <div class="box">
        <canvas id="canvas"></canvas>
        <span class="proNum">0%</span>
    </div>
    <script>
        var wave = {
            speed : 50 ,   //波浪横向流动速度
            offsetX : 0 ,   //波浪横向偏移量
            isDrawContainer : false,        //判断是否画了容器
            offsetYRange : 1.1 ,            //波浪垂直方向最大范围
            offsetY : 0,                    //波浪垂直方向位移
            offsetYSpeed : 0.003,            //波浪溢满
            progressNum : 0,                    //进度
            init : function(){
                var canvas = document.getElementById('canvas'),
                    winW = document.body.clientWidth;
                
                this.ctx = canvas.getContext('2d');
                canvas.width = winW * 0.6;
                canvas.height = winW * 0.6;

                this.canvasW = canvas.width;

                this.draw()
            },

            //所有绘制
            draw : function(){
                var ctx = this.ctx;

                ctx.clearRect(0,0,this.canvasW,this.canvasW);
                this.offsetX += this.speed;

                if(!this.isDrawContainer){
                    this.drawContainer(ctx);
                }

                this.drawWave(ctx , this.offsetX , this.offsetY , 0.04 , 6 , '#a4def6');
                this.drawWave(ctx , this.offsetX + 2 , this.offsetY  - 0.02, 0.04 , 8, '#79d4f9');

                if(this.offsetY < this.offsetYRange){
                    this.offsetY += this.offsetYSpeed;

                    this.progressNum += 100/(this.offsetYRange/this.offsetYSpeed);

                    document.querySelector('.proNum').innerHTML = parseInt(this.progressNum) + '%';
                }

                requestAnimationFrame(this.draw.bind(this));
            },

            drawContainer : function(ctx){
                var pointR = this.canvasW / 2,
                    lineWidth = 10 ,
                    circleR = pointR - (lineWidth);

                ctx.lineWidth = lineWidth;
                ctx.beginPath();
                ctx.arc(pointR,pointR,circleR,0,2 * Math.PI);
                ctx.strokeStyle = 'rgba(192,225,242,0.3)';
                ctx.stroke();
                ctx.clip();
                this.isDrawContainer = true;
            },

            //画波浪线
            drawWave : function(ctx , offsetX , offsetY , waveW , waveH , color){
                var canvasW = this.canvasW,
                    startX = 0;     //波浪线初始x轴坐标

                ctx.beginPath();

                var startPos = [startX];
                
                for(var x = startX ; x < canvasW ; x += 20 / canvasW){
                    //正弦曲线公式:y=Asin(ωx+φ)+k
                    var y = (1 - offsetY) * canvasW + waveH * Math.sin((startX + x) * waveW + offsetX); 

                    if(startPos.length == 1){startPos.push(y)}

                    ctx.lineTo(x , y);
                }
                //画出完整的波浪形状
                ctx.lineTo(canvasW , canvasW);
                ctx.lineTo(startX , canvasW);
                ctx.lineTo(startPos[0] , startPos[1]);
                ctx.fillStyle = color;
                ctx.fill();
            }
        }
        wave.init()
    </script>
</body>
</html>

使用方法

  1. 将上述代码保存为一个HTML文件,例如canvas-wave-progress.html
  2. 打开浏览器,运行HTML文件。
  3. 页面将显示出水波纹进度条效果。

总结

通过使用Canvas绘制波浪形状和动态变化的水位,我们可以实现水波纹进度条效果。这种效果可以用于展示进度、加载状态等场景中,为用户提供更加直观和有趣的体验。

请注意,以上代码仅为示例,你可以根据自己的需求进行修改和扩展。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

usp1994

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值