返回列表 发新帖

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

227.2k 8
swmozowtfl 发表于 2015-7-10 22:25:43|湖北 | 查看全部 阅读模式
html5 canvas实现图片玻璃碎片特效,图片以玻璃碎片的形式出现到界面中,然后似玻璃被打碎的效果渐消息,效果很不错,喜欢的朋友可以参考下9 k0 Q7 A9 @/ ?
今天要为大家带来一款html5 canvas实现的图片玻璃碎片特效。图片以玻璃碎片的形式出现到界面中,然后似玻璃被打碎的效果渐消息。效果图如下:
6 x& X; O% R! P) ~. Z3 k

# D, A# Y: {  t0 h: Z  ?                               
登录/注册后可看大图
  S. e* @& I( M; I+ e& k# ^
源码下载
# |# _/ |# x2 V" ~% x2 F/ g# D3 Ohtml代码:
% w' h( D# p! G代码如下:9 y8 T: Y7 ?1 i- {& b* x
<img src=city_copy.jpg id=src_img class=hidden> 0 O6 b" o7 v2 U! y  e5 f7 h* F
<div id=container style=-webkit-perspective: 500px;> 3 j5 p  `# X5 ^! t. c9 v
<div>
- l. A" ]' ~, s5 X<script src=delaunay.js></script> , a2 v0 g: B3 ]. c" k9 T
<script src=tweenmax.min.js></script>
+ G( u' S7 ]$ l8 B: T; X! Ujs代码:
+ ^1 w3 B8 f3 w代码如下:
& j8 ]* J. X9 D5 d' C6 Z* W5 c
// canvas settings
7 J- }' M3 B$ @: ?var imagewidth = 768, & Z8 x3 h) o' x" ]2 i
imageheight = 485;
: a; b8 `+ w! H9 u4 m0 Y( Q6 P5 vvar vertices = [], 1 ]& D- D: g' S- \! ]
indices,
) h3 I, M, o2 nboxes = []; & M# h3 }+ ^3 d# w$ d4 R& z
var image,
" W; a! C; L. p  _/ Rfragments = [],
% h0 |( t/ C9 A" x0 {, |container = document.getelementbyid('container'); : T; o; `5 |- I8 i! F( e
window.onload = function () {
! b" H' X5 O- j% x9 |image = document.getelementbyid('src_img'); : y" N# x/ }2 Y, i; w# h* B* v% U
triangulate(); 4 q% z& M9 }  \7 d$ l' `! O8 K! J+ @
makeboxes();
* Z9 N& a; _. M1 J1 {  t5 ?makefragments();
! ~7 g0 X( r4 g* T+ ~8 E9 [1 ?6 Q}; $ f2 K) z: v. x0 A' s5 D$ H# r
function triangulate() { 1 h8 y% x7 p" t& X7 F" x
var x,
: v  O9 W& ?9 V. ]0 x+ jy,
4 j+ n+ a1 }6 X  a6 I8 H" L* fdx = imagewidth / 8,
# K# R4 n' w; L0 S6 rdy = imageheight / 8, + y( J! X/ @$ |0 b) g4 C# i
offset = 0.5;
! q; K+ H$ l# ]1 _for (var i = 0; i <= imagewidth; i += dx) {
5 R7 L9 a) G- ^) D0 W6 g2 vfor (var j = 0; j <= imageheight; j += dy) {
6 m/ g  O, a/ W2 ]+ Fif (i && (i !== imagewidth)) x = i + randomrange(-dx * offset, dx * offset);
7 T7 |  D6 S, {: n. g' c+ z0 Selse x = i;
" i2 r! r& V( Oif (j && (j !== imageheight)) y = j + randomrange(-dy * offset, dy * offset); 6 k* ~! B' P/ g
else y = j;
+ _" l" e9 g# U5 }vertices.push([x, y]);
) J# l  M" N/ t+ q% t- _}
5 n: ], w% W+ s5 V}
$ |) H' ?3 o$ z6 E8 n1 Gindices = delaunay.triangulate(vertices);
0 x8 @5 e( ^/ H1 a} % {; r2 A1 t7 W) s) U0 v
function makeboxes() {
% M- S1 \, B/ U3 X& ~0 d0 Kvar p0, p1, p2, & l6 ?" p8 V5 o; E. S
xmin, xmax, # [5 ?% u& Y* D; W* A* Q, {
ymin, ymax;
; n9 E) k1 y5 p; {9 d) m, qfor (var i = 0; i < indices.length; i += 3) { , u& y8 r& W, O) r' |) `
p0 = vertices[indices[i + 0]]; ) Z! j+ s, Z: `! ]- z/ ~
p1 = vertices[indices[i + 1]];
: c3 J* X) r4 p+ v! m( _2 R$ Gp2 = vertices[indices[i + 2]]; ' I  p+ |! H* D" j6 U( E8 l
xmin = math.min(p0[0], p1[0], p2[0]); 5 t# ]. @3 m( v
xmax = math.max(p0[0], p1[0], p2[0]);
5 {% h9 k3 w6 Rymin = math.min(p0[1], p1[1], p2[1]); - _2 x& Q9 \/ y) G
ymax = math.max(p0[1], p1[1], p2[1]);   D( U7 a: S( G# a6 G
boxes.push({ ; t0 j% Z+ {$ L, p  d
x: xmin, . K# G- W8 ~; R9 p* }) [
y: ymin,
. D/ y1 \+ }& r6 L3 B8 yw: xmax - xmin, , D0 @* q/ f/ K( G( P$ q" T
h: ymax - ymin
% I" B* h! [- D0 @. m9 q; u});
2 {  a4 n8 P4 c6 e4 d, w}
  Z: M" a3 Q7 m} 7 u5 l( R( L& V+ w3 a. c0 ~
function makefragments() { 6 {7 p  N+ G; z. j
var p0, p1, p2,
: C7 {; O* `; P0 L! L  Pbox,
* X0 p* a  _2 X5 _9 ffragment; 2 N: U. ^+ j3 {6 G
tweenmax.set(container, { perspective: 500 });
4 j+ @) x" R; `% xvar tl0 = new timelinemax({ repeat: -1 });
1 F% m; _% n1 B9 Y0 [% [9 _for (var i = 0; i < indices.length; i += 3) {
7 [$ u, `( l9 F: T5 G) \" Yp0 = vertices[indices[i + 0]];
$ [- c+ Q$ g5 q. O7 cp1 = vertices[indices[i + 1]];
# d2 s6 e( f* h9 ~4 c  Vp2 = vertices[indices[i + 2]];
0 w) |8 \6 R; o  ubox = boxes[i / 3]; " Y/ U+ [) i1 \0 Z( l
fragment = new fragment(p0, p1, p2, box);
; \8 m6 g& Y8 L7 m  u1 a5 T- d( pvar rx = randomrange(30, 60) * ((i % 2) ? 1 : -1); ( x  k8 j5 P; T' z
var ry = randomrange(30, 60) * ((i % 2) ? -1 : 1); 6 K7 i6 n# J5 |! @: v' n* W
var tl1 = new timelinemax();
, l9 d9 d6 w! ]# i9 w, f  d  dtweenmax.set(fragment.canvas, {
7 C0 o. Q1 l- Oy: box.y - 1000
, ^4 Y: T6 x6 P6 T+ p5 @}); 1 }- j, Q, x" _! ~+ I
tl1.to(fragment.canvas, randomrange(0.9, 1.1), { / C( f0 h% t1 J# {; s
y: box.y, 7 [" i) h4 y! ~% k% D4 x) K5 i
ease: back.easeout
7 F( c& q9 q4 o  t- u) J}); 0 |0 N, L6 X& C2 A7 z! Q3 F5 }4 G
tl1.to(fragment.canvas, 0.5, { * o6 M- t0 ?. k' I
z: -100, : r" Q6 a8 c, [3 C
ease: cubic.easein,
" r+ Z) }- w; b" Q7 Y4 Wdelay: 0.4 6 j4 x" M/ v9 L/ v- A
});
- c4 j5 E. ~& _0 i; `) {$ C0 Ptl1.to(fragment.canvas, randomrange(1, 1.2), { $ r9 z+ f! C2 e& \3 v' \/ c+ P$ R
rotationx: rx,
# [( d# Y, v  p% o4 b" \0 urotationy: ry, 9 ~9 J+ y( v" N) U) Y
z: 250, 0 R& M/ n; Q& g# w! L9 B
alpha: 0,
0 j' H* @! O) `4 V, w2 lease: cubic.easeout 9 K* x( `4 y1 ^: e3 A
}); 5 N2 L" d3 @) |
tl0.insert(tl1); / F0 X( s8 {( u' d, O1 U# o
fragments.push(fragment);
2 H0 U1 `8 @* D3 zcontainer.appendchild(fragment.canvas); % C: I2 U3 l+ w' N
}
4 g2 O: J6 E0 E" B- P' s( n$ i} + g1 {4 K& X0 R: D* r( W3 w
function randomrange(min, max) { . w* l. f/ A: f2 T: k9 r
return min + (max - min) * math.random();
* Z3 B5 F( I( M2 I# H, Y) G}
4 d+ \, ]: O$ ufragment = function (v0, v1, v2, box) {
: o7 |  `; s% W, ithis.v0 = v0;
: P' F3 A' \& p/ l# x5 {* ?this.v1 = v1;
6 v4 L2 Y; o0 @" w9 Z7 }& j8 ]; ?* u7 Nthis.v2 = v2; ' H4 f* c$ N, g: f: A
this.box = box;
/ m$ {( K: V  z, sthis.canvas = document.createelement('canvas');
$ d! [$ Q8 T0 ^3 [# ^% l* Hthis.canvas.width = this.box.w;
( B  I; G! S- E7 ^! |this.canvas.height = this.box.h;
- P6 m) `8 G$ M! q% i$ E7 D; \* M' T" Mthis.canvas.style.width = this.box.w + 'px';
' z* m$ M9 |$ `2 G4 r; Q& ]9 ?this.canvas.style.height = this.box.h + 'px'; ) E- T5 D9 K$ |; E
this.ctx = this.canvas.getcontext('2d');
8 ]; K. o" h: p# u8 xtweenmax.set(this.canvas, { " j" w* f  V3 \4 S. c5 o. }
x: this.box.x,
+ f! q! }3 Y! Wy: this.box.y - R( r  Q4 G  f
}); 9 F3 I5 }# M8 u5 }/ I; O9 s
this.ctx.translate(-this.box.x, -this.box.y); + H, g* D) d$ J
this.ctx.beginpath(); / A2 Q3 o3 v. V4 X
this.ctx.moveto(this.v0[0], this.v0[1]);
" y$ `% |5 M/ P* Athis.ctx.lineto(this.v1[0], this.v1[1]);
5 F  s9 R2 G! Uthis.ctx.lineto(this.v2[0], this.v2[1]);
. l, s1 j  v* D( s0 S+ t5 Y7 ^this.ctx.closepath(); & d$ n5 ?( P; M) {; W/ ^. I: b
this.ctx.clip();
9 v. S3 k, x! U+ o: Nthis.ctx.drawimage(image, 0, 0); % R/ u1 z, ~5 C9 O1 q) ^* \
}; //@ sourceurl=pen.js - j7 {& }/ k/ _! q+ s
5 L' |! B# K" {3 ?2 M- o' X
更多网页制作信息请查看: 网页制作

回复|共 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技术交流平台 版权所有 All Rights Reserved. Powered by Discuz! X5.0 鄂ICP备15006301号-5|鄂公网安备 42018502006730号
关灯 在本版发帖 扫一扫添加QQ客服 返回顶部
快速回复 返回顶部 返回列表