Menu
Coddy logo textTech

Animar elementos ao rolar

Parte da seção JavaScript in Action do Journey de HTML da Coddy. Lição 19 de 27.

Às vezes, queremos que os elementos se animem (fade in, slide in, zoom, etc.) quando entram na viewport ao rolar a página.
Isso geralmente é feito verificando se o elemento está visível na tela e, em seguida, adicionando uma classe que dispara uma animação ou transição CSS.

Primeiro, vamos criar um elemento HTML simples:

<div class="animate-on-scroll">This element will animate when scrolled into view</div>

Em seguida, adicione o CSS para a animação:

.animate-on-scroll {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 0.5s ease, transform 0.5s ease;
}

.animate-on-scroll.visible {
  opacity: 1;
  transform: translateY(0);
}

Agora, vamos criar uma função JavaScript para detectar quando os elementos entram na visualização ao rolar a página. Como podemos ter múltiplos elementos, percorremos cada um deles com o forEach e verificamos a posição de cada elemento em relação à viewport.

function checkScroll() {
  const elements = document.querySelectorAll('.animate-on-scroll');
  
  elements.forEach(element => {
    // Obtém a posição do elemento em relação à viewport
    const position = element.getBoundingClientRect();
    
    // Se o elemento estiver na viewport
    if(position.top < window.innerHeight) {
      element.classList.add('visible');
    }
  });
}

// Executa ao rolar a página
window.addEventListener('scroll', checkScroll);

// Executa uma vez ao carregar a página
checkScroll();

Quando um elemento com a classe animate-on-scroll entra na viewport, o script adiciona a classe visible, disparando a animação.

challenge icon

Desafio

Fácil

Dentro do loop, crie uma instrução if.

  1. A condição deve verificar: se a posição superior (top position) do elemento é menor que window.innerHeight - 50.
  2. Se a condição for verdadeira, use .classList.add("active") para adicionar a classe active a esse elemento.

Dessa forma, sempre que um elemento entrar na visualização (dentro de 50px a partir da parte inferior da tela), ele aparecerá suavemente com um efeito de fade-in.

Experimente você mesmo

<!DOCTYPE html>
<html>
<head>
  <title>Scroll Animation Example</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <header>
    <h1>Discover the Beauty of Nature</h1>
    <p>Scroll down to reveal the magic</p>
  </header>

  <div class="container">
    <div class="fade-in card">
      <h2>Mountains</h2>
      <p>Standing tall and timeless, mountains remind us of strength and stability.</p>
    </div>

    <div class="fade-in card">
      <h2>Forests</h2>
      <p>Forests are the lungs of our planet, offering peace and endless green beauty.</p>
    </div>

    <div class="fade-in card">
      <h2>Rivers</h2>
      <p>Calm or powerful, rivers flow endlessly, connecting life along their paths.</p>
    </div>

    <div class="fade-in card">
      <h2>Deserts</h2>
      <p>Silent and vast, deserts teach us resilience and the value of every drop of water.</p>
    </div>

    <div class="fade-in card">
      <h2>Oceans</h2>
      <p>The oceans cover most of our Earth, a mysterious world full of wonder and life.</p>
    </div>
  </div>

  <script src="script.js"></script>
</body>
</html>
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de JavaScript in Action

Pratique por conta própria: Playground de Web