一款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旋转动画实例代码
Sep 11 HTML / CSS
纯css3实现的竖形无限级导航
Dec 10 HTML / CSS
CSS3实现点击放大的动画实例代码
Feb 27 HTML / CSS
CSS3制作圆形滚动进度条动画的示例
Nov 05 HTML / CSS
html5应用缓存_动力节点Java学院整理
Jul 13 HTML / CSS
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
Apr 14 HTML / CSS
使用HTML5的Canvas绘制曲线的简单方法
Sep 08 HTML / CSS
简单整理HTML5的基本特性和语法
Feb 18 HTML / CSS
AmazeUI中各种的导航式菜单与解决方法
Aug 19 HTML / CSS
html+css 实现简易导航栏功能
Apr 07 HTML / CSS
css3实现背景图片颜色修改的多种方式
Apr 13 HTML / CSS
教你做个可爱的css滑动导航条
Jun 15 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 strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
Laravel框架实现简单的学生信息管理平台案例
2019/05/07 PHP
PHP下载文件函数与用法示例
2019/09/27 PHP
两种WEB下的模态对话框 (asp.net或js的分别实现)
2009/12/02 Javascript
jquery animate图片模向滑动示例代码
2011/01/26 Javascript
JavaScript异步调用定时方法并停止该方法实现代码
2012/03/16 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
2016/01/22 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
获取当前月(季度/年)的最后一天(set相关操作及应用)
2016/12/27 Javascript
nodejs处理图片的中间件node-images详解
2017/05/08 NodeJs
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
JavaScript实现的简单Tab点击切换功能示例
2018/07/06 Javascript
Python中time模块和datetime模块的用法示例
2016/02/28 Python
深入理解python try异常处理机制
2016/06/01 Python
Python学生信息管理系统修改版
2018/03/13 Python
python学生管理系统学习笔记
2019/03/19 Python
django一对多模型以及如何在前端实现详解
2019/07/24 Python
Python正则表达式急速入门(小结)
2019/12/16 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
阿联酋航空假期:Emirates Holidays
2018/03/20 全球购物
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
CK巴西官方网站:Calvin Klein巴西
2019/07/19 全球购物
抽象方法、抽象类怎样声明
2014/10/25 面试题
婚礼证婚人证婚词
2014/01/08 职场文书
幼儿园小班教学反思
2014/02/02 职场文书
关于读书的演讲稿1000字
2014/08/27 职场文书
2014年政教处工作总结
2014/12/20 职场文书
小学安全工作总结2015
2015/05/18 职场文书
公司员工离职感言
2015/08/03 职场文书
导游词之海南天涯海角
2019/12/05 职场文书
nodejs利用readline提示输入内容实例代码
2021/07/15 NodeJs
浅谈Java父子类加载顺序
2021/08/04 Java/Android
JavaScript 定时器详情
2021/11/11 Javascript
以下牛机,你有几个
2022/04/05 无线电