Se você, assim como eu, gosta de animações e está querendo uma animação de entrada com o efeito de máquina de escrever simples, bonita e eficiente sem a necessidade de instalar uma lib externa para isso, você veio ao lugar certo!

Recentemente eu estava desenvolvendo um projeto e tive a ideia de fazer tal efeito, porém, pesquisando um pouco, percebi que a grande maioria dos tutoriais utilizam uma lib de terceiros para construir esse efeito, e eu não estava nem um pouco a fim de instalar uma lib em meu projeto simplesmente para fazer essa animação.

Então, resolvi colocar a mão na massa e desenvolver um componente capaz de produzir esse efeito.

E foi um desafio, pois a maneira como o React interage com o DOM é diferente, mas no final eu obtive o seguinte resultado:

Gif máquina de escrever
Gif máquina de escrever

Pré-requisitos

A princípio, para que você consiga prosseguir e alcançar o mesmo resultado apresentado acima, você precisa ter um projeto React ou Next e configurar o Tailwind CSS em seu projeto.

O Tailwind não é obrigatório, você pode fazer tudo com CSS puro. Porém, eu estou usando Tailwind neste exemplo, ok?

Depois que você configurou o seu projeto, vamos desenvolver nosso componente. Para isso, crie um componente com o nome “maquinaDeEscrever” ou algum outro nome do seu agrado:

Máquina de escrever
Máquina de escrever

No meu caso, eu criei a pasta components e dentro dela o arquivo “MaquinaDeEscrever“. Depois que você criar, exporte uma função com o mesmo nome:

A função

Componente máquina de escrever
Componente

Este componente só tem um estado, e ela retorna o valor desse estado.

Agora nós temos que, de alguma forma, fazer esse componente escrever o valor do estado na tela simulando uma máquina de escrever. Vamos nessa?

Escrevendo na tela com máquina de escrever
Escrevendo na Tela

Olhando o código acima, nós só criamos uma função chamada “escreverNaTela” e a única coisa que essa função faz é alterar o estado do componente, sempre adicionando uma letra após a outra, com um conceito, chamado de recurção (eu não vou entrar em detalhes desse conceito, pois ele não é o foco do artigo, certo?).

Outra coisa importante que esse componente está fazendo é chamando a função dentro de um useEffect. Mas o que isso quer dizer? Bom, isso significa que essa função vai ser chamada logo depois que o DOM (Document Object Model) for carregado.

Usando o componente

A partir de agora, nós já podemos usar o nosso componente em qualquer parte da nossa aplicação.

Vamos fazer um teste inicial?

Eu vou utilizar esse componente no meu arquivo index.jsx. Você pode chamá-lo em qualquer parte da sua aplicação/árvore de componentes.

Chamando o componente
Chamando o componente

Como pode ver, o meu index só tem estilos feitos com o Tailwind CSS e a chamada ao nosso componente. Não esqueça do importe, ok?

Depois, nós só precisamos passar o texto via props para que o efeito seja aplicado, e já podemos conferir o resultado em nosso browser:

Testando efeito
Testando efeito

Nós já temos um resultado aceitável, concorda? No entanto, ainda está diferente do resultado proposto no início do artigo.

Então, vamos voltar pro código e finalizar nosso componente.

Finalizando o componente
Finalizando o componente

Vamos entender o que mudou aqui.

A princípio, nós definimos um novo estado, que define quando o cursor dever ser exibido ou não, e a gente muda esse estado de acordo com a nossa preferência.

Também temos uma nova propriedade chamada “delay”. Essa props seta um abraso, entre uma frase e outra.

Nós vamos entender isso mais adiante.

Animando o cursor

Logo após o return da função dentro da div, nós temos um span que representa nosso cursor e ele contém uma animação bem simples, porém, para que ela funcione no Tailwind CSS, nós precisamos definir essa animação em nosso arquivo tailwind.config.js, mais especificamente dentro de extend:

Definindo animação do cursor
Definindo animação do cursor

E agora, finalmente podemos visualizar o resultado do nosso componente.

Da mesma forma como antes, precisamos passar as props, para o componente:

Usando a versão final
Usando a versão final

Por fim, instanciamos três componentes “MaquinaDeEscrever” cada um com frases diferentes e com diferentes delays.

Como resultado teremos em nosso navegador o seguinte efeito:

Resultado final
Resultado final

Conclusão

Se você chegou até aqui, agora você poderá criar a sua própria versão melhorada desse projeto. Você pode ver o código completo no github.

Muito obrigado por chegar até aqui, um abraço e até a próxima!

Leia também

Dark Mode com Next.JS

Quais projetos colocar no meu portfólio?

NVM – Instalação e utilização

Front-end e back-end: O que são e quais suas diferenças