返回列表 发新帖

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

227.5k 8
swmozowtfl 发表于 2015-7-10 22:25:43|湖北 | 查看全部 阅读模式
html5 canvas实现图片玻璃碎片特效,图片以玻璃碎片的形式出现到界面中,然后似玻璃被打碎的效果渐消息,效果很不错,喜欢的朋友可以参考下& e( B* Q8 ~6 t& `  b* W
今天要为大家带来一款html5 canvas实现的图片玻璃碎片特效。图片以玻璃碎片的形式出现到界面中,然后似玻璃被打碎的效果渐消息。效果图如下:
% ]" r6 I5 z* x* j( T

' ]& {- H6 M; N2 ^5 m* `                               
登录/注册后可看大图

4 }( j0 b1 `$ a& t9 b源码下载 / [2 z* d, n& D  u- ], o$ o; f
html代码: 9 H6 V) |, b$ K
代码如下:
8 v6 o2 G" v9 l: |! L1 K% l
<img src=city_copy.jpg id=src_img class=hidden> 1 Q2 X5 s1 d& b: W# \
<div id=container style=-webkit-perspective: 500px;>
9 [0 g( f/ h$ |/ F( E<div> ) w$ B2 k; z& {3 w7 L% S% A4 t
<script src=delaunay.js></script> % _7 R; ?8 p. r+ W8 ~1 t( ^1 ^
<script src=tweenmax.min.js></script>
+ P8 v0 @; {0 L1 g3 y( X( l5 t1 yjs代码:
, d7 n: n8 n; W. e# [代码如下:
% l: U) A+ q4 K" l: G5 v  r0 ^
// canvas settings + N  S; W* C7 ?1 X. }1 j2 h
var imagewidth = 768,
0 Q' W. W) d3 B! X2 `imageheight = 485;
! u3 r1 d& q& R9 pvar vertices = [],
! L) h( N& u% h" uindices,
* {/ `0 }! }* E9 v( t2 zboxes = []; 9 `* x8 Y$ A( Z7 F
var image,
, E7 _6 y! Z/ C9 ^9 Mfragments = [],
! t- C. y2 I) {' k0 Xcontainer = document.getelementbyid('container');
7 u1 Z" k' ~* j, p7 qwindow.onload = function () {
) w4 m2 l: `  p. G, [: j0 R2 jimage = document.getelementbyid('src_img');
9 x# |. @" I, G3 htriangulate(); ' _; Y0 S$ I- u, P
makeboxes();
4 L7 J+ c& O1 m4 M9 Omakefragments();
$ n$ k4 G3 {; p$ ]/ W}; 6 A$ L: g6 b8 u7 Z
function triangulate() { . n8 p3 O+ d& [! s, Q4 P
var x,
+ e) c& U  g" Q, r/ K* ^y,
3 d  S; S' ]2 ~- ^dx = imagewidth / 8, 2 s5 G" h, o. m" W
dy = imageheight / 8, 3 i* r( ~1 C4 Y* \0 O$ _
offset = 0.5;
3 N) ?" k, W( q# xfor (var i = 0; i <= imagewidth; i += dx) {
7 n/ j, \, Z& t2 |5 {# hfor (var j = 0; j <= imageheight; j += dy) {
( y8 E' {7 {  ?: Eif (i && (i !== imagewidth)) x = i + randomrange(-dx * offset, dx * offset); " ]0 H# U0 L4 g
else x = i; ' R2 R+ b$ R& Q* B3 H/ A
if (j && (j !== imageheight)) y = j + randomrange(-dy * offset, dy * offset); / A5 _! A8 e4 ]) j8 M2 H1 v
else y = j;
2 [& Q: ]8 Z1 D# p  Rvertices.push([x, y]); 4 w/ Q0 I2 |! \: ?
} 8 m$ Y: Q. k0 Z% K: p2 S; H0 _/ S
} ; j+ i& G. C6 @$ P; g: W4 r4 {9 i7 ]
indices = delaunay.triangulate(vertices);
8 a' X0 j' I# b9 C: `# J}
# h. D2 M3 x( d& G# C* cfunction makeboxes() { % r0 f: P# U7 T  a
var p0, p1, p2, 3 \! y& V7 C0 X: [4 w
xmin, xmax, 4 }, D7 `5 S5 t7 A) f9 c' e
ymin, ymax; # _9 O! V6 n9 c8 v$ P7 t9 J8 O5 y
for (var i = 0; i < indices.length; i += 3) { 0 ]5 Z; c- y; s
p0 = vertices[indices[i + 0]];
" L6 s* }" {8 `0 Tp1 = vertices[indices[i + 1]]; ( m& Z9 |" ~0 F1 ?
p2 = vertices[indices[i + 2]];
0 `* i$ X$ z, Kxmin = math.min(p0[0], p1[0], p2[0]);
1 b7 S- a; n5 b! O0 F/ ]xmax = math.max(p0[0], p1[0], p2[0]); " W( a8 O. w7 b. Z
ymin = math.min(p0[1], p1[1], p2[1]);
- x) i6 |2 w. Q+ R. i8 _  J; Y+ symax = math.max(p0[1], p1[1], p2[1]); % L5 a% U% f( I
boxes.push({
' b5 _% [1 D3 S' w. Sx: xmin,
' [) Y% G/ L* M) W  r) z/ hy: ymin, ; Z5 R- z# E2 `4 G1 c# m- v$ [9 g
w: xmax - xmin,
* `: Q2 K8 [: F6 s4 Ih: ymax - ymin & w& k" h2 ]7 U  ]4 P7 g
});
6 K; M8 l. [. W7 m* S2 R} ; M$ x4 u5 ]& x$ r0 _$ g
}
. M1 F! e4 A: a8 @' qfunction makefragments() {
. I. _" ~3 b  H3 J) e- bvar p0, p1, p2, ' t/ j1 [( C$ \5 }
box,
# N7 w" U% S, k  C' Wfragment;
7 E0 H1 J& ]) M; Btweenmax.set(container, { perspective: 500 });
" e: e" E- [; {# a' `var tl0 = new timelinemax({ repeat: -1 }); % Z- T! f/ f* S8 R5 w3 w
for (var i = 0; i < indices.length; i += 3) {
. p" _/ ~: D% d) R# L  ?p0 = vertices[indices[i + 0]];
. U$ t; ^: J$ C7 f/ ^p1 = vertices[indices[i + 1]]; & [5 [8 _- Y: Z7 b- I) A! Y
p2 = vertices[indices[i + 2]];
' u: ~) D% r8 x" j0 xbox = boxes[i / 3];
: Z5 T# U7 w+ A+ n! d% I0 ?. `  sfragment = new fragment(p0, p1, p2, box); ' \* ~* v2 F. U- s' O0 ~; ]
var rx = randomrange(30, 60) * ((i % 2) ? 1 : -1);
7 T& X/ }0 `5 Yvar ry = randomrange(30, 60) * ((i % 2) ? -1 : 1); # F5 h" F0 k8 W/ I2 i, t
var tl1 = new timelinemax();
% R% e$ `9 V8 g4 O. w3 m( |$ O$ ytweenmax.set(fragment.canvas, {
. @, Q5 A% U4 T* N1 Ey: box.y - 1000
4 f( g$ r7 g# x});
8 j- w& V8 H1 W4 Y, @tl1.to(fragment.canvas, randomrange(0.9, 1.1), { ) @! g0 ]. Y( n# ]2 c
y: box.y, # Q3 \5 Z: F5 ^- r$ x/ D; g
ease: back.easeout " p9 J5 ?7 z. i2 l* C/ R
});
& C8 A: ~/ ?+ |) S$ `tl1.to(fragment.canvas, 0.5, { : c7 i8 f( R- q: v- c- `
z: -100, ! o/ a1 s" J2 ~6 M- z' Y( [
ease: cubic.easein, 9 ?/ j7 R3 x$ k! F5 u6 v' q
delay: 0.4
; t: N+ Q; P* @& i3 {# G$ e});
$ o) ]7 m: c/ P7 d; J. Qtl1.to(fragment.canvas, randomrange(1, 1.2), {
6 o' @, K# R4 Q9 M" F6 @/ u! X7 Jrotationx: rx,
5 ^3 \. P- f9 Rrotationy: ry, 0 ?2 Z6 n; z& v4 a: I; \* J
z: 250, , d1 [7 l1 V  k& A) h+ R
alpha: 0,
6 g: d; I' A) ^2 a, V# k. C- `% Oease: cubic.easeout ; G( S$ G) ?! t4 W; c7 Q: h# @! g
}); / M/ P" h+ `- N; H" H$ i
tl0.insert(tl1);
( C4 u; q1 Y/ V1 T+ h" j0 Hfragments.push(fragment);
. h! {5 ~' w, `) \- N0 scontainer.appendchild(fragment.canvas);
+ J9 k3 F! p! j3 s}
. d" y" `& W- ], U1 b$ ~  w  x1 `} + s* s( f1 ^+ B" ]9 l) G
function randomrange(min, max) { 0 z6 t; r' s: }& E! u: Y, U5 w, u
return min + (max - min) * math.random();
& l/ m3 e7 d  P9 a}
( @+ j' V$ Y) Vfragment = function (v0, v1, v2, box) { ) r1 r2 G0 _5 B- ^
this.v0 = v0;
. x! h0 p" Q9 C1 O& hthis.v1 = v1; + L0 k) o4 J# e( [) C
this.v2 = v2;
7 U* X$ E3 q$ t# J' pthis.box = box; 8 B0 Q  P9 R; F8 y5 k3 A1 [6 g3 O' u
this.canvas = document.createelement('canvas');
6 f2 k( }1 R# L9 n8 L% m9 fthis.canvas.width = this.box.w; ; H; T: C2 @$ U# b# d  k
this.canvas.height = this.box.h; # t. G8 {0 W* R
this.canvas.style.width = this.box.w + 'px'; 5 a" a! s1 p, h$ I8 n9 b6 R
this.canvas.style.height = this.box.h + 'px'; . O4 q; ~1 }; r* n4 _
this.ctx = this.canvas.getcontext('2d'); + e) o, W- B" Y, `
tweenmax.set(this.canvas, { + c1 d2 ]- b) W! U
x: this.box.x,
( I0 H  F4 r% f" M( gy: this.box.y / d$ f7 S: R! A
}); " d+ |, v& {5 n" K1 g
this.ctx.translate(-this.box.x, -this.box.y); 3 o6 T4 W6 h. E: S- q
this.ctx.beginpath();
  ~4 B* w+ l' a2 R+ q/ Lthis.ctx.moveto(this.v0[0], this.v0[1]);
+ M# _4 ^  @, o0 e+ lthis.ctx.lineto(this.v1[0], this.v1[1]); : S, o2 j" a" a, R# N; q( n
this.ctx.lineto(this.v2[0], this.v2[1]);
. S* S; O0 J- v% X- nthis.ctx.closepath();
) a+ D/ k" \9 c( {( Y0 @& Athis.ctx.clip(); 6 {$ `5 t! i# V& B- H
this.ctx.drawimage(image, 0, 0);
0 I4 |5 l" u5 B3 f}; //@ sourceurl=pen.js $ \0 g& p, o! t7 r& u" F

. j6 y' `& W5 X( N' U% h6 c更多网页制作信息请查看: 网页制作

回复|共 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客服 返回顶部
快速回复 返回顶部 返回列表