一款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 Media Queries中媒体属性的使用
Feb 29 HTML / CSS
详解如何在css3打包后自动追加前缀插件:autoprefixer
Dec 18 HTML / CSS
css3 transform过渡抖动问题解决
Oct 23 HTML / CSS
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
Mar 05 HTML / CSS
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
Jan 30 HTML / CSS
HTML5新增的表单元素和属性实例解析
Jul 07 HTML / CSS
HTML5 canvas标签实现刮刮卡效果
Apr 24 HTML / CSS
HTML5新特性之用SVG绘制微信logo
Feb 03 HTML / CSS
Canvas制作的下雨动画的示例
Mar 06 HTML / CSS
详解Html5项目适配系统深色模式方案总结
Apr 14 HTML / CSS
使用CSS定位HTML元素的实现方法
Jul 07 HTML / CSS
el-form每行显示两列底部按钮居中效果的实现
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
无刷新动态加载数据 滚动条加载适合评论等页面
2013/10/16 PHP
php像数组一样存取和修改字符串字符
2014/03/21 PHP
yii中widget的用法
2014/12/03 PHP
ThinkPHP模型详解
2015/07/27 PHP
php实现的Curl封装类Curl.class.php用法实例分析
2015/09/25 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
测试你的JS的掌握程度的代码
2009/12/09 Javascript
Jquery Ajax请求代码(2)
2011/01/07 Javascript
jQuery计算textarea中文字数(剩余个数)的小程序
2013/11/28 Javascript
浅析JavaScript基本类型与引用类型
2014/05/28 Javascript
Jquery自定义button按钮的几种方法
2014/06/11 Javascript
js实现的捐赠管理完整实例
2015/01/20 Javascript
javascript实现仿腾讯游戏选择
2015/05/14 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
原生js封装自定义滚动条
2017/03/24 Javascript
微信小程序表单验证插件WxValidate的二次封装功能(终极版)
2019/09/03 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
如何区分vue中的v-show 与 v-if
2020/09/08 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
浅谈numpy生成数组的零值问题
2018/11/12 Python
对python中基于tcp协议的通信(数据传输)实例讲解
2019/07/22 Python
python3 自动打印出最新版本执行的mysql2redis实例
2020/04/09 Python
浅谈Selenium 控制浏览器的常用方法
2020/12/04 Python
美国著名的团购网站:Woot
2016/08/02 全球购物
澳大利亚墨尔本的在线时装店:LORETA
2018/09/14 全球购物
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
学校元旦晚会方案
2014/02/19 职场文书
优秀员工推荐信
2014/05/10 职场文书
安全责任书怎么写
2014/07/28 职场文书
房屋租赁协议书
2014/10/18 职场文书
生日祝酒词大全
2015/08/10 职场文书
HTML+VUE分页实现炫酷物联网大屏功能
2021/05/27 Vue.js
基于Python实现对比Exce的工具
2022/04/07 Python
解决WINDOWS电脑开机后桌面没有任何图标
2022/04/09 数码科技