首页 > 编程 > HTML > 正文

一款html5 canv,as实现的图片玻璃碎片特效

2020-03-24 15:56:10
字体:
来源:转载
供稿:网友

今天要为大家带来一款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

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表