Saltar al contenido

Desplazamiento en JavaScript

Entendiendo los eventos y técnicas de desplazamiento en JavaScript

Los eventos de desplazamiento en JavaScript permiten a los desarrolladores interactuar con el desplazamiento de una página web. Esto puede ser extremadamente útil para funciones como el efecto parallax, activar animaciones según la posición de desplazamiento, implementar desplazamiento infinito o incluso cambiar el estilo de los elementos de forma dinámica mientras el usuario se desplaza por una página. Esta guía explorará cómo usar JavaScript para manejar eventos de desplazamiento y ofrecerá ejemplos prácticos para demostrar técnicas eficaces.

Evento de desplazamiento en JavaScript

El evento scroll se dispara cuando se desplaza la vista del documento o un elemento. Es uno de los eventos más utilizados en las páginas web para efectos dinámicos y diseños interactivos.

Conceptos clave:

  • Frecuencia del evento: El evento scroll puede dispararse con mucha frecuencia, lo que hace que el código del controlador del evento se ejecute muy a menudo. Esto puede provocar problemas de rendimiento, por lo que es común aplicar debounce o throttle a estos eventos. En producción, envuelve el listener en una función debounce o throttle para limitar la frecuencia de ejecución. Por ejemplo:
javascript
function debounce(func, wait) {
  let timeout;
  return function(...args) {
    clearTimeout(timeout);
    timeout = setTimeout(() => func.apply(this, args), wait);
  };
}

window.addEventListener('scroll', debounce(() => {
  // handle scroll logic here
}, 100));
  • Desplazamiento de window vs. element: Puedes escuchar eventos de desplazamiento en toda la ventana o en elementos específicos desplazables.

Ejemplos prácticos de manejo del evento de desplazamiento

Ejemplo 1: Mostrar/Ocultar la navegación al desplazarse

Este ejemplo demuestra cómo ocultar una barra de navegación al desplazarse hacia abajo y mostrarla al desplazarse hacia arriba, lo cual es un patrón común en muchos sitios web modernos para maximizar el espacio en pantalla.


html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Scroll Event Navigation Example</title>
    <style>
      #navbar {
        position: fixed;
        top: 0;
        width: 100%;
        background-color: #333;
        color: white;
        text-align: center;
        padding: 10px;
        transition: top 0.3s;
      }
      body {
        padding: 0;
        margin: 0;
        height: 1500px; /* to ensure scrolling */
        font-family: Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <p style="display: flex; justify-content: center; align-items: center; margin-top: 50vh;"><strong>When you scroll down, the navigation bar disappears. Scroll back up, and it reappears!</strong></p>

    <div id="navbar">Navigation Bar</div>

    <script>
      let lastScrollTop = 0;
      window.addEventListener(
        "scroll",
        function () {
          let currentScroll = window.pageYOffset || document.documentElement.scrollTop;
          if (currentScroll > lastScrollTop) {
            document.getElementById("navbar").style.top = "-50px"; // Adjust based on nav height
          } else {
            document.getElementById("navbar").style.top = "0px";
          }
          lastScrollTop = currentScroll <= 0 ? 0 : currentScroll; // For Mobile or negative scrolling
        },
        false
      );
    </script>
  </body>
</html>

Explicación:

  • El script rastrea la última posición de desplazamiento y la compara con la posición actual. Si la posición actual es mayor, significa que el usuario se está desplazando hacia abajo, por lo que la barra de navegación se oculta ajustando su posición superior fuera de la pantalla.
  • Al desplazarse hacia arriba, la barra de navegación reaparece.

Ejemplo 2: Activador de animación al desplazarse

Este ejemplo muestra cómo puedes activar animaciones cuando los elementos entran en el viewport durante un desplazamiento.


html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Scroll Animation Trigger</title>
    <style>
        .box {
            width: 100px;
            height: 100px;
            background: red;
            opacity: 0;
            transition: opacity 2s;
            margin: 600px auto;  /* Ensures it starts out of view */
        }
    </style>
</head>
<body>
<p>Keep scrolling down to see the animation!</p>
<div class="box"></div>

<script>
    let hasAnimated = false;
    window.addEventListener('scroll', function() {
        const box = document.querySelector('.box');
        const rect = box.getBoundingClientRect();
        
        if (rect.top < window.innerHeight && !hasAnimated) {
            box.style.opacity = 1;  // Fade in the box when it comes into view
            hasAnimated = true;
        }
    });
</script>
</body>
</html>

Explicación:

  • Comprobación de visibilidad: El script comprueba si la parte superior del elemento .box está dentro del viewport y cambia su opacidad a 1, activando un efecto de aparición gradual. Una bandera evita que la animación se vuelva a activar en eventos de desplazamiento posteriores.

Ejemplo 3: Efecto de desplazamiento parallax

Este ejemplo demuestra un efecto parallax simple en el que la imagen de fondo se mueve a una velocidad diferente a la del contenido del primer plano mientras te desplazas por la página.


html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Enhanced Parallax Scrolling</title>
    <style>
        body, html {
            height: 100%;
            margin: 0;
            font-family: Arial, sans-serif;
            overflow-x: hidden; /* Prevent horizontal scroll */
        }
        .parallax {
            height: 100vh; /* Full height of the viewport */
            position: relative;
            background: url('https://via.placeholder.com/1920x1080') no-repeat center center; 
            background-size: cover;
            display: flex;
            justify-content: center;
            align-items: center;
            color: white;
            font-size: 36px;
            letter-spacing: 1px;
        }
        .content {
            height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            background: white;
            color: #333;
            font-size: 24px;
            padding: 0 20px;
            text-align: center;
            box-sizing: border-box;
            border-top: 1px solid #ccc;
            border-bottom: 1px solid #ccc;
        }
    </style>
</head>
<body>

<div class="content">Scroll down to see the parallax effect!</div>
<div class="parallax">Stunning Parallax!</div>
<div class="content">Keep scrolling to see more effects.</div>
<div class="parallax"></div>
<div class="content">You have reached the end. Amazing, right?</div>

<script>
    document.addEventListener('scroll', function() {
        document.querySelectorAll('.parallax').forEach(function(el) {
            const factor = 0.5; // Change this for more or less parallax
            const offset = window.pageYOffset * factor - 300; // Adjusts the starting position of background
            el.style.backgroundPositionY = offset + 'px';
        });
    });
</script>

</body>
</html>

Explicación:

  1. Estilos CSS:

    • La clase .parallax establece la imagen de fondo para que llene el contenedor y la posiciona en el centro. El ejemplo depende completamente de JavaScript para el posicionamiento, evitando background-attachment: fixed de CSS, que puede causar problemas de rendimiento en dispositivos móviles.
  2. Funcionalidad de JavaScript:

    • Al desplazarse, el script calcula una nueva posición vertical para la imagen de fondo según el desplazamiento.
    • Al ajustar backgroundPositionY de forma dinámica, la imagen se desplaza a una velocidad diferente a la del contenido de la página, creando el efecto de profundidad parallax.

En resumen, a medida que te desplazas por esta página web, verás que las imágenes de fondo se mueven más lentamente que el texto, creando un efecto visual agradable que hace que las imágenes parezcan estar a una profundidad diferente.

Conclusión

Manejar eficazmente los eventos de desplazamiento es una habilidad crucial para los desarrolladores web, ya que permite sitios web más interactivos y optimizados en rendimiento. Ya sea que estés implementando mejoras de interfaz de usuario como barras de navegación dinámicas o usando un efecto parallax en tu página, comprender y manejar correctamente el desplazamiento en JavaScript puede mejorar drásticamente la experiencia del usuario.

Practice

¿Qué acciones son usos apropiados del evento scroll de JavaScript en el desarrollo web?

¿Te resulta útil?

Vista previa dual-run — compárala con las rutas Symfony en producción.