一款html5 canvas实现的图片玻璃碎片特效


Posted in HTML / CSS onSeptember 11, 2014

今天要为大家带来一款html5 canvas实现的图片玻璃碎片特效。图片以玻璃碎片的形式出现到界面中,然后似玻璃被打碎的效果渐消息。效果图如下:

一款html5 canvas实现的图片玻璃碎片特效 

源码下载 

html代码:

复制代码
代码如下:

<img src="city_copy.jpg" id="src_img" class="hidden">
<div id="container" style="-webkit-perspective: 500px;">
<div>
<script src="delaunay.js"></script>
<script src="TweenMax.min.js"></script>


js代码:
复制代码
代码如下:

// canvas settings
var imageWidth = 768,
imageHeight = 485;
var vertices = [],
indices,
boxes = [];
var image,
fragments = [],
container = document.getElementById('container');
window.onload = function () {
image = document.getElementById('src_img');
triangulate();
makeBoxes();
makeFragments();
};
function triangulate() {
var x,
y,
dx = imageWidth / 8,
dy = imageHeight / 8,
offset = 0.5;
for (var i = 0; i <= imageWidth; i += dx) {
for (var j = 0; j <= imageHeight; j += dy) {
if (i && (i !== imageWidth)) x = i + randomRange(-dx * offset, dx * offset);
else x = i;
if (j && (j !== imageHeight)) y = j + randomRange(-dy * offset, dy * offset);
else y = j;
vertices.push([x, y]);
}
}
indices = Delaunay.triangulate(vertices);
}
function makeBoxes() {
var p0, p1, p2,
xMin, xMax,
yMin, yMax;
for (var i = 0; i < indices.length; i += 3) {
p0 = vertices[indices[i + 0]];
p1 = vertices[indices[i + 1]];
p2 = vertices[indices[i + 2]];
xMin = Math.min(p0[0], p1[0], p2[0]);
xMax = Math.max(p0[0], p1[0], p2[0]);
yMin = Math.min(p0[1], p1[1], p2[1]);
yMax = Math.max(p0[1], p1[1], p2[1]);
boxes.push({
x: xMin,
y: yMin,
w: xMax - xMin,
h: yMax - yMin
});
}
}
function makeFragments() {
var p0, p1, p2,
box,
fragment;
TweenMax.set(container, { perspective: 500 });
var tl0 = new TimelineMax({ repeat: -1 });
for (var i = 0; i < indices.length; i += 3) {
p0 = vertices[indices[i + 0]];
p1 = vertices[indices[i + 1]];
p2 = vertices[indices[i + 2]];
box = boxes[i / 3];
fragment = new Fragment(p0, p1, p2, box);
var rx = randomRange(30, 60) * ((i % 2) ? 1 : -1);
var ry = randomRange(30, 60) * ((i % 2) ? -1 : 1);
var tl1 = new TimelineMax();
TweenMax.set(fragment.canvas, {
y: box.y - 1000
});
tl1.to(fragment.canvas, randomRange(0.9, 1.1), {
y: box.y,
ease: Back.easeOut
});
tl1.to(fragment.canvas, 0.5, {
z: -100,
ease: Cubic.easeIn,
delay: 0.4
});
tl1.to(fragment.canvas, randomRange(1, 1.2), {
rotationX: rx,
rotationY: ry,
z: 250,
alpha: 0,
ease: Cubic.easeOut
});
tl0.insert(tl1);
fragments.push(fragment);
container.appendChild(fragment.canvas);
}
}
function randomRange(min, max) {
return min + (max - min) * Math.random();
}
Fragment = function (v0, v1, v2, box) {
this.v0 = v0;
this.v1 = v1;
this.v2 = v2;
this.box = box;
this.canvas = document.createElement('canvas');
this.canvas.width = this.box.w;
this.canvas.height = this.box.h;
this.canvas.style.width = this.box.w + 'px';
this.canvas.style.height = this.box.h + 'px';
this.ctx = this.canvas.getContext('2d');
TweenMax.set(this.canvas, {
x: this.box.x,
y: this.box.y
});
this.ctx.translate(-this.box.x, -this.box.y);
this.ctx.beginPath();
this.ctx.moveTo(this.v0[0], this.v0[1]);
this.ctx.lineTo(this.v1[0], this.v1[1]);
this.ctx.lineTo(this.v2[0], this.v2[1]);
this.ctx.closePath();
this.ctx.clip();
this.ctx.drawImage(image, 0, 0);
}; //@ sourceURL=pen.js
HTML / CSS 相关文章推荐
使用CSS3制作饼状旋转载入效果的实例
Jun 23 HTML / CSS
纯CSS3实现扇形动画菜单(简化版)实例源码
Jan 17 HTML / CSS
HTML5文档结构标签
Apr 21 HTML / CSS
html+css实现自定义图片上传按钮功能
Sep 04 HTML / CSS
html5 canvas 画图教程案例分析
Nov 23 HTML / CSS
html5 浏览器支持 如何让所有的浏览器都支持HTML5标签样式
Dec 07 HTML / CSS
HTML5中input输入框默认提示文字向左向右移动的示例代码
Sep 10 HTML / CSS
CSS 还能这样玩?奇思妙想渐变的艺术
Apr 27 HTML / CSS
为什么你写的height:100%不起作用
May 10 HTML / CSS
HTML通过表单实现酒店筛选功能
May 18 HTML / CSS
关于CSS浮动与取消浮动的问题
Jun 28 HTML / CSS
css中:last-child不生效的解决方法
Aug 05 HTML / CSS
基于html5 canvas实现漫天飞雪效果实例
Sep 10 #HTML / CSS
html5中的input新属性range使用记录
Sep 05 #HTML / CSS
让IE下支持Html5的placeholder属性的插件
Sep 02 #HTML / CSS
html5摇一摇代码优化包括DeviceMotionEvent等等
Sep 01 #HTML / CSS
Html5 FileReader实现即时上传图片功能实例代码
Sep 01 #HTML / CSS
html5定位获取当前位置并在百度地图上显示
Aug 22 #HTML / CSS
HTML5 transform三维立方体实现360无死角三维旋转效果
Aug 22 #HTML / CSS
You might like
适用于php-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
php中解析带中文字符的url函数分享
2015/01/20 PHP
PHPCMS2008广告模板SQL注入漏洞修复
2016/10/11 PHP
Thinkphp 框架扩展之类库扩展操作详解
2020/04/23 PHP
PHP7 其他语言层面的修改
2021/03/09 PHP
JavaScript获取文本框内选中文本的方法
2015/02/20 Javascript
jQuery实现列表内容的动态载入特效
2015/08/08 Javascript
jQuery+css3实现转动的正方形效果(附demo源码下载)
2016/01/27 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
angular和BootStrap3实现购物车功能
2017/01/25 Javascript
koa2使用ejs和nunjucks作为模板引擎的使用
2018/11/27 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
[48:41]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
python getopt详解及简单实例
2016/12/30 Python
python迭代dict的key和value的方法
2018/07/06 Python
python3实现猜数字游戏
2020/12/07 Python
Python 实现数据结构-循环队列的操作方法
2019/07/17 Python
python+rsync精确同步指定格式文件
2019/08/29 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
2020/04/26 Python
windows支持哪个版本的python
2020/07/03 Python
Python创建简单的神经网络实例讲解
2021/01/04 Python
俄罗斯厨房产品购物网站:COOK HOUSE
2021/03/15 全球购物
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
介绍一下常见的木马种类
2014/11/15 面试题
金融专业个人的自我评价
2013/10/18 职场文书
操行评语大全
2014/04/30 职场文书
党员先锋岗事迹材料
2014/05/08 职场文书
大型活动组织方案
2014/05/10 职场文书
优秀毕业生求职信
2014/06/05 职场文书
2014年信用社工作总结
2014/11/25 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
硕士毕业答辩开场白
2015/05/27 职场文书
律师催款函范文
2015/06/24 职场文书
2016年感恩母亲节活动总结
2016/04/01 职场文书
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python