解析html5 canvas实现背景鼠标连线动态效果代码

2020-04-21 23:29:17易采站长站整理

squares.forEach(function(i) {
//实现小方块定向移动
i.x += i.xa;
i.y += i.ya;
// 控制小方块移动方向
// 当小方块达到窗口边界时,反向移动
i.xa = i.xa * (i.x > W || i.x < 0 ? -1 : 1);
i.ya = i.ya * (i.y > H || i.y < 0 ? -1 : 1);
//fillRect前两个参数为矩形左上角的x,y坐标,后两个分别为宽度和高度
//绘制小方块
context.fillRect(i.x - 0.5, i.y - 0.5, 1, 1);
//遍历w中所有元素
for (let n = 0; n < w.length; n++) {
x = w[n];
//如果x与i不是同一个对象实例且x的xy坐标存在
if (i !== x && null !== x.x && null !== x.y) {
x_diff = i.x - x.x; //i和x的x坐标差
y_diff = i.y - x.y; //i和x的y坐标差
distance = x_diff * x_diff + y_diff * y_diff; //斜边平方
if (distance < x.max) {
//使i小方块受鼠标小方块束缚,即如果i小方块与鼠标小方块距离过大,i小方块会被鼠标小方块束缚,
//造成 多个小方块以鼠标为圆心,mouse.max/2为半径绕成一圈
if (x === mouse && distance > x.max / 2) {
i.x = i.x - 0.03 * x_diff;
i.y = i.y - 0.03 * y_diff;
}
A = (x.max - distance) / x.max;
context.beginPath();
//设置画笔的画线的粗细与两个小方块的距离相关,范围0-0.5,两个小方块距离越远画线越细,达到max时画线消失
context.lineWidth = A / 2;
//设置画笔的画线颜色为s.c即画布颜色,透明度为(A+0.2)即两个小方块距离越远画线越淡
context.strokeStyle = "rgba(" + attr.color + "," + (A + 0.2) + ")";
//设置画笔的笔触为i小方块
context.moveTo(i.x, i.y);
//使画笔的笔触移动到x小方块
context.lineTo(x.x, x.y);
//完成画线的绘制,即绘制连接小方块的线
context.stroke();
}
}
}
//把i小方块从w数组中去掉
//防止两个小方块重复连线
w.splice(w.indexOf(i), 1);
});
//window.requestAnimationFrame与setTimeout相似,形成递归调用,
//不过window.requestAnimationFrame采用系统时间间隔,保持最佳绘制效率,提供了更好地优化,使动画更流畅
//经过浏览器优化,动画更流畅;
//窗口没激活时,动画将停止,省计算资源;
animation(draw);
}
//此处是等待0.1秒后,执行一次draw(),真正的动画效果是用window.requestAnimationFrame实现的
setTimeout(function() {
draw();
},
100)
} ();

源码地址: https://github.com/jc1144096387/canvas_nest

总结

以上所述是小编给大家介绍的解析html5 canvas实现背景鼠标连线动态效果代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对软件开发网网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!