Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Comportamento estranho na animação das palavras

Olá, tudo bem?

Notei um comportamento estranho na utilização da animação recomendada no exercício para o aparecimento das palavras no index.html.

Acontece que, ao utilizar 'opacity: 0' e 'transform: scale(0.001)' juntos no @keyframe que descreve o 'animation: aparece', como o exercício sugere, há algum problema no cálculo do tamanho final das palavras, de forma que elas vão aparecendo (opacity) e aumentando (scale) até certo ponto e, ao final da animação, sofrem um novo aumento para o seu real tamanho final.

.palavras-chave {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    animation: aparece 2s;
}

@keyframes aparece {
    0% {
        opacity: 0;
        transform: scale(0.001);
    }
}

Acredito que esse tamanho final deveria ter sido alcançado já durante o intervalo da animação, por isso a dúvida sobre o que estaria produzindo esse efeito. Há inclusive um outro tópico marcado como resolvido no fórum que cita este mesmo comportamento: https://cursos.alura.com.br/forum/topico-a-animacao-das-palavras-termina-de-forma-brusca-39432.

Além disso, quando separei em duas animações, como sugerido na solução desse outro tópico, o problema continua da mesma maneira.

.palavras-chave {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    animation: aparece 2s;
    animation: apareceFilho 2s;
}

@keyframes aparece {
    0% {
        transform: scale(0.001);
    }
}

@keyframes apareceFilho {
    0% {
        opacity: 0;
    }
}

A solução que encontrei para as palavras chegarem ao tamanho final durante a animação foi retirar o 'opacity' e deixar apenas o 'scale' variando.

A duvida que isso me gerou é: Existe alguma limitação para modificar mais de um atributo ao mesmo tempo na animação, ou fiz algo errado mesmo nesse processo?

Espero que tenha dado para entender, Obrigado!

8 respostas

Oi Raul, tudo bem? Antes de qualquer coisa, queria te fazer um pedido. Quando referenciar outros tópicos, coloca o link junto pra gente poder ver o outro tópico e entender melhor o que você está falando sobre ele, tá bem? Isso ajuda até mesmo outros alunos.

Segundo, como seu problema se trata sobre questões de código. Cola o trecho do código que acha ser o problemático aqui pra gente analisar uma solução?

Assim fica tudo centralizado pra quem quiser tentar ajudar você e ainda faz com que a solução para o sua dúvida possa ser resolvida mais rapidamente. Tá bem? Você poderia fazer isso por favor?

Olá Wanderson,

Editei o tópico da forma que você sugeriu, estava tarde quando criei e acabei pulando essas etapas =)

Espero que tenha ficado melhor para entender, valeu.

Oi Raul, agora ficou mais claro. Quanto a sua pergunta, não sei dizer que há uma limitação, mas mesmo em outros cenários é complicado sincronizar animações paralelas.

Lembrando que tem o fator percepção. As vezes a animação mesmo muito bem sincronizada, percebemos esses pequenos pulos. As vezes isso pode estar atrelado ao processamento da mesma, interrupções por causa da interpretação tardia de scripts, etc. Mesmo nas animações mais simples, podem haver gargalos.

O Sergio Lopes tem uma palestra muito bacana que fala sobre performance com animações e exemplos de como não cair nos gargalos de travamento.

Será que se você trocar o opacity, por filter: opacity, algo não muda? https://developer.mozilla.org/en-US/docs/Web/CSS/filter

Testei com o filter e o comportamento continuou da mesma forma, por algum motivo.

No primeiro caso, onde coloco o 'transform: scale()' e o 'opacity' juntos, a animação funciona de maneira estranha perto do seu final.

No segundo caso, onde separo em duas animações para o mesmo elemento, somente a que vem por último funciona, como se sobrepusesse à outra.

Acredito que em casos assim o caminho é planejar e adaptar uma eventual animação que se queira usar, como você sugeriu, para tentar driblar essas limitações :)

Obrigado.

Oi Raul, você consegue me disponibilizar um zip do seu projeto pra eu testar alguma alternativa? Algo no github ou mesmo um link pra download?

Opa Wanderson, segue o link do projeto no github então, modifiquei o arquivo "index.css" para deixar com a animação com o comportamento estranho que mencionei, se precisar de algo a mais avisa.

https://github.com/ruawl/FirstHomepage

Oi Raul, desculpa a demora. O finalzinho de ano é sempre complicado de manter o ritmo nas mensagens. Eu acabei de baixar o seu projeto. Vou analisar e procurar uma solução, talvez isso demore um pouco, tá bem? Qualquer coisa, se eu demorar mais de 2 dias, posta algo aqui que assim serve de lembrete.

Desculpa mesmo, vou ver isso hoje ainda se puder.

solução!

Raul, eu não consegui entender o problema de fato, mas até onde vi, me parece que é por causa das diferenças nos cálculos das escalas. Veja por exemplo que você aumenta a escala do elemento pai, até ai OK, todos os filhos recebem a mesma regra, juntamente com a opacidade.

Mas depois que a animação termina, o scale é recalculado por causa que cada filho tem seu próprio scale pra reduzir o tamanho da fonte. Mas a animação, não altera o tamanho da fonte dos elementos filhos, só a escala do elemento pai.

Então, depois que o elemento pai termina a animação, os elementos filhos terão seus scales recalculados. Esses scales não fazem parte da animação e por isso são feitos apenas no final quando há um salto no tamanho final da fonte.

Solução básica: mover a animação para os elementos li:

.palavras-chave li {
    animation: aparece 2s;
}

Lembrando que como também é feito cálculos com porcentagens de font-size e scale, Isso torna o problema um pouco mais complicado. A solução acima já resolve, mas você vai perceber que a animação muda um pouco, ela não vem mais de trás da imagem.

Eu não consegui pensar em outra solução que mantivesse a mesma animação. Desculpa.

Eu estou refazendo este curso. Quem sabe quando chegar nessa etapa, eu pense em algo.