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


Ignore:
Timestamp:
08/24/2026 08:29:13 AM (2 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
a1882e5
Parents:
7b03c35
Message:

Lezen op mobiel: proef met het native snappen, achter een vlag

De vraag die deze proef beantwoordt is er precies een: houdt de browser zich
aan scroll-snap-stop: always? Die eigenschap zegt dat een uitloop nooit over
een snappunt heen mag vliegen, en dat is woord voor woord de regel van 24-8
(voorbijgescrolld of niet, je landt op het target) maar dan uitgevoerd door
het toestel met zijn eigen momentumcurve.

Dat overvliegen was destijds de reden om Lenis op mobiel erbij te halen, en
de eigenschap is toen nooit geprobeerd: hij stond op normal, en dan ook nog
op .read-post, een element dat door scroll-snap-align:none helemaal geen
snappunt is. Het ankertje dat het snappunt WEL is had hem niet.

Achter ?nativesnap=1 (en =0 om terug te gaan), onthouden in sessionStorage
omdat een htmx-navigatie de queryreeks weggooit. Staat de vlag aan, dan
blijft Lenis van de telefoon af en snapt de browser zelf. Standaard verandert
er dus niets, voor niemand, en de Lenis-kant blijft heel tot de proef gewonnen
is.

Een detail dat anders stil zou blijven staan: zetSnappen() zette het snappen
"aan" door de inline stijl leeg te maken, oftewel terugvallen op de
stylesheet. Die zet het op mobiel juist uit. Zonder Lenis zou het snappen
daarmee nooit aangaan; nu staat er expliciet 'y proximity'. Op desktop is dat
exact wat de stylesheet daar al geeft.

MOD_V 60 en style.css v=109, want beide bestanden wijzigen.

File:
1 edited

Legend:

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

    r7b03c35 raaa700e  
    252252const RUST_MS = 120;
    253253
     254/**
     255 * DE PROEF: op mobiel het NATIVE snappen terug (24-8).
     256 *
     257 * De vraag die deze vlag beantwoordt is er precies een: houdt de browser zich
     258 * aan `scroll-snap-stop: always`? Die eigenschap zegt dat een uitloop nooit
     259 * over een snappunt heen mag vliegen -- en dat is woord voor woord Robins regel
     260 * ("ook al zou het target voorbijgescrolld worden, alsnog op het target
     261 * landen"), maar dan uitgevoerd door het toestel met zijn eigen momentumcurve
     262 * in plaats van door onze nabootsing ervan in JavaScript.
     263 *
     264 * Dat overvliegen was destijds de reden om Lenis er op mobiel bij te halen. De
     265 * eigenschap is toen nooit geprobeerd: hij stond op `normal`, en dan ook nog op
     266 * .read-post -- een element dat door scroll-snap-align:none helemaal geen
     267 * snappunt is. Het ankertje dat het snappunt WEL is had hem niet.
     268 *
     269 * ACHTER EEN VLAG, want de Lenis-kant blijft staan tot deze proef gewonnen is.
     270 * Wint hij, dan kan Lenis van de telefoon af en verdwijnen daarmee ook de vier
     271 * routes waarlangs de native scroll het gebaar nu soms overneemt. Verliest hij,
     272 * dan hebben we dat geweten voordat er iets weg was.
     273 *
     274 * ?nativesnap=1 zet hem aan, ?nativesnap=0 weer uit. De keuze blijft staan
     275 * zolang het tabblad open is, want een htmx-navigatie gooit de queryreeks weg
     276 * en dan zou de proef na een klik voorbij zijn.
     277 */
     278function nativeSnap() {
     279  try {
     280    const q = new URLSearchParams(location.search).get('nativesnap');
     281    if (q === '1') sessionStorage.setItem('klonkt:native-snap', '1');
     282    if (q === '0') sessionStorage.removeItem('klonkt:native-snap');
     283    return sessionStorage.getItem('klonkt:native-snap') === '1';
     284  } catch (e) {
     285    return false;   // privémodus zonder opslag: gewoon de gewone weg
     286  }
     287}
     288
    254289let bezig = false;          // loopt er een gebaar of een uitloop?
    255290let ooitGescrold = false;   // snappen begint UIT, zie zetSnappen()
     
    305340  // zijn snap heeft zijn scroll-gebeurtenissen nodig om te kunnen timen.
    306341  if (lenis || !(OP_DESKTOP.matches || OP_TOUCH.matches)) return;
     342  // Staat de proef aan, dan blijft Lenis van de telefoon af en doet de browser
     343  // het snappen zelf. Desktop merkt hier niets van: daar is OP_TOUCH onwaar.
     344  if (OP_TOUCH.matches && nativeSnap()) return;
    307345  const [L, S] = await Promise.all([
    308346    import(`/assets/vendor/lenis.mjs?v=${VENDOR_V}`),
     
    543581  // eerste gebaar naar beneden zet hem aan.
    544582  const el = document.documentElement;
    545   const wil = aan ? '' : 'none';
     583  // EXPLICIET 'y proximity', geen lege waarde. Leeg betekent "val terug op de
     584  // stylesheet", en die zet het snappen op mobiel juist UIT (de mediaquery bij
     585  // .read-post, want twee snapsystemen op dezelfde scroller vechten). Zolang
     586  // Lenis daar draaide klopte dat; zonder Lenis zou het snappen dan nooit meer
     587  // aangaan en zou de proef niets kunnen bewijzen.
     588  // Op desktop verandert er niets: dit is exact wat de stylesheet daar geeft.
     589  const wil = aan ? 'y proximity' : 'none';
    546590  if (el.style.scrollSnapType !== wil) el.style.scrollSnapType = wil;
    547591}
Note: See TracChangeset for help on using the changeset viewer.