首先咱们先贴出效果出来,这是一个动态的波浪哦!!
html部分:
<canvas id="Theback" width="320">抱歉您的浏览器不支持canvas!</canvas>
以上的canvas可以根据自己的需要改变他的宽高!!
注:canvas标签中间的内容不会显示在页面上,当浏览器不支持canvas的时候才会显示!!!
js部分:(一下代码已经是我测试通过的,不需要在修改就可以顺利绘制了!)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | function wavesurRecord() { //获取画布 var beisizer = document.getElementById( "Theback" ); var ContenofBeisizer = beisizer.getContext( "2d" ); //设置波浪海域(海浪宽度,高度) var beisizerwidth = beisizer.width; var beisizerheight = beisizer.height; var beisizerlinewidth = 2; //曲线 var sinX = 0; var sinY = beisizerheight / 2.0; //轴长 var axisLenght = beisizerwidth; //弧度宽度 var waveWidth = 0.014; //海浪高度 var waveHeight = beisizerheight / 15.0; var speed = 0.1; //数值越大速率越快 var xofspeed = 0; //波浪横向的偏移量 var rand = beisizerheight; //波浪高度 ContenofBeisizer.lineWidth = beisizerlinewidth; // 创建静态的曲线 var drawSin = function (xofspeed) { ContenofBeisizer.save(); //存放贝塞尔曲线的各个点 var points = []; ContenofBeisizer.beginPath(); //创建贝塞尔点 for ( var x = sinX; x < sinX + axisLenght; x += 80 / axisLenght) { // var y = -Math.sin((sinX + x) * waveWidth); //测试请解开注释,注释下一行 var y = -Math.sin((sinX + x) * waveWidth + xofspeed); // points.push([x, sinY + y * waveHeight]); //测试请解开注释,注释下一行 points.push([x, rand + y * waveHeight]); ContenofBeisizer.lineTo(x, sinY + y * waveHeight); //测试请解开注释,注释下一行 // ContenofBeisizer.lineTo(x, rand + y * waveHeight); } ContenofBeisizer.lineTo(axisLenght, beisizerheight); ContenofBeisizer.lineTo(sinX, beisizerheight); ContenofBeisizer.lineTo(points[0][0], points[0][1]); ContenofBeisizer.stroke(); ContenofBeisizer.restore(); //贝塞尔曲线样式设置 ContenofBeisizer.strokeStyle = "#3bc777" ; ContenofBeisizer.fillStyle = "#3bc777" ; ContenofBeisizer.fill(); }; var rendY = function () { ContenofBeisizer.clearRect(0, 0, beisizerwidth, beisizerheight); //控制海浪高度 var tmp = 0.1; rand -= tmp; var b = beisizerheight - rand; //控制循环涨潮 if (parseInt(b) == beisizerheight) { rand = beisizerheight; } drawSin(xofspeed); xofspeed += speed; requestAnimationFrame(rendY); }; // 动态 drawSin(); rendY(); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微服务架构学习与思考:微服务拆分的原则
· 记一次 .NET某云HIS系统 CPU爆高分析
· 如果单表数据量大,只能考虑分库分表吗?
· 一文彻底搞懂 MCP:AI 大模型的标准化工具箱
· 电商平台中订单未支付过期如何实现自动关单?
· 精选 4 款免费且实用的数据库管理工具,程序员必备!
· Cursor:一个让程序员“失业”的AI代码搭子
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(6)
· 重生之我是操作系统(七)----内存管理(上)
· .NET 阻止Windows关机以及阻止失败的一些原因