Command Palette

Search for a command to run...

Eventos de Interfaz: Scroll, Resize, Focus y Blur

Domina los eventos de interfaz en JavaScript, desde scroll y resize hasta focus y blur, con ejemplos prácticos y mejores prácticas de rendimiento.

Lectura: 14 min
Nivel: Intermedio

TL;DR - Resumen rápido

  • El evento scroll se dispara cuando un elemento es desplazado, ideal para lazy loading
  • El evento resize detecta cambios en el tamaño de la ventana, útil para diseños responsivos
  • Los eventos focus y blur gestionan cuando un elemento gana o pierde el foco
  • focus y blur NO hacen bubbling, pero focusin/focusout sí lo hacen
  • Optimiza el rendimiento usando throttling para eventos de scroll y resize

Introducción a los Eventos de Interfaz

Los eventos de interfaz son un conjunto de eventos que te permiten responder a cambios en el entorno del navegador y en el estado de los elementos. Estos eventos son fundamentales para crear aplicaciones web responsivas, accesibles y con buen rendimiento. Desde detectar cuando el usuario hace scroll hasta saber cuando un elemento obtiene el foco, estos eventos te dan control total sobre la interfaz de tu aplicación.

Los eventos de interfaz más importantes son scroll, resize, focus yblur. Cada uno de estos eventos tiene un propósito específico y se usa en diferentes escenarios.

  • <strong>scroll:</strong> Se dispara al desplazar contenido. NO hace bubbling en algunos navegadores
  • <strong>resize:</strong> Se dispara al cambiar tamaño de ventana. Solo funciona en window
  • <strong>focus:</strong> Se dispara al obtener foco. NO hace bubbling
  • <strong>blur:</strong> Se dispara al perder foco. NO hace bubbling
  • <strong>focusin/focusout:</strong> Alternativas que SÍ hacen bubbling, útiles para delegación

Rendimiento y experiencia de usuario

Los eventos de interfaz pueden dispararse con mucha frecuencia (especialmente scroll y resize). Es crucial optimizar su manejo usando técnicas como throttling, debouncing o requestAnimationFrame para evitar problemas de rendimiento y mantener la interfaz fluida.

Evento Scroll

El evento scroll se dispara cuando el contenido de un elemento es desplazado. Este evento es útil para detectar cuando el usuario ha llegado al final de una lista, implementar lazy loading de imágenes, o crear efectos visuales que respondan al desplazamiento. Sin embargo, debido a que se dispara con mucha frecuencia, debe usarse con precaución.

Uso Básico de Scroll

El evento scroll se puede usar tanto en elementos específicos como en el objeto window. Cuando se usa en un elemento específico, el evento se dispara cuando ese elemento es desplazado. Cuando se usa en window, el evento se dispara cuando toda la página es desplazada.

scroll-basico.js
Loading code...

Este ejemplo muestra el uso básico del evento scroll. El listener detecta cuando el usuario hace scroll en el contenedor y muestra la posición actual del scroll. La propiedad scrollTop indica la posición vertical del scroll, mientras que scrollLeft indica la posición horizontal.

Optimización de Scroll

El evento scroll puede dispararse cientos de veces por segundo mientras el usuario hace scroll. Esto puede causar problemas de rendimiento significativos si ejecutas operaciones costosas dentro del listener. La optimización es esencial para mantener la interfaz fluida.

scroll-optimizacion.js
Loading code...

Este ejemplo muestra cómo optimizar el evento scroll usando throttling. El throttle limita la frecuencia de ejecución del listener a una vez cada 16ms (aproximadamente 60fps), lo que evita que el código se ejecute demasiadas veces y afecte el rendimiento.

Advertencia de rendimiento

Evita manipulaciones del DOM, cálculos complejos o llamadas a APIs dentro del listener de scroll. Si necesitas realizar estas operaciones, usa requestAnimationFrame para sincronizarlas con el ciclo de refresco del navegador, o usa throttling para limitar la frecuencia de ejecución.

Detectar Dirección del Scroll

A veces necesitas saber en qué dirección está haciendo el usuario scroll. Esto es útil para implementar funcionalidades como lazy loading, navegación infinita, o efectos visuales que respondan a la dirección del desplazamiento.

scroll-direccion.js
Loading code...

Este ejemplo muestra cómo detectar la dirección del scroll. Al comparar la posición actual del scroll con la posición anterior, puedes determinar si el usuario está haciendo scroll hacia arriba, hacia abajo, hacia la izquierda o hacia la derecha. Esta información es valiosa para implementar funcionalidades avanzadas.

Evento Resize

El evento resize se dispara cuando el tamaño de la ventana del navegador o de un elemento cambia. Este evento es esencial para crear diseños responsivos que se adaptan dinámicamente al tamaño de la pantalla, y para implementar funcionalidades que dependen del espacio disponible.

Uso Básico de Resize

El evento resize se usa principalmente en el objeto window para detectar cambios en el tamaño de la ventana. También se puede usar en elementos específicos, aunque esto es menos común. El evento proporciona las nuevas dimensiones a través de las propiedades innerWidth y innerHeight.

resize-basico.js
Loading code...

Este ejemplo muestra el uso básico del evento resize. Cuando el usuario cambia el tamaño de la ventana, el listener se dispara y muestra las nuevas dimensiones. Esto es útil para ajustar el diseño de la página dinámicamente según el espacio disponible.

Optimización de Resize

Al igual que el evento scroll, el evento resize puede dispararse con mucha frecuencia mientras el usuario cambia el tamaño de la ventana. Esto es especialmente problemático en dispositivos móviles donde el cambio de orientación (portrait/landscape) puede disparar múltiples eventos rápidos.

resize-optimizacion.js
Loading code...

Este ejemplo muestra cómo optimizar el evento resize usando debouncing. El debounce espera a que el usuario deje de cambiar el tamaño durante un período de tiempo (250ms en este caso) antes de ejecutar la lógica. Esto evita que el código se ejecute múltiples veces innecesariamente.

Mejor práctica

Para cambios de orientación en dispositivos móviles, considera usar window.matchMedia() en lugar de depender exclusivamente del evento resize. matchMedia() es más eficiente y te permite responder específicamente a cambios de orientación.

Evento Focus

El evento focus se dispara cuando un elemento obtiene el foco, generalmente cuando el usuario hace clic en el elemento o navega hasta él usando el teclado. Este evento es fundamental para la accesibilidad y para crear formularios con buena experiencia de usuario.

Uso Básico de Focus

El evento focus se usa comúnmente en elementos de formulario como inputs, textareas y botones. Cuando un elemento obtiene el foco, puedes resaltar visualmente el campo, mostrar ayuda contextual, o preparar el elemento para la entrada del usuario.

focus-basico.js
Loading code...

Este ejemplo muestra el uso básico del evento focus. Cuando el input obtiene el foco, se agrega una clase CSS que resalta visualmente el campo. También se muestra un mensaje de ayuda para guiar al usuario. Este patrón mejora significativamente la experiencia de usuario en formularios.

Focus vs FocusIn

Una confusión común es la diferencia entre focus y focusin. El eventofocus NO hace bubbling, mientras que focusin SÍ lo hace. Esta diferencia es importante cuando trabajas con elementos anidados o necesitas delegación de eventos de foco.

focus-vs-focusin.js
Loading code...

Este ejemplo muestra la diferencia entre focus y focusin. Con focus, el evento solo se dispara en el elemento específico que obtiene el foco. Con focusin, el evento se propaga hacia arriba, lo que permite usar delegación de eventos de foco en contenedores padres.

Error común

Un error frecuente es intentar usar delegación de eventos con focus o blur. Como estos eventos no hacen bubbling, la delegación no funcionará. Usa focusin y focusouten su lugar cuando necesites delegación de eventos de foco.

Evento Blur

El evento blur se dispara cuando un elemento pierde el foco, generalmente cuando el usuario hace clic en otro elemento o presiona Tab para navegar. Este evento es ideal para validar formularios, guardar cambios automáticamente, o limpiar mensajes de error cuando el usuario abandona un campo.

Uso Básico de Blur

El evento blur se usa comúnmente para validar formularios cuando el usuario abandona un campo. También es útil para guardar cambios automáticamente, limpiar mensajes de error, o restaurar el estado original del elemento.

blur-basico.js
Loading code...

Este ejemplo muestra el uso básico del evento blur para validación de formularios. Cuando el input pierde el foco, se valida el valor y se muestra un mensaje de error si es inválido. También se resalta el campo visualmente para indicar el problema.

Validación con Blur

El evento blur es especialmente útil para validación de formularios porque se dispara cuando el usuario abandona un campo, lo que indica que ha terminado de ingresar datos. Esto permite validar cada campo individualmente en lugar de esperar a que se envíe todo el formulario.

blur-validacion.js
Loading code...

Este ejemplo muestra cómo usar blur para validar un formulario completo. Cada campo se valida individualmente cuando pierde el foco, y también se valida el formulario completo cuando se intenta enviar. Este enfoque proporciona feedback inmediato al usuario y mejora la experiencia de usuario.

Consejo profesional

Cuando uses blur para validación, considera también usar el evento change para detectar cambios en el valor del campo. El evento change se dispara cuando el valor cambia y el campo pierde el foco, lo que complementa perfectamente a blur.

Casos de Uso Prácticos

Los eventos de interfaz se usan en una amplia variedad de escenarios en aplicaciones web modernas. Conocer estos casos de uso te ayudará a identificar cuándo y cómo aplicar estos eventos en tus proyectos.

  • <strong>Lazy loading:</strong> Usar scroll para cargar contenido cuando el usuario llega al final de la página
  • <strong>Diseño responsivo:</strong> Usar resize para ajustar el diseño según el tamaño de la pantalla
  • <strong>Accesibilidad:</strong> Usar focus y blur para mejorar la navegación por teclado
  • <strong>Validación de formularios:</strong> Usar blur para validar campos cuando el usuario los abandona
  • <strong>Animaciones:</strong> Usar scroll para crear efectos visuales que respondan al desplazamiento

Lazy Loading con Scroll

El lazy loading es una técnica de optimización que carga contenido solo cuando es necesario, generalmente cuando el usuario hace scroll hasta una posición específica. Esto mejora significativamente el rendimiento inicial de la página y reduce el ancho de banda.

lazy-loading.js
Loading code...

Este ejemplo muestra cómo implementar lazy loading usando el evento scroll. Cuando el usuario hace scroll cerca del final de la página, se cargan más elementos automáticamente. Esto mejora el rendimiento inicial y proporciona una experiencia de usuario más fluida.

Formulario Accesible con Focus y Blur

Los eventos focus y blur son fundamentales para crear formularios accesibles. El focus indica al usuario qué campo está activo, mientras que el blur permite validar y limpiar campos cuando el usuario los abandona. Esto mejora significativamente la experiencia de usuario, especialmente para usuarios que navegan con teclado.

formulario-accesible.js
Loading code...

Este ejemplo muestra cómo crear un formulario accesible usando focus y blur. Cuando un campo obtiene el foco, se resalta visualmente y se muestra ayuda contextual. Cuando pierde el foco, se valida el campo y se limpian los mensajes de error. Este patrón proporciona feedback claro y mejora la accesibilidad.

Resumen: Eventos de Interfaz

Conceptos principales:

  • El evento scroll se dispara cuando un elemento es desplazado, ideal para lazy loading
  • El evento resize detecta cambios en el tamaño de la ventana, útil para diseños responsivos
  • Los eventos focus y blur gestionan cuando un elemento gana o pierde el foco
  • focus y blur NO hacen bubbling, pero focusin/focusout sí lo hacen
  • Optimiza el rendimiento usando throttling para scroll y debouncing para resize

Mejores prácticas:

  • Usa throttling (16ms) para optimizar eventos de scroll que se disparan con mucha frecuencia
  • Usa debouncing (250ms) para optimizar eventos de resize que pueden dispararse múltiples veces
  • Usa focusin/focusout en lugar de focus/blur cuando necesites delegación de eventos de foco
  • Valida formularios con blur para proporcionar feedback inmediato al usuario
  • Implementa lazy loading con scroll para mejorar el rendimiento inicial de la página