Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Fiz um slideshow em JavaScript simples. O php carrega umas imagens e dados da base e passa para o javascript que fica clareando e escurecendo uma div atrás da outra dando a sensação de slideshow - nada que não tenha pilhas de exemplos por aí, mas eu quis fazer a minha!
Funciona perfeito no Safari e no FireFox, mas nada de rodar no Google Chrome (para Mac)!
Após examinar o comportamento de cada variável descobri o bug na forma do número 1.3877787807814457e-16 que é a subração sucessiva da opacidade da div em 0.1.
Ou seja, a div começa com 1 (opaco) e eu vou subraindo 0.1 a cada 100ms até que dá zero (transparente) e passa para a próxima div que eu vou acrescendo 0.1 a partir do zero até chegar a 1 - voilá!
Esta é a parte que trava:
id_slide = 'slide_'+String(slideShowSlide);
slideShowJan = document.getElementById(id_slide);
slideShowJanOpc = Number(slideShowJan.style.opacity);
if(slideShowJanOpc>0){
slideShowJanOpc -= 0.1;
slideShowJan.style.opacity = String(slideShowJanOpc);
} else {
slideShowJan.style.visibility = 'hidden';
slideShowSlide = slideShowNext;
slideShowTimer = slideShowDelay;
}
Como 1.3877787807814457e-16 é maior que zero, ele repete a subtração mas não arredonda para zero. Um bug duplo pois o conjunto utilizado é 1 a 0, então um número negativo deveria gerar um erro ou ser considerado zero (é o que os outros navegadores fazem) além do fato da subtração 0.1 sucessiva gerar este bizarro resultado.
Segue a correção:
id_slide = 'slide_'+String(slideShowSlide);
slideShowJan = document.getElementById(id_slide);
slideShowJanOpc = Number(slideShowJan.style.opacity);
if(slideShowJanOpc>=0.1){
slideShowJanOpc -= 0.1;
slideShowJan.style.opacity = String(slideShowJanOpc);
} else {
slideShowJan.style.visibility = 'hidden';
slideShowSlide = slideShowNext;
slideShowTimer = slideShowDelay;
}
Ou seja, se chegar próximo de zero, eu já mando pro próximo!
No ActionScript eu já me habituei a trabalhar com <= >= mas no JavaScript ainda não tinha aparecido este tipo de problema!
Perfeito. Foi o que eu fiz. A solução abaixo deverá ser ainda mais à prova de cálculos bizarros:
id_slide = 'slide_'+String(slideShowSlide);
slideShowJan = document.getElementById(id_slide);
slideShowJanOpc = Number(slideShowJan.style.opacity)*10;
if(slideShowJanOpc>=1){
slideShowJanOpc--;
slideShowJan.style.opacity = String(Math.round(slideShowJanOpc)/10);
} else {
slideShowJan.style.visibility = 'hidden';
slideShowSlide = slideShowNext;
slideShowTimer = slideShowDelay;
}
okay.. é maior que zero (pouca coisa, mas é.. hehe)
mas não tem numero negativo.. se é maior que zero, então é positivo.
não deveria chegar nesse teu numero. Pois se você diminuir de decimo em decimo, depois de 10 iterações chegara no zero.
o problema do Chrome (chuto eu), é que qndo ele tenta fazer a conta:
0.1 - 0.1, isso não da zero, por isso continua fazendo...
tente debugar para ver se oque estou falando está correto. Se estiver, a forma simples de resolver é trabalhar com inteiros.
e então na hora de aplicar a opacidade, você pega esse inteiro e divide por 10 :lol: