canvas实现文字变成沙粒交互动画效果代码

代码语言:html

所属分类:动画

代码描述:canvas实现文字变成沙粒交互动画效果代码

代码标签: canvas 文字 变成 沙粒 交互 动画

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>
 
<meta charset="UTF-8">
 

 
<link href="https://fonts.googleapis.com/css?family=Medula+One" rel="stylesheet">
 
 
 
<style>
body
{
   
font-family: Arial, sans-serif;
   
display: flex;
   
justify-content: center;
   
align-items: center;
   
height: 100vh;
   
margin: 0;
   
background-color: #f0f0f0;
   
overflow: hidden;
}

.container {
   
position: relative;
   
width: 100%;
   
height: 100%;
   
display: flex;
   
justify-content: center;
   
align-items: center;
}

h1
{
   
font-size: 8rem;
   
text-align: center;
   
color: #333;
   
text-transform: uppercase;
   
position: absolute;
   
z-index: 0;
   
transition: opacity 0.5s ease;
   
font-weight: 900;
   
padding: 1.5rem 0;
}

canvas
{
   
position: absolute;
   
top: 0;
   
left: 0;
   
width: 100%;
   
height: 100%;
   
z-index: 0;
}

.hidden {
   
opacity: 0;
}
</style>


 
 
</head>

<body>
   
<div class="container">
       
<h1 id="text">BFW.WIKI</h1>
       
<canvas id="canvas"></canvas>
   
</div>

     
<script  >
document.addEventListener('DOMContentLoaded', () => {
  // Get elements
  const text = document.getElementById('text');
  const canvas = document.getElementById('canvas');
  const ctx = canvas.getContext('2d', { alpha: true });

  // Set canvas dimensions
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;

  // Configuration options
  const config = {
    particleDensity: 3, // Lower = more particles
    particleSizeMultiplier: 1 / 20, // Adjust particle size relative to font
    gravity: 0.15,
    friction: 0.95,
    bounce: 0.6,
    returnSpeed: 0.05,
    colorVariation: 15, // Random color variation
    initialCycleDelay: 2000, // Initial delay before animation starts
    fallingDuration: 5000, // How long particles fall
    returnDuration: 800, // How long particles return
    restDuration: 2000, // Rest time between cycles
    canInteract: true, // Allow interaction with the mouse
    interactiveForce: 5, // Force applied by mouse interaction
    interactiveRadius: 100 // Radius of mouse interaction
  };

  // Mouse position tracking
  let mouse = {
    x: undefined,
    y: undefined,
    isPressed: false };


  // Track mouse movement
  canvas.addEventListener('mousemove', event => {
    mouse.x = event.x;
    mouse.y = event.y;
  });

  // Track mouse press
  canvas.addEventListener('mousedown', () => {
    mouse.isPressed = true;
  });

  canvas.addEventListener('mouseup', () => {
    mouse.isPressed = false;
  });

  // Touch support
  canvas.addEventListener('touchmove', event => {
    event.preventDefault();
    mouse.x = event.touches[0].clientX;
    mouse.y = event.touches[0].clientY;
    mouse.isPressed = true;
  });

  canvas.addEventListener('touchend', () => {
    mouse.isPressed = false;
  });

  // Resize canvas on window resize with debounce
  let resizeTimeout;
  window.addEventListener('resize', () => {
    clearTimeout(resizeTimeout);
    resizeTimeout = setTimeout(() => {
      canvas.width = window.innerWidth;
      canvas.height = window.innerHeight;

      // Recreate particles on resize if they exist
      if (particles.length > 0) {
        particles = createParticles();
      }
    }, 250);
  });

  // Particle class
  class Particle {
    constructor(x, y, color, size) {
      this.x = x;
      this.y = y;
      this.originalX = x;
      this.originalY = y;
      this.baseColor = color;
      this.color = this.addColorVariation(color);
      this.size = size;
      this.baseSize = size;
      this.velocity = {
        x: (Math.random() - 0.5) * 2,
        y: Math.random() * -2 };

      this.gravity = config.gravity * (0.8 + Math.random() * 0.4); // Slight variation in gravity
      this.friction = config.friction;
      this.active = false;
      this.activeDelay = Math.random() * 500; // Random delay for each particle
      this.returning = false;
      this.returnSpeed = config.returnSpeed * (0.8 + Math.random() * 0.4); // Variation in return speed
      this.opacity = 1;
      this.fadeSpeed = 0.02;
    }

    // Add slight color variation to particles
    addColorVariation(color) {
      const rgbMatch = color.match(.........完整代码请登录后点击上方下载按钮下载查看

网友评论0