1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2 <html xmlns="http://www.w3.org/1999/xhtml">
3
4 <head>
5 <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
6 <title>超酷超绚精美图片展示效果代码(六) - 网页特效观止-网页特效代码|JsCode.CN|</title>
7 <style type="text/css">
8 html {
9 overflow: hidden;
10 }
11 body {
12 position: absolute;
13 margin: 0px;
14 padding: 0px;
15 background: #111;
16 width: 100%;
17 height: 100%;
18 }
19 #screen {
20 position: absolute;
21 left: 10%;
22 top: 10%;
23 width: 80%;
24 height: 80%;
25 background: #000;
26 }
27 #screen img {
28 position: absolute;
29 cursor: pointer;
30 visibility: hidden;
31 width: 0px;
32 height: 0px;
33 }
34 #screen .tvover {
35 border: solid #876;
36 opacity: 1;
37 filter: alpha(opacity=100);
38 }
39 #screen .tvout {
40 border: solid #fff;
41 opacity: 0.7;
42 }
43 #bankImages {
44 display: none;
45 }
46 </style>
47 <script type="text/javascript">
48 var Library = {};
49 Library.ease = function () {
50 this.target = 0;
51 this.position = 0;
52 this.move = function (target, speed)
53 {
54 this.position += (target - this.position) * speed;
55 }
56 }
57
58 var tv = {
59 /* ==== variables ==== */
60 O : [],
61 screen : {},
62 grid : {
63 size : 4, // 4x4 grid
64 borderSize : 6, // borders size
65 zoomed : false
66 },
67 angle : {
68 x : new Library.ease(),
69 y : new Library.ease()
70 },
71 camera : {
72 x : new Library.ease(),
73 y : new Library.ease(),
74 zoom : new Library.ease(),
75 focalLength : 750 // camera Focal Length
76 },
77
78 /* ==== init script ==== */
79 init : function ()
80 {
81 this.screen.obj = document.getElementById('screen');
82 var img = document.getElementById('bankImages').getElementsByTagName('img');
83 this.screen.obj.onselectstart = function () { return false; }
84 this.screen.obj.ondrag = function () { return false; }
85 /* ==== create images grid ==== */
86 var ni = 0;
87 var n = (tv.grid.size / 2) - .5;
88 for (var y = -n; y <= n; y++)
89 {
90 for (var x = -n; x <= n; x++)
91 {
92 /* ==== create HTML image element ==== */
93 var o = document.createElement('img');
94 var i = img[(ni++) % img.length];
95 o.className = 'tvout';
96 o.src = i.src;
97 tv.screen.obj.appendChild(o);
98 /* ==== 3D coordinates ==== */
99 o.point3D = {
100 x : x,
101 y : y,
102 z : new Library.ease()
103 };
104 /* ==== push object ==== */
105 o.point2D = {};
106 o.ratioImage = 1;
107 tv.O.push(o);
108 /* ==== on mouse over event ==== */
109 o.onmouseover = function ()
110 {
111 if (!tv.grid.zoomed)
112 {
113 if (tv.o)
114 {
115 /* ==== mouse out ==== */
116 tv.o.point3D.z.target = 0;
117 tv.o.className = 'tvout';
118 }
119 /* ==== mouse over ==== */
120 this.className = 'tvover';
121 this.point3D.z.target = -.5;
122 tv.o = this;
123 }
124 }
125 /* ==== on click event ==== */
126 o.onclick = function ()
127 {
128 if (!tv.grid.zoomed)
129 {
130 /* ==== zoom in ==== */
131 tv.camera.x.target = this.point3D.x;
132 tv.camera.y.target = this.point3D.y;
133 tv.camera.zoom.target = tv.screen.w * 1.25;
134 tv.grid.zoomed = this;
135 } else {
136 if (this == tv.grid.zoomed){
137 /* ==== zoom out ==== */
138 tv.camera.x.target = 0;
139 tv.camera.y.target = 0;
140 tv.camera.zoom.target = tv.screen.w / (tv.grid.size + .1);
141 tv.grid.zoomed = false;
142 }
143 }
144 }
145 /* ==== 3D transform function ==== */
146 o.calc = function ()
147 {
148 /* ==== ease mouseover ==== */
149 this.point3D.z.move(this.point3D.z.target, .5);
150 /* ==== assign 3D coords ==== */
151 var x = (this.point3D.x - tv.camera.x.position) * tv.camera.zoom.position;
152 var y = (this.point3D.y - tv.camera.y.position) * tv.camera.zoom.position;
153 var z = this.point3D.z.position * tv.camera.zoom.position;
154 /* ==== perform rotations ==== */
155 var xy = tv.angle.cx * y - tv.angle.sx * z;
156 var xz = tv.angle.sx * y + tv.angle.cx * z;
157 var yz = tv.angle.cy * xz - tv.angle.sy * x;
158 var yx = tv.angle.sy * xz + tv.angle.cy * x;
159 /* ==== 2D transformation ==== */
160 this.point2D.scale = tv.camera.focalLength / (tv.camera.focalLength + yz);
161 this.point2D.x = yx * this.point2D.scale;
162 this.point2D.y = xy * this.point2D.scale;
163 this.point2D.w = Math.round(
164 Math.max(
165 0,
166 this.point2D.scale * tv.camera.zoom.position * .8
167 )
168 );
169 /* ==== image size ratio ==== */
170 if (this.ratioImage > 1)
171 this.point2D.h = Math.round(this.point2D.w / this.ratioImage);
172 else
173 {
174 this.point2D.h = this.point2D.w;
175 this.point2D.w = Math.round(this.point2D.h * this.ratioImage);
176 }
177 }
178 /* ==== rendering ==== */
179 o.draw = function ()
180 {
181 if (this.complete)
182 {
183 /* ==== paranoid image load ==== */
184 if (!this.loaded)
185 {
186 if (!this.img)
187 {
188 /* ==== create internal image ==== */
189 this.img = new Image();
190 this.img.src = this.src;
191 }
192 if (this.img.complete)
193 {
194 /* ==== get width / height ratio ==== */
195 this.style.visibility = 'visible';
196 this.ratioImage = this.img.width / this.img.height;
197 this.loaded = true;
198 this.img = false;
199 }
200 }
201 /* ==== HTML rendering ==== */
202 this.style.left = Math.round(
203 this.point2D.x * this.point2D.scale +
204 tv.screen.w - this.point2D.w * .5
205 ) + 'px';
206 this.style.top = Math.round(
207 this.point2D.y * this.point2D.scale +
208 tv.screen.h - this.point2D.h * .5
209 ) + 'px';
210 this.style.width = this.point2D.w + 'px';
211 this.style.height = this.point2D.h + 'px';
212 this.style.borderWidth = Math.round(
213 Math.max(
214 this.point2D.w,
215 this.point2D.h
216 ) * tv.grid.borderSize * .01
217 ) + 'px';
218 this.style.zIndex = Math.floor(this.point2D.scale * 100);
219 }
220 }
221 }
222 }
223 /* ==== start script ==== */
224 tv.resize();
225 mouse.y = tv.screen.y + tv.screen.h;
226 mouse.x = tv.screen.x + tv.screen.w;
227 tv.run();
228 },
229
230 /* ==== resize window ==== */
231 resize : function ()
232 {
233 var o = tv.screen.obj;
234 tv.screen.w = o.offsetWidth / 2;
235 tv.screen.h = o.offsetHeight / 2;
236 tv.camera.zoom.target = tv.screen.w / (tv.grid.size + .1);
237 for (tv.screen.x = 0, tv.screen.y = 0; o != null; o = o.offsetParent)
238 {
239 tv.screen.x += o.offsetLeft;
240 tv.screen.y += o.offsetTop;
241 }
242 },
243
244 /* ==== main loop ==== */
245 run : function ()
246 {
247 /* ==== motion ease ==== */
248 tv.angle.x.move(-(mouse.y - tv.screen.h - tv.screen.y) * .0025, .1);
249 tv.angle.y.move( (mouse.x - tv.screen.w - tv.screen.x) * .0025, .1);
250 tv.camera.x.move(tv.camera.x.target, tv.grid.zoomed ? .25 : .025);
251 tv.camera.y.move(tv.camera.y.target, tv.grid.zoomed ? .25 : .025);
252 tv.camera.zoom.move(tv.camera.zoom.target, .05);
253 /* ==== angles sin and cos ==== */
254 tv.angle.cx = Math.cos(tv.angle.x.position);
255 tv.angle.sx = Math.sin(tv.angle.x.position);
256 tv.angle.cy = Math.cos(tv.angle.y.position);
257 tv.angle.sy = Math.sin(tv.angle.y.position);
258 /* ==== loop through all images ==== */
259 for (var i = 0, o; o = tv.O[i]; i++)
260 {
261 o.calc();
262 o.draw();
263 }
264 /* ==== loop ==== */
265 setTimeout(tv.run, 32);
266 }
267 }
268
269 /* ==== global mouse position ==== */
270 var mouse = {
271 x : 0,
272 y : 0
273 }
274 document.onmousemove = function(e)
275 {
276 if (window.event) e = window.event;
277 mouse.x = e.clientX;
278 mouse.y = e.clientY;
279 return false;
280 }
281
282 </script>
283 </head>
284
285 <body>
286
287 <div id="screen">
288 </div>
289 <div id="bankImages">
290 <img alt="" src="2764450_130035075_2.jpg">
291 <img alt="" src="2764450_130035075_2.jpg">
292 <img alt="" src="2764450_130035075_2.jpg">
293 <img alt="" src="2764450_130035075_2.jpg">
294 <img alt="" src="2764450_130035075_2.jpg">
295 <img alt="" src="2764450_130035075_2.jpg">
296 <img alt="" src="2764450_130035075_2.jpg">
297 <img alt="" src="2764450_130035075_2.jpg">
298 <img alt="" src="2764450_130035075_2.jpg">
299 <img alt="" src="2764450_130035075_2.jpg">
300 <img alt="" src="2764450_130035075_2.jpg">
301 <img alt="" src="2764450_130035075_2.jpg">
302 <img alt="" src="2764450_130035075_2.jpg">
303 <img alt="" src="2764450_130035075_2.jpg">
304 <img alt="" src="2764450_130035075_2.jpg">
305 <img alt="" src="2764450_130035075_2.jpg"> </div>
306 <script type="text/javascript">
307 /* ==== start script ==== */
308 onresize = tv.resize;
309 tv.init();
310 </script>
311
312 </body>
313
314 </html>