返回列表 发新帖

一款html5 canvas实现的图片玻璃碎片特效

227.5k 8
swmozowtfl 发表于 2015-7-10 22:25:43|湖北 | 查看全部 阅读模式
html5 canvas实现图片玻璃碎片特效,图片以玻璃碎片的形式出现到界面中,然后似玻璃被打碎的效果渐消息,效果很不错,喜欢的朋友可以参考下
1 B5 \) G2 O6 _5 u  ~) B今天要为大家带来一款html5 canvas实现的图片玻璃碎片特效。图片以玻璃碎片的形式出现到界面中,然后似玻璃被打碎的效果渐消息。效果图如下:
0 Y1 u: g+ Z! g8 V, v3 t8 p5 I

4 p# f8 R4 \9 v0 e6 q                               
登录/注册后可看大图

. y( M: t7 P5 e7 r  G% u) w+ X源码下载
+ ]8 D5 O. h% g+ uhtml代码: * ]- M& `8 `: }2 c9 b
代码如下:
2 t. q+ t* |3 r9 W# F" O4 K* v
<img src=city_copy.jpg id=src_img class=hidden>
1 h# U- o/ h. z! j) J<div id=container style=-webkit-perspective: 500px;> # Y; @% k: L& \% h
<div>
0 C( `) h3 V1 Y* s/ a<script src=delaunay.js></script>
( \, c. B" U1 g<script src=tweenmax.min.js></script> ' M$ ^% h* T3 x
js代码: ; ?5 A; a- b1 ?3 K/ B% y
代码如下:
6 B" s9 O" @2 f6 n9 y
// canvas settings ! y, @, P; V+ v/ K( [( q- d
var imagewidth = 768, & M5 {( g# J% V4 ?( l
imageheight = 485; ) T7 p" f/ d) r7 S" L: b
var vertices = [],
$ n0 i; }& b. k- dindices,
/ X7 p  b  c+ zboxes = []; 9 B" q7 u( z5 t  _6 i: z/ `# l
var image,
! W* _6 v% H) J$ K" K6 B! q9 t9 @; t7 nfragments = [], # _1 v* r* F  h* M
container = document.getelementbyid('container'); / \4 p$ O8 ?4 Z5 r
window.onload = function () { # h, n+ r6 O0 ], `
image = document.getelementbyid('src_img');
. t& j9 W8 o! N9 O; P: ntriangulate();
* w# o- X' u8 i# H, U& v' C- G* h( Hmakeboxes(); ; V0 Y5 t6 L4 k
makefragments(); 3 P/ k$ N9 K0 {
};
  J% {9 V' x& Q' X6 ^function triangulate() {
! s0 {8 H* H$ e' lvar x, $ O& T( ]( T4 w# Z' u$ f
y, 5 l6 T0 n' `+ X
dx = imagewidth / 8,
0 G, H; s2 r3 z- I2 W6 Rdy = imageheight / 8,
1 n0 M" G5 t- v4 `: Doffset = 0.5; * _6 a# F$ ?$ R( M7 l+ N- |$ M! M. b/ W
for (var i = 0; i <= imagewidth; i += dx) {
! \) [/ _) t* s) m+ lfor (var j = 0; j <= imageheight; j += dy) { 3 H  n8 N; g# U4 \% n5 y; T
if (i && (i !== imagewidth)) x = i + randomrange(-dx * offset, dx * offset); ' j- A- y- \# o! x0 u' a7 |
else x = i; % n' c; s5 k0 x7 r4 w+ p
if (j && (j !== imageheight)) y = j + randomrange(-dy * offset, dy * offset);
1 r& e5 R- f& |. I/ _$ @4 W2 felse y = j; - l8 ~+ {& e" c/ J* F
vertices.push([x, y]); $ U* m+ }3 t1 c$ C
}
. A# [# Z  t$ T- v}
( Z. h; z$ Z' xindices = delaunay.triangulate(vertices); - w$ [9 [5 z. I! w. ^- Q
}
" f5 C" f" K' i. T$ z+ Y0 D' Ifunction makeboxes() {
' n5 w( o7 `' `) Q. c3 N& F) rvar p0, p1, p2,
9 W  j0 p" r" H+ yxmin, xmax, % K% b9 e: H; p2 x7 Y" ~7 s
ymin, ymax; ; o1 j- B3 p. \+ \2 d
for (var i = 0; i < indices.length; i += 3) {
. t) S# @* u; a0 ?9 ep0 = vertices[indices[i + 0]]; " q5 `' @* D* Z# _( K) h
p1 = vertices[indices[i + 1]]; 7 [' T  j1 f  h
p2 = vertices[indices[i + 2]];
) U3 V: e, U' B0 K8 e9 i$ Lxmin = math.min(p0[0], p1[0], p2[0]);
) E/ Y* o( K/ a4 Kxmax = math.max(p0[0], p1[0], p2[0]); 0 D: s" Y6 a/ w
ymin = math.min(p0[1], p1[1], p2[1]); 1 f( C( e7 N' i4 ]6 T$ k# J" C
ymax = math.max(p0[1], p1[1], p2[1]);
4 _+ Z2 f5 k  u" v. Cboxes.push({ ! O* v5 g2 ^8 e4 V* a! H2 q; n
x: xmin, ; {! J/ k! q/ S, V  e( j
y: ymin,
; X' T: C3 R1 L' t+ o0 r+ ow: xmax - xmin, ) ?1 h3 m5 [5 N; s" D/ H% H% Q
h: ymax - ymin , f% ]- n( A, N: s: x" b5 n
}); # b3 \( Q! T. E. e
} 0 |: R, R3 [! ]+ |2 G
}
3 a1 u9 |- ]+ v4 `# Z9 bfunction makefragments() {
2 S) x7 M4 ]0 X# ]7 p- |  Kvar p0, p1, p2,
. D7 d7 ~# Q9 S" Y" N' Kbox, * ]5 r3 p! d& e3 i
fragment;
0 ^2 K, d. l" L2 z0 R  itweenmax.set(container, { perspective: 500 }); % L5 p3 q0 V' N7 q" }
var tl0 = new timelinemax({ repeat: -1 });
  g2 {- q/ Q, g& `3 V" s" g0 [for (var i = 0; i < indices.length; i += 3) {
( R- J: X- B% dp0 = vertices[indices[i + 0]]; ( _) Y* F" f) J6 ^. d, E. v8 Z& A5 B% T
p1 = vertices[indices[i + 1]];
, c# s: U- t/ ?7 }; G5 {6 Cp2 = vertices[indices[i + 2]];
% i9 Y$ s) ]2 C2 k; O3 kbox = boxes[i / 3]; 8 j4 S; O( m3 d( w
fragment = new fragment(p0, p1, p2, box);
8 O! L. [. H, G" _4 J+ H) {var rx = randomrange(30, 60) * ((i % 2) ? 1 : -1); 0 U9 T2 \* y/ h4 i  B
var ry = randomrange(30, 60) * ((i % 2) ? -1 : 1);
6 ?* e+ P* F; Q. \3 }- hvar tl1 = new timelinemax(); % L- A5 M- P  \
tweenmax.set(fragment.canvas, { ; K5 c6 G; L* |' M5 g0 m0 d3 s
y: box.y - 1000
) p& @2 d4 Q) _/ B  ~. {0 ^3 j7 l}); / D- \5 K" Y9 K3 {8 I
tl1.to(fragment.canvas, randomrange(0.9, 1.1), { $ }; j5 q+ r+ B2 [; j
y: box.y, ' W: p5 W( {3 L, L
ease: back.easeout 9 \/ q* r2 n# S/ e' T
});
# B! w3 _6 z7 dtl1.to(fragment.canvas, 0.5, { # w2 Y; q' h2 v$ M9 N" \
z: -100,
' _# b6 e" A/ N3 B* Fease: cubic.easein, 4 T$ H7 z& _1 I$ I
delay: 0.4
7 M) U1 Q0 E7 o5 T});
. A) n; [! `$ K& ptl1.to(fragment.canvas, randomrange(1, 1.2), {
, i* N6 A: T) W. n$ Vrotationx: rx,
+ i0 Z8 T  O( c; Urotationy: ry,
/ w) \. V: ]% D6 e7 A+ Az: 250,
' d) a+ W: P; R% \/ Walpha: 0,
3 O: i' j3 y6 wease: cubic.easeout * H3 m7 M9 F# |8 l
}); 7 f9 Z8 T) Q" }/ ^8 f0 `2 m
tl0.insert(tl1); " Z. h6 m0 s0 h6 i7 ^
fragments.push(fragment);
: D" J6 z  c  y! k, L: g: L, V+ Ycontainer.appendchild(fragment.canvas); ! h* ^2 Q7 l* ^" g( G
} : q9 k2 R. r1 K' b5 y
} 5 H6 ~& @9 v( k% W* \  o# K- _
function randomrange(min, max) {
1 q9 [# w9 |* Ureturn min + (max - min) * math.random(); . ]7 E1 |& s/ o2 q2 D
} + r/ e. W5 E) @! ~$ e
fragment = function (v0, v1, v2, box) { 5 l! z/ l$ T: k7 l6 \2 x4 @
this.v0 = v0;
/ u, _, N  z" Z( x: a( Q( bthis.v1 = v1; $ K& I, {8 N( n* S
this.v2 = v2;
+ P1 l" v# @) D. d- ^9 d' y2 ?0 Athis.box = box; 2 B* ^8 C0 ]/ }7 }2 k9 D$ X
this.canvas = document.createelement('canvas'); 1 J  K; w- V4 ?9 @1 N
this.canvas.width = this.box.w; " I+ b& R% L7 {$ g
this.canvas.height = this.box.h; + _& }0 K- e9 o3 @. R% Q4 ^) n
this.canvas.style.width = this.box.w + 'px';
! `* H+ i) C3 f: Z/ a4 othis.canvas.style.height = this.box.h + 'px';
" U0 e% i0 D" t1 Tthis.ctx = this.canvas.getcontext('2d');
4 ~7 L! Z! e: O7 Wtweenmax.set(this.canvas, {
. m( [3 G+ K  v- Rx: this.box.x, 7 y+ M/ B2 B6 S+ e& E% d4 H* E% n
y: this.box.y
; f0 r$ ^/ N* Y/ B* @( H}); & f" f* T" {7 o+ I6 j
this.ctx.translate(-this.box.x, -this.box.y);
# ^, p" H2 ^/ v9 _this.ctx.beginpath();
  ^: c$ b" a; p5 Rthis.ctx.moveto(this.v0[0], this.v0[1]);
& w* |# b+ ?  x. A. R& u, E: nthis.ctx.lineto(this.v1[0], this.v1[1]); 7 |) z0 Z' Q3 b( ?
this.ctx.lineto(this.v2[0], this.v2[1]);
4 L9 m, P$ m  |& Cthis.ctx.closepath(); 1 r; j$ r9 _) |& l, l
this.ctx.clip(); 3 [" c& }- z" m! D# q3 ^: w
this.ctx.drawimage(image, 0, 0); 2 e% @* ], u) v, ^
}; //@ sourceurl=pen.js
" W9 D, [" Y8 {! a8 G: g/ h- D( s: m# I  R6 }1 I) h5 l9 |
更多网页制作信息请查看: 网页制作

回复|共 8 个

buingeEvineus 发表于 2015-11-7 22:47:02|美国 | 查看全部
感觉楼主说的很不错,我也很赞同
wwzcdenleclv 发表于 2015-11-7 22:47:02|美国 | 查看全部
挨骂也是幸福~~~
wwdu926a 发表于 2015-11-7 22:47:14|美国 | 查看全部
我刚来~~~嘿嘿~~此声明最终解释权归本人所有。
effoggikeftor 发表于 2015-11-7 22:47:17|法国 | 查看全部
看你快沉底了~~~~~~
gevaemaidovef 发表于 2015-11-7 22:47:58|加拿大 | 查看全部
这个论坛值得推荐,给了我们这么好的一个平台
tohme 发表于 2015-11-12 15:45:29|INNA | 查看全部
风沙就是由无数松散沙粒组成的,但是他们却又紧密的联系在一起,那股叱诧风云,横击 而过的气概相信大家在作者的文章里也能体会的出来。如果有读者还不能体会的,请参考
wwdu926a 发表于 2015-11-12 15:45:38|瑞典 | 查看全部
成长可以说已经是很幸福的了。但在另一方面,作者也不是温室里的花*,只能作些鸳鸯蝴蝶 的文章。在前面我已经说过了,这篇文章比形散神聚更胜一筹。诸位见过大风沙没有
Mqokjdvq 发表于 2015-11-12 15:45:45|Reserved | 查看全部
感谢党和人民的关爱~~~

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

得知互动是一个融创意、设计、开发、营销、生活、互联网于一体的专业交流分享平台。
Copyright © 2026 得知互动-专注Ai与站长技术交流社区-Ai交流平台 版权所有 All Rights Reserved. Powered by Discuz! X5.0 鄂ICP备15006301号-5|鄂公网安备 42018502006730号
关灯 在本版发帖 扫一扫添加QQ客服 返回顶部
快速回复 返回顶部 返回列表