一款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开启硬件加速的使用和坑
Aug 21 HTML / CSS
CSS3 制作旋转的大风车(充满童年回忆)
Jan 30 HTML / CSS
CSS3中:nth-child和:nth-of-type的区别深入理解
Mar 10 HTML / CSS
CSS3动画animation实现云彩向左滚动
May 09 HTML / CSS
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
May 17 HTML / CSS
详解CSS3中字体平滑处理和抗锯齿渲染
Mar 29 HTML / CSS
html5文本内容_动力节点Java学院整理
Jul 11 HTML / CSS
实例教程 利用html5和css3打造一款创意404页面
Oct 20 HTML / CSS
html5将图片转换成base64的实例代码
Sep 21 HTML / CSS
HTML5 拖放(Drag 和 Drop)详解与实例代码
Sep 14 HTML / CSS
AmazeUI在模态框中嵌入表单形成模态输入框
Aug 20 HTML / CSS
HTML基础详解(下)
Oct 16 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读取超大文件的实例代码
2012/04/01 PHP
基于php 随机数的深入理解
2013/06/05 PHP
php购物车实现方法
2015/01/03 PHP
老版本PHP转义Json里的特殊字符的函数
2015/06/08 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
php二维码生成以及下载实现
2017/09/28 PHP
JS 实现导航栏悬停效果(续2)
2013/09/24 Javascript
js菜单点击显示或隐藏效果的简单实例
2014/01/13 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
Bootstrap每天必学之简单入门
2015/11/19 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
2016/08/02 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
2017/01/19 Javascript
select2 ajax 设置默认值,初始值的方法
2018/08/09 Javascript
webpack实现一个行内样式px转vw的loader示例
2018/09/13 Javascript
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
python中as用法实例分析
2015/04/30 Python
python实现根据主机名字获得所有ip地址的方法
2015/06/28 Python
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
Python控制键盘鼠标pynput的详细用法
2019/01/28 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
Python常用类型转换实现代码实例
2020/07/28 Python
露营世界:Camping World
2017/02/02 全球购物
捷克玩具商店:Bambule
2019/02/23 全球购物
美国在线艺术商店:HandmadePiece
2020/11/06 全球购物
电信专业应届生自荐信
2013/09/28 职场文书
车祸赔偿收入证明
2014/01/09 职场文书
公益活动邀请函
2014/02/05 职场文书
节能环保家庭事迹材料
2014/08/27 职场文书
乡镇干部个人对照检查材料思想汇报(原创篇)
2014/09/28 职场文书
财务工作犯错检讨书
2014/10/07 职场文书
学校机关党总支领导班子整改工作方案
2014/10/26 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书
大学生村官驻村工作心得体会
2016/01/23 职场文书
学生检讨书范文
2019/06/24 职场文书
Python办公自动化之Excel(中)
2021/05/24 Python
MySQL分库分表详情
2021/09/25 MySQL