Commit 52a653a12d31d46f01dcfcb59953fc06adcff67d
1 parent
2b5ed0f2
+ snow (Вкл. выкл. снег)
Showing
6 changed files
with
593 additions
and
0 deletions
Show diff stats
3.67 KB
5.53 KB
3.87 KB
1 | + | |
2 | +.bg2 { | |
3 | + background: none; | |
4 | + font-family: Androgyne; | |
5 | + background-image: url('/img/snow/s1.png'), url('/img/snow/s2.png'), url('/img/snow/s3.png'); | |
6 | + height: 100%; | |
7 | + left: 0; | |
8 | + position: absolute; | |
9 | + top: 0; | |
10 | + width: 100%; | |
11 | + z-index:1; | |
12 | + -webkit-animation: snow 10s linear infinite; | |
13 | + -moz-animation: snow 10s linear infinite; | |
14 | + -ms-animation: snow 10s linear infinite; | |
15 | + animation: snow 10s linear infinite; | |
16 | +} | |
17 | +@keyframes snow { | |
18 | + 0% {background-position: 0px 0px, 0px 0px, 0px 0px;} | |
19 | + 50% {background-position: 500px 500px, 100px 200px, -100px 150px;} | |
20 | + 100% {background-position: 500px 1000px, 200px 400px, -100px 300px;} | |
21 | +} | |
22 | +@-moz-keyframes snow { | |
23 | + 0% {background-position: 0px 0px, 0px 0px, 0px 0px;} | |
24 | + 50% {background-position: 500px 500px, 100px 200px, -100px 150px;} | |
25 | + 100% {background-position: 400px 1000px, 200px 400px, 100px 300px;} | |
26 | +} | |
27 | +@-webkit-keyframes snow { | |
28 | + 0% {background-position: 0px 0px, 0px 0px, 0px 0px;} | |
29 | + 50% {background-position: 500px 500px, 100px 200px, -100px 150px;} | |
30 | + 100% {background-position: 500px 1000px, 200px 400px, -100px 300px;} | |
31 | +} | |
32 | +@-ms-keyframes snow { | |
33 | + 0% {background-position: 0px 0px, 0px 0px, 0px 0px;} | |
34 | + 50% {background-position: 500px 500px, 100px 200px, -100px 150px;} | |
35 | + 100% {background-position: 500px 1000px, 200px 400px, -100px 300px;} | |
36 | +} | |
0 | 37 | \ No newline at end of file | ... | ... |
1 | +/** @license | |
2 | + * DHTML Snowstorm! JavaScript-based Snow for web pages | |
3 | + * -------------------------------------------------------- | |
4 | + * Version 1.43.20111201 (Previous rev: 1.42.20111120) | |
5 | + * Copyright (c) 2007, Scott Schiller. All rights reserved. | |
6 | + * Code provided under the BSD License: | |
7 | + * http://schillmania.com/projects/snowstorm/license.txt | |
8 | + */ | |
9 | + | |
10 | +/*global window, document, navigator, clearInterval, setInterval */ | |
11 | +/*jslint white: false, onevar: true, plusplus: false, undef: true, nomen: true, eqeqeq: true, bitwise: true, regexp: true, newcap: true, immed: true */ | |
12 | + | |
13 | +var snowStorm = (function(window, document) { | |
14 | + | |
15 | + // --- common properties --- | |
16 | + | |
17 | + this.autoStart = true; // Whether the snow should start automatically or not. | |
18 | + this.flakesMax = 128; // Limit total amount of snow made (falling + sticking) | |
19 | + this.flakesMaxActive = 64; // Limit amount of snow falling at once (less = lower CPU use) | |
20 | + this.animationInterval = 33; // Theoretical "miliseconds per frame" measurement. 20 = fast + smooth, but high CPU use. 50 = more conservative, but slower | |
21 | + this.excludeMobile = true; // Snow is likely to be bad news for mobile phones' CPUs (and batteries.) By default, be nice. | |
22 | + this.flakeBottom = null; // Integer for Y axis snow limit, 0 or null for "full-screen" snow effect | |
23 | + this.followMouse = false; // Snow movement can respond to the user's mouse | |
24 | + this.snowColor = '#fff'; // Don't eat (or use?) yellow snow. | |
25 | + this.snowCharacter = '•'; // • = bullet, · is square on some systems etc. | |
26 | + this.snowStick = false; // Whether or not snow should "stick" at the bottom. When off, will never collect. | |
27 | + this.targetElement = null; // element which snow will be appended to (null = document.body) - can be an element ID eg. 'myDiv', or a DOM node reference | |
28 | + this.useMeltEffect = true; // When recycling fallen snow (or rarely, when falling), have it "melt" and fade out if browser supports it | |
29 | + this.useTwinkleEffect = false; // Allow snow to randomly "flicker" in and out of view while falling | |
30 | + this.usePositionFixed = false; // true = snow does not shift vertically when scrolling. May increase CPU load, disabled by default - if enabled, used only where supported | |
31 | + | |
32 | + // --- less-used bits --- | |
33 | + | |
34 | + this.freezeOnBlur = true; // Only snow when the window is in focus (foreground.) Saves CPU. | |
35 | + this.flakeLeftOffset = 0; // Left margin/gutter space on edge of container (eg. browser window.) Bump up these values if seeing horizontal scrollbars. | |
36 | + this.flakeRightOffset = 0; // Right margin/gutter space on edge of container | |
37 | + this.flakeWidth = 8; // Max pixel width reserved for snow element | |
38 | + this.flakeHeight = 8; // Max pixel height reserved for snow element | |
39 | + this.vMaxX = 5; // Maximum X velocity range for snow | |
40 | + this.vMaxY = 3; // Maximum Y velocity range for snow | |
41 | + this.zIndex = 100; // CSS stacking order applied to each snowflake | |
42 | + | |
43 | + // --- End of user section --- | |
44 | + | |
45 | + var s = this, storm = this, i, | |
46 | + // UA sniffing and backCompat rendering mode checks for fixed position, etc. | |
47 | + isIE = navigator.userAgent.match(/msie/i), | |
48 | + isIE6 = navigator.userAgent.match(/msie 6/i), | |
49 | + isWin98 = navigator.appVersion.match(/windows 98/i), | |
50 | + isMobile = navigator.userAgent.match(/mobile|opera m(ob|in)/i), | |
51 | + isBackCompatIE = (isIE && document.compatMode === 'BackCompat'), | |
52 | + noFixed = (isMobile || isBackCompatIE || isIE6), | |
53 | + screenX = null, screenX2 = null, screenY = null, scrollY = null, vRndX = null, vRndY = null, | |
54 | + windOffset = 1, | |
55 | + windMultiplier = 2, | |
56 | + flakeTypes = 6, | |
57 | + fixedForEverything = false, | |
58 | + opacitySupported = (function(){ | |
59 | + try { | |
60 | + document.createElement('div').style.opacity = '0.5'; | |
61 | + } catch(e) { | |
62 | + return false; | |
63 | + } | |
64 | + return true; | |
65 | + }()), | |
66 | + didInit = false, | |
67 | + docFrag = document.createDocumentFragment(); | |
68 | + | |
69 | + this.timers = []; | |
70 | + this.flakes = []; | |
71 | + this.disabled = false; | |
72 | + this.active = false; | |
73 | + this.meltFrameCount = 20; | |
74 | + this.meltFrames = []; | |
75 | + | |
76 | + this.events = (function() { | |
77 | + | |
78 | + var old = (!window.addEventListener && window.attachEvent), slice = Array.prototype.slice, | |
79 | + evt = { | |
80 | + add: (old?'attachEvent':'addEventListener'), | |
81 | + remove: (old?'detachEvent':'removeEventListener') | |
82 | + }; | |
83 | + | |
84 | + function getArgs(oArgs) { | |
85 | + var args = slice.call(oArgs), len = args.length; | |
86 | + if (old) { | |
87 | + args[1] = 'on' + args[1]; // prefix | |
88 | + if (len > 3) { | |
89 | + args.pop(); // no capture | |
90 | + } | |
91 | + } else if (len === 3) { | |
92 | + args.push(false); | |
93 | + } | |
94 | + return args; | |
95 | + } | |
96 | + | |
97 | + function apply(args, sType) { | |
98 | + var element = args.shift(), | |
99 | + method = [evt[sType]]; | |
100 | + if (old) { | |
101 | + element[method](args[0], args[1]); | |
102 | + } else { | |
103 | + element[method].apply(element, args); | |
104 | + } | |
105 | + } | |
106 | + | |
107 | + function addEvent() { | |
108 | + apply(getArgs(arguments), 'add'); | |
109 | + } | |
110 | + | |
111 | + function removeEvent() { | |
112 | + apply(getArgs(arguments), 'remove'); | |
113 | + } | |
114 | + | |
115 | + return { | |
116 | + add: addEvent, | |
117 | + remove: removeEvent | |
118 | + }; | |
119 | + | |
120 | + }()); | |
121 | + | |
122 | + function rnd(n,min) { | |
123 | + if (isNaN(min)) { | |
124 | + min = 0; | |
125 | + } | |
126 | + return (Math.random()*n)+min; | |
127 | + } | |
128 | + | |
129 | + function plusMinus(n) { | |
130 | + return (parseInt(rnd(2),10)===1?n*-1:n); | |
131 | + } | |
132 | + | |
133 | + this.randomizeWind = function() { | |
134 | + var i; | |
135 | + vRndX = plusMinus(rnd(s.vMaxX,0.2)); | |
136 | + vRndY = rnd(s.vMaxY,0.2); | |
137 | + if (this.flakes) { | |
138 | + for (i=0; i<this.flakes.length; i++) { | |
139 | + if (this.flakes[i].active) { | |
140 | + this.flakes[i].setVelocities(); | |
141 | + } | |
142 | + } | |
143 | + } | |
144 | + }; | |
145 | + | |
146 | + this.scrollHandler = function() { | |
147 | + var i; | |
148 | + // "attach" snowflakes to bottom of window if no absolute bottom value was given | |
149 | + scrollY = (s.flakeBottom?0:parseInt(window.scrollY||document.documentElement.scrollTop||document.body.scrollTop,10)); | |
150 | + if (isNaN(scrollY)) { | |
151 | + scrollY = 0; // Netscape 6 scroll fix | |
152 | + } | |
153 | + if (!fixedForEverything && !s.flakeBottom && s.flakes) { | |
154 | + for (i=s.flakes.length; i--;) { | |
155 | + if (s.flakes[i].active === 0) { | |
156 | + s.flakes[i].stick(); | |
157 | + } | |
158 | + } | |
159 | + } | |
160 | + }; | |
161 | + | |
162 | + this.resizeHandler = function() { | |
163 | + if (window.innerWidth || window.innerHeight) { | |
164 | + screenX = window.innerWidth-16-s.flakeRightOffset; | |
165 | + screenY = (s.flakeBottom?s.flakeBottom:window.innerHeight); | |
166 | + } else { | |
167 | + screenX = (document.documentElement.clientWidth||document.body.clientWidth||document.body.scrollWidth)-(!isIE?8:0)-s.flakeRightOffset; | |
168 | + screenY = s.flakeBottom?s.flakeBottom:(document.documentElement.clientHeight||document.body.clientHeight||document.body.scrollHeight); | |
169 | + } | |
170 | + screenX2 = parseInt(screenX/2,10); | |
171 | + }; | |
172 | + | |
173 | + this.resizeHandlerAlt = function() { | |
174 | + screenX = s.targetElement.offsetLeft+s.targetElement.offsetWidth-s.flakeRightOffset; | |
175 | + screenY = s.flakeBottom?s.flakeBottom:s.targetElement.offsetTop+s.targetElement.offsetHeight; | |
176 | + screenX2 = parseInt(screenX/2,10); | |
177 | + }; | |
178 | + | |
179 | + this.freeze = function() { | |
180 | + // pause animation | |
181 | + var i; | |
182 | + if (!s.disabled) { | |
183 | + s.disabled = 1; | |
184 | + } else { | |
185 | + return false; | |
186 | + } | |
187 | + for (i=s.timers.length; i--;) { | |
188 | + clearInterval(s.timers[i]); | |
189 | + } | |
190 | + }; | |
191 | + | |
192 | + this.resume = function() { | |
193 | + if (s.disabled) { | |
194 | + s.disabled = 0; | |
195 | + } else { | |
196 | + return false; | |
197 | + } | |
198 | + s.timerInit(); | |
199 | + }; | |
200 | + | |
201 | + this.toggleSnow = function() { | |
202 | + if (!s.flakes.length) { | |
203 | + // first run | |
204 | + s.start(); | |
205 | + } else { | |
206 | + s.active = !s.active; | |
207 | + if (s.active) { | |
208 | + s.show(); | |
209 | + s.resume(); | |
210 | + } else { | |
211 | + s.stop(); | |
212 | + s.freeze(); | |
213 | + } | |
214 | + } | |
215 | + }; | |
216 | + | |
217 | + this.stop = function() { | |
218 | + var i; | |
219 | + this.freeze(); | |
220 | + for (i=this.flakes.length; i--;) { | |
221 | + this.flakes[i].o.style.display = 'none'; | |
222 | + } | |
223 | + s.events.remove(window,'scroll',s.scrollHandler); | |
224 | + s.events.remove(window,'resize',s.resizeHandler); | |
225 | + if (s.freezeOnBlur) { | |
226 | + if (isIE) { | |
227 | + s.events.remove(document,'focusout',s.freeze); | |
228 | + s.events.remove(document,'focusin',s.resume); | |
229 | + } else { | |
230 | + s.events.remove(window,'blur',s.freeze); | |
231 | + s.events.remove(window,'focus',s.resume); | |
232 | + } | |
233 | + } | |
234 | + }; | |
235 | + | |
236 | + this.show = function() { | |
237 | + var i; | |
238 | + for (i=this.flakes.length; i--;) { | |
239 | + this.flakes[i].o.style.display = 'block'; | |
240 | + } | |
241 | + }; | |
242 | + | |
243 | + this.SnowFlake = function(parent,type,x,y) { | |
244 | + var s = this, storm = parent; | |
245 | + this.type = type; | |
246 | + this.x = x||parseInt(rnd(screenX-20),10); | |
247 | + this.y = (!isNaN(y)?y:-rnd(screenY)-12); | |
248 | + this.vX = null; | |
249 | + this.vY = null; | |
250 | + this.vAmpTypes = [1,1.2,1.4,1.6,1.8]; // "amplification" for vX/vY (based on flake size/type) | |
251 | + this.vAmp = this.vAmpTypes[this.type]; | |
252 | + this.melting = false; | |
253 | + this.meltFrameCount = storm.meltFrameCount; | |
254 | + this.meltFrames = storm.meltFrames; | |
255 | + this.meltFrame = 0; | |
256 | + this.twinkleFrame = 0; | |
257 | + this.active = 1; | |
258 | + this.fontSize = (10+(this.type/5)*10); | |
259 | + this.o = document.createElement('div'); | |
260 | + this.o.innerHTML = storm.snowCharacter; | |
261 | + this.o.style.color = storm.snowColor; | |
262 | + this.o.style.position = (fixedForEverything?'fixed':'absolute'); | |
263 | + this.o.style.width = storm.flakeWidth+'px'; | |
264 | + this.o.style.height = storm.flakeHeight+'px'; | |
265 | + this.o.style.fontFamily = 'arial,verdana'; | |
266 | + this.o.style.cursor = 'default'; | |
267 | + this.o.style.overflow = 'hidden'; | |
268 | + this.o.style.fontWeight = 'normal'; | |
269 | + this.o.style.zIndex = storm.zIndex; | |
270 | + docFrag.appendChild(this.o); | |
271 | + | |
272 | + this.refresh = function() { | |
273 | + if (isNaN(s.x) || isNaN(s.y)) { | |
274 | + // safety check | |
275 | + return false; | |
276 | + } | |
277 | + s.o.style.left = s.x+'px'; | |
278 | + s.o.style.top = s.y+'px'; | |
279 | + }; | |
280 | + | |
281 | + this.stick = function() { | |
282 | + if (noFixed || (storm.targetElement !== document.documentElement && storm.targetElement !== document.body)) { | |
283 | + s.o.style.top = (screenY+scrollY-storm.flakeHeight)+'px'; | |
284 | + } else if (storm.flakeBottom) { | |
285 | + s.o.style.top = storm.flakeBottom+'px'; | |
286 | + } else { | |
287 | + s.o.style.display = 'none'; | |
288 | + s.o.style.top = 'auto'; | |
289 | + s.o.style.bottom = '0px'; | |
290 | + s.o.style.position = 'fixed'; | |
291 | + s.o.style.display = 'block'; | |
292 | + } | |
293 | + }; | |
294 | + | |
295 | + this.vCheck = function() { | |
296 | + if (s.vX>=0 && s.vX<0.2) { | |
297 | + s.vX = 0.2; | |
298 | + } else if (s.vX<0 && s.vX>-0.2) { | |
299 | + s.vX = -0.2; | |
300 | + } | |
301 | + if (s.vY>=0 && s.vY<0.2) { | |
302 | + s.vY = 0.2; | |
303 | + } | |
304 | + }; | |
305 | + | |
306 | + this.move = function() { | |
307 | + var vX = s.vX*windOffset, yDiff; | |
308 | + s.x += vX; | |
309 | + s.y += (s.vY*s.vAmp); | |
310 | + if (s.x >= screenX || screenX-s.x < storm.flakeWidth) { // X-axis scroll check | |
311 | + s.x = 0; | |
312 | + } else if (vX < 0 && s.x-storm.flakeLeftOffset < -storm.flakeWidth) { | |
313 | + s.x = screenX-storm.flakeWidth-1; // flakeWidth; | |
314 | + } | |
315 | + s.refresh(); | |
316 | + yDiff = screenY+scrollY-s.y; | |
317 | + if (yDiff<storm.flakeHeight) { | |
318 | + s.active = 0; | |
319 | + if (storm.snowStick) { | |
320 | + s.stick(); | |
321 | + } else { | |
322 | + s.recycle(); | |
323 | + } | |
324 | + } else { | |
325 | + if (storm.useMeltEffect && s.active && s.type < 3 && !s.melting && Math.random()>0.998) { | |
326 | + // ~1/1000 chance of melting mid-air, with each frame | |
327 | + s.melting = true; | |
328 | + s.melt(); | |
329 | + // only incrementally melt one frame | |
330 | + // s.melting = false; | |
331 | + } | |
332 | + if (storm.useTwinkleEffect) { | |
333 | + if (!s.twinkleFrame) { | |
334 | + if (Math.random()>0.9) { | |
335 | + s.twinkleFrame = parseInt(Math.random()*20,10); | |
336 | + } | |
337 | + } else { | |
338 | + s.twinkleFrame--; | |
339 | + s.o.style.visibility = (s.twinkleFrame && s.twinkleFrame%2===0?'hidden':'visible'); | |
340 | + } | |
341 | + } | |
342 | + } | |
343 | + }; | |
344 | + | |
345 | + this.animate = function() { | |
346 | + // main animation loop | |
347 | + // move, check status, die etc. | |
348 | + s.move(); | |
349 | + }; | |
350 | + | |
351 | + this.setVelocities = function() { | |
352 | + s.vX = vRndX+rnd(storm.vMaxX*0.12,0.1); | |
353 | + s.vY = vRndY+rnd(storm.vMaxY*0.12,0.1); | |
354 | + }; | |
355 | + | |
356 | + this.setOpacity = function(o,opacity) { | |
357 | + if (!opacitySupported) { | |
358 | + return false; | |
359 | + } | |
360 | + o.style.opacity = opacity; | |
361 | + }; | |
362 | + | |
363 | + this.melt = function() { | |
364 | + if (!storm.useMeltEffect || !s.melting) { | |
365 | + s.recycle(); | |
366 | + } else { | |
367 | + if (s.meltFrame < s.meltFrameCount) { | |
368 | + s.setOpacity(s.o,s.meltFrames[s.meltFrame]); | |
369 | + s.o.style.fontSize = s.fontSize-(s.fontSize*(s.meltFrame/s.meltFrameCount))+'px'; | |
370 | + s.o.style.lineHeight = storm.flakeHeight+2+(storm.flakeHeight*0.75*(s.meltFrame/s.meltFrameCount))+'px'; | |
371 | + s.meltFrame++; | |
372 | + } else { | |
373 | + s.recycle(); | |
374 | + } | |
375 | + } | |
376 | + }; | |
377 | + | |
378 | + this.recycle = function() { | |
379 | + s.o.style.display = 'none'; | |
380 | + s.o.style.position = (fixedForEverything?'fixed':'absolute'); | |
381 | + s.o.style.bottom = 'auto'; | |
382 | + s.setVelocities(); | |
383 | + s.vCheck(); | |
384 | + s.meltFrame = 0; | |
385 | + s.melting = false; | |
386 | + s.setOpacity(s.o,1); | |
387 | + s.o.style.padding = '0px'; | |
388 | + s.o.style.margin = '0px'; | |
389 | + s.o.style.fontSize = s.fontSize+'px'; | |
390 | + s.o.style.lineHeight = (storm.flakeHeight+2)+'px'; | |
391 | + s.o.style.textAlign = 'center'; | |
392 | + s.o.style.verticalAlign = 'baseline'; | |
393 | + s.x = parseInt(rnd(screenX-storm.flakeWidth-20),10); | |
394 | + s.y = parseInt(rnd(screenY)*-1,10)-storm.flakeHeight; | |
395 | + s.refresh(); | |
396 | + s.o.style.display = 'block'; | |
397 | + s.active = 1; | |
398 | + }; | |
399 | + | |
400 | + this.recycle(); // set up x/y coords etc. | |
401 | + this.refresh(); | |
402 | + | |
403 | + }; | |
404 | + | |
405 | + this.snow = function() { | |
406 | + var active = 0, used = 0, waiting = 0, flake = null, i; | |
407 | + for (i=s.flakes.length; i--;) { | |
408 | + if (s.flakes[i].active === 1) { | |
409 | + s.flakes[i].move(); | |
410 | + active++; | |
411 | + } else if (s.flakes[i].active === 0) { | |
412 | + used++; | |
413 | + } else { | |
414 | + waiting++; | |
415 | + } | |
416 | + if (s.flakes[i].melting) { | |
417 | + s.flakes[i].melt(); | |
418 | + } | |
419 | + } | |
420 | + if (active<s.flakesMaxActive) { | |
421 | + flake = s.flakes[parseInt(rnd(s.flakes.length),10)]; | |
422 | + if (flake.active === 0) { | |
423 | + flake.melting = true; | |
424 | + } | |
425 | + } | |
426 | + }; | |
427 | + | |
428 | + this.mouseMove = function(e) { | |
429 | + if (!s.followMouse) { | |
430 | + return true; | |
431 | + } | |
432 | + var x = parseInt(e.clientX,10); | |
433 | + if (x<screenX2) { | |
434 | + windOffset = -windMultiplier+(x/screenX2*windMultiplier); | |
435 | + } else { | |
436 | + x -= screenX2; | |
437 | + windOffset = (x/screenX2)*windMultiplier; | |
438 | + } | |
439 | + }; | |
440 | + | |
441 | + this.createSnow = function(limit,allowInactive) { | |
442 | + var i; | |
443 | + for (i=0; i<limit; i++) { | |
444 | + s.flakes[s.flakes.length] = new s.SnowFlake(s,parseInt(rnd(flakeTypes),10)); | |
445 | + if (allowInactive || i>s.flakesMaxActive) { | |
446 | + s.flakes[s.flakes.length-1].active = -1; | |
447 | + } | |
448 | + } | |
449 | + storm.targetElement.appendChild(docFrag); | |
450 | + }; | |
451 | + | |
452 | + this.timerInit = function() { | |
453 | + s.timers = (!isWin98?[setInterval(s.snow,s.animationInterval)]:[setInterval(s.snow,s.animationInterval*3),setInterval(s.snow,s.animationInterval)]); | |
454 | + }; | |
455 | + | |
456 | + this.init = function() { | |
457 | + var i; | |
458 | + for (i=0; i<s.meltFrameCount; i++) { | |
459 | + s.meltFrames.push(1-(i/s.meltFrameCount)); | |
460 | + } | |
461 | + s.randomizeWind(); | |
462 | + s.createSnow(s.flakesMax); // create initial batch | |
463 | + s.events.add(window,'resize',s.resizeHandler); | |
464 | + s.events.add(window,'scroll',s.scrollHandler); | |
465 | + if (s.freezeOnBlur) { | |
466 | + if (isIE) { | |
467 | + s.events.add(document,'focusout',s.freeze); | |
468 | + s.events.add(document,'focusin',s.resume); | |
469 | + } else { | |
470 | + s.events.add(window,'blur',s.freeze); | |
471 | + s.events.add(window,'focus',s.resume); | |
472 | + } | |
473 | + } | |
474 | + s.resizeHandler(); | |
475 | + s.scrollHandler(); | |
476 | + if (s.followMouse) { | |
477 | + s.events.add(isIE?document:window,'mousemove',s.mouseMove); | |
478 | + } | |
479 | + s.animationInterval = Math.max(20,s.animationInterval); | |
480 | + s.timerInit(); | |
481 | + }; | |
482 | + | |
483 | + this.start = function(bFromOnLoad) { | |
484 | + if (!didInit) { | |
485 | + didInit = true; | |
486 | + } else if (bFromOnLoad) { | |
487 | + // already loaded and running | |
488 | + return true; | |
489 | + } | |
490 | + if (typeof s.targetElement === 'string') { | |
491 | + var targetID = s.targetElement; | |
492 | + s.targetElement = document.getElementById(targetID); | |
493 | + if (!s.targetElement) { | |
494 | + throw new Error('Snowstorm: Unable to get targetElement "'+targetID+'"'); | |
495 | + } | |
496 | + } | |
497 | + if (!s.targetElement) { | |
498 | + s.targetElement = (!isIE?(document.documentElement?document.documentElement:document.body):document.body); | |
499 | + } | |
500 | + if (s.targetElement !== document.documentElement && s.targetElement !== document.body) { | |
501 | + s.resizeHandler = s.resizeHandlerAlt; // re-map handler to get element instead of screen dimensions | |
502 | + } | |
503 | + s.resizeHandler(); // get bounding box elements | |
504 | + s.usePositionFixed = (s.usePositionFixed && !noFixed); // whether or not position:fixed is supported | |
505 | + fixedForEverything = s.usePositionFixed; | |
506 | + if (screenX && screenY && !s.disabled) { | |
507 | + s.init(); | |
508 | + s.active = true; | |
509 | + } | |
510 | + }; | |
511 | + | |
512 | + function doDelayedStart() { | |
513 | + window.setTimeout(function() { | |
514 | + s.start(true); | |
515 | + }, 20); | |
516 | + // event cleanup | |
517 | + s.events.remove(isIE?document:window,'mousemove',doDelayedStart); | |
518 | + } | |
519 | + | |
520 | + function doStart() { | |
521 | + if (!s.excludeMobile || !isMobile) { | |
522 | + if (s.freezeOnBlur) { | |
523 | + s.events.add(isIE?document:window,'mousemove',doDelayedStart); | |
524 | + } else { | |
525 | + doDelayedStart(); | |
526 | + } | |
527 | + } | |
528 | + // event cleanup | |
529 | + s.events.remove(window, 'load', doStart); | |
530 | + } | |
531 | + | |
532 | + // hooks for starting the snow | |
533 | + if (s.autoStart) { | |
534 | + s.events.add(window, 'load', doStart, false); | |
535 | + } | |
536 | + | |
537 | + return this; | |
538 | + | |
539 | +}(window, document)); | |
540 | + | |
541 | + | |
542 | + | |
543 | + /* | |
544 | + ==== ЗАПУСК ==== | |
545 | + */ | |
546 | + | |
547 | + snowStorm.autoStart = true; | |
548 | + snowStorm.snowColor = "#99ccff"; | |
549 | + snowStorm.flakesMax = 200; | |
550 | + snowStorm.flakesMaxActive = 200; | |
551 | + snowStorm.animationInterval = 20; | |
552 | + snowStorm.useTwinkleEffect = true; | |
553 | + snowStorm.followMouse = true; | |
554 | + | ... | ... |