html5 canvas实现图片玻璃碎片特效,图片以玻璃碎片的形式出现到界面中,然后似玻璃被打碎的效果渐消息,效果很不错,喜欢的朋友可以参考下; x1 X! N' M8 l5 j- q1 D2 _
今天要为大家带来一款html5 canvas实现的图片玻璃碎片特效。图片以玻璃碎片的形式出现到界面中,然后似玻璃被打碎的效果渐消息。效果图如下: + C3 L& h& y) @1 z P
' m; P' }6 a8 o) |* @5 F0 D) P* G7 G& K
源码下载
3 h( V, i: P# q2 [/ _0 ]6 Z( r8 {html代码:
y5 c+ \2 Q1 ?代码如下:$ x( ?9 z7 N1 [$ M$ G+ a- ?- z C: G
<img src=city_copy.jpg id=src_img class=hidden>
1 e1 Z+ e9 k8 e<div id=container style=-webkit-perspective: 500px;>
; h# t- X# z, v9 `9 D4 k% L8 Q* C) A8 Q<div>
) c* a! g" j# g<script src=delaunay.js></script> 6 |" u& j3 \' |$ s& W
<script src=tweenmax.min.js></script> u4 o! Y! r$ z" ^/ b; W
js代码:
9 n" m7 X o/ S- F& e. B( r代码如下:6 J8 D& z- B8 O4 O9 n+ a
// canvas settings / Z, e* h9 l; g/ [
var imagewidth = 768, . H4 h& A* c" Z8 ? O& ^+ r! R* t
imageheight = 485;
" Q+ s8 ?6 Y) H$ M# C3 Evar vertices = [], 4 L7 I& W5 G$ I* D5 y$ P
indices,
/ c+ Y" S" K" M$ Y* S4 \6 {1 E/ i# Vboxes = []; , o0 P- T3 a, b3 f
var image, 0 P7 P' ^% p3 t
fragments = [],
- E: S; ^: e9 y& D- c Lcontainer = document.getelementbyid('container'); : K# w! A+ c. v( c; S6 g
window.onload = function () { 1 X. X; b1 _* I/ ~/ `# z
image = document.getelementbyid('src_img');
0 M# k# Y( O( u; t: k: jtriangulate(); / l+ q2 M o; k& p6 j) U
makeboxes(); # P {1 S7 n% Z" r+ Z+ F8 @
makefragments(); / p3 ^' Y4 e9 q' s4 B2 Z
}; * D0 N+ L% v1 _, @% @
function triangulate() {
- J, ]6 |" `9 j4 T7 k5 b" jvar x, 5 y1 D# H6 m& |3 V: q
y, 9 k+ _, S* Z( E, _
dx = imagewidth / 8, 1 O2 j' ~) J( C% m8 ~! l# [: R
dy = imageheight / 8,
" B, s! ~2 \4 noffset = 0.5; , a' d* [) e' L
for (var i = 0; i <= imagewidth; i += dx) {
( f5 s+ h5 p9 y1 jfor (var j = 0; j <= imageheight; j += dy) {
, p0 Q+ S6 d5 A' m6 }! hif (i && (i !== imagewidth)) x = i + randomrange(-dx * offset, dx * offset);
4 \$ R* ?& }" S0 Relse x = i;
& V, t* ?% R4 {. k8 Hif (j && (j !== imageheight)) y = j + randomrange(-dy * offset, dy * offset); 6 G" Z+ a- u9 e9 v
else y = j;
# U, ?* |1 P: l+ t p5 H0 {vertices.push([x, y]);
( X5 U' q6 ]3 Z} : x' B7 }! Q' ^7 R
} 7 b. V f3 E. P8 T; X f+ r7 x8 v
indices = delaunay.triangulate(vertices); 5 n- e, N5 U0 a2 U. i' S) T
}
+ m: A# W( N: _5 w Y1 B( y Dfunction makeboxes() { 5 f; D5 o# w/ `
var p0, p1, p2, $ Z' w; c" l0 F" R; C
xmin, xmax,
) @5 m9 S4 Q" w+ ~7 N/ H0 k% Cymin, ymax;
3 g5 A4 ?5 {& i* c6 pfor (var i = 0; i < indices.length; i += 3) {
, K3 X2 y/ c- Hp0 = vertices[indices[i + 0]];
; Y0 J3 `8 D. }p1 = vertices[indices[i + 1]]; 1 \& y& Q0 Q V( c
p2 = vertices[indices[i + 2]]; 5 Q, y. p! a2 t
xmin = math.min(p0[0], p1[0], p2[0]); 3 h! n% p5 q2 U' y; G2 p
xmax = math.max(p0[0], p1[0], p2[0]); - A# L2 V2 ~/ \! e5 c$ m. [: {) C
ymin = math.min(p0[1], p1[1], p2[1]); ' w( Y, `5 S0 t+ e) y9 E, u
ymax = math.max(p0[1], p1[1], p2[1]); , u- I7 g5 o% ?- T% q2 Z) x
boxes.push({ 9 A. j4 G5 t k: k7 C
x: xmin, - `6 o& e5 o( r+ m. V. @6 K
y: ymin, 3 a6 \* Y( L4 [0 q
w: xmax - xmin, / Y3 O; E4 T1 |3 h& ~/ {) d
h: ymax - ymin . B K. o1 X- @9 g; _2 ~ J
});
% J7 {. ~6 m2 d0 g+ p% F, u5 ]}
u# t. W& t6 x0 l) H; `}
- O( Q0 x, A/ i- `. q, g8 s4 Mfunction makefragments() {
B3 V& `9 p2 s- xvar p0, p1, p2,
2 |; [/ x& e# _0 w! Sbox, ( L, m! a% T; q1 W s8 E
fragment;
. n+ J+ C3 r/ V& b2 U0 y$ Ktweenmax.set(container, { perspective: 500 }); 3 \; ^2 ^) ?, g1 B
var tl0 = new timelinemax({ repeat: -1 });
2 B0 p8 R+ q$ ]" jfor (var i = 0; i < indices.length; i += 3) {
' x! a, `) z0 g5 ^* W' T) _5 P" Ip0 = vertices[indices[i + 0]];
+ d0 m, @& T" A2 o' j1 x% ~# ] wp1 = vertices[indices[i + 1]]; ' u6 D5 W0 |, H7 h" J/ O/ d/ W8 J& F
p2 = vertices[indices[i + 2]]; 6 I5 [! s! e& x% V+ d
box = boxes[i / 3]; ! h; q4 j% |" h# L: f A- K% J/ E
fragment = new fragment(p0, p1, p2, box);
; y" H8 g V% J0 i6 \0 X: g2 |var rx = randomrange(30, 60) * ((i % 2) ? 1 : -1);
9 J, ^9 y8 d8 h2 Yvar ry = randomrange(30, 60) * ((i % 2) ? -1 : 1);
$ q! V: s8 M* t5 Gvar tl1 = new timelinemax(); / z) v0 h) M) H6 h$ b# O# p! ?
tweenmax.set(fragment.canvas, { * X. o6 Q' `4 C& N% M8 A
y: box.y - 1000
2 a( u, _5 G# [0 s7 b}); - q9 D% S$ S6 w) C
tl1.to(fragment.canvas, randomrange(0.9, 1.1), { 5 d3 O i& [* I: r+ n
y: box.y, b: a$ s; D0 r1 C! n
ease: back.easeout
( ?6 P; d' j5 x$ s8 r' d4 d, T}); ' x+ y% s5 V2 b/ E! K3 K
tl1.to(fragment.canvas, 0.5, { # U t! G$ D2 j2 S0 H! w7 b! n% q
z: -100, / F+ Z( @8 A* p- z
ease: cubic.easein, 4 m6 o- _# V0 t) U! E* N
delay: 0.4 3 P# a V+ P1 a3 j3 P7 T% E- d
});
) q$ j% n, X0 F* t2 H. ztl1.to(fragment.canvas, randomrange(1, 1.2), { 6 z" \1 Y/ I& N; n& z8 g8 g
rotationx: rx, 8 I0 G$ t4 y- ]: E: r
rotationy: ry,
0 w. c( q# R6 o. G( |z: 250,
0 \/ i; A# {; \5 L9 r1 M% Jalpha: 0, % y7 {# m+ o9 m+ j, @/ x8 P8 k
ease: cubic.easeout
4 c: t" w! Q. `! I! J0 u# Q. z" ^- [}); 7 t! u R& c8 z
tl0.insert(tl1); ; W' ^: C5 U- [ S) K( n
fragments.push(fragment);
9 c5 Z. h# ~/ ~1 h1 e9 \; acontainer.appendchild(fragment.canvas);
4 t5 B: Z7 X G9 j2 S# _- ~}
% b0 q* ~7 c. K& M0 u+ u} ! Z; q5 `& x3 g N9 v5 v
function randomrange(min, max) { 9 ]& @! i8 t! {* |
return min + (max - min) * math.random(); , n& s+ @3 ~5 I& T/ X7 H: E
}
6 R3 s1 f2 }1 S5 Y1 i, Hfragment = function (v0, v1, v2, box) {
' h1 M9 G$ n/ `* I3 [2 X* uthis.v0 = v0; f% F+ X# v0 b% q4 h5 V
this.v1 = v1; ( z3 U2 @% l! w6 e M' g
this.v2 = v2; ' f: f, h: d0 L3 T; a6 D6 b
this.box = box; $ k6 ]& J* N6 w: ^& _" b
this.canvas = document.createelement('canvas');
" V; x& x2 N, a* Gthis.canvas.width = this.box.w;
/ h" _/ V1 W" p+ ?3 \4 ` Kthis.canvas.height = this.box.h; * ^$ I# x% q& V4 }" s( a
this.canvas.style.width = this.box.w + 'px';
" B4 A& x! ]2 ?2 d% ^. Zthis.canvas.style.height = this.box.h + 'px';
( f: W) r9 Z/ Z/ g5 ]8 j8 ]% D# othis.ctx = this.canvas.getcontext('2d');
' o" ^; I$ ]! c1 p+ G& I F8 dtweenmax.set(this.canvas, {
2 A' |: U$ Z4 m) v8 [; sx: this.box.x,
1 B w3 `' L5 Z- q( v* x$ k; [y: this.box.y
: E v. J2 Z( U. @* Q( ^2 o}); ; W* ]8 s. s D
this.ctx.translate(-this.box.x, -this.box.y); 8 I* p# y, @4 ~$ Q/ I8 ~7 r
this.ctx.beginpath(); 5 r8 ]7 i) p- }+ [# K
this.ctx.moveto(this.v0[0], this.v0[1]); ! \! L8 {+ {* X T6 h" ]8 M
this.ctx.lineto(this.v1[0], this.v1[1]); ! o/ `0 N% D) i4 s* E9 v
this.ctx.lineto(this.v2[0], this.v2[1]);
9 a/ B, @" y0 S Zthis.ctx.closepath(); 1 u) ~9 ~" Z8 O- ^+ @1 W
this.ctx.clip();
% [3 b) F+ O$ K8 w2 y j: Kthis.ctx.drawimage(image, 0, 0);
$ S! m, D. ~# Y; U, u}; //@ sourceurl=pen.js q% x1 U, Q& i" c s
4 Z7 S* ?& J4 r( n& z更多网页制作信息请查看: 网页制作 |
|