一款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伸缩布局盒模型Flex布局
Aug 20 HTML / CSS
纯CSS绘制漂亮的圆形图案效果
May 07 HTML / CSS
CSS3实现闪烁动画效果的方法
Feb 09 HTML / CSS
CSS3下的渐变文字效果实现示例
Mar 02 HTML / CSS
使用HTML5的链接预取功能(link prefetching)给网站提速
Dec 13 HTML / CSS
html5 Canvas画图教程(10)—把面拆成线条模拟出圆角矩形
Jan 09 HTML / CSS
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
Jun 09 HTML / CSS
HTML 5 input placeholder 属性如何完美兼任ie
May 12 HTML / CSS
canvas进阶之如何画出平滑的曲线
Oct 15 HTML / CSS
Html5写一个简单的俄罗斯方块小游戏
Dec 03 HTML / CSS
详解如何使用rem或viewport进行移动端适配
Aug 14 HTML / CSS
table不让td文字溢出操作方法
Dec 24 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
多数据表共用一个页的新闻发布
2006/10/09 PHP
PHP动态生成指定大小随机图片的方法
2016/03/25 PHP
php 使用html5实现多文件上传实例
2016/10/24 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
laravel框架中间件 except 和 only 的用法示例
2019/07/12 PHP
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
js获取url中&quot;?&quot;后面的字串方法
2014/05/15 Javascript
jQuery.prop() 使用详解
2015/07/19 Javascript
angularjs自定义ng-model标签的属性
2016/01/21 Javascript
jQuery 3.0十大新特性最终版发布
2016/07/14 Javascript
JavaScript中关于iframe滚动条的去除和保留
2016/11/17 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
2017/05/02 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
npm scripts 使用指南详解
2018/10/08 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
JS实现提示框跟随鼠标移动
2019/08/27 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
[01:27]DOTA2电竞之夜 今夜共饮庆功酒
2014/08/02 DOTA
python实现斐波那契递归函数的方法
2014/09/08 Python
python的变量与赋值详细分析
2017/11/08 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
Python求均值,方差,标准差的实例
2019/06/29 Python
Python pandas RFM模型应用实例详解
2019/11/20 Python
python随机生成大小写字母数字混合密码(仅20行代码)
2020/02/01 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
使用Python+Appuim 清理微信的方法
2021/01/26 Python
面向对象编程的优势是什么
2015/12/17 面试题
信息工程学院毕业生推荐信
2013/11/05 职场文书
仓库管理专业个人自我评价范文
2013/11/11 职场文书
书法培训心得体会
2014/01/05 职场文书
学期研究性学习个人的自我评价
2014/01/09 职场文书
《一件运动衫》教学反思
2014/02/19 职场文书
人事经理岗位职责
2014/04/28 职场文书
团队队名口号大全
2014/06/06 职场文书
挂职锻炼工作总结2015
2015/05/28 职场文书
创业计划书之农家乐
2019/10/09 职场文书