Elke post op dit blog heeft een klein figuurtje van Mr. Grummel in de kantlijn. Scrol je gestaag, dan knikt hij mee. Stop je een halve minuut met scrollen, dan doezelt hij weg, met snurkletters die naast hem omhoog drijven. Scrol je snel genoeg, lang genoeg, dan stopt hij met knikken en kijkt hij geïrriteerd. Niets daarvan is decoratie die er achteraf op is geplakt — het is één scroll-listener die rekenwerk doet met je scrollpositie en de klok, en vier eenvoudige uitkomsten koppelt aan een stemmingsklasse.
De enige twee getallen die hij eigenlijk heeft
Elke scrollgebeurtenis geeft de listener twee dingen: hoe ver de pagina is bewogen sinds de vorige gebeurtenis, en hoeveel tijd daartussen zat. Deel het één door het ander en je krijgt een snelheid, in pixels per seconde. Dat is de hele sensor. Hij weet niet waar je ogen zich bevinden, of je bij deze alinea bent of al drie verder, of je überhaupt aan het lezen bent versus de pagina stilhoudt terwijl je aan iets anders denkt — hij weet alleen hoe snel het document onder een vast beeldvenster doorschoof, en dat is een indirecte maat voor aandacht, niets meer.
Uit dat ene getal volgen drie gedragingen. Scrol je normaal, dan knikt hij even na elke gebeurtenis, om na negen tiende van een seconde zonder verdere scrollbeweging weer stil te vallen — genoeg om te lezen als "meelezen" zonder bij elke pixel te schokken. Stop je helemaal met scrollen, dan valt hij na dertig seconden stilte in slaap; scrol je weer, dan schrikt hij wakker, met even een verraste stemming voordat hij weer terugvalt op zijn gebruikelijke strengheid. Duw je de snelheid voorbij zo'n 1500 pixels per seconde en houd je dat langer dan een halve seconde vol, dan leest hij dat als scannen in plaats van lezen — het knikken stopt, hij wordt geïrriteerd, en dat oordeel blijft twee en een halve seconde staan voordat hij bereid is het te heroverwegen, zodat één schokkerig scrollgebaar hem niet elke frame heen en weer kan laten omslaan.
De ene beloning die erbovenop is gebouwd
Er zit nog een tweede, eenvoudiger onderdeel op datzelfde element: een intersection observer die de afsluitende call-to-action van de post in de gaten houdt, direct onder de laatste alinea. Zodra veertig procent van dat blok voor het eerst in beeld scrolt, geeft hij een klein goedkeurend momentje — niet omdat je de post uit hebt, want dat kan de sensor niet bevestigen, maar omdat de pagina ver genoeg gescrold is dat het einde nu in beeld staat. Het is een indirecte maat bovenop een indirecte maat, en we denken dat dat een eerlijke omschrijving is, geen kritiekpunt.
Waar we nog niet zeker van zijn
Scrolsnelheid is een oprecht zwak signaal voor "scannen" versus "lezen". Iemand die uit gewoonte even met het trackpad flitst terwijl hij diep nadenkt over de vorige alinea, wordt precies zo aangemerkt als iemand die daadwerkelijk aan het scannen is, en er is geen manier voor een snelheidssensor om die twee uit elkaar te houden. We hebben dit gebouwd als een klein, eerlijk stukje karakter, niet als een betrokkenheidsmeting die iemand zou moeten vertrouwen — mocht deze pagina ooit beslissingen gaan baseren op wat het leesmaatje "denkt" dat een bezoeker deed, dan zou dat een veel grotere claim zijn dan de sensor eigenlijk kan onderbouwen.
Niets hiervan is lesstof — het is een notitie over hoe deze blogpagina gebouwd is, geen onderwerp waar de app je op overhoort. Als afstand-gedeeld-door-tijd en event listeners iets zijn waarover je liever overhoord wordt dan dat je erover leest, dan behandelt het vak Informatica in de app de eenvoudigere bouwstenen daaronder, te beginnen bij Programmeren.