Die Liste im Dialog rollt, das Anschlagbrett schreibt nicht mehr ab
Zwei Dinge aus Filipes Durchgang. ERSTENS: "das hoch und runter scollen geht nicht in der liste da." Die Auswahlliste im Kanal-Dialog liegt seit dem Popover-Umbau in der obersten Ebene. Das loest das Abschneiden -- aber der Zeiger steht danach ueber dem Dialog, nicht ueber der Liste, und das Mausrad rollt den Dialog. Der Horcher haengt jetzt am Dokument (capture) und fragt selbst, ob der Zeiger im Rechteck der Liste steht. Gemessen: 5 Messungen, 0 Befunde. ZWEITENS: "gestalte diese seite auch anders ... viel uebersichtlicher." Am Anschlagbrett stand die Herkunft als vollstaendige Abschrift des Titels darueber -- derselbe Satz zweimal, direkt untereinander. Jetzt nennt sie nur noch das Brett, wenn der Titel uebernommen wurde, und kuerzt sonst auf 60 Zeichen an der Wortgrenze. Dazu Karten mit 620 px Hoechstbreite, zwei nebeneinander statt einer Zeile ueber die ganze Breite -- lesbar bleibt, was eine begrenzte Zeilenlaenge hat. Gemessen: 11 Messungen, 0 Befunde; Titel von 352 px statt voller Breite, zwei Spalten a 571 px. Geprueft: pruef-anschlagbrett (12, 0), pruef-css-klassen, pruef-highlights, pruef-chat-kanaele (81, 0), pruef-freie-namen (32, 0). Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
@@ -349,6 +349,65 @@
|
||||
if (dlg && dlg.open && typeof liste.showPopover === "function") {
|
||||
liste.setAttribute("popover", "manual");
|
||||
try { liste.showPopover(); } catch { /* dann eben ohne */ }
|
||||
|
||||
/* ==== UND DAS SCROLLEN SELBST UEBERNEHMEN (24.09.2026) =======
|
||||
|
||||
Filipe: "das hoch und runter scollen geht nicht in der liste
|
||||
da."
|
||||
|
||||
Gemessen, alle drei Verdaechtigen einzeln:
|
||||
|
||||
scrollTop von Hand setzen geht (80)
|
||||
das wheel-Ereignis kommt an
|
||||
overscroll-behavior unauffaellig
|
||||
|
||||
Also kann der Kasten scrollen, und das Ereignis erreicht ihn
|
||||
-- der Browser fuehrt es nur nicht aus. Der Grund ist der
|
||||
modale Dialog: Er unterdrueckt das Scrollen von allem, was
|
||||
ausserhalb von ihm liegt. Ein Popover in der Top Layer bleibt
|
||||
zwar anklickbar (das hat die Messung gestern gezeigt), aber
|
||||
gescrollt wird darin nicht.
|
||||
|
||||
DIE LISTE IN DEN DIALOG ZU HAENGEN LOEST ES NICHT -- dort
|
||||
schneidet das clip-path der abgeschraegten Ecke sie ab, genau
|
||||
das war gestern der erste, falsche Versuch.
|
||||
|
||||
Also uebernimmt die Liste das Scrollen selbst: Das Ereignis
|
||||
ist da, der Weg ist frei, es fehlt nur die Ausfuehrung. Nur
|
||||
im Popover-Fall -- ueberall sonst macht der Browser es
|
||||
richtig, und ein zweiter Scroller danebenliegend waere die
|
||||
Sorte Doppelung, die irgendwann ruckelt. */
|
||||
const rollbar = liste.querySelector(".wahl2__zeilen") || liste;
|
||||
/* AM DOKUMENT, NICHT AN DER LISTE -- und zwar in der
|
||||
Einfangphase.
|
||||
|
||||
An der Liste zu horchen klingt naeher dran und ist es nicht:
|
||||
Welches Element ein Rad-Ereignis bekommt, entscheidet der
|
||||
Treffertest, und der meldet bei einem Popover ueber einem
|
||||
modalen Dialog den DIALOG. Gemessen: Ein Ereignis, das direkt
|
||||
auf der Liste ausgeloest wird, rollt sie (100 -> 209); eines
|
||||
ueber Bildschirmkoordinaten kommt gar nicht erst an.
|
||||
|
||||
Am Dokument laeuft jedes Rad-Ereignis vorbei, egal wer den
|
||||
Treffertest gewinnt. Ob es die Liste MEINT, entscheidet dann
|
||||
die Lage des Zeigers -- das ist dieselbe Frage, nur an einer
|
||||
Stelle beantwortet, an der sie beantwortbar ist. */
|
||||
z.beiRad = (ereignis) => {
|
||||
const r = liste.getBoundingClientRect();
|
||||
const drin = ereignis.clientX >= r.left && ereignis.clientX <= r.right
|
||||
&& ereignis.clientY >= r.top && ereignis.clientY <= r.bottom;
|
||||
if (!drin) return;
|
||||
const platz = rollbar.scrollHeight - rollbar.clientHeight;
|
||||
if (platz <= 0) return;
|
||||
const vorher = rollbar.scrollTop;
|
||||
rollbar.scrollTop = Math.max(0, Math.min(platz, vorher + ereignis.deltaY));
|
||||
/* Nur wenn wirklich gerollt wurde: Am Ende der Liste soll das
|
||||
Rad nichts weiter tun -- und vor allem nicht die Seite
|
||||
darunter bewegen. */
|
||||
if (rollbar.scrollTop !== vorher) ereignis.preventDefault();
|
||||
};
|
||||
document.addEventListener("wheel", z.beiRad,
|
||||
{ passive: false, capture: true });
|
||||
}
|
||||
stelle(z);
|
||||
z.knopf.setAttribute('aria-expanded', 'true');
|
||||
@@ -383,6 +442,13 @@
|
||||
|
||||
function schliessen() {
|
||||
if (!aktiv) return;
|
||||
/* Den Rad-Horcher abmelden. Ohne das bliebe bei jedem Oeffnen
|
||||
einer mehr am Dokument haengen -- und jeder von ihnen faende
|
||||
seine Liste nicht mehr. */
|
||||
if (aktiv.beiRad) {
|
||||
document.removeEventListener("wheel", aktiv.beiRad, { capture: true });
|
||||
aktiv.beiRad = null;
|
||||
}
|
||||
aktiv.liste?.remove();
|
||||
aktiv.knopf.setAttribute('aria-expanded', 'false');
|
||||
aktiv.liste = null;
|
||||
|
||||
Reference in New Issue
Block a user