扑面而来的碎片--图片3D炸裂效果初体验
之前逛园子的时候看到 ChokCoco 的爆炸效果作品:【BOOM】一款有趣的Javascript动画效果 (大神英文有没有拼错呀←.←),觉得蛮有意思的,效果如下:

不过觉得这个爆炸效果还是偏软了一点,没有爆炸那种碎片飞溅的感觉,一直念念不忘想要自己做一个3D效果的爆炸动效。这两天在搞一些小动画,就顺便也把3D爆炸做了出来,动画效果:

实现
原理很简单,就是用很多小图片拼凑成大图片,然后让小图片按照一定规律运动形成爆炸效果。这里的爆炸效果用的是 CSS3 的 3D 变换来做的,通过 js 动态改变变换参数形成动画。实现步骤简单说说:
1、图片拼凑
这一步相对简单,用的是很多 div 标签的背景图拼凑的,设置好每个 div 标签的 position 和 background-position 就可以了。这里要注意的一点就是添加 div 标签是记得要用 innerHTML 一次性全部添加进去。虽然这里没有直接显示图片,但是这里还是 new 了一个 image,并将图片拼凑放在 load 事件中执行。效果和代码分别如下(实际效果没格子线的):

var img = new Image();
img.src = 'img/zoro.jpg'; //160*160,or you need to change wrapper's size
img.onload = function () {
var x = y = 0,
div = styleCtn = '',
imgWidth = this.width,
imgHeight = this.height,
pwidth = pheight = 10,
nx = Math.floor(imgWidth / pwidth), //x方向粒子个数
ny = Math.floor(imgHeight / pheight), //y方向粒子个数
wrap = document.getElementById('zd-wrap'); for (var i = 0, num = nx * ny; i < num; i++) {
x = (i % nx) * pwidth;
y = Math.floor(i / ny) * 10;
styleCtn = 'left: ' + x + 'px; top: ' + y + 'px; background-position: ' + (-x) + 'px ' + (-y) + 'px;';
div = div + '<div class="bomb" style="background-image: url(' + this.src + '); ' + styleCtn + '"></div>';
}
wrap.innerHTML = div; //添加图片
};
2、爆炸效果
这一步相对难了许多,因为都是三维的运动,分为平移和翻转两种运动会简单一点。
a)平移运动:在立体空间中的爆炸应该是这样的:

回到平面空间应该是这样的:

从上图可以总结出小块的运动方向,根据小块所处的位置运动方向是不同的,左上角向左上角飞去,右下角向右下角飞去这样。这里应该有一部分小块向屏幕飞来,还有一部分远离屏幕以突出扑面而来的感觉。编程中表现各轴运动的是 translate3d,这里注意屏幕和图片的坐标关系,屏幕的 Y 轴就是现实中的垂直方向、向下为正,Z轴就是面向用户方向。运动总结起来就是:
左上角:vx < 0, vy < 0, vz随机
左下角:vx < 0, vy > 0, vz随机
右上角:vx > 0, vy < 0, vz随机
右下角:vx > 0, vy > 0, vz随机

这里 Y 方向没有严格对半分,有一种整体向上的感觉。加速度的话模仿需要模仿重力: vxa = 0, vya = 0.5 (模仿重力),vza可以适当加点,能加强扑面而来的感觉。
b)翻转运动
翻转效果,就是 X 轴的旋转,为了效果更加逼真需要引入 Y 轴的旋转,可以忽略 z 轴的旋转。因为粒子小块的尺寸很小,所以这里不需要严格控制旋转参数,一方面简化模型,另一方面减轻浏览器负荷。当然也不必引入旋转变量了,直接用 x、y 的坐标代入也可以得到不错的翻转效果: rotateX(xdeg) rotateY(ydeg),我这里引用了 Zachstronaut 的算法:
rotateX: Math.cos(0.1 *ys) + 'rad
rotateY: Math.sin(0.1 * xs) + 'rad
最后设置终止条件,可以根据 粒子小块的x、y 坐标判断是否应该让其退出动画循环。
这样就实现了动画,当然还必须要开启父对象的透视属性,大概设置透视距离 300px 左右就可以了。
后话
我使用的图片尺寸为160*160,粒子尺寸为10*10,在iOS中表现优秀,移动chrome中表现的也还不错。虽然已经调用了 GPU 加速渲染,但已经到了很多国产移动浏览器的上限了,所以不建议再增加粒子数量。性能提升也做了,但是没找到好的突破点,如果你有更好的点子,请联系我!
耗时测试:
   
可以看到瓶颈在 Painting 上,再细分的话主要是图层重组,接着看一下动画过程:

可以看到在最开始的时候出现了密密麻麻的绿框,也就是这里发生了大量的 paint flashing(重绘)。再看我们一开始拼凑背景图的方法,用的是绝对定位+ left + top,这里会导致大量的重绘。虽然你可以在最开始用一个 translate3d(0, 0, 0)来限定渲染层让绿框消失,但并不会有多大的效果,因为主要耗时的是图层合成,并不是绘制。分层是必须的,我也尝试过使用 translate 去代替 left + top,但是效果并不理想,暂时没有想到更好的办法改善渲染性能……
DOM操作方面倒是可以再改善,现在动效的代码是:
 this.nodes[i].style[this.transformProperty] = 'translate3d(' + this.xs[i] + 'px, ' + this.ys[i] + 'px, ' + this.zs[i] + 'px) rotateX(' + Math.cos(0.1 * this.ys[i]) + 'rad) rotateY(' + Math.sin(0.1 * this.xs[i]) + 'rad)';
循环中每次都会操作dom,而且在设置style上还是用属性查找的方式,那这里应该是可以改善的。一是重写style,避免查找属性。二就是重写父对象div里面的innerHTML,就像开头设置背景图一样,一次更新所有粒子块。
不过我在步进调试的时候发现,除了第一次执行时会一个一个地设置粒子块的属性,后面的动画循环中都已经被浏览器优化成整体重写了,每次更新都是全体更新的,所以上面的方法貌似也不能提升太多。真的没想到其他优化的办法了,如果你有点子,请联系我!
如何使用
源码已经放到GitHub(bomb.js)上面去了,有兴趣的同学可以fork来看看,求星星!
我已经将 js+HTML+CSS 都封装好了,设置好容器之后直接引用bomb.js就可以了,如下:
<style type="text/css">
.wrapper {
width: 160px;
margin: 100px auto 0;
position: relative;
cursor: pointer;
perspective: 200px;
}
</style> <div class="wrapper" id="zd-wrap"></div> <script src="js/bomb.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
var explore = new ParticlesTemplate(),
exploreImg = new Image(),
wrapper = document.getElementById('zd-wrap');
exploreImg.src = 'img/zoro.jpg';
exploreImg.onload = function () {
explore.init(exploreImg, wrapper);
wrapper.addEventListener('click', function () {
explore.go();
}, false);
};
</script>
就写到这了,码字不易,随手点赞哈~~~
参考资料:
3) http://www.zachstronaut.com/

(图片出处:小周)
原创文章,转载请注明出处!本文链接:http://www.cnblogs.com/qieguo/p/5491192.html
扑面而来的碎片--图片3D炸裂效果初体验的更多相关文章
- CSS3之图片3D翻转效果(网页效果--每日一更)
		
今天,带来的是纯CSS3的效果--图片3D翻转. 请看效果:亲,请点击这里 这个效果主要还是运用了CSS3的transform变形属性,与上个效果不同的是,这次并不是动画,所以没有采用animatio ...
 - css3图片3D翻转效果
		
点击图片看翻转效果 html结构 <div class="flip"> <div class="front"> <img src= ...
 - jquery图片3D旋绕效果    rotate3Di的操作
		
这是一个图片效果,很简单实用,只需要一个"rotate3Di.js"的插件就行, 关于rotate的用法有如下几种: $(选择器).rotate3Di(30); //把图片3D旋转 ...
 - JQ 实现轮播图(3D旋转图片轮播效果)
		
轮播图效果如下: 代码: <!DOCTYPE html> <html xmlns="/www.w3.org/1999/xhtml"> <head> ...
 - 实现图片旋转木马3D浏览效果
		
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
 - 实现一个图片轮播-3d播放效果
		
前言:最近在做一个音乐播放器,首页要做一个图片轮播,看了bootstrap的carousel插件以及移动端的swipe.js库,都是平面图片轮播的效果,所以自己想着实现类似网易云app里那种3d图片轮 ...
 - CSS3 3D立方体效果-transform也不过如此
		
CSS3系列已经学习了一段时间了,第一篇文章写了一些css3的奇技淫巧,原文戳这里,还获得了较多网友的支持,在此谢过各位,你们的支持是我写文章最大的动力^_^. 那么这一篇文章呢,主要是通过一个3D立 ...
 - jQuery演示10种不同的切换图片列表动画效果
		
经常用到的图片插件演示jQuery十种不同的切换图片列表动画效果 在线演示 下载地址 实例代码 <!DOCTYPE html> <html lang="en" c ...
 - Space.js – HTML 驱动的页面 3D 滚动效果
		
为了让我们的信息能够有效地沟通,我们需要创建用户和我们的媒体之间的强有力的联系.今天我们就来探讨在网络上呈现故事的新方法,并为此创造了一个开源和免费使用的 JavaScript 库称为 space.j ...
 
随机推荐
- 利用bootstrap的carousel.js实现轮播图动画
			
前期准备: 1.jquery.js. 2.bootstrap的carousel.js. 3.bootstrap.css. 如果大家不知道在哪下载,可以联系小颖,小颖把这些js和css可以发送给你. 一 ...
 - 关于VS2015 ASP.NET MVC添加控制器的时候报错
			
调试环境:VS2015 数据库Mysql WIN10 在调试过程中出现类似下两图的同学们,注意啦. 其实也是在学习的过程中遇到这个问题的,找了很多资料都没有正面的解决添加控制器的时候报错的问题,还是 ...
 - nginx源码分析之网络初始化
			
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
 - CRL快速开发框架系列教程十一(大数据分库分表解决方案)
			
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
 - 免费道路 bzoj 3624
			
免费道路(1s 128MB)roads [输入样例] 5 7 21 3 04 5 13 2 05 3 14 3 01 2 14 2 1 [输出样例] 3 2 04 3 05 3 11 2 1 题解: ...
 - arcgis api for js入门开发系列六地图分屏对比(含源代码)
			
上一篇实现了demo的地图标绘模块,本篇新增地图地图分屏对比模块,截图如下(源代码见文章底部): 对效果图的简单介绍一下,在demo只采用了两分屏对比,感兴趣的话,可以在两分屏的基础上拓展,修改css ...
 - Lucene4.4.0 开发之排序
			
排序是对于全文检索来言是一个必不可少的功能,在实际运用中,排序功能能在某些时候给我们带来很大的方便,比如在淘宝,京东等一些电商网站我们可能通过排序来快速找到价格最便宜的商品,或者通过排序来找到评论数最 ...
 - Redis配置文件redis.conf
			
1.地址 2.Units单位 1 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit 2 对大小写不敏感 3.includes包含
 - Linux 权限设置chmod
			
Linux中设置权限,一般用chmod命令 1.介绍 权限设置chmod 功能:改变权限命令.常用参数: 1=x(执行权execute) 2=w(写权write) 4=r(读权Read) setuid ...
 - hadoop 笔记(zookeeper)
			
1.安装 需要提前安装java环境,本文下载zookeeper-3.3.6.tar.gz包. 1.1 tar -zxvf zookeeper-3.3.6.tar.gz 1.2 修改conf中的zoo_ ...