首页 > 其他分享 >使用Canvas制作一个火焰跟随鼠标的动画

使用Canvas制作一个火焰跟随鼠标的动画

时间:2024-12-22 09:09:08浏览次数:3  
标签:function 动画 Canvas 鼠标 ctx canvas 火焰 flame

创建一个火焰跟随鼠标的动画涉及到多个步骤,包括创建canvas元素,监听鼠标事件,以及在canvas上绘制火焰。以下是一个基本的实现方式:

首先,在HTML中添加一个canvas元素:

<!DOCTYPE html>
<html>
<head>
    <title>火焰跟随鼠标动画</title>
    <style>
        body { margin: 0; }
        canvas { background: #000; display: block; }
    </style>
</head>
<body>
    <canvas id="canvas"></canvas>
    <script src="script.js"></script>
</body>
</html>

然后,在script.js文件中添加以下JavaScript代码:

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');

// 设置canvas大小
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

let flame = {
    x: canvas.width / 2,
    y: canvas.height / 2,
    size: 50,
    vx: 0,
    vy: 0,
    color1: 'orange',
    color2: 'red',
};

function drawFlame(flame) {
    let gradient = ctx.createRadialGradient(flame.x, flame.y, 0, flame.x, flame.y, flame.size);
    gradient.addColorStop(0, flame.color1);
    gradient.addColorStop(1, flame.color2);

    ctx.beginPath();
    ctx.arc(flame.x, flame.y, flame.size, 0, Math.PI * 2, false);
    ctx.fillStyle = gradient;
    ctx.fill();
}

function clearCanvas() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
}

function animate() {
    clearCanvas();
    drawFlame(flame);
    requestAnimationFrame(animate);
}

function updateMousePos(e) {
    flame.vx = (e.clientX - flame.x) * 0.1;
    flame.vy = (e.clientY - flame.y) * 0.1;
}

function update() {
    flame.x += flame.vx;
    flame.y += flame.vy;
    flame.vx *= 0.95;
    flame.vy *= 0.95;
}

canvas.addEventListener('mousemove', updateMousePos);

animate();
setInterval(update, 16); // 更新频率可以根据需要调整

这段代码首先设置了一个flame对象,表示火焰,包含其位置、大小、速度和颜色等信息。drawFlame函数用于在canvas上绘制火焰,clearCanvas函数用于清除canvas。animate函数用于持续绘制火焰,updateMousePos函数根据鼠标位置更新火焰的速度,update函数根据速度更新火焰的位置,并稍微减小速度以模拟阻力效果。最后,通过setInterval定期更新火焰位置。

标签:function,动画,Canvas,鼠标,ctx,canvas,火焰,flame
From: https://www.cnblogs.com/ai888/p/18621703

相关文章

  • 写一个风扇的动画
    创建一个风扇动画在前端开发中通常涉及到HTML、CSS和JavaScript的使用。以下是一个简单的风扇旋转动画的示例:HTML(index.html):<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=dev......
  • 使用Canvas画出头发飘逸的动画
    创建一个头发飘逸的动画需要一定的设计能力和动画技巧。下面我会给出一个简单的步骤来在HTML5的<canvas>元素上创建一个飘逸的头发的动画。步骤1:设置HTML和Canvas首先,你需要在HTML中创建一个<canvas>元素。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-......
  • 使用CSS3写一个图片左右切换的弹性动画
    要使用CSS3创建一个图片左右切换的弹性动画,你可以使用@keyframes来定义动画,并利用animation属性将其应用到元素上。以下是一个简单的示例,展示了如何实现这样的动画效果:HTML:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"co......
  • jquery动画表情插件
    jquery.mb.emoticons.js是一款jquery动画表情插件。它允许你通过面板拾取某个表情符号,然后可以通过这些表情相应的关键字符号将它们转换为gif动画表情。 在线预览  下载  使用方法在页面中引入jquery和jquery.mb.emoticons.js文件。<scriptsrc="js/jquery.min.js......
  • Flash动画综合设计
    Flash动画综合设计并发布、嵌入到网页 【作业要求】自己选定主题,创意制作Flash动画,并与网页进行集成【实验环境】l 所需硬件环境为微机;l 所需软件环境为Flash8.0【创意内容】 一、国旗飘荡效果 设计思路:我选择了中国国旗作为主题,想通过动态效果让国旗看起来像在风......
  • 40.在 Vue3 中使用 OpenLayers 实现 canvas 遮罩效果
    一、引言在Vue3前端开发与地图应用结合的场景中,OpenLayers作为强大的地图库,为我们带来了丰富多样的功能拓展可能性。今天,我们将深入探讨如何利用OpenLayers在Vue3项目里巧妙地实现canvas遮罩效果,这一技巧能够为地图应用增添独特的交互体验与视觉呈现,无论是突出特定区......
  • 前端 PDF 生成和分页的最佳实践:利用 `jspdf` 和 `html2canvas` 从基础到高级技巧
    前端PDF生成和分页的最佳实践:利用jspdf和html2canvas从基础到高级技巧标签:PDF生成、分页处理、前端开发、jspdf、html2canvas引言在实际开发中,很多场景都会涉及PDF的生成,比如合同生成、内容导出等等。我遇到的一个实际问题是,在项目中需要将合同内容生成PDF,合......
  • 鼠标 芯片pc110 linux驱动程序
    /*Copyright©2000-2001VojtechPavlikBasedontheworkof:AlanCoxRobinO’Leary*//*IBMPC110touchpaddriverforLinux*//*Thisprogramisfreesoftware;youcanredistributeitand/ormodifyitunderthetermsoftheGNUGeneralPubli......
  • 鼠标 芯片pxa930 linux驱动程序
    /*PXA930trackballmousedriverCopyright©2007MarvellInternationalLtd.initialversionThisprogramisfreesoftware;youcanredistributeitand/ormodifyitunderthetermsoftheGNUGeneralPublicLicenseversion2aspublishe......
  • 写一个鼠标经过头像时,头像旋转180度并放大2位,离开时恢复原样的特效
    为了实现这个效果,你可以使用HTML、CSS和JavaScript。下面是一个简单的示例,展示了如何使用这些技术来创建一个鼠标经过头像时旋转180度并放大2倍,离开时恢复原样的特效。HTML<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"conte......