🎬 Módulo 1: Parallax Scrolling

Agregando Profundidad Como una Película - Usando Bootstrap 5.3

Bootstrap 5.3 CSS Parallax JavaScript Parallax

Fondo Parallax (Fijo)

Desplázate para ver el efecto

¿Qué es Parallax Scrolling?

El parallax scrolling hace que los fondos se muevan más lento que el contenido del primer plano cuando te desplazas. Es como mirar por la ventana de un auto: los árboles (fondo) se mueven más lento que la carretera (primer plano). Esto agrega profundidad y hace que los sitios se sientan dinámicos.

Técnica Bootstrap + Parallax

HTML con Bootstrap:

<div class="parallax-section d-flex align-items-center justify-content-center text-white">
  <div class="container">
    <h2 class="display-3 fw-bold">Contenido Parallax</h2>
  </div>
</div>

CSS Personalizado para Parallax:

.parallax-section {
  background-image: url('...');
  min-height: 500px;
  background-attachment: fixed; /* ¡CLAVE! */
  background-position: center;
  background-size: cover;
}

✅ Utilidades Bootstrap Usadas

  • d-flex align-items-center – Centrado flexbox
  • container – Ancho responsivo
  • display-3 fw-bold – Tipografía
  • text-white – Color de texto
  • py-5 – Padding vertical

⚠️ Puntos Clave

  • Bootstrap maneja layout y diseño responsivo
  • CSS personalizado agrega el efecto parallax
  • Dispositivos móviles: parallax automáticamente deshabilitado
  • Respeta prefers-reduced-motion

Fondo con Desplazamiento Normal

Compara con la sección parallax de arriba

Comparación: Desplazamiento Normal

La sección verde de arriba usa background-attachment: scroll (el valor por defecto). Nota cómo se desplaza con el contenido en lugar de quedarse fija. Este es el enfoque tradicional.

📊 Diferencias Clave:

Técnica Implementación Soporte Móvil Complejidad
Parallax (fijo) background-attachment: fixed Limitado ⭐ Simple
Normal (scroll) background-attachment: scroll ✅ Funciona ⭐ Simple
🌌
☁️
JavaScript Parallax
Desplázate para ver 3 capas moviéndose a diferentes velocidades

Técnica 2: JavaScript Parallax con Múltiples Capas

La sección de arriba usa JavaScript con transform: translateY() para mover tres capas separadas a diferentes velocidades. Esto crea un efecto de profundidad más sofisticado que CSS puro.

Paso 1: Estructura HTML con data-speed

<div class="parallax-js-section">
  <!-- Cada capa se mueve a diferente velocidad -->
  <div class="parallax-layer layer-back" data-speed="0.2">🌌</div>
  <div class="parallax-layer layer-middle" data-speed="0.5">☁️</div>
  <div class="parallax-layer layer-front" data-speed="0.8">Texto</div>
</div>

Paso 2: JavaScript lee data-speed y aplica transform

// 1. Seleccionar todas las capas
const parallaxLayers = document.querySelectorAll('.parallax-layer');

// 2. Al hacer scroll, actualizar posición de cada capa
function updateParallax() {
  parallaxLayers.forEach((layer) => {
    // Leer el valor de velocidad del atributo HTML
    const speed = parseFloat(layer.dataset.speed);
    
    // Calcular cuánto mover esta capa
    const scrolled = window.pageYOffset;
    const yPos = scrolled * speed * 0.5;
    
    // Aplicar el transform
    layer.style.transform = `translateY(${yPos}px)`;
  });
}

// 3. Escuchar eventos de scroll eficientemente
window.addEventListener('scroll', () => {
  requestAnimationFrame(updateParallax);
}, { passive: true });

✅ Ventajas

  • Control Preciso: Controla la velocidad exacta por capa
  • Múltiples Elementos: Mueve cualquier elemento HTML
  • Funciona en Móviles: A diferencia del fondo fijo CSS
  • Animaciones Complejas: Combina con opacity, scale, etc.

⚠️ Consideraciones

  • Requiere JavaScript (se necesita fallback)
  • Usa requestAnimationFrame para rendimiento
  • Respeta prefers-reduced-motion
  • Las utilidades de Bootstrap siguen siendo útiles para el layout

♿ Accesibilidad: Respetando las Preferencias del Usuario

¿Qué es prefers-reduced-motion?

prefers-reduced-motion es una media query CSS que detecta si un usuario ha solicitado movimiento reducido en la configuración de su sistema operativo. Los usuarios pueden habilitarlo en:

  • macOS: Preferencias del Sistema → Accesibilidad → Pantalla → Reducir movimiento
  • Windows: Configuración → Accesibilidad → Pantalla → Mostrar animaciones
  • iOS: Ajustes → Accesibilidad → Movimiento → Reducir movimiento
  • Android: Ajustes → Accesibilidad → Eliminar animaciones

Cómo Esta Demo lo Respeta

Esta demo automáticamente deshabilita los efectos parallax cuando los usuarios tienen la reducción de movimiento habilitada:

// 1. Detectar la preferencia de movimiento del usuario
const prefersReducedMotion = window.matchMedia(
  '(prefers-reduced-motion: reduce)'
);
let isReducedMotion = prefersReducedMotion.matches;

// 2. Deshabilitar parallax CSS si es necesario
function handleMotionPreference() {
  if (isReducedMotion) {
    // Cambiar fondos fijos para que se desplacen normalmente
    document.querySelectorAll('.parallax-bg').forEach((el) => {
      el.style.backgroundAttachment = 'scroll';
    });
  }
}

// 3. No inicializar parallax JavaScript si hay movimiento reducido
function initParallax() {
  if (isReducedMotion) {
    console.log('Parallax deshabilitado: el usuario prefiere movimiento reducido');
    return; // Salir sin configurar animaciones
  }
  // ... resto del código parallax
}

// 4. Escuchar cambios de preferencia durante la sesión
prefersReducedMotion.addEventListener('change', (e) => {
  isReducedMotion = e.matches;
  // Actualizar animaciones en consecuencia
});

Pruébalo Tú Mismo

  1. Abre las DevTools de tu navegador (F12)
  2. Ve a la pestaña Console y escribe: window.matchMedia('(prefers-reduced-motion: reduce)').matches
  3. Devuelve true si el movimiento reducido está habilitado, false de lo contrario
  4. Habilita "Reducir movimiento" en la configuración de tu SO y recarga esta página
  5. ¡Nota cómo todos los efectos parallax están deshabilitados!

💡 Mejores Prácticas para Accesibilidad

  • Siempre respeta prefers-reduced-motion - Es una solicitud del usuario, no una sugerencia
  • Proporciona fallbacks: Asegúrate de que el contenido sea accesible sin movimiento
  • No solo reduzcas: Deshabilita el movimiento por completo cuando se solicite
  • Prueba exhaustivamente: Verifica con la reducción de movimiento habilitada
  • Bootstrap ayuda: Usa las utilidades de Bootstrap para estructura que funcione independientemente del movimiento