js canvas实现圆形流水动画

2023-12-08前端开发
178

下面是详细的js canvas实现圆形流水动画的攻略:

1. 准备工作

在HTML中,我们需要创建一个canvas元素,用于显示流水效果。

<canvas id="myCanvas"></canvas>

在JavaScript中,我们需要获取该canvas元素,并在其中绘制圆形流水。需要注意:canvas绘图需要在canvas元素绘制之前被调用,否则会导致绘图不显示。

const canvas = document.getElementById('myCanvas')
const ctx = canvas.getContext('2d')

2. 绘制圆形流水

绘制圆形流水可以分为以下步骤:

2.1 设置属性

在绘制圆形流水之前,我们需要设置样式属性。下面是一些需要设置的样式属性:

// 设置线宽
ctx.lineWidth = 1

// 设置颜色
ctx.strokeStyle = 'rgba(255, 255, 255, 0.2)'

// 设置绘图起点和终点样式
ctx.lineCap = 'round'

// 设置渐变色
const gradient = ctx.createLinearGradient(0, 0, canvas.width, 0)
gradient.addColorStop(0, "rgba(255, 255, 255, 0.2)")
gradient.addColorStop(0.5, "rgba(255, 255, 255, 0.5)")
gradient.addColorStop(1, "rgba(255, 255, 255, 0.2)")
ctx.strokeStyle = gradient

2.2 绘制圆形流水

绘制圆形流水需要使用clearRect()方法清除画板上的内容,不然会导致原内容与新内容混杂。然后,我们可以使用beginPath()方法来开始一个新的路径,在其中使用arc()方法来绘制圆形,并使用stroke()方法来渲染出路径。

// 清空画布
ctx.clearRect(0, 0, canvas.width, canvas.height)

// 绘制圆形流水
ctx.beginPath()
ctx.arc(x, y, r, 0, 2 * Math.PI)
ctx.stroke()

2.3 更新坐标点

在绘制完一个圆形之后,我们需要更新坐标点,在下一次绘制圆形时能够正确的绘制流水。

// 更新坐标
x += dx
y += dy

2.4 循环绘制

最后,我们需要使用requestAnimationFrame()方法来进行循环绘制。这个方法会在浏览器刷新显示之前调用,所以可以达到较高的动画帧率。

// 循环绘制
function animation() {
  // ...
  requestAnimationFrame(animation)
}
animation()

3. 示例说明

3.1 示例一:“彩虹流水”

这个示例绘制了不同颜色的彩虹流水。我们需要在循环绘制中维护一个颜色列表,然后在每次绘制圆形时根据索引选择对应颜色。

const colors = ['red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple']
let colorIndex = 0

function animation() {
  // ...
  ctx.strokeStyle = colors[colorIndex % colors.length]
  colorIndex++
  // ...
}
animation()

3.2 示例二:“光波流水”

这个示例绘制了光波流水的效果。我们需要根据时间来计算出圆形的半径,然后使用sin()函数来计算出圆形的x、y坐标。

let t = 0

function animation() {
  // ...
  const r = 50 + 20 * Math.sin(t)
  const x = canvas.width / 2 + r * Math.cos(t)
  const y = canvas.height / 2 + r * Math.sin(t)
  // ...
  t += 0.05
}
animation()

总结

以上就是js canvas实现圆形流水动画的完整攻略。需要注意的是,canvas绘图需要使用实时信息,建议在使用canvas API时不要使用jQuery等封装库,以免出现意想不到的问题。

The End

相关推荐

layui实现图片上传成功后回显点击放大图片功能
layui实现图片上传成功后回显点击放大图片功能,html代码部分: !-- html代码--div class="layui-form-item" label class="layui-form-label"上传图片/label div class="layui-input-block" button type="button" class="layui-btn" id="license-auth-letter-...
2025-09-06 前端开发
202

Layui实现数据表格中鼠标悬停图片放大离开时恢复原图
Layui实现数据表格中鼠标悬停图片放大离开时恢复原图的效果,最终效果如下图所示: 实现代码如下,在done函数中调用hoverOpenImg方法 var tableIns = window.demoTable = table .render({ elem : '#idTest', id : 'idTest', url : '/postData', //width : 150...
2025-09-04 前端开发
112

layui点击文本输入框调起弹出选择框并选择内容的两种方法参考
我们在用到layui时候,需要点击文本输入框调起弹出选择框并选择内容,这个要怎么操作呢?以下两种方法可以参考: 1、点击名称,弹出信息弹框,选择表格中的某一行,实现效果如下: html页面代码 !--计量器具弹出层-- div id="equipment" lay-filter="equipmen...
2025-09-02 前端开发
167

网站部署https后百度地图不显示问题
https的网站如果引用百度地图,会出现加载不了的问题,这是因为涉及到跨域问题,网站是https的,但是引用百度地图的是http的,这个要怎么操作呢? 比如我引用的地址:http://api.map.baidu.com/api?v=2.0ak=AK显示 后来看了一下,少了一个s=1字段,加一下s=1...
2025-07-28 前端开发
139

微信小程序实现点击复制功能和手机拨打电话功能
做小程序项目的时候,客户提了一个功能需求优化,就是长按文字需要复制全部内容,因为有的手机支持全选复制,有的手机不支持全选复制。 通过设置系统剪贴板的内容和获取系统剪贴板的内容实现复制功能 html相关代码: van-field value="{{form.contactPhone}}"...
2025-07-02 前端开发
78

js拖拽排序插件Sortable.js如何使用
由于项目功能需要,要实现对table中的行实现拖拽排序功能,找来找去发现Sortable.js能很好的满足这个需求,而且它还是开源的,于是乎就开始学习使用Sortable.js 特点 轻量级但功能强大 移动列表项时有动画 支持触屏设备和大多数浏览器(IE9及以下除外) 支持...
2025-06-12 前端开发
161