专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Go

炫彩logo粒子成效

发布时间:2011-06-29 18:24:39 文章来源:www.iduyao.cn 采编人员:星星草
炫彩logo粒子效果
前端开发whqet,csdn,王海庆,whqet,前端开发专家

昨天我们学习了利用requestAnimationFrame优化动画控制,然后就忍不住冲动,在fork别人codepen的基础上,实现了这个炫彩logo粒子效果,效果预览如下。


 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                                               ==== 炫彩logo粒子1====    ==全屏预览==   ==在线编辑==    ==下载收藏==    ==赞助投票==
 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

思路解析

1.canvas绘制图像

2.取得图像像素点

3.粒子效果附加在像素点上

实现步骤

html文档结构和css非常简单,不赘述,直接来代码。

<canvas id='c'></canvas>
html, body {
  height: 100%;
}

body {
  background: black;
  overflow: hidden;
}

canvas {
  max-width: 100%;
}

然后是核心的JS,这里我们同样用到requestAnimationFrame,不再详述,不确切的同学可以参加上篇文章。

为了避免canvas的跨域问题,这里使用base64的方式使用logo图片,图片转base64的工具可以使用这个。base64的方式太占篇幅,我们放到一个变量里,扔在代码的最前方,然后设置canvas,加载图像。

//数据存储,Base64图片信息,太长了占屏太多,请使劲往下拉。
var picUrl = "data:image/png;base64,……";
//canvas基础设置
var canvas = document.getElementById("c"),
	ctx = canvas.getContext("2d"),
	w = canvas.width = window.innerWidth,
	h = canvas.height = window.innerHeight,
	logoParticles = [],
	particleIndex = 0,
	logo = new Image(),
	hue = 0;
//设置图像
logo.src = picUrl;

当图像加载完成后,绘制图像,获取图像像素点,遍历像素点绑定粒子。

//加载完成后,获取图像像素,将粒子绑定在图像像素上
logo.onload = function() {
	var posX = (w - this.width) / 2,
		posY = (h - this.height) / 2;
	//绘制图形
	ctx.drawImage(this, posX, posY);
	//获取像素点
	var imgData = ctx.getImageData(0, 0, w, h),
		pixels = imgData.data;
	//遍历像素点,绑定粒子
	for (var y = 0; y < imgData.height; y += 3) {
		for (var x = 0; x < imgData.width; x += 3) {
			var alpha = pixels[((imgData.width * y) + x) * 4 + 3];
			if (alpha > 0) {
				logoParticles.push(new Particle(x, y));
			}
		}
	}
	//调用动画
	animate();
};

接着使用requestAnimationFrame动画机制动画粒子。

//requesetAnimationFrame的方式设置动画
function animate() {
	//调用polyfill
	requestAnimationFrame(animate);
	//本案例动画
	ctx.fillStyle = "rgba(0,0,0,.1)";
	ctx.fillRect(0, 0, w, h);
	for (var i in logoParticles) {
		logoParticles[i].draw();
	}
	hue += 1;
}

粒子类的属性有:origX、origY代表原来的坐标,x、y代表即时坐标,color代表颜色,maxLife代表最大生命周期,lift代表生命时间,vx、vy代表x、y方向的速度,grav代表重力,index代表粒子序号。

粒子类的方法有:draw绘制方法,update动画机制,reset重置,random去随机数。详细代码如下。

//粒子类定义
function Particle(x, y) {
	this.origX = this.x = x;
	this.origY = this.y = y;
	this.color = "white";
	this.maxLife = this.random(20);
	this.life = 0;
	this.vx = this.random(-1, 1);
	this.vy = this.random(-1, 1);
	this.grav = .04;
	this.index = particleIndex;
	logoParticles[particleIndex] = this;
	particleIndex++;
}
//粒子原型,draw、update、reset、random方法
Particle.prototype = {
	constructor: Particle,
	//绘制
	draw: function() {
		ctx.fillStyle = this.color;
		ctx.fillRect(this.x, this.y, 1, 1);
		this.update();
	},
	//动画
	update: function() {
		if (this.life >= this.maxLife) {
			logoParticles[this.index].reset();
		}
		this.x += this.vx;
		this.y += this.vy;
		this.vy += this.grav;
		this.life++;
	},
	//重置
	reset: function() {
		this.x = this.origX;
		this.y = this.origY;
		this.life = 0;
		this.color = "hsl(" + hue + ", 100%, 50%)";
		this.vx = this.random(-1, 1);
		this.vy = this.random(-1, 1);
	},
	//取随机数
	random: function() {
		var min = arguments.length == 1 ? 0 : arguments[0],
			max = arguments.length == 1 ? arguments[0] : arguments[1];
		return Math.random() * (max - min) + min;
	}

};

相关阅读

1.requestAnimationFrame动画控制详解

2. html5烟花绽放效果

3.html5式程序猿表白

4.单击控制爆炸粒子

5.小方框粒子

6.多彩折回弹起粒子

7.逼真火焰效果

8.WebGL酷炫粒子效果

感谢您耐心读完,如果对您有帮助,请支持我

----------------------------------------------------------

前端开发whqet,关注web前端开发,分享相关资源,欢迎点赞,欢迎拍砖。

---------------------------------------------------------------------------------------------------------

9楼qq4120308223小时前
学习了
Re: whqet1小时前
回复qq412030822n谢谢支持。
8楼chenssy4小时前
这个不错!!!
Re: whqet4小时前
回复chenssyn谢谢夸奖,共同进步哈。
7楼mingshanjianke12小时前
不错
Re: whqet12小时前
回复mingshanjianken谢谢!
Re: mingshanjianke4小时前
回复mingshanjianken恩恩
6楼u010850027昨天 14:26
好炫的效果 `(*∩_∩*)′ 漂亮
Re: whqet昨天 14:59
回复u010850027n谢谢,共同进步哈。
5楼soledadzz昨天 14:12
您的文章已被推荐到博客首页和个人页侧边栏推荐文章,感谢您的分享。
Re: whqet昨天 14:25
回复soledadzzn谢谢支持。
4楼qq_25467035昨天 12:56
学习
Re: whqet昨天 14:12
回复qq_25467035n谢谢支持!
3楼qq_17304257昨天 07:02
看看!!!!!!!!
Re: whqet昨天 11:49
回复qq_17304257n谢谢关注。
2楼sinat_24954001前天 16:43
赞,加油,已投票。
Re: whqet昨天 22:05
回复sinat_24954001n感谢支持。
1楼longwenjie前天 15:06
null
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

  • ModernUI课程:定义一个Logo

    ModernUI教程:定义一个Logo ModernWindow的标题栏包含了一块区域用来显示自定义的窗体Logo: 这个窗体logo通过ModernWindow.LogoD...

  • Django忘记管理员账号和密码的解决方法

    Django忘记管理员账号和密码的解决办法 看着Django的教程学习搭建网站,结果忘记第一次创建的账号和密码了。结果搭建成功以后,一直...

  • GO语言小结(1)——基本知识

    GO语言总结(1)——基本知识 1、注释(与C++一样)   行注释://  块注释:/*   ...  */ 2、标识符   可以这么说,除了数字开头...

  • golang 惯用的文件读取方式

    golang 常用的文件读取方式 Golang 的文件读取方法很多,刚上手时不知道怎么选择,所以贴在此处便后速查。 一次性读取 小文件推荐一...

  • 查询深圳市通相关信息

    查询深圳通相关信息 用 HTTP.GET 从开放 API 中查询深圳通信息,然后将 JSON 数据存入结构体中,再格式化输出。 注意:获取的并不是实...

  • Go语言设计模式实践:结合(Composite)

    Go语言设计模式实践:组合(Composite) 关于本系列 这个系列首先是关于Go语言实践的。在项目中实际使用Go语言也有段时间了,一个体会就...

  • 列出索引和遍历目录

    列出目录和遍历目录 获取目录列表用 ioutil.ReadDir(),遍历目录用 filepath.Walk(),使用方法请参考文章示例。 示例代码: package ma...

  • io 包的惯用接口速记

    io 包的常用接口速记 我没有 C/C++ 基础,没有接口的概念,且从 Python 投奔而来,Python 的极简主义(一个结果往往只提供一个方法),让我在...

  • 代理服务扩充

    代理服务扩展 之前自己实现了一个代理服务,当时考虑的是只要支持SOCKS5就好了,因为我经常用CHROME,配合着SwitchySharp,体验还是很棒...

  • 文件的创造与打开

    文件的创建与打开 文件操作是个很重要的话题,使用也非常频繁,熟悉如何操作文件是必不可少的。Golang 对文件的支持是在 os package ...

热门推荐: