Cada post de este blog tiene una pequeña figura de Mr. Grummel sentada en el margen. Desplázate con constancia y asiente contigo. Deja de hacer scroll durante medio minuto y se queda dormido, con letras de ronquido flotando a su lado. Haz scroll lo bastante rápido, durante lo bastante tiempo, y deja de asentir para mostrarse molesto. Nada de eso es una decoración añadida después: es un único listener de scroll haciendo aritmética con tu posición de desplazamiento y el reloj, y traduciendo cuatro resultados sencillos en una clase de estado de ánimo.
Los dos únicos números que realmente tiene
Cada evento de scroll le da al listener dos datos: cuánto se movió la página desde el último evento y cuánto tiempo pasó. Divide uno entre el otro y obtienes una velocidad, en píxeles por segundo. Eso es todo el sensor. No sabe dónde están tus ojos, si estás en este párrafo o tres más adelante, ni si estás leyendo de verdad o manteniendo la página quieta mientras piensas en otra cosa — solo sabe a qué velocidad se desplazó el documento bajo un viewport fijo, que es un indicador indirecto de la atención y nada más.
De ese único número salen tres comportamientos. Haz scroll con normalidad y asiente un momento después de cada evento, volviendo a quedarse quieto tras nueve décimas de segundo sin más desplazamiento — suficiente para leerse como «te está siguiendo» sin dar un tirón en cada píxel. Deja de hacer scroll del todo y, tras treinta segundos de silencio, se duerme; vuelve a desplazarte y se despierta sobresaltado, con el ánimo pasando brevemente a sorprendido antes de volver a su seriedad habitual. Empuja la velocidad por encima de unos 1500 píxeles por segundo y mantenla así durante más de medio segundo, y lo interpreta como pasar por encima del texto en vez de leer — deja de asentir, se pone molesto, y ese veredicto se mantiene durante dos segundos y medio antes de estar dispuesto a reconsiderarlo, así que un gesto de scroll nervioso no puede hacerlo cambiar de humor en cada fotograma.
La única recompensa construida encima
Hay una segunda pieza, más sencilla, apoyada en el mismo elemento: un intersection observer que vigila la llamada a la acción con la que se cierra el post, justo debajo del último párrafo. En el instante en que el cuarenta por ciento de ese bloque entra en pantalla por primera vez, suelta un pequeño gesto de aprobación — no exactamente por terminar el post, ya que el sensor no puede confirmar eso, sino porque la página se ha desplazado lo suficiente como para que el final esté ahora en pantalla. Es un indicador indirecto que sustituye a otro indicador indirecto, y creemos que es una forma honesta de describirlo, no una crítica hacia él.
De lo que todavía no estamos seguros
La velocidad de scroll es, sinceramente, una señal débil para distinguir «pasar por encima» de «leer». Alguien que mueve el trackpad por costumbre mientras piensa a fondo en el párrafo anterior será marcado exactamente igual que alguien que de verdad está pasando de largo, y un sensor que solo mide velocidad no tiene forma de distinguir entre ambos casos. Construimos esto como un pequeño detalle de personaje honesto, no como una métrica de interacción en la que nadie debería confiar — si esta página alguna vez empezara a tomar decisiones basadas en lo que el compañero de lectura «cree» que hizo un visitante, eso sería una afirmación mucho más grande de lo que el sensor puede en realidad respaldar.
Nada de esto es temario — es una nota sobre cómo está construida esta página del blog, no algo que la app te vaya a preguntar. Si la distancia entre tiempo y los event listeners son el tipo de cosas sobre las que preferirías que te preguntaran en lugar de leer, la asignatura de Informática de la app cubre los conceptos más básicos que hay detrás, empezando por Programación.