Changeset c581e5e in Klonkt for src/assets/js/mod/read.js


Ignore:
Timestamp:
08/20/2026 07:25:24 AM (3 weeks ago)
Author:
Claude (agent) <aiclaude@…>
Branches:
main
Children:
22d2dba5
Parents:
520c993
git-author:
Robin <roboburr@…> (08/20/2026 02:56:12 AM)
git-committer:
Claude (agent) <aiclaude@…> (08/20/2026 07:25:24 AM)
Message:

proef: lenis ook op touch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/assets/js/mod/read.js

    r520c993 rc581e5e  
    143143 */
    144144const OP_DESKTOP = window.matchMedia('(hover: hover) and (pointer: fine)');
     145// PROEF (20-8): Lenis ook op touch. Robin meldde op mobiel drie dingen -- de
     146// header niet zichtbaar bij laden, snappen dat soms te ver gaat, en horizontaal
     147// kunnen scrollen. De eerste twee komen van de NATIVE snap: die vangt al bij het
     148// laden, en zijn uitloop vliegt bij een flick over een grens heen. Lenis zet de
     149// native snap uit en doet het zelf, dus die twee kunnen ermee verdwijnen.
     150//
     151// De prijs is echt: syncTouch betekent dat Lenis het VINGERSCROLLEN overneemt
     152// van iOS -- momentum, rubber-band en het wegschuiven van de adresbalk worden
     153// dan een benadering in JavaScript. De makers waarschuwen daar zelf voor op
     154// iOS < 16. Dit staat er dus als proef, niet als besluit: voelt het niet goed,
     155// dan is OP_TOUCH weer false zetten de hele terugweg.
     156const OP_TOUCH = window.matchMedia('(hover: none) and (pointer: coarse)');
    145157const VENDOR_V = 1;   // ophogen als de bestanden in /assets/js/vendor wijzigen
    146158
     
    149161
    150162async function startLenis() {
    151   if (lenis || !OP_DESKTOP.matches) return;
     163  if (lenis || !(OP_DESKTOP.matches || OP_TOUCH.matches)) return;
    152164  const [L, S] = await Promise.all([
    153165    import(`/assets/vendor/lenis.mjs?v=${VENDOR_V}`),
     
    165177    smoothWheel: true,
    166178    lerp: 0.2,
    167     syncTouch: false,   // op touch blijft alles van het systeem
     179    // Alleen op touch overneemt hij het vingerscrollen; op desktop hoeft dat niet.
     180    syncTouch: OP_TOUCH.matches,
     181    // TOUCH-SPECIFIEK, want de standaardwaarden voelen op een telefoon traag.
     182    //
     183    // Waar dat zit is precies aan te wijzen. In Lenis staat
     184    // `lerp: d ? syncTouchLerp : 1`, waarbij d "de vinger is net losgelaten"
     185    // betekent. Tijdens het SLEPEN is de lerp dus 1 -- de inhoud volgt je vinger
     186    // exact, net als iOS, en daar is niets mis mee. De traagheid zit in de glijder
     187    // NA het loslaten: die gebruikt syncTouchLerp, en dat staat standaard op
     188    // 0.075. Dat dempt zo langzaam uit dat de pagina nog seconden naijlt.
     189    //
     190    // TWEE KNOPPEN, en ze doen iets anders -- dat verwarde ik eerst:
     191    //
     192    //   touchInertiaMultiplier   hoe VER een veeg je brengt
     193    //   syncTouchLerp            hoe snel de glijder UITDEMPT
     194    //
     195    // Eerste ronde zette ik de multiplier op 25 (korter dan de standaard 35),
     196    // omdat ik "te traag" las als "hij ijlt te lang na". Robin bedoelde het
     197    // omgekeerde: een veeg moet je VERDER brengen, zoals op iOS -- daar draagt
     198    // een flick een heel eind. Dus juist omhoog, ruim boven de standaard.
     199    //
     200    // De lerp gaat mee terug naar 0.1: tussen de trage standaard (0.075, dat
     201    // seconden naijlt) en de kordate 0.15 in. Met een langere weg af te leggen
     202    // mag de demping wat zachter, anders komt hij te abrupt tot stilstand.
     203    // Waar we na een paar rondes proberen op uitkwamen, met de betekenis erbij
     204    // omdat de tweede knop contra-intuitief is:
     205    //
     206    //   touchInertiaMultiplier 70   hoe VER een veeg draagt (standaard 35).
     207    //                               25 en 45 waren allebei te kort.
     208    //   syncTouchLerp 0.05          hoe snel hij zijn doel BENADERT. Hoger = eerder
     209    //                               aankomen en dus abrupt stoppen; LAGER = langer
     210    //                               onderweg blijven. Robin: "te stroef bij het
     211    //                               loslaten, mag echt een tijdje doorscrollen".
     212    //                               Dus omlaag, niet omhoog -- 0.15 en 0.1 kapten
     213    //                               de uitloop af.
     214    // syncTouchLerp 0.25: VIER KEER de vorige waarde, en ruim boven de standaard
     215    // van 0.075. Ik heb hem vier rondes lang de verkeerde kant op gedraaid omdat
     216    // ik "stroef" las als "hij stopt te vroeg" -- maar het betekende STROPERIG.
     217    // Een lage lerp benadert het doel langzaam en geeft dus een kruipende
     218    // uitloop; hoog betekent er vlot naartoe. Met de multiplier op 70 blijft de
     219    // AFSTAND groot, dus je gaat ver EN snel: dat is hoe een flick op iOS voelt.
     220    //
     221    // Kort samengevat, want dit is twee keer misgegaan:
     222    //   syncTouchLerp hoger  = sneller weg, korter narollen
     223    //   multiplier hoger     = verder komen
     224    ...(OP_TOUCH.matches ? { syncTouchLerp: 0.25, touchInertiaMultiplier: 70 } : {}),
    168225    autoRaf: true,
    169226  });
     
    171228    type: 'proximity',
    172229    distanceThreshold: '12%',   // de vangzone, hier WEL instelbaar
    173     debounce: 60,               // niet de standaard 500: dat voelt als te laat
    174     duration: 0.4,              // in totaal onder de halve seconde
     230    // Hoe lang na de laatste scrollbeweging hij mag vangen. De standaard is 500
     231    // en dat voelt als te laat. Op touch nog korter dan op desktop, want daar
     232    // eindigt een veeg in een lange, trage staart -- en juist dan wil je dat de
     233    // snap er snel bij is in plaats van te wachten tot de laatste pixel stil ligt.
     234    //
     235    // LET OP DE SPANNING: een vloeiendere uitloop (lagere syncTouchLerp) maakt
     236    // die staart langer, en stelt de snap dus uit. Deze twee getallen houden
     237    // elkaar in evenwicht; draai je aan de een, kijk dan ook naar de ander.
     238    // OP TOUCH JUIST LANG, en dat is het omgekeerde van wat ik vorige ronde deed.
     239    // Tussen je vinger loslaten en het op gang komen van de uitloop zit een korte
     240    // stilte in de scrollbeweging. Met 25ms viel de snap precies in dat gat: hij
     241    // greep op het moment van loslaten en knipte de veeg af -- wat aanvoelt als
     242    // "stroef bij het loslaten", en het werd er dan ook erger van. 200ms laat de
     243    // uitloop eerst zijn werk doen.
     244    debounce: OP_TOUCH.matches ? 200 : 60,
     245    // Op touch korter: een telefoon vraagt om directer antwoord dan een muis, en
     246    // de snap komt daar aan het eind van een lange uitloop -- dan mag hij kort.
     247    duration: OP_TOUCH.matches ? 0.18 : 0.4,
    175248    // Vlot weg, dan steeds langzamer aankomen (Robin, 20-8). easeOutQuart: op de
    176249    // helft van de tijd is 94% van de weg af, en de rest dempt zacht uit.
Note: See TracChangeset for help on using the changeset viewer.