今天看到一个 canvas 点击效果,甚是喜欢
就下载下来想加到网站,就是现在你们点击时看到的效果,但是源码有问题啊,不是被网页原本的元素覆盖就是覆盖网页原有的元素,有点拗,将就看吧
,然后怎么办?修改呗。 ![]()
有新版更新,效率更高
思路
(学大佬们的套路,写写思路,哈哈)
- 因为被网页原本的元素覆盖,所以把 canvas 的 z-index 开高,就 99999999 吧。
- z-index置顶了,覆盖了网页所有元素的事件,设置下它的 pointer-events: none。
- 好了,网页所有元素的事件正常了, canvas 效果点击没反应了,修改 JS 解决,不用 canvas 层接收事件,收集document点击事件触发 canvas 的效果。
- 排除 a 、 img 等标签。
差不多了,其他的看代码把。
JS代码
/*
* 鼠标点击特效,canvas点击效果
* 原文地址:https://www.iowen.cn/mouse-click-effect-canvas-click-effect
*/
const cnv = document.getElementById('mineCanvas');
if(cnv){
let ctx = cnv.getContext('2d');
// 基础配置
let count = 20;//圆点数量
let innerRadius = 20;
let outterRadius = 80;
let moreOutterRadius = 120;
let easing = 0.05;
let mcolor = [
'rgba(244,64,51,.6)',
'rgba(255,235,59,.6)',
'rgba(244,3,232,.6)'
]
// 窗口变化重置 canvas 大小
window.onresize=function(){resize();};
function resize() {
cnv.width = window.innerWidth;
cnv.height = window.innerHeight;
}
window.onload = function () {
// 初始化宽高
resize();
let mouse = new Mouse();
mouse.getMousePosition(document);
document.addEventListener('click', function(e){
let balls = getEnoughBall(count, mouse.x, mouse.y);
let circle = new Ball(mouse.x, mouse.y, innerRadius, 'rgba(244,64,51,.6)');
var opacticy = 0.6;
//排除一些元素
"TEXTAREA" !== e.target.nodeName && "INPUT" !== e.target.nodeName && "A" !== e.target.nodeName && "I" !== e.target.nodeName && "IMG" !== e.target.nodeName
&& (function animation() {
requestAnimationFrame(animation);
ctx.clearRect(0, 0, cnv.width, cnv.height);
balls.forEach(item => {
item.draw('fill');
// 缓动动画
item.vx = (item.dx - item.x) * easing;
item.vy = (item.dy - item.y) * easing;
item.x += item.vx;
item.y += item.vy;
item.sx += -item.sx * easing;
item.sy += -item.sy * easing;
})
circle.draw('stroke');
circle.radius += (outterRadius - circle.radius) * easing;
opacticy = opacticy - 0.6 * easing;
circle.color = `rgba(244, 67, 54, ${opacticy})`
})()
}, false)
}
function getEnoughBall(num, mouseX, mouseY) {
var balls = [];
for (let i = 0; i < num; i++) {
var ball = new Ball(0, 0, Math.random() * (20 - 5 + 1) + 5, mcolor[parseInt(Math.random() * 3)]);//随机初始大小
ball.x = mouseX + Math.random() * innerRadius - Math.random() * innerRadius;
ball.y = mouseY + Math.random() * innerRadius - Math.random() * innerRadius;
// 计算最终位置
var x = mouseX - ball.x;
var y = mouseY - ball.y;
var scale = Math.abs(x / y);
ball.dx = (x < 0 ? 1 : -1) * moreOutterRadius / Math.sqrt(scale * scale + 1) * Math.random() * scale + mouseX;
ball.dy = (y < 0 ? 1 : -1) * moreOutterRadius / Math.sqrt(scale * scale + 1) * Math.random() + mouseY;
balls.push(ball);
}
return balls;
}
// ball class
class Ball {
constructor(x, y, radius, color) {
this.x = x || 0;
this.y = y || 0;
this.vx = 0;
this.vy = 0;
this.sx = 1;
this.sy = 1;
this.radius = radius || 10;
this.color = color || 'black';
}
draw(type) {
if (['fill', 'stroke'].indexOf(type) == -1) {
throw ('ball.draw need a right type');
}
ctx.save();
ctx.translate(this.x, this.y);
ctx.scale(this.sx, this.sy);
ctx.fillStyle = this.color;
ctx.strokeStyle = this.color;
ctx.beginPath();
ctx.arc(0, 0, this.radius, 0, 360 * Math.PI / 180);
ctx.closePath();
type === 'fill' ? ctx.fill() : ctx.stroke();
ctx.restore();
}
}
// mouse class
class Mouse {
constructor() {
this.x = 0;
this.y = 0;
}
getMousePosition(c) {
c.addEventListener('click', (e) => {
this.x = e.clientX - cnv.offsetLeft;
this.y = e.clientY - cnv.offsetTop;
}, false)
}
}
}
部署方法
复制 js 代码到主题主 js 最下面;或者保存为单独的文件,然后引入主题,然后在 页面 body 标签中加入 <canvas id="mineCanvas" ></canvas>WordPress 主题可以找主题的 header.php 或者 footer.php 文件,再任意一个合适的位置加入下方代码,加一个地方就可以了,
<?php !wp_is_mobile()): //排除移动设备 ?> <canvas id="mineCanvas" style="position:fixed;left:0;top:0;z-index:99999999;pointer-events:none;"></canvas> <?php endif; ?>
好了完美,喜欢的话记得打赏、点赞、分享 ![]()


犬青 ( VIP 1 )
浙江你好,我看这篇然后试了一下,和你的效果差的有点大,动画没有你的生动,能分享下你现在用的代码吗?谢谢
一为 ( VIP 6 )
湖南@犬青 嗯 ,这几天我整理分享出来