Handy: Sicherheitsabstaende, Wisch-Reiter, zweispaltige Uebersicht

Der wichtigste Fund: env(safe-area-inset-*) stand bereits im CSS, lieferte
aber immer null -- viewport-fit=cover fehlte auf allen dreizehn Seiten.
Der Code sah richtig aus und tat nichts. Zusammen mit
apple-mobile-web-app-status-bar-style=black-translucent (schon gesetzt)
hiess das: installiert lag die Kopfzeile auf einem iPhone hinter Uhr und
Akkuanzeige.

Behoben:
- viewport-fit=cover auf allen 13 Seiten.
- Vier Sicherheitsabstaende zentral benannt statt an jeder Stelle
  einzeln geschrieben. Kopfzeile weicht der Statusleiste, Container dem
  seitlichen Notch im Querformat, Fusszeile der Gestenleiste.
- Der 'Ueberspringen'-Knopf des Vorspanns lag mit bottom:2rem praktisch
  AUF dem Entsperr-Strich (34px). Man haette die App verlassen statt
  uebersprungen.
- Eigener Zweig fuer den installierten Betrieb: kein Gummiband-
  Nachfedern (sieht in einer App nach einem Fehler aus), kein
  Installations-Hinweis.
- Die vier Sprungmarken auf der Rechtsseite waren 39px hoch -- fuenf
  unter dem Daumenmass. Ausgerechnet dort muss man zum Widerrufsrecht
  springen koennen.
- 'Waehle links einen Verlauf aus': Auf dem Handy gibt es kein links,
  die Liste steht darueber. Richtungswort entfernt.
- Sechs Reiter brauchten auf dem Handy drei Zeilen. Jetzt ein
  Wischstreifen mit Einrasten und Auslauf am Rand; der aktive Reiter
  wird herangeholt, wenn man ueber eine Kachel springt.
- Uebersicht zweispaltig statt zwoelf Zeilen untereinander: 2635px ->
  1924px. Eine Uebersicht, an der man vorbeiwischen muss, ist keine.

Geprueft mit 55 neuen Handy-Pruefungen auf iPhone 14 Pro, Pixel 7 und
320px Breite, jeweils im Browser und im installierten Zweig. Drei
Fehlalarme der eigenen Pruefung wurden begruendet ausgenommen (Honigtopf
bei left:-9999px, Eingabefeld in einer Beschriftung, Inline-Link im
Fliesstext -- WCAG 2.5.8 nimmt letztere ausdruecklich aus).

Zwei Selbstkorrekturen an der Pruefung dokumentiert: Die Emulation von
display-mode wirkt nicht (Chromium nimmt den Befehl an und ignoriert
ihn) -- ohne das waeren die zwoelf 'installiert'-Zeilen ein zweiter
Browser-Durchgang gewesen. Und die Messung gegen die Systemleisten mass
zuerst die Kastenkante statt der Inhaltskante und meldete elf korrekte
Seiten als fehlerhaft. Eine Selbstpruefung mit einem absichtlich falsch
gesetzten Knopf belegt jetzt, dass die Messung echte Fehler findet.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-08-23 19:51:10 +02:00
co-authored by Claude Opus 5
parent c1cb51884f
commit 37f1b4a8f5
18 changed files with 912 additions and 23 deletions
+121 -2
View File
@@ -905,7 +905,7 @@ a.wd-karte:hover, .wd-karte--klickbar:hover {
/* Vollbildnavigation auf dem Handy (Masterplan S.5), aber scrollbar —
bei 8 Punkten + Sprachschalter passt sonst nicht alles auf ein
kleines Display. */
max-height: calc(100vh - 70px);
max-height: calc(100dvh - 70px);
overflow-y: auto;
}
.wd-nav.wd-offen { display: flex; }
@@ -1710,7 +1710,16 @@ button.po-aufg-haken:hover { border-color: var(--wd-gold); background: rgb(var(-
margin: 1.2rem 0 1.6rem;
}
.rl-nav a {
padding: .42rem .85rem; border-radius: 999px;
/* inline-flex + min-height 44px statt nur Innenabstand.
Mit reinem padding kamen die vier Sprungmarken auf 39px -- fuenf
Pixel unter dem Daumenmass. Genau derselbe Fall wie frueher bei
.wd-nav a (dort waren es 43px): Ein Innenabstand, der auf dem
Bildschirm gut aussieht, ergibt nicht automatisch ein treffbares
Ziel. Und ausgerechnet auf der Rechtsseite muss man verlaesslich
zum Widerrufsrecht springen koennen. */
display: inline-flex; align-items: center; min-height: 44px;
padding: .42rem .95rem; border-radius: 999px;
border: 1px solid var(--wd-rand); background: var(--wd-glas);
font-size: .88rem; color: var(--wd-text-mid) !important; text-decoration: none;
}
@@ -2130,3 +2139,113 @@ a.wd-karte:active, .wd-karte--klickbar:active {
@media (prefers-reduced-motion: reduce) {
.wd-karte::after { display: none; }
}
/* =====================================================================
HANDY UND INSTALLIERTE APP — Sicherheitsabstände
AUSGANGSLAGE (gefunden am 23.08.2026)
Die Seite trug bereits `apple-mobile-web-app-status-bar-style:
black-translucent`. Das heißt wörtlich: Der Seiteninhalt beginnt bei
y=0 und läuft UNTER Uhr, Empfangsbalken und Akkuanzeige durch. Auf
einem iPhone mit Aussparung stand die Kopfzeile also im installierten
Betrieb hinter der Statusleiste.
Gleichzeitig fehlte `viewport-fit=cover` auf allen dreizehn Seiten.
Ohne diese Angabe liefert jedes `env(safe-area-inset-*)` schlicht
null. Die eine Stelle, die den unteren Abstand bereits benutzte (der
Installations-Hinweis), war damit wirkungslos — sie sah richtig aus
und tat nichts. Genau die Sorte Fehler, die man nie bemerkt, weil der
Code stimmt.
LÖSUNG IN ZWEI TEILEN
1. `viewport-fit=cover` in jeder Seite (dort erledigt).
2. Die Abstände hier einmal zentral benennen, statt sie an fünfzehn
Stellen einzeln zu schreiben. Wer sie einzeln schreibt, vergisst
eine — und dann liegt genau ein Knopf unter der Gestenleiste.
WARUM `max()` UND NICHT NUR `env()`
Auf einem Gerät ohne Aussparung ist der Wert 0. Ein Kopfbereich mit
0 Abstand klebt aber am oberen Rand. `max(env(...), <Mindestwert>)`
gibt beiden Fällen ein brauchbares Ergebnis: Notch-Geräte bekommen
den echten Abstand, alle anderen den normalen.
===================================================================== */
:root {
--wd-sicher-oben: env(safe-area-inset-top, 0px);
--wd-sicher-unten: env(safe-area-inset-bottom, 0px);
--wd-sicher-links: env(safe-area-inset-left, 0px);
--wd-sicher-rechts: env(safe-area-inset-right, 0px);
}
/* Die Kopfzeile klebt oben (position: sticky). Im Browser sitzt sie
unter der Adressleiste und braucht nichts. Installiert gibt es keine
Adressleiste mehr — dann muss sie sich selbst unter die Statusleiste
schieben, sonst steht die Marke hinter der Uhr. */
.wd-kopf {
padding-top: var(--wd-sicher-oben);
}
/* Querformat: Bei gedrehtem Gerät liegt die Aussparung seitlich. Ohne
diesen Abstand verschwindet die linke Spalte halb darunter. `92vw`
allein hilft nicht — vw zählt die Aussparung mit. */
.wd-container,
.wd-container--schmal {
padding-left: var(--wd-sicher-links);
padding-right: var(--wd-sicher-rechts);
}
/* Unten die Gestenleiste. Betrifft den Fußbereich und alles, was fest
am unteren Rand sitzt. */
.wd-fuss {
padding-bottom: calc(1.5rem + var(--wd-sicher-unten));
}
@media (display-mode: standalone), (display-mode: window-controls-overlay), (display-mode: minimal-ui) {
/* ------------------------------------------------------------------
NUR IM INSTALLIERTEN BETRIEB
Installiert fehlt alles, was ein Browser sonst beisteuert: keine
Adressleiste, kein Zurück-Knopf, kein Neuladen durch Herunterziehen
im gewohnten Sinn. Was im Browser eine Kleinigkeit ist, wird hier
zum Fehler.
------------------------------------------------------------------ */
/* Das Gummiband-Nachfedern am Seitenende sieht in einer App nach
einem Darstellungsfehler aus -- im Browser erwartet man es, in
einer App nicht. Innerhalb scrollbarer Bereiche bleibt Scrollen
natürlich unverändert. */
html, body {
overscroll-behavior-y: none;
}
/* Der Hinweis "Als App installieren" ist installiert sinnlos. Er wird
zwar schon per JavaScript unterdrückt -- aber nur, wenn das Skript
lädt. Diese Regel greift auch dann, wenn es das nicht tut. */
.wd-install { display: none !important; }
}
/* ---------------------------------------------------------------------
TIPP-VERHALTEN
Auf Android legt der Browser über jede angetippte Fläche ein graues
Rechteck. Bei runden Kacheln und Knöpfen zeichnet es die eckige
Trefferfläche nach und sieht nach einem Fehler aus. Ersetzt wird es
nicht ersatzlos: Jeder Knopf hat einen sichtbaren :active-Zustand,
sonst fehlte die Rückmeldung, dass der Tipp angekommen ist.
--------------------------------------------------------------------- */
.wd a, .wd button, .wd [role="button"], .wd summary, .wd label {
-webkit-tap-highlight-color: transparent;
}
.wd .wd-btn:active,
.wd .vw-ub-kachel:active,
.wd .vw-ub-projekt:active,
.wd .vw-filter-knopf:active {
/* Kein Verschieben, nur ein kurzes Einsinken: Bewegung nach unten
wird als Druck gelesen und braucht keine Farbe. */
transform: scale(.985);
}
@media (prefers-reduced-motion: reduce) {
.wd .wd-btn:active,
.wd .vw-ub-kachel:active,
.wd .vw-ub-projekt:active,
.wd .vw-filter-knopf:active { transform: none; }
}