Was nur fuer Vorleseprogramme dasteht, ist kein zerquetschter Text

DER BEFUND WAR EIN FEHLALARM

pruef-handy-teamdogi meldete auf notizen.html, nur bei 412 px:

  Text auf fast nichts gedrueckt -- a.zurueck „Team Dogi…" 0 statt 82px

Nachgemessen ist das Absicht. start.css setzt auf schmalen Schirmen
`.kopfleiste .marke__text` auf 1x1 Pixel mit `clip-path: inset(50%)`
-- das uebliche Muster fuer "bleibt fuer Vorleseprogramme,
verschwindet fuer das Auge". Der Grund steht daneben: Der Text
steht auf jeder Seite zwei Zeilen tiefer noch einmal als
Ueberschrift.

WARUM DIE ERKENNUNG DANEBENGRIFF

`nurVorlesen()` gab es laengst -- sie sah aber nur das Element
SELBST an. Der Link darin ist 0 Pixel breit, aber eine Zeile hoch,
und traegt selbst kein `clip-path`. Er fiel damit durch beide
Bedingungen. Die Funktion steigt jetzt die Kette der Vorfahren hoch.

DAS MACHT DIE REGEL SCHAERFER, NICHT LAXER

Ausgenommen wird nur, was in einem nachweislich abgeklemmten Kasten
sitzt. Der echte Fund vom 20.09.2026 -- ein Gespraechsname, der in
einer normalen Kopfzeile auf null gequetscht wurde -- hat keinen
solchen Vorfahren und wird weiter gemeldet.

Und das ist nicht behauptet, sondern gemessen: Die Gegenprobe
bekommt ein PAAR statt eines Falls. Derselbe zerquetschte Text
einmal in einem abgeklemmten Kasten (darf nicht gemeldet werden)
und einmal ohne (muss gemeldet werden). Eine Regel, die enger
misst, kann zu eng sein; dann faellt echter Schaden durch und der
Lauf bleibt gruen. Sechs Gegenproben statt vier.

GEMESSEN

  244 Seitenaufrufe, 123409 Elemente, 5393 Bedienelemente
  0 Befunde   (vorher: 4-5, darunter die 40-Pixel-Knoepfe)
  alle sechs Gegenproben greifen, zweimal hintereinander gleich

  span#gp-laut  „Dieser Name ist wirklich…" 0 statt 320px  -> gemeldet
  span#gp-leise                                            -> nicht

OFFEN GEBLIEBEN

Die Ueberstandsmessung derselben Datei nimmt abgeklemmte Elemente
NICHT aus -- mein Gegenprobe-Element taucht dort als 523 px auf.
Auf echten Seiten hat das keine Folgen (0 Befunde), aber es ist
dieselbe Inkonsistenz an einer zweiten Stelle. Nicht angefasst,
weil der Nachweis dafuer wieder den ganzen Lauf braucht.
This commit is contained in:
2026-09-29 14:35:29 +02:00
parent af61f77e92
commit 59b2a6d0e5
+66 -3
View File
@@ -316,12 +316,39 @@ const messen = () => {
/* NUR-FUER-VORLESEPROGRAMME IST KEIN FEHLER. Solche Elemente sind /* NUR-FUER-VORLESEPROGRAMME IST KEIN FEHLER. Solche Elemente sind
absichtlich 1 px groß und weggeschnitten -- sie als „zu klein" zu absichtlich 1 px groß und weggeschnitten -- sie als „zu klein" zu
melden wäre ein Fehlalarm, der die echten Funde zudeckt. */ melden wäre ein Fehlalarm, der die echten Funde zudeckt. */
const nurVorlesen = (e) => { /* WER IN EINEM ABGEKLEMMTEN KASTEN SITZT, IST SELBST ABGEKLEMMT
(geschaerft 29.09.2026).
Gemeldet wurde `a.zurueck „Team Dogi…" 0 statt 82px` auf
notizen.html. Das ist kein Mangel, sondern Absicht: Auf schmalen
Schirmen setzt start.css `.kopfleiste .marke__text` auf 1x1
Pixel mit `clip-path: inset(50%)` -- das uebliche Muster fuer
„bleibt fuer Vorleseprogramme, verschwindet fuer das Auge".
Daneben steht der Grund: Der Text steht auf jeder Seite zwei
Zeilen tiefer noch einmal als Ueberschrift.
Die Erkennung sah nur das Element SELBST an. Der Link darin ist
0 Pixel breit, aber eine Zeile hoch -- also fiel er durch beide
Bedingungen und wurde gemeldet. Sie steigt jetzt die Kette der
Vorfahren hoch.
DAS MACHT DIE REGEL SCHAERFER, NICHT LAXER: Ausgenommen wird
nur, was in einem nachweislich abgeklemmten Kasten sitzt. Ein
Name, der in einer normalen Kopfzeile auf null gequetscht wird
-- der echte Fund vom 20.09. -- hat keinen solchen Vorfahren
und wird weiter gemeldet. */
const abgeklemmt = (e) => {
const st = getComputedStyle(e); const st = getComputedStyle(e);
const r = e.getBoundingClientRect(); const r = e.getBoundingClientRect();
return (r.width <= 2 && r.height <= 2) return (r.width <= 2 && r.height <= 2)
|| st.clipPath === "inset(50%)" || st.clip === "rect(0px, 0px, 0px, 0px)"; || st.clipPath === "inset(50%)" || st.clip === "rect(0px, 0px, 0px, 0px)";
}; };
const nurVorlesen = (e) => {
for (let k = e; k && k !== document.body; k = k.parentElement) {
if (abgeklemmt(k)) return true;
}
return false;
};
const alle = [...document.querySelectorAll("body *")]; const alle = [...document.querySelectorAll("body *")];
const bedienbar = [...document.querySelectorAll(BEDIENBAR)] const bedienbar = [...document.querySelectorAll(BEDIENBAR)]
@@ -785,6 +812,35 @@ melde("\n --- Gegenprobe (beide Fehler MÜSSEN gefunden werden) ---");
stumm.textContent = "o"; stumm.textContent = "o";
stumm.style.cssText = "width:8px;height:8px;pointer-events:none"; stumm.style.cssText = "width:8px;height:8px;pointer-events:none";
document.body.append(stumm); document.body.append(stumm);
/* ---- UND DIE AUSNAHME VOM 29.09.2026 -------------------------
(c) Zerquetschter Text IN einem abgeklemmten Kasten -- darf
NICHT gemeldet werden. So steht der Markentext in der
Kopfleiste auf schmalen Schirmen: 1x1 Pixel mit
`clip-path: inset(50%)`, damit er fuer Vorleseprogramme
bleibt und fuer das Auge verschwindet.
(d) DERSELBE TEXT OHNE ABGEKLEMMTEN KASTEN -- muss gemeldet
werden. Ohne dieses Paar waere die neue Ausnahme nicht
geprueft, sondern nur behauptet: Eine Regel, die enger
misst, kann zu eng sein, und dann faellt echter Schaden
durch. */
const huelle = document.createElement("div");
huelle.style.cssText = "position:absolute;width:1px;height:1px;"
+ "overflow:hidden;clip-path:inset(50%);white-space:nowrap";
const leise = document.createElement("span");
leise.id = "gp-leise";
leise.textContent = "Nur fuer Vorleseprogramme, nicht fuers Auge";
huelle.append(leise);
document.body.append(huelle);
const eng = document.createElement("div");
eng.style.cssText = "width:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap";
const laut = document.createElement("span");
laut.id = "gp-laut";
laut.textContent = "Dieser Name ist wirklich zerquetscht worden";
laut.style.cssText = "display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap";
eng.append(laut);
document.body.append(eng);
}); });
const g = await seite.evaluate(messen); const g = await seite.evaluate(messen);
const ok1 = g.ueberstand.length > 0; const ok1 = g.ueberstand.length > 0;
@@ -794,12 +850,19 @@ melde("\n --- Gegenprobe (beide Fehler MÜSSEN gefunden werden) ---");
der stumme Knopf. */ der stumme Knopf. */
const ok3 = !g.ueberstand.some((x) => /9\d\dpx/.test(x)); const ok3 = !g.ueberstand.some((x) => /9\d\dpx/.test(x));
const ok4 = !g.klein.some((x) => /\b8×8\b/.test(x)); const ok4 = !g.klein.some((x) => /\b8×8\b/.test(x));
/* Das Paar vom 29.09.: der abgeklemmte Text darf NICHT auftauchen,
der daneben MUSS. Nur beides zusammen beweist, dass die neue
Ausnahme genau greift und nicht weiter. */
const ok5 = g.zerquetscht.some((x) => /gp-laut/.test(x));
const ok6 = !g.zerquetscht.some((x) => /gp-leise/.test(x));
melde(` ${ok1 ? "ok " : "FEHL"} ein zu breites Element wird gemeldet (${g.ueberstand.join(", ") || "nichts"})`); melde(` ${ok1 ? "ok " : "FEHL"} ein zu breites Element wird gemeldet (${g.ueberstand.join(", ") || "nichts"})`);
melde(` ${ok2 ? "ok " : "FEHL"} ein zu kleiner Knopf wird gemeldet (${g.klein.join(", ") || "nichts"})`); melde(` ${ok2 ? "ok " : "FEHL"} ein zu kleiner Knopf wird gemeldet (${g.klein.join(", ") || "nichts"})`);
melde(` ${ok3 ? "ok " : "FEHL"} was in einem rollenden Kasten steht, NICHT`); melde(` ${ok3 ? "ok " : "FEHL"} was in einem rollenden Kasten steht, NICHT`);
melde(` ${ok4 ? "ok " : "FEHL"} was keine Klicks annimmt, auch NICHT`); melde(` ${ok4 ? "ok " : "FEHL"} was keine Klicks annimmt, auch NICHT`);
if (!ok1 || !ok2) { fehler += 1; probleme.push("GEGENPROBE VERSAGT — die Messung findet nichts mehr"); } melde(` ${ok5 ? "ok " : "FEHL"} zerquetschter Text wird gemeldet (${g.zerquetscht.join(", ") || "nichts"})`);
if (!ok3 || !ok4) { fehler += 1; probleme.push("GEGENPROBE VERSAGT — die Messung meldet Absicht als Fehler"); } melde(` ${ok6 ? "ok " : "FEHL"} was nur fuer Vorleseprogramme dasteht, NICHT`);
if (!ok1 || !ok2 || !ok5) { fehler += 1; probleme.push("GEGENPROBE VERSAGT — die Messung findet nichts mehr"); }
if (!ok3 || !ok4 || !ok6) { fehler += 1; probleme.push("GEGENPROBE VERSAGT — die Messung meldet Absicht als Fehler"); }
await kontext.close(); await kontext.close();
} }