canvas实现跟随鼠标和跟随手指粒子特效

2023-11-05

原文出处: https://blog.csdn.net/IForDreams/article/details/75453450
效果图:

代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>粒子跟随特效</title>
    <style>
        *
        {
            margin: 0;
            padding: 0;
        }

        body
        {
            overflow: hidden;
            background: #000;
        }
    </style>
</head>
<body>
    <canvas id="canvas"></canvas>
    <script>
        var canvas = document.getElementById("canvas");
        canvas.width = document.documentElement.clientWidth;
        canvas.height = document.documentElement.clientHeight;
        var ctx = canvas.getContext("2d");
        var flag = false;       //启动的标志
        var particles = [];     //粒子数组
        var color = ['white', 'red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'purple'];
       // 实现动画方法   
        animate();
        function animate() {
            setInterval(function () {
                render();           // 渲染particles中的粒子
                area();             // 删除particles中微小的粒子
            }, 1000 / 60)      // 相当于:60帧 / 1秒 
        }

        // 鼠标处理
        canvas.onmousedown = function (event) {
            var e = event || window.event;
            flag = true;
            do_spawn(e, 35 * Math.random() + 35);
        };
        canvas.onmouseup = function () {
            flag = false;
        };
        canvas.onmouseout = function () {
            flag = false;
        };
        canvas.onmousemove = function (event) {
            var e = event || window.event;
            if (flag) {
                do_spawn(e, 9);
            }
        };

        // 手势处理
        canvas.ontouchstart = function (e) {
            flag = true;
            do_spawn(e, 35 * Math.random() + 35);
        };
        canvas.ontouchend = function (e) {
            flag = false;
        };
        canvas.ontouchmove = function (e) {
            if (flag) {
                do_spawn(e, 9);
            }
        };

        function do_spawn(e, n) {   //设置孵化器的生产数量
            var x = e.clientX || e.touches[0].pageX;  //鼠标坐标||移动端触摸坐标
            var y = e.clientY || e.touches[0].pageY;
            // 生成n个粒子
            for (var i = 0; i < n; i++) {
                spawn(x, y);
            }
        }

        function spawn(x, y) {   //孵化器,生成一个原点对象
            var particle = new Particle();
            particle.init(x, y);
            particles.push(particle);
        }

        function render() {    //把生成的原点渲染出来
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            for (var i = 0, len = particles.length; i < len; i++) {
                particles[i].draw();
                particles[i].update();
            }
        }

        function area() {  //半径足够小的时候删除该点
            var n = 0;
            for (var i = 0, l = particles.length; i < l; i++) {
                if (particles[i].r > 1) {
                    particles[n++] = particles[i];     // 将半径大于1,凑起来 
                }
            }

            //删除>n(半径<1)的粒子, 最多保留700个 
            while (particles.length > Math.min(700, n)) {
                particles.pop();
            }
        }

        function Particle() { }  //构造函数,小球原型
        Particle.prototype = {
            init: function (x, y) {  //初始化小球各项数据
                this.x = x || 0.0;
                this.y = y || 0.0;
                this.r = 10 * Math.random() + 10 || 40;
                this.color = color[~~(Math.random() * 8)];
                this.theta = Math.random() * 2 * Math.PI;
                this.R = Math.random() * 4 + 2;
                this.vx = Math.cos(this.theta) * this.R;
                this.vy = Math.sin(this.theta) * this.R;
            },
            draw: function () {    //画出一个球的方法
                ctx.beginPath();
                ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2);
                ctx.fillStyle = this.color;
                ctx.fill();
            },
            update: function () {    //改变球的各项属性(位置、大小、颜色)的方法
                this.x += this.vx;
                this.y += this.vy;
                this.vx += Math.cos(this.theta) * .1;
                this.vy += Math.sin(this.theta) * .1;
                this.vx *= .94;
                this.vy *= .94;    //给速度设置一个衰减系数
                this.r *= .92;     //园圈越来越小(衰减)
                this.color = color[~~(Math.random() * 8)]; //动态改变圆点的颜色达到闪烁的效果
            }
        };
    </script>
</body>
</html>


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

canvas实现跟随鼠标和跟随手指粒子特效 的相关文章

  • 如何利用excel中的数据源制作数据地图

    关于这个问题 制作数据地图的方法已不新奇 总体来说有这么几类方案 一类方案 直接在excel里制作 优势 个人小数据量应用较为方便简单 缺点 需要熟悉VBA 且更强大的功能对VBA水平要求较高 1 绘制地图图形 VBA宏语言 思路 用插入图
  • ECharts合并地图上的区域

    对于某些特定需求 官方下载的地图数据可能并不能完全满足 例如 要求显示中国地图 但需要将山东江苏和浙江这3个省合并起来 显示 东部区域 其他省份不变 于是就需要对官方提供的地图数据进行修改 一个思路是借助第三方工具 生成新区域的轮廓点 然后
  • 高德地图的简单使用

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 如何在Vue中引入基础高德地图 1 注册并登录高德地图开放平台 2 安装高德地图加载器 二 封装一个自定义地图组件 并初始化 三 添加放大缩小地图 转盘 四 点
  • 百度地图点聚合中marker的infowindow消失的问题

    目前的业务场景是 地图中有多个点的点聚合 聚合点展开后 每个marker有自己的点击事件 点击时显示窗口信息 做法是marker openInfoWindow infowin 问题来了 每次点击时地图会自动将窗口平移到地图中心 这时窗口就消
  • WGS84转腾讯地理坐标系,并将经纬坐标转化为腾讯地图地址

    项目后台使用的坐标系是WGS1984 但是小程序使用的是腾讯地图 我想要将84坐标转化为具体的地址存储在数据库中 供小程序使用 就需要先将84 腾讯地图使用的坐标系 腾讯地图地址 note 在网上找了很多实现的方法 大部分都没有啥用 各种报
  • 高德地图JS API升级到2.0版本

    项目上反馈高德地图底图信息更新不及时 不利于进行点位规划 经研究发现高德地图JS API 1 4 15版本相对于2 0版本 确实地图切片上的标注信息较少 通过工单的形式询问高德的技术工程师认识到1 4 15版本数据更新有延迟 1 4 15版
  • vue高德地图初体验地图初始化(一)

    vue高德地图初体验地图初始化 安装依赖 引用依赖 地图初始化 AMap Map参数说明 安装依赖 npm i amap amap jsapi loader save 引用依赖 import AMapLoader from amap ama
  • vue+高德地图实现地图搜索及点击定位

    首先需要在index html中引入高德地图的js链接 key需要换成你自己的key 最近有个需求是实现一个使用地图搜索定位的功能 在网上参考了下其他的文章 感觉不是很完善 自己整理了一下 可以实现点击定位 搜索列表定位等功能 可能有些地方
  • 设置地图鼠标样式

    设置鼠标样式为十字花样式 map setDefaultCursor crosshair 设置鼠标样式为手形 map setDefaultCursor url bird cur
  • VMWare 网络连接激活失败(有线连接)

    解决方案 找到管理 gt 虚拟机设置 然后选择 然后选择自己主机网络连接所用的网卡 如果不知道自己网卡的名称 打开网络适配器 找到主机连接所用的网口
  • 解决uni.getLocation用户端首次拒绝后,点第二次不会再调用的问题

    解决方案 给与用户手动指引开启手机定位 效果 测试机为iphone11 机型不一样可能效果会有差别
  • 高德地图android sdk 地图显示和定位 基本使用方法

    首先 定位和地图是分开的 定位有定位的sdk 地图有地图的sdk 地图显示分为MapView和 AMap 两个类 MapView重写activity内的基本所有生命周期方法 Amap由mapview产生 aMap mapView getMa
  • 【疑难杂症】取消pyecharts绘制地图时默认显示小圆点标识

    取消pyecharts绘制地图时默认显示小圆点标识 1 问题 2 问题解决 手动反爬虫 原博地址 https blog csdn net lys 828 article details 124061946 知识梳理不易 请尊重劳动成果 文章
  • 利用R包ggmap进行空间可视化

    ggmap 是在R环境里调用地图作用可视化的利器 它的语法结构跟ggplot2非常相似 也使R语言的用户可以迅速上手 ggmap 结合 ggplot 可以方便快速绘制基于地图的可视化图表 下面的文章里 我将用两个例子 三藩市的犯罪记录 和
  • 微信小程序开发——map地图组件,定位,并手动修改位置偏差。

    环境搭建 注册 获取APPID 没有这个不能真鸡调试 下载微信web开发者工具 挺多bug 将就用 打开微信web开发者工具 扫码登录 新建小程序 输入APPID 勾选创建quick start项目 工程结构 可以看到工程根目录中有个app
  • 在cms以及kindeditor中插入百度动态地图的方法

    想在网页中插入动态地图不难 直接打开网址http api map baidu com lbsapi creatmap 然后按照提示操作 最终生成脚本 放到html文件中即可 而在kindeditor中插入动态地图就更简单了 最新版的kind
  • 拼接滚动地图-Quick-cocos2dx

    lua里面class的使用 一个class的使用 class方法用于创建类 其实就是lua表 传入类名和父类 父类为方法或表 class使用 第一次用A class fun 第二次用a A new 示例 local LevelView cl
  • echarts地图的常见用法:基本使用、区域颜色分级、水波动画、区域轮播、给地图添加背景图片和图标、3d地图、飞线图

    前言 最近几天用echarts做中国地图 就把以前写的demo 在vue中实现中国地图 拿来用 结果到项目里直接报错了 后来发现是因为版本的问题 没办法只能从头进行踩坑了 以下内容基于vue3 和 echarts 5 32 常用的功能应该就
  • 获取京东cookie简单暴力获取京东CK

    获取京东cookie简单暴力获取京东CK 具有时效性 太久没玩可能以失效 注意 用浏览器请使用隐身窗口 如果多个账号 一定不要点退出登录 直接关闭网页 清除浏览器cookie数据 隐身窗口无需这一步 重新进入网页登录下一个账号 退出会导致刚
  • AI原创文章在线生成工具:颠覆你的写作体验

    1 引言 身为热爱数码科技的爱好者 我始终对人工智能技术有着浓厚兴趣 近日 我偶然得知有一款名为 AI原创文章在线生成工具 的实用神器 据称能够自动生成各类主题的文章 为确认它的实证性及可信度 我亲身进行了一次细致的测评与比较 2 实用性评

随机推荐

  • c/c++进制转换方法汇总(含全部代码)

    进制转换方法汇总表 原进制 转换进制 方法1 方法2 方法3 方法4 十进制 二进制 bitset指定格式输出 除留余数法 itoa 十进制 八进制 oct o指定格式输出 流 除留余数法 itoa 十进制 十六进制 hex x指定格式输出
  • Windows默认字符集_查询

    https zhidao baidu com question 32462047 html Windows95 XP 7操作系统自带的都是GBK字符集 含2万余汉字 是完全兼容GB2312 仅含0 67万汉字 的 不必将GBK字符集改为小字
  • const与指针的关系

    文章目录 前言 一 const与一级指针的关系 二 const与二级指针的关系 总结 前言 关于指针这部分内容 const与指针的关系也非常重要 而这部分也是一个难点 我们要了解清楚const对指针的哪些部分限定 然后通过画图进行分析 下面
  • 导入jar包到私服

    2 1手动导入 少量jar包 2 1 1登录私服 选择上传的仓库 2 1 2填写坐标信息 2 2替换私服仓库导入 大量jar包 2 2 1停掉本地私服 2 2 1再重新拉取一份 然后替换私服仓库目录
  • 在Ubuntu14.04 64位上编译CMake源码操作步骤

    在Ubuntu上通过apt get install安装CMake并不是最新版的 这里记录下在Ubuntu上通过源码安装CMake的操作步骤 1 卸载旧版CMake 执行以下命令 apt get autoremove cmake 如果卸载不掉
  • java中wait和sleep的区别_java wait和sleep的区别是什么

    所以sleep 和wait 方法的最大区别是 sleep 睡眠时 保持对象锁 仍然占有该锁 而wait 睡眠时 释放对象锁 但是wait 和sleep 都可以通过interrupt 方法打断线程的暂停状态 从而使线程立刻抛出Interrup
  • 手把手教搭建微信小程序教程

    小白式手把手教搭建微信小程序教程 宝塔软件商店下载如下 php7 3 Nginx 1 20 2 MySQL 8 0 24 phpMyAdmin 5 0 搭建准备1 一台服务器 压缩包里附购买教程 安装镜像为 Centos 不要安装成 Win
  • IIS+PHP+MySQL安装笔记

    2011 8 29安装成功 PHP的跨平台性和执行效率一直受到广大网络程序员的亲睐 它可以和各种Web服务器和数据库服务器整合 运行在各种平台上 提供强大的Web服务功能 且效率较高 唯一的缺点就是在和其他的Web Server整合时 需要
  • 图解自注意力机制

    写在最前边 这个文章是 图解GPT 2 The Illustrated GPT 2 Visualizing Transformer Language Models 的一部分 因为篇幅太长我就单独拿出来了 当然如果你只想了解自注意力机制可以只
  • Java学习心得1———面向对象的思想

    学习Java的第一天是学习面向对象的思想 思考方式 以下是我对面向对象思想的个人理解 面向对象是符合人类的思考方式的 因为我们平时观察和认知这个世界都是以对象为单位的 我们能分辨猫 狗 房子 车是不同的对象 我们知道猫这个对象有眼睛 有嘴巴
  • centos 7 confluence 安装

    1 环境准备 1 1 jdk安装 参考https my oschina net u 182501 blog 1837017 1 2 mysq安装 参考https my oschina net u 182501 blog 1832015 不过
  • HIVE表中导入导出数据的几种方式

    一 往HIVE表中导入导出数据 语法结构 带括号的表示可选择字段 LOAD DATA LOCAL INPATH filepath OVERWRITE INTO TABLE tablename PARTITION partcol1 val1
  • DBvisualizer中SQL Commander出现中文乱码

    DBvisualizer中的SQLCommander出现中文乱码的问题 设置字体就OK了 Tools gt toolProperties gt General gt Appearance gt Fonts gt
  • Audio采样率相关计算

    根据采样率计算buffer duration audio buffer的时长和timestamp在知道采样率的情况下是可以直接计算的 这里假设采样率是44100 那么以微妙为单位 1秒等于1000000微妙 一个采样的时间计算出来就是22微
  • 驼峰转下划线

    一 定义Student实体类 包含如下字段 public class Student private String name private Integer age private Date date JSONField name orde
  • c++day3

    stack h ifndef STACK H define STACK H include
  • 详解dp - 最长回文子序列

    给定一个字符串 s 找到其中最长的回文子序列 并返回该序列的长度 可以假设 s 的最大长度为 1000 类似问题 最长回文子串 首先找出状态转移方程 table i j table i 1 j 1 2 if s i s j else tab
  • SQLAlchemy链接池的使用

    1 倒入需要的模块 from sqlalchemy import create engine from sqlalchemy orm import sessionmaker from sqlalchemy pool import Queue
  • 关于element-ui的el-dialog页面不居中问题

    el dialog 貌似不设置样式的时候默认不居中显示 如下所示 有很多地方是需要用到居中的 并且比较美观 所以我修改了以下代码 gt gt gt 是为了样式穿透 gt gt gt el dialog display flex flex d
  • canvas实现跟随鼠标和跟随手指粒子特效

    原文出处 https blog csdn net IForDreams article details 75453450 效果图 代码