HTML5 Canvas很酷炫的粉尘态粒子引力效应
时间:2019-03-09
本文章向大家介绍HTML5 Canvas很酷炫的粉尘态粒子引力效应,主要包括HTML5 Canvas很酷炫的粉尘态粒子引力效应使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
分享个大牛制作的 Canvas粉尘态粒子引力效应
主要特点:
鼠标移动会被依附追随
鼠标点击会被弹开
鼠标拖动会以一定的范围弹开
<style type="text/css">
* {
margin: 0;
padding: 0;
}
html {
overflow: hidden;
}
canvas {
cursor: none;
}
</style>
<!--move mouse or click -->
<script type="text/javascript">
window.onload = function() {
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var pi = Math.PI;
var centerX, centerY;
var part_num = 2000; //粒子数量
var mousedown = false;
var X, Y; //鼠标坐标
var P = [];
var part = function(x, y, vx, vy, r, red, green, blue, alpha, col) {
this.x = x;
this.y = y;
this.vx = vx; //初始向左移动
this.vy = vy; //初始向右移动
this.r = r; //大小
this.red = red;
this.green = green;
this.blue = blue;
this.alpha = alpha;
this.col = col;
};
window.onmousemove = function(e) {
X = e.clientX;
Y = e.clientY;
}
window.onmousedown = function() {
mousedown = true;
}
window.onmouseup = function() {
mousedown = false;
}
var mouseover = false;
window.onmouseover = function() {
mouseover = true;
}
window.onmouseout = function() {
mouseover = false;
}
function rand(min, max) {
return Math.random() * (max - min) + min;
}
function dist(dx, dy) {
return Math.sqrt(dx * dx + dy * dy);
}
function size() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
centerX = canvas.width / 2;
centerY = canvas.height / 2;
}
size();
X = centerX;
Y = centerY;
function init() {
var x, y, vx, vy, r, red, green, blue, alpha, col;
for (var i = 0; i < part_num; i++) {
x = rand(0, canvas.width);
y = rand(0, canvas.height);
vx = rand(-5, 5);
vy = rand(-5, 5);
r = rand(1, 10);
red = Math.round(rand(150, 200));
green = Math.round(rand(100, 255));
blue = Math.round(rand(180, 255));
alpha = 1;
col = "rgba(" + red + "," + green + "," + blue + "," + alpha + ")";
P.push(new part(x, y, vx, vy, r, red, green, blue, alpha, col));
}
}
// 背景绘制
function bg() {
// 使用 fillStyle 属性来设置用于填充绘图的颜色
ctx.fillStyle = "raba(25,25,30,1)";
// 使用fillRect() 方法绘制“已填色”的矩形
ctx.fillRect(0, 0, canvas.width, canvas.height);
//clearRect() 方法清空给定矩形内的指定像素
// ctx.clearRect(0, 0, canvas.width, canvas.height);
}
//鼠标吸引
function attract(p) {
var dx = (p.x - X),
dy = (p.y - Y),
dist = Math.sqrt(dx * dx + dy * dy), //返回距离(平方根)
angle = Math.atan2(dy, dx); //返回坐标(dx,dy)与 X轴之间的角度的弧度
if(dist > 50 && dist < 500) {
if(!mousedown) {
p.vx -= (200 / (p.r * dist)) * Math.cos(angle);
p.vy -= (200 / (p.r * dist)) * Math.sin(angle);
} else if(mousedown) {
p.vx += (300 / (p.r * dist)) * Math.cos(angle);
p.vy += (300 / (p.r * dist)) * Math.sin(angle);
}
}
}
//粒子弹弹弹
function bounce(b) {
if(b.x < b.r) {
b.x = b.y;
b.vx *= -3;
}
if(b.x > canvas.width - b.r) {
b.x = canvas.width - b.r;
b.vx *= -3;
}
if(b.y - b.r < 0) {
b.y = b.r;
b.vy *= -3;
}
if(b.y > canvas.height - b.r) {
b.y = canvas.height - b.r;
b.vy *= -3;
}
}
// 鼠标拖动
function draw() {
var p;
for(var i = 0; i < P.length; i++) {
p = P[i];
if(mouseover) attract(p);
bounce(p);
p.x += p.vx;
p.y += p.vy;
p.vx *= .975;
p.vy *= .975;
ctx.fillStyle = p.col;
ctx.fillRect(p.x, p.y, p.r, p.r);
}
ctx.strokeStyle = (!mousedown) ? "rgba(0,0,0,,1)" : "rgba(255,0,0,1)";
ctx.beginPath();
ctx.moveTo(X, Y - 10);
ctx.lineTo(X, Y + 10);
ctx.moveTo(X - 10, Y);
ctx.lineTo(X + 10, Y);
ctx.stroke();
}
function loop() {
bg();
draw();
window.requestAnimationFrame(loop);
}
// 事件
window.onresize = size;
// 初始化
init();
loop();
}
</script>
“我自己是一名从事了5年前端的老程序员,辞职目前在做讲师,今年年初我花了一个月整理了一份最适合2019年学习的web前端干货,从最基础的HTML+CSS+JS到移动端HTML5到各种框架都有整理,送给每一位前端小伙伴,这里是小白聚集地,欢迎初学和进阶中的小伙伴。"
加QQ群:645199623(招募中)
加微❤:QD_666_QD
- 神经网络反向传播梯度计算数学原理
- Spring Boot 1.5.10 发布:修复重要安全漏洞!!!
- 从零开始写项目第三篇【在线聊天和个人收藏夹】
- TiDB 源码阅读系列文章(六)Select 语句概览
- 从零开始写项目第四篇【搭建Linux环境】
- salesforce零基础学习(八十六)Ajax Toolkit (VF页面中使用及javascript action使用)
- salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)
- 深入nDPI
- 44个Java代码性能优化总结
- 干货:Java正确获取客户端真实IP方法整理
- sublime学习笔记
- Java程序员必须掌握的常用Linux命令。
- SAMP论文学习
- IEEE Trans 2009 Stagewise Weak Gradient Pursuits论文学习
- HTML 教程
- HTML 简介
- html div 标签介绍
- html span 标签介绍
- html a 超链接标签
- HTML Br换行标签介绍
- HTML P段落标签介绍
- HTML br与p标签区别
- Html H 标题标签
- html px em pt长度单位
- HTML form 标签
- HTML radio 单选框
- HTML B 加粗标签
- HTML strong加粗粗体标签
- HTML em 强调标签
- HTML i 斜体标签
- HTML u下划线标签
- HTML s 删除线标签
- Html img 图片标签
- Html上标注sup与下标注sub标签
- HTML nobr 禁止换行标签
- HTML hr 水平线标签
- HTML label 标签
- HTML input 标签
- HTML textarea 标签
- HTML select下拉列表标签
- HTML checkbox 多选框
- HTML font color 标签
- HTML iframe 框架标签
- HTML Table 表格
- HTML dl dt dd 标签
- HTML ol li有序列表标签
- HTML ul li 无序列表标签
- HTML 注释
- CSS 教程
- CSS 简介
- CSS 语法
- CSS Id 和 Class选择器
- CSS 样式的创建
- CSS background 背景介绍
- CSS 文本样式
- CSS font 字体
- CSS A 链接
- CSS ul ol列表样式
- CSS TABLE 样式
- CSS 框模型
- CSS border 边框
- CSS Outlines 轮廓
- CSS 外边距 Margin
- CSS Padding 内边距
- CSS 分组和嵌套选择器
- CSS 尺寸 (Dimension)
- CSS Display 属性
- CSS Position 定位
- CSS Float 浮动
- CSS 水平对齐(Horizontal Align)
- CSS 组合选择符
- CSS 伪类
- CSS 伪元素
- CSS 导航栏
- CSS 下拉菜单
- CSS 图片廊
- CSS 图像透明/不透明
- CSS sprite 图像拼合技术
- CSS 媒体类型
- CSS 属性选择器
- CSS 实例
- 使用 Node.js 定制你的技术雷达:中篇
- 数据库PostrageSQL-在Windows上从源代码安装
- Redis的过期策略和内存淘汰策略及LRU算法详解
- 群晖Docker安装GitLab及腾讯企业邮件配置踩坑记录
- 基于docker搭建DNSmasq
- Django-admin配置和显示图标
- redis学习(八)
- 【剑指Offer】打印从1到最大的n位数
- 面试题-List之ArrayList、Vector、SynchronizedList、CopyOnWriteArrayList
- 面试题-JAVA设计模式之单例模式的5种实现方式
- 面试题-JAVA中的深拷贝、浅拷贝原理及实现
- Cross-Origin Resource Sharing (CORS)-跨域
- 多线程技术-CountDownLatch在业务中实践
- Mybatis源码阅读-准备环境搭建
- 【SpringBoot WebFlux 系列】WebFlux 之 Path 参数解析与 url 映射