前端开发 之 12个鼠标交互特效上【附完整源码】
文章目录
前端开发 之 12个鼠标交互特效上【附完整源码】 一:彩色空心爱心滑动特效
二:彩色实心爱心滑动特效
三:粒子连结特效
四:彩色拖尾特效
五:彩色粒子收回特效
六:彩色粒子交互特效
一:彩色空心爱心滑动特效
1.效果展示
2.HTML
完整代码
<! doctype html >
< html>
< head>
< meta charset = " utf-8" >
< title> 超级炫酷的爱心滑动特效</ title>
< style>
body {
overflow : hidden;
margin : 0;
background : #222;
}
canvas {
display : block;
}
</ style>
</ head>
< body>
< canvas> </ canvas>
< script>
var canvas = document. querySelector ( "canvas" ) ,
ctx = canvas. getContext ( "2d" ) ;
var ww, wh;
function onResize ( ) {
ww = canvas. width = window. innerWidth;
wh = canvas. height = window. innerHeight;
}
function randomColor ( ) {
return ` hsla( ${ Math. random ( ) * 360 } , 100%, 60%, 1) ` ;
}
var precision = 100 ;
var hearts = [ ] ;
var mouseMoved = false ;
function onMove ( e ) {
mouseMoved = true ;
for ( let i = 0 ; i < 5 ; i++ ) {
let x, y;
if ( e. type === "touchmove" ) {
x = e. touches[ 0 ] . clientX;
y = e. touches[ 0 ] . clientY;
} else {
x = e. clientX;
y = e. clientY;
}
hearts. push ( new Heart ( x, y) ) ;
}
}
var Heart = function ( x, y ) {
this . x = x || Math. random ( ) * ww;
this . y = y || Math. random ( ) * wh;
this . size = Math. random ( ) * 4 + 1 ;
this . shadowBlur = Math. random ( ) * 20 ;
this . speedX = ( Math. random ( ) - 0.5 ) * 10 ;
this . speedY = ( Math. random ( ) - 0.5 ) * 10 ;
this . speedSize = Math. random ( ) * 0.05 + 0.01 ;
this . opacity = 1 ;
this . color = randomColor ( ) ;
this . vertices = [ ] ;
for ( var i = 0 ; i < precision; i++ ) {
var step = ( i / precision - 0.5 ) * ( Math. PI * 2 ) ;
var vector = {
x : ( 15 * Math. pow ( Math. sin ( step) , 3 ) ) ,
y : - ( 13 * Math. cos ( step) - 5 * Math. cos ( 2 * step) - 2 * Math. cos ( 3 * step) - Math. cos ( 4 * step) )
}
this . vertices. push ( vector) ;
}
}
Heart . prototype. draw = function ( ) {
this . size -= this . speedSize;
this . x += this . speedX;
this . y += this . speedY;
ctx. save ( ) ;
ctx. translate ( this . x, this . y) ;
ctx. scale ( this . size, this . size) ;
ctx. beginPath ( ) ;
ctx. strokeStyle = this . color;
ctx. shadowBlur = this . shadowBlur;
ctx. shadowColor = this . color;
for ( var i = 0 ; i < precision; i++ ) {
var vector = this . vertices[ i] ;
ctx. lineTo ( vector. x, vector. y) ;
}
ctx. globalAlpha = this . size;
ctx. closePath ( ) ;
ctx. stroke ( ) ;
ctx. restore ( ) ;
} ;
function render ( a ) {
requestAnimationFrame ( render) ;
ctx. clearRect ( 0 , 0 , ww, wh) ;
for ( var i = 0 ; i < hearts. length; i++ ) {
hearts[ i] . draw ( ) ;
if ( hearts[ i] . size <= 0 ) {
hearts. splice ( i, 1 ) ;
i-- ;
}
}
}
onResize ( ) ;
window. addEventListener ( "mousemove" , onMove) ;
window. addEventListener ( "touchmove" , onMove) ;
window. addEventListener ( "resize" , onResize) ;
requestAnimationFrame ( render) ;
</ script>
</ body>
</ html>
二:彩色实心爱心滑动特效
1.效果展示
2.HTML
完整代码
<! doctype html >
< html>
< head>
< meta charset = " utf-8" >
< title> 滑动爱心</ title>
< style>
body {
overflow : hidden;
margin : 0;
background : linear-gradient ( to right, #ff9a9e, #fad0c4) ;
height : 100vh;
display : flex;
justify-content : center;
align-items : center;
}
canvas {
position : absolute;
top : 0;
left : 0;
}
</ style>
</ head>
< body>
< canvas> </ canvas>
< script>
var canvas = document. querySelector ( "canvas" ) ,
ctx = canvas. getContext ( "2d" ) ;
var ww, wh;
function onResize ( ) {
ww = canvas. width = window. innerWidth;
wh = canvas. height = window. innerHeight;
}
var precision = 50 ;
var hearts = [ ] ;
var mouseMoved = false ;
function onMove ( e ) {
mouseMoved = true ;
var x, y;
if ( e. type === "touchmove" ) {
x = e. touches[ 0 ] . clientX;
y = e. touches[ 0 ] . clientY;
} else {
x = e. clientX;
y = e. clientY;
}
hearts. push ( new Heart ( x, y) ) ;
}
var Heart = function ( x, y ) {
this . x = x || Math. random ( ) * ww;
this . y = y || Math. random ( ) * wh;
this . size = Math. random ( ) * 2 + 1 ;
this . maxSize = this . size * 1.5 ;
this . shadowBlur = Math. random ( ) * 15 ;
this . speedX = ( Math. random ( ) - 0.5 ) * 4 ;
this . speedY = ( Math. random ( ) - 0.5 ) * 4 ;
this . alpha = 1 ;
this . fadeSpeed = Math. random ( ) * 0.02 + 0.02 ;
this . color = ` hsl( ${ Math. random ( ) * 360 } , 100%, 50%) ` ;
this . vertices = [ ] ;
for ( var i = 0 ; i < precision; i++ ) {
var step = ( i / precision - 0.5 ) * ( Math. PI * 2 ) ;
var vector = {
x : ( 15 * Math. pow ( Math. sin ( step) , 3 ) ) ,
y : - ( 13 * Math. cos ( step) - 5 * Math. cos ( 2 * step) - 2 * Math. cos ( 3 * step) - Math. cos ( 4 * step) )
}
this . vertices. push ( vector) ;
}
}
Heart . prototype. draw = function ( ) {
this . x += this . speedX;
this . y += this . speedY;
this . size += ( this . maxSize - this . size) * 0.1 ;
this . alpha -= this . fadeSpeed;
ctx. save ( ) ;
ctx. translate ( this . x, this . y) ;
ctx. scale ( this . size, this . size) ;
ctx. beginPath ( ) ;
ctx. moveTo ( 0 , 0 ) ;
for ( var i = 0 ; i < precision; i++ ) {
var vector = this . vertices[ i] ;
ctx. lineTo ( vector. x, vector. y) ;
}
ctx. closePath ( ) ;
ctx. fillStyle = this . color;
ctx. globalAlpha = this . alpha;
ctx. shadowBlur = this . shadowBlur;
ctx. shadowColor = this . color;
ctx. fill ( ) ;
ctx. restore ( ) ;
} ;
function render ( a ) {
requestAnimationFrame ( render) ;
ctx. clearRect ( 0 , 0 , ww, wh) ;
for ( var i = 0 ; i < hearts. length; i++ ) {
hearts[ i] . draw ( ) ;
if ( hearts[ i] . alpha <= 0 ) {
hearts. splice ( i, 1 ) ;
i-- ;
}
}
}
onResize ( ) ;
window. addEventListener ( "mousemove" , onMove) ;
window. addEventListener ( "touchmove" , onMove) ;
window. addEventListener ( "resize" , onResize) ;
requestAnimationFrame ( render) ;
</ script>
</ body>
</ html>
三:粒子连结特效
1.效果展示
2.HTML
完整代码
<! DOCTYPE html >
< html lang = " en" >
< head>
< meta charset = " UTF-8" >
< meta name = " viewport" content = " width=device-width, initial-scale=1.0" >
< title> Enhanced Particle System with Cool Effects</ title>
< style>
body {
margin : 0;
overflow : hidden;
background : linear-gradient ( 45deg, #000, #333) ;
animation : bgGradient 10s ease infinite;
}
@keyframes bgGradient {
0% { background-position : 0% 50%; }
50% { background-position : 100% 50%; }
100% { background-position : 0% 50%; }
}
canvas {
display : block;
}
</ style>
</ head>
< body>
< canvas id = " particleCanvas" > </ canvas>
</ body>
< script>
const canvas = document. getElementById ( 'particleCanvas' ) ;
const ctx = canvas. getContext ( '2d' ) ;
canvas. width = window. innerWidth;
canvas. height = window. innerHeight;
let particlesArray = [ ] ;
const numberOfParticles = 50 ;
const mouse = {
x : undefined ,
y : undefined ,
} ;
const maxParticleLifeTime = 1 ;
class Particle {
constructor ( x, y, initialLife = 1 ) {
this . x = x || Math. random ( ) * canvas. width;
this . y = y || Math. random ( ) * canvas. height;
this . size = Math. random ( ) * 2 + 1 ;
this . speedX = ( Math. random ( ) - 0.5 ) * 2 ;
this . speedY = ( Math. random ( ) - 0.5 ) * 2 ;
this . color = ` hsl( ${ Math. random ( ) * 360 } , 100%, 50%) ` ;
this . alpha = 1 ;
this . decay = Math. random ( ) * 0.01 + 0.01 ;
this . life = initialLife;
this . trail = [ ] ;
this . lifeTime = 0 ;
}
update ( ) {
this . x += this . speedX;
this . y += this . speedY;
if ( this . x > canvas. width || this . x < 0 ) this . speedX *= - 1 ;
if ( this . y > canvas. height || this . y < 0 ) this . speedY *= - 1 ;
if ( mouse. x && mouse. y) {
const dx = mouse. x - this . x;
const dy = mouse. y - this . y;
const distance = Math. sqrt ( dx * dx + dy * dy) ;
const force = 1 / distance * 20 ;
this . speedX += ( dx / distance) * force;
this . speedY += ( dy / distance) * force;
}
this . life -= this . decay;
this . alpha = this . life;
this . color = ` hsl( ${ ( 1 - this . life) * 360 } , 100%, 50%) ` ;
this . lifeTime += 1 / 60 ;
if ( this . life <= 0 || this . lifeTime >= maxParticleLifeTime) {
this . reset ( ) ;
}
this . trail. push ( { x : this . x, y : this . y } ) ;
if ( this . trail. length > 15 ) this . trail. shift ( ) ;
for ( let otherParticle of particlesArray) {
if ( otherParticle !== this ) {
const dx = this . x - otherParticle. x;
const dy = this . y - otherParticle. y;
const distance = Math. sqrt ( dx * dx + dy * dy) ;
if ( distance < 50 ) {
const repelForce = 0.1 / distance;
this . speedX -= ( dx / distance) * repelForce;
this . speedY -= ( dy / distance) * repelForce;
}
}
}
}
draw ( ) {
ctx. globalAlpha = this . alpha;
ctx. fillStyle = this . color;
ctx. beginPath ( ) ;
ctx. arc ( this . x, this . y, this . size, 0 , Math. PI * 2 ) ;
ctx. closePath ( ) ;
ctx. fill ( ) ;
ctx. globalAlpha = 0.7 * this . alpha;
ctx. beginPath ( ) ;
for ( let i = 0 ; i < this . trail. length; i++ ) {
ctx. lineTo ( this . trail[ i] . x, this . trail[ i] . y) ;
}
ctx. strokeStyle = this . color;
ctx. lineWidth = 0.5 ;
ctx. stroke ( ) ;
ctx. closePath ( ) ;
}
reset ( ) {
this . x = Math. random ( ) * canvas. width;
this . y = Math. random ( ) * canvas. height;
this . size = Math. random ( ) * 2 + 1 ;
this . speedX = ( Math. random ( ) - 0.5 ) * 4 ;
this . speedY = ( Math. random ( ) - 0.5 ) * 4 ;
this . color = ` hsl( ${ Math. random ( ) * 360 } , 100%, 50%) ` ;
this . alpha = 1 ;
this . life = 1 ;
this . decay = Math. random ( ) * 0.01 + 0.01 ;
this . trail = [ ] ;
this . lifeTime = 0 ;
}
}
function init ( ) {
particlesArray = [ ] ;
for ( let i = 0 ; i < numberOfParticles; i++ ) {
particlesArray. push ( new Particle ( ) ) ;
}
}
function animate ( ) {
ctx. clearRect ( 0 , 0 , canvas. width, canvas. height) ;
for ( let particle of particlesArray) {
particle. update ( ) ;
particle. draw ( ) ;
}
requestAnimationFrame ( animate) ;
}
window. addEventListener ( 'resize' , function ( ) {
canvas. width = window. innerWidth;
canvas. height = window. innerHeight;
init ( ) ;
} ) ;
window. addEventListener ( 'mousemove' , function ( event ) {
mouse. x = event. x;
mouse. y = event. y;
} ) ;
window. addEventListener ( 'mouseout' , function ( ) {
mouse. x = undefined ;
mouse. y = undefined ;
} ) ;
window. addEventListener ( 'click' , function ( event ) {
for ( let i = 0 ; i < 30 ; i++ ) {
const angle = Math. random ( ) * 2 * Math. PI ;
const distance = Math. random ( ) * 50 ;
const x = event. x + Math. cos ( angle) * distance;
const y = event. y + Math. sin ( angle) * distance;
particlesArray. push ( new Particle ( x, y, 1 ) ) ;
}
} ) ;
init ( ) ;
animate ( ) ;
</ script>
</ html>
四:彩色拖尾特效
1.效果展示
2.HTML
完整代码
<! DOCTYPE html >
< html lang = " en" >
< head>
< meta charset = " UTF-8" >
< meta name = " viewport" content = " width=device-width, initial-scale=1.0" >
< title> 1234</ title>
< style>
body, html {
margin : 0;
padding : 0;
width : 100%;
height : 100%;
overflow : hidden;
background-color : #000;
}
#trail-container {
position : absolute;
top : 0;
left : 0;
width : 100%;
height : 100%;
pointer-events : none;
}
.particle {
position : absolute;
width : 3px;
height : 3px;
background-color : #fff;
border-radius : 50%;
opacity : 1;
transform : translate ( -50%, -50%) ;
pointer-events : none;
mix-blend-mode : screen;
}
@keyframes fadeOut {
0% { opacity : 1; }
100% { opacity : 0; }
}
.particle.fade {
animation : fadeOut 0.5s ease-out forwards;
}
</ style>
</ head>
< body>
< div id = " trail-container" > </ div>
< script>
document. addEventListener ( 'DOMContentLoaded' , ( ) => {
const trailContainer = document. getElementById ( 'trail-container' ) ;
const particles = [ ] ;
document. addEventListener ( 'mousemove' , ( e ) => {
createParticle ( e. clientX, e. clientY) ;
} ) ;
function createParticle ( x, y ) {
const particle = document. createElement ( 'div' ) ;
particle. classList. add ( 'particle' ) ;
particle. style. left = ` ${ x} px ` ;
particle. style. top = ` ${ y} px ` ;
particle. style. backgroundColor = getRandomColor ( ) ;
trailContainer. appendChild ( particle) ;
particles. push ( particle) ;
setTimeout ( ( ) => {
particle. classList. add ( 'fade' ) ;
particle. addEventListener ( 'animationend' , ( ) => {
particle. remove ( ) ;
particles. splice ( particles. indexOf ( particle) , 1 ) ;
} ) ;
} , 100 ) ;
}
function getRandomColor ( ) {
const letters = '0123456789ABCDEF' ;
let color = '#' ;
for ( let i = 0 ; i < 6 ; i++ ) {
color += letters[ Math. floor ( Math. random ( ) * 16 ) ] ;
}
return color;
}
setInterval ( ( ) => {
particles. forEach ( particle => {
if ( particle. classList. contains ( 'fade' ) ) {
particle. remove ( ) ;
particles. splice ( particles. indexOf ( particle) , 1 ) ;
}
} ) ;
} , 1000 ) ;
} ) ;
</ script>
</ body>
</ html>
五:彩色粒子收回特效
1.效果展示
2.HTML
完整代码
<! DOCTYPE html >
< html lang = " en" >
< head>
< meta charset = " UTF-8" >
< meta name = " viewport" content = " width=device-width, initial-scale=1.0" >
< title> Enhanced Particle System with Gravity and Wind</ title>
< style>
body, html {
margin : 0;
padding : 0;
width : 100%;
height : 100%;
overflow : hidden;
}
#particleCanvas {
display : block;
width : 100%;
height : 100%;
background : linear-gradient ( to bottom, #000000, #111111) ;
}
</ style>
</ head>
< body>
< canvas id = " particleCanvas" > </ canvas>
< script>
const canvas = document. getElementById ( 'particleCanvas' ) ;
const ctx = canvas. getContext ( '2d' ) ;
canvas. width = window. innerWidth;
canvas. height = window. innerHeight;
const particlesArray = [ ] ;
const numberOfParticles = 500 ;
const mouse = {
x : undefined ,
y : undefined ,
} ;
const gravity = 0.05 ;
const wind = {
x : 0.01 ,
y : 0 ,
} ;
class Particle {
constructor ( ) {
this . x = Math. random ( ) * canvas. width;
this . y = Math. random ( ) * canvas. height;
this . size = Math. random ( ) * 5 + 1 ;
this . speedX = ( Math. random ( ) - 0.5 ) * 4 ;
this . speedY = ( Math. random ( ) - 0.5 ) * 4 ;
this . color = 'hsl(' + Math. floor ( Math. random ( ) * 360 ) + ', 100%, 50%)' ;
this . alpha = 1 ;
this . targetX = this . x;
this . targetY = this . y;
this . ease = 0.05 ;
}
update ( ) {
if ( mouse. x !== undefined && mouse. y !== undefined ) {
this . targetX = mouse. x;
this . targetY = mouse. y;
}
this . x += ( this . targetX - this . x) * this . ease;
this . y += ( this . targetY - this . y) * this . ease;
this . speedY += gravity;
this . speedX += wind. x;
if ( this . x > canvas. width || this . x < 0 ) this . speedX *= - 1 ;
if ( this . y > canvas. height) this . y = canvas. height, this . speedY *= - 0.7 ;
this . alpha -= 0.01 ;
if ( this . alpha < 0 ) this . alpha = 0 ;
this . draw ( ) ;
}
draw ( ) {
ctx. globalAlpha = this . alpha;
ctx. fillStyle = this . color;
ctx. beginPath ( ) ;
ctx. arc ( this . x, this . y, this . size, 0 , Math. PI * 2 ) ;
ctx. closePath ( ) ;
ctx. fill ( ) ;
}
}
function init ( ) {
for ( let i = 0 ; i < numberOfParticles; i++ ) {
particlesArray. push ( new Particle ( ) ) ;
}
}
function animate ( ) {
ctx. clearRect ( 0 , 0 , canvas. width, canvas. height) ;
for ( let particle of particlesArray) {
particle. update ( ) ;
}
requestAnimationFrame ( animate) ;
}
window. addEventListener ( 'resize' , function ( ) {
canvas. width = window. innerWidth;
canvas. height = window. innerHeight;
} ) ;
window. addEventListener ( 'mousemove' , function ( event ) {
mouse. x = event. x;
mouse. y = event. y;
} ) ;
window. addEventListener ( 'mouseout' , function ( ) {
mouse. x = undefined ;
mouse. y = undefined ;
} ) ;
window. addEventListener ( 'click' , function ( ) {
for ( let i = 0 ; i < 20 ; i++ ) {
particlesArray. push ( new Particle ( ) ) ;
}
} ) ;
init ( ) ;
animate ( ) ;
</ script>
</ body>
</ html>
六:彩色粒子交互特效
1.效果展示
2.HTML
完整代码
<! DOCTYPE html >
< html lang = " en" >
< head>
< meta charset = " UTF-8" >
< meta name = " viewport" content = " width=device-width, initial-scale=1.0" >
< title> 彩色粒子交互特效</ title>
</ head>
< body>
< script>
! ( function ( ) {
function n ( n, e, t ) {
return n. getAttribute ( e) || t;
}
function e ( n ) {
return document. getElementsByTagName ( n) ;
}
function t ( ) {
var t = e ( "script" ) ,
o = t. length,
i = t[ o - 1 ] ;
return {
l : o,
z : n ( i, "zIndex" , - 1 ) ,
o : n ( i, "opacity" , 0.6 ) ,
c : n ( i, "color" , "0,255,0" ) ,
n : n ( i, "count" , 400 ) ,
} ;
}
function o ( ) {
( a = m. width =
window. innerWidth ||
document. documentElement. clientWidth ||
document. body. clientWidth) ,
( c = m. height =
window. innerHeight ||
document. documentElement. clientHeight ||
document. body. clientHeight) ;
}
function i ( ) {
r. clearRect ( 0 , 0 , a, c) ;
var n, e, t, o, m, l;
s. forEach ( function ( particle, index ) {
for (
particle. x += particle. xa,
particle. y += particle. ya,
particle. xa *= particle. x > a || particle. x < 0 ? - 1 : 1 ,
particle. ya *= particle. y > c || particle. y < 0 ? - 1 : 1 ,
r. fillStyle = particle. color,
r. fillRect ( particle. x - 0.5 , particle. y - 0.5 , 1 , 1 ) ,
e = index + 1 ;
e < u. length;
e++
) {
( n = u[ e] ) ,
null !== n. x &&
null !== n. y &&
( ( o = particle. x - n. x) ,
( m = particle. y - n. y) ,
( l = o * o + m * m) ,
l < n. max &&
( n === y &&
l >= n. max / 2 &&
( ( particle. x -= 0.03 * o) , ( particle. y -= 0.03 * m) ) ,
( t = ( n. max - l) / n. max) ,
r. beginPath ( ) ,
( r. lineWidth = t / 2 ) ,
r. strokeStyle = particle. color,
r. moveTo ( particle. x, particle. y) ,
r. lineTo ( n. x, n. y) ,
r. stroke ( ) ) ) ;
}
} ) ,
x ( i) ;
}
var fixedColors = [
"rgba(255, 0, 0, 1.0)" ,
"rgba(0, 255, 0, 1.0)" ,
"rgba(0, 0, 255, 1.0)" ,
"rgba(255, 255, 0, 1.0)" ,
"rgba(0, 255, 255, 0.8)" ,
"rgba(255, 0, 255, 0.8)" ,
"rgba(255, 165, 0, 0.8)" ,
"rgba(127, 255, 212, 1.0)" ,
"rgba(0, 255, 127, 1.0)"
] ;
var a,
c,
u,
m = document. createElement ( "canvas" ) ,
d = t ( ) ,
l = "c_n" + d. l,
r = m. getContext ( "2d" ) ,
x =
window. requestAnimationFrame ||
window. webkitRequestAnimationFrame ||
window. mozRequestAnimationFrame ||
window. oRequestAnimationFrame ||
window. msRequestAnimationFrame ||
function ( n ) {
window. setTimeout ( n, 1e3 / 45 ) ;
} ,
w = Math. random,
y = { x : null , y : null , max : 2e4 } ;
( m. id = l) ,
( m. style. cssText =
"position:fixed;top:0;left:0;z-index:" + d. z + ";opacity:" + d. o) ,
e ( "body" ) [ 0 ] . appendChild ( m) ,
o ( ) ,
( window. onresize = o) ,
( window. onmousemove = function ( n ) {
( n = n || window. event) , ( y. x = n. clientX) , ( y. y = n. clientY) ;
} ) ,
( window. onmouseout = function ( ) {
( y. x = null ) , ( y. y = null ) ;
} ) ;
for ( var s = [ ] , f = 0 ; d. n > f; f++ ) {
var h = w ( ) * a,
g = w ( ) * c,
v = 2 * w ( ) - 1 ,
p = 2 * w ( ) - 1 ,
color = fixedColors[ Math. floor ( Math. random ( ) * fixedColors. length) ] ;
s. push ( { x : h, y : g, xa : v, ya : p, max : 6e3 , color : color } ) ;
}
( u = s. concat ( [ y] ) ) ,
setTimeout ( function ( ) {
i ( ) ;
} , 100 ) ;
} ) ( ) ;
</ script>
</ body>
</ html>