HTML5+Canvas实现的鼠标跟随自定义发光线条源码

devtools/2025/1/20 18:57:56/

源码介绍

HTML5+Canvas实现的鼠标跟随自定义发光线条特效源码非常炫酷,在黑色的背景中,鼠标滑过即产生彩色变换的发光线条效果,且线条周围散发出火花飞射四溅的粒子光点特效。

效果预览

在这里插入图片描述

源码如下

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="refresh" content="90;url=&#x0068;&#x0074;&#x0074;&#x0070;&#x0073;&#x003a;&#x002f;&#x002f;&#x0077;&#x0077;&#x0077;&#x002e;&#x0071;&#x0071;&#x006d;&#x0075;&#x002e;&#x0063;&#x006f;&#x006d;"><title>Canvas 鼠标跟随的线条闪烁动画</title>
<style>
body {width: 100%;margin: 0;overflow: hidden;background: #000;
}
canvas {width: 100%;height: 100vh;
}
</style>
</head>
<body>
<canvas id="canv" width="450" height="450"></canvas>
<script>
window.requestAnimFrame = (function() {return window.requestAnimationFrame ||window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame ||window.oRequestAnimationFrame ||window.msRequestAnimationFrame ||function(callback) {window.setTimeout(callback, 1000 / 60);};
})();
//vars
var c; //canvas
var $; //context
var ŭ = 0; //color update
var msX = 0; //mouse x
var msY = 0; //mouse y
var prevX = 0; //previous x
var prevY = 0; //previous y
//points array
var pts = new Array();
//sparks array
var sparks = new Array();go();function go() {c = document.getElementById("canv");$ = c.getContext("2d");c.width = window.innerWidth;c.height = window.innerHeight;c.onmousemove = function(e) {prevX = msX;prevY = msY;msX = e.clientX;msY = e.clientY;if (pts.length > 3) {var vel = (Math.abs(prevX - msX) + Math.abs(prevY - msY)) * 0.8;var numsparks = Math.ceil(vel);if (numsparks < 5) {numsparks = 1;}for (var i = 0; i < numsparks; i++) {ŭ -= .5;if (Math.random() > 0.9) {sparks[sparks.length] = new Spark(msX, msY, (prevX - msX) * 0.2, (prevY - msY) * 0.2, vel);}}}};anim();
}function anim() {render();window.requestAnimFrame(anim);
}function render() {$.globalCompositeOperation = "source-over";$.fillStyle = "hsla(0,0%,0%,.2)";$.fillRect(0, 0, c.width, c.height);$.globalCompositeOperation = "lighter";ptSet(msX, msY);sprkSet();
}function ptSet(x, y) {if (pts.length > 30) {pts.shift();}if (x != 0 && y != 0) {pts[pts.length] = new Pt(x, y);}if (pts.length > 10) {for (var i = 2; i < pts.length; i++) {curve(pts[i - 2], pts[i - 1], pts[i]);}}
}function curve(prevPt, midPt, currPt) {$.save();$.beginPath();$.strokeStyle = currPt.color;$.shadowColor = "hsla(" + (ŭ % 360) + ",100%,50%,1)";$.shadowBlur = 15;$.lineWidth = 10;$.moveTo((prevPt.x + midPt.x) * 0.5, (prevPt.y + midPt.y) * 0.5);$.quadraticCurveTo(midPt.x, midPt.y, (midPt.x + currPt.x) * 0.5, (midPt.y + currPt.y) * 0.5);$.stroke();$.restore();}function Pt(x, y) {this.x = x;this.y = y;this.color = "hsla(206, 95%, 95%, 1)";
}function sprkSet() {for (var i = 0; i < sparks.length; i++) {sparks[i].move();}for (i = sparks.length - 1; i >= 0; i--) {if (sparks[i].y > c.height + 20) {sparks.splice(i, 1);}}
}function Spark(x, y, velX, velY, vel) {this.x = x + (vel - Math.random() * vel * 2) * 0.5;this.y = y + (vel - Math.random() * vel * 2) * 0.5;this.vecX = (1 - Math.random() * 2 - Math.random() * velX);this.vecY = (1 - Math.random() * 3 - Math.random() * velY);
}
Spark.prototype.move = function() {this.vecY += 0.15;this.x += this.vecX;this.y += this.vecY;$.save();$.fillStyle = "hsla(" + (ŭ % 360) + ",100%,50%,1)";$.shadowColor = "hsla(" + (ŭ % 360) + ",100%,50%,.3)";$.shadowBlur = 10;$.beginPath();$.arc(this.x, this.y, 2.6, 0, Math.PI * 2, true);$.fill();$.restore();
}
</script>
</body>
</html>

http://www.ppmy.cn/devtools/152164.html

相关文章

Spring Web MVC综合案例

承接上篇文章——Spring Web MVC探秘&#xff0c;在了解Spring Web MVC背后的工作机制之后&#xff0c;我们接下来通过三个实战项目&#xff0c;来进一步巩固一下前面的知识。 一、计算器 效果展示&#xff1a;访问路径&#xff1a;http://127.0.0.1:8080/calc.html 前端代码&a…

Reactor 模式在 Edis、Nginx 和 Netty 中的应用与高性能网络模式解析

文章目录 参考文章Reactor 模式在 Edis、Nginx 和 Netty 中的应用与高性能网络模式解析一、Reactor 模式二、Redis 中的 Reactor 模式三、Nginx 中的 Reactor 模式四、Netty 中的 Reactor 模式五、Reactor 模式的优势六、总结 参考文章 redis&#xff0c;nginx&#xff0c;net…

掌握AutoGen:轻松控制多Agent框架中的代理对话退出(28/30)

一、AutoGen 框架初相识 在人工智能的蓬勃发展进程中&#xff0c;多智能体系统已然成为研究与应用的焦点领域。而 AutoGen 框架&#xff0c;作为多智能体对话领域的璀璨新星&#xff0c;正以其独特的魅力与强大的功能&#xff0c;引领着这一领域的创新潮流。它为开发者们搭建了…

【Redis】win10安装Redis

如果需要&#xff0c;先卸载 WIN10如何卸载redis_mob64ca12f831ae的技术博客_51CTO博客 下载 Releases tporadowski/redis (github.com) 我这里选择压缩包&#xff0c;需要手动解压、初始化、配置和安装服务 解压 启动 进入安装目录&#xff0c;这个cmd关闭即停止redis服…

[JavaScript] 深入理解流程控制结构

文章目录 1. **if-else 语句**基本语法&#xff1a;示例&#xff1a;扩展&#xff1a;else if 2. **switch-case 语句**基本语法&#xff1a;示例&#xff1a;注意事项&#xff1a; 3. **for 循环**基本语法&#xff1a;示例&#xff1a;扩展&#xff1a;for-in 和 for-of 4. *…

js高阶-监听对象的操作

控制与监听对象的行为 需求:监听对象中的属性设置与访问的过程 Object.defineProperty() 缺点 设计初衷是设置属性描述符,监听更加丰富的操作比如新增属性,删除操作是无能为力的 // 1.监听对象的某个属性的操作Object.defineProperty(obj,name,{set:function(val){console.…

结合帧级边界检测和深度伪造检测,定位部分伪造音频攻击中的篡改区域

Integrating frame-level boundary detection and deepfake detection for locating manipulated regions in partially spoofed audio forgery 摘要&#xff1a; 部分伪造音频是一种深度伪造的变体&#xff0c;它通过引入伪造或外部来源的善意音频片段来操纵音频语句&#xf…

Ubuntu升级Linux内核教程

本文作者CVE-柠檬i: CVE-柠檬i-CSDN博客 本文使用的方法是dpkg安装&#xff0c;目前版本为5.4.0-204&#xff0c;要升级成5.8.5版本 下载 下载网站&#xff1a;https://kernel.ubuntu.com/mainline/ 在该网站下载deb包&#xff0c;选择自己想要升级的版本&#xff0c;这里是5…