Changeset d8f8f07 in Klonkt


Ignore:
Timestamp:
08/20/2026 02:02:18 AM (3 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
a505f31
Parents:
4989294
git-author:
Robin <roboburr@…> (08/20/2026 01:55:34 AM)
git-committer:
Robin <roboburr@…> (08/20/2026 02:02:18 AM)
Message:

Lezen: het snappunt op een anker van nul hoog, niet op het bericht zelf

Robins melding (20-8): "wanneer we aan de onderkant vlakbij de zone komen
begint het te verspringen; het lijkt alsof de bovenkant van de volgende
post aan de onderkant van de viewport snapt." En de goede vraag erbij: ligt
het aan de browser?

Ja, en volgens de spec -- dus geen bug maar een regel die ik niet kende.

Een snapgebied dat GROTER is dan het scherm mag op elke positie blijven
staan waar het het scherm nog vult. Onze berichten waren zelf het
snapgebied, en twee ervan zijn hoger dan de viewport (812 op dev):

bericht 2 1009px geldig van 700 tot 897
bericht 3 839px geldig van 1709 tot 1736

De bovenste stand van zo'n bereik is de onderkant van dat bericht op de
onderrand -- oftewel de bovenkant van het VOLGENDE bericht op de onderrand.
Precies wat Robin zag. En het "verspringen" volgt eruit: net binnen dat
bereik gebeurt er niets, net erbuiten wel, en die grens ligt midden in je
leesgebied. Onze CSS zei gewoon start; de browser mocht het ruimer nemen.

Gemeten voordat ik iets veranderde: landen op 867 (binnen het bereik van
bericht 2) gaf geen snap, landen op 1706 sprong naar 1709.

De reparatie: het snappunt verhuist naar een leeg <span> van NUL HOOG
bovenin elk bericht. Nul is nooit groter dan het scherm, dus er is precies
een geldige positie -- die bovenrand aan de bovenrand.

Na afloop gemeten:

grens naar bericht 2 -> 701 (doel 700)
grens naar bericht 3 -> 1710 (doel 1709)
oude "onderin"-stand 867 -> 701, geen vangst onderin meer
oude "onderin"-stand 1706 -> 1710

Onderweg een eigen fout gevangen: het anker staat BINNEN de padding van het
artikel, dus het snappunt lag 33px te laag en de scheidingslijn viel net
boven beeld (733 waar 700 hoort). scroll-margin-top: 2rem zet dat recht --
die verschuift alleen het snappunt en niet de opmaak, en blijft in de pas
met de padding-top van .read-post.

De regel voor het laatste bericht blijft staan; dat is een ander geval. Zijn
snappunt is onbereikbaar (2548 tegen een maximum van 2356), en dan snapt de
browser naar de bodem.

style.css naar v81.

Suite 1169/1169.

Co-Authored-By: Claude Opus 5 <noreply@…>

Location:
src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/assets/css/style.css

    r4989294 rd8f8f07  
    24922492       ook niet naar zijn eigen bovenrand -- anders trekt proximity je terug
    24932493       zodra je een paar regels verder leest. */
    2494     scroll-snap-align: start;
     2494    /* Het snappunt zit op .read-anker hierna, niet hier. Zie de toelichting
     2495       daar: een snapgebied groter dan het scherm heeft een BEREIK aan geldige
     2496       posities, en de bovenste daarvan zet het volgende bericht op de onderrand. */
     2497    scroll-snap-align: none;
    24952498    scroll-snap-stop: normal;
    24962499    /* GEEN min-height meer. Die rekte elk bericht tot een vol scherm, en bij een
     
    25112514    box-sizing: border-box;
    25122515}
     2516/* ONDERIN GEBEURT ER NIETS (Robin, 20-8: "enkel de bovenkant mag snappen, niet
     2517   de onderkant; onderin mag er niks met de zone gebeuren").
     2518   Het laatste bericht heeft een snappunt dat de browser NIET KAN BEREIKEN: er
     2519   zit niet genoeg pagina onder om zijn bovenkant naar de bovenrand te brengen.
     2520   Gemeten op dev: snappunt 2548, maar de scroll gaat maar tot 2356. De spec
     2521   laat de browser dan naar de dichtstbijzijnde BEREIKBARE positie snappen, en
     2522   dat is de bodem -- waardoor het laatste bericht ergens middenin het scherm
     2523   blijft hangen en het lijkt of er aan de onderkant wordt uitgelijnd.
     2524   Zonder snappunt scrolt dat laatste stuk gewoon vrij uit tot het einde. */
     2525/* HET SNAPPUNT. Nul hoog, dus precies EEN geldige positie: deze bovenrand aan de
     2526   bovenrand van het scherm. Zat de uitlijning op het artikel zelf, dan gold voor
     2527   elk bericht dat hoger is dan het scherm een heel BEREIK aan geldige posities
     2528   (spec: een snapgebied groter dan de snapport mag overal staan waar het de
     2529   snapport nog vult). Gemeten op dev: bericht van 1009px op een scherm van 812
     2530   -> geldig van 700 tot 897, en op 867 bleef hij dus gewoon staan. Die bovenste
     2531   stand, 897, is de onderkant van dat bericht op de onderrand -- oftewel de
     2532   bovenkant van het VOLGENDE bericht op de onderrand. Dat is wat er onderin
     2533   leek te snappen, en het kwam van de browser en niet uit onze code. */
     2534.feed-reader .read-anker {
     2535    display: block;
     2536    height: 0;
     2537    scroll-snap-align: start;
     2538    /* Het anker staat BINNEN de padding van het artikel, dus 2rem onder de
     2539       streep. Zonder deze correctie landt de snap 32px te laag en staat de
     2540       scheidingslijn net boven beeld -- gemeten: 733 waar 700 hoort.
     2541       scroll-margin verschuift alleen het SNAPPUNT en niet de opmaak, dus het
     2542       anker blijft waar het staat en de uitlijning klopt met de lijn.
     2543       Blijft in de pas met de padding-top van .read-post hierboven. */
     2544    scroll-margin-top: 2rem;
     2545}
     2546/* Het laatste bericht krijgt geen snappunt: zijn bovenkant is niet te bereiken
     2547   (er zit te weinig pagina onder), en de browser snapt dan naar de dichtstbij-
     2548   zijnde bereikbare positie -- de bodem. Gemeten: snappunt 2548, maxScroll 2356. */
     2549.feed-reader .read-post:last-child .read-anker { scroll-snap-align: none; }
     2550
    25132551/* Een lijn tussen twee berichten: zonder grens is een stroom een lange brij. */
    25142552.feed-reader .read-post + .read-post { border-top: 1px solid color-mix(in srgb, currentColor 12%, transparent); }
  • src/views/partials/read-article.ejs

    r4989294 rd8f8f07  
    2020         data-title="<%= post.title || '' %>"
    2121         aria-label="<%= post.title || '' %>">
     22  <%# Het SNAPPUNT, en met opzet een leeg element van nul hoog in plaats van het
     23      artikel zelf. Een snapgebied dat GROTER is dan het scherm mag van de spec
     24      overal blijven staan waar het het scherm nog vult -- dus bij een bericht
     25      van 1009px op een scherm van 812 accepteert de browser elke positie tussen
     26      de bovenkant en "onderkant op de onderrand". Die tweede stand zet de
     27      bovenkant van het VOLGENDE bericht op de onderrand van het scherm, en dat
     28      is wat Robin zag (20-8). Een anker van nul hoog heeft maar een geldige
     29      positie: zijn bovenkant op de bovenrand. %>
     30  <span class="read-anker" aria-hidden="true"></span>
    2231  <%# De titel is een echte link naar het bericht zelf. De leesstroom toont de
    2332      TEKST, maar reacties, waarderingen en boosts staan op de berichtpagina --
  • src/views/shell.ejs

    r4989294 rd8f8f07  
    222222
    223223<!-- v9 stylesheet (full palette system) -->
    224 <link rel="stylesheet" href="/assets/css/style.css?v=78">
     224<link rel="stylesheet" href="/assets/css/style.css?v=81">
    225225<script>
    226226/* iOS safe-area, built by hand. env(safe-area-inset-top) resolves to 0 on this iOS in
Note: See TracChangeset for help on using the changeset viewer.