Jump to content

[Resolvido] Implementação do efeito "Falling Snow" em javascript


softklin

Recommended Posts

Boas!

Estou a criar umas páginas e achei engraçado colocar um efeito de neve a cair, mas sem grandes exageros, uma coisa discreta e sem imagens, e encontrei este código:

/*
Snow Fall 1 - no images - Java Script
Visit http://rainbow.arch.scriptmania.com/scripts/
  for this script and many more
*/

// Set the number of snowflakes (more than 30 - 40 not recommended)
var snowmax=35

// Set the colors for the snow. Add as many colors as you like
var snowcolor=new Array("#AAAACC","#DDDDFF","#CCCCDD","#F3F3F3","#F0FFFF")

// Set the fonts, that create the snowflakes. Add as many fonts as you like
var snowtype=new Array("Arial Black","Arial Narrow","Times","Comic Sans MS")

// Set the letter that creates your snowflake (recommended: * )
var snowletter="*"

// Set the speed of sinking (recommended values range from 0.3 to 2)
var sinkspeed=0.6

// Set the maximum-size of your snowflakes
var snowmaxsize=22

// Set the minimal-size of your snowflakes
var snowminsize=8

// Set the snowing-zone
// Set 1 for all-over-snowing, set 2 for left-side-snowing 
// Set 3 for center-snowing, set 4 for right-side-snowing
var snowingzone=1

  /*
   //   * NO CONFIGURATION BELOW HERE *
*/

// Do not edit below this line
var snow=new Array()
var marginbottom
var marginright
var timer
var i_snow=0
var x_mv=new Array();
var crds=new Array();
var lftrght=new Array();
var browserinfos=navigator.userAgent 
var ie5=document.all&&document.getElementById&&!browserinfos.match(/Opera/)
var ns6=document.getElementById&&!document.all
var opera=browserinfos.match(/Opera/)  
var browserok=ie5||ns6||opera

function randommaker(range) {		
rand=Math.floor(range*Math.random())
    return rand
}

function initsnow() {
if (ie5 || opera) {
	marginbottom = document.body.clientHeight
	marginright = document.body.clientWidth
}
else if (ns6) {
	marginbottom = window.innerHeight
	marginright = window.innerWidth
}
var snowsizerange=snowmaxsize-snowminsize
for (i=0;i<=snowmax;i++) {
	crds[i] = 0;                      
    	lftrght[i] = Math.random()*15;         
    	x_mv[i] = 0.03 + Math.random()/10;
	snow[i]=document.getElementById("s"+i)
	snow[i].style.fontFamily=snowtype[randommaker(snowtype.length)]
	snow[i].size=randommaker(snowsizerange)+snowminsize
	snow[i].style.fontSize=snow[i].size
	snow[i].style.color=snowcolor[randommaker(snowcolor.length)]
	snow[i].sink=sinkspeed*snow[i].size/5
	if (snowingzone==1) {snow[i].posx=randommaker(marginright-snow[i].size)}
	if (snowingzone==2) {snow[i].posx=randommaker(marginright/2-snow[i].size)}
	if (snowingzone==3) {snow[i].posx=randommaker(marginright/2-snow[i].size)+marginright/4}
	if (snowingzone==4) {snow[i].posx=randommaker(marginright/2-snow[i].size)+marginright/2}
	snow[i].posy=randommaker(2*marginbottom-marginbottom-2*snow[i].size)
	snow[i].style.left=snow[i].posx
	snow[i].style.top=snow[i].posy
}
movesnow()
}

function movesnow() {
for (i=0;i<=snowmax;i++) {
	crds[i] += x_mv[i];
	snow[i].posy+=snow[i].sink
	snow[i].style.left=snow[i].posx+lftrght[i]*Math.sin(crds[i]);
	snow[i].style.top=snow[i].posy

	if (snow[i].posy>=marginbottom-2*snow[i].size || parseInt(snow[i].style.left)>(marginright-3*lftrght[i])){
		if (snowingzone==1) {snow[i].posx=randommaker(marginright-snow[i].size)}
		if (snowingzone==2) {snow[i].posx=randommaker(marginright/2-snow[i].size)}
		if (snowingzone==3) {snow[i].posx=randommaker(marginright/2-snow[i].size)+marginright/4}
		if (snowingzone==4) {snow[i].posx=randommaker(marginright/2-snow[i].size)+marginright/2}
		snow[i].posy=0
	}
}
var timer=setTimeout("movesnow()",50)
}

for (i=0;i<=snowmax;i++) {
document.write("<span id='s"+i+"' style='position:absolute;top:-"+snowmaxsize+"'>"+snowletter+"</span>")
}

Pronto, o codigo é longo, mas se chegaram até aqui, obrigado, porque o dilema vem agora  😛

Esta função inicia-se e... não para... a não ser claro, que o user desligue o JS.. Bem, o que pretendia, era que me ajudassem a criar uma pequena função que, a pedido, clicando num link ou botão, parasse este script. Eu pensei numa função que ocultasse os sucessivos spans que isto cria, mas será possivel eliminá-los, para assim poupar eventual memória?

Obrigado desde já  😛

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Link to comment
Share on other sites

Troca o var timer=setTimeout("movesnow()",50) da função movesnow por timer=setTimeout("movesnow()",50). Ou seja, tira o var;

Cria uma função hidesnow que coloque a visibilidade dos objectos do array snow como hidden e pare o timer;

Cria uma função showsnow que coloque a visibilidade dos objectos do array snow como visible e inicie o timer.

Acho que não é preciso dizer, mas chama a função hidesnow quando quiseres pará-la e  e showsnow quando quiseres continuá-la 😄

EDIT: Faltou-me a parte de eliminar os elementos. Embora eu ache que isso adiciona um overhead excessivo se quiseres reiniciar a neve, basta fazer um for para todos os elementos do array snow que faça delete a snow[i].

Desaparecido.

Link to comment
Share on other sites

Boas!

Obrigado pelas respostas.

Não sabia da existência de uma função que parasse o timer, mas afinal sempre há  😄

Ora, para quem ficou com curiosidade ou tem um problema semelhante, aqui está o código:

function stopSnow(){
//apaga a função de timeout em cima
clearTimeout(timer);

//esconde os flocos
for(j=0; j<=snowmax;j++){
	document.getElementById("s"+j).style.visibility="hidden";
}
}

E claro, obrigado pela vossa ajuda  😄

EDIT: já agora, as fontes 😄

http://www.w3schools.com/js/js_timing.asp

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.