diff --git a/assets/css/webdesign.css b/assets/css/webdesign.css index 4c87dc14..f9de692e 100644 --- a/assets/css/webdesign.css +++ b/assets/css/webdesign.css @@ -125,8 +125,14 @@ body.wd::after { .wd-container { width: min(1180px, 92vw); margin: 0 auto; } .wd-container--schmal { width: min(860px, 92vw); } -.wd-abschnitt { padding: clamp(3.4rem, 7vw, 6.5rem) 0; position: relative; } -.wd-abschnitt--eng { padding: clamp(2rem, 4vw, 3.2rem) 0; } +/* Abstand zwischen den Abschnitten. + Vorher clamp(3.4rem, 7vw, 6.5rem) = 100,8px oben UND unten, also gut + 200px Leerraum zwischen zwei Abschnitten. Rueckmeldung 22.08.2026: + "ich will nicht soooo viel abstand". Jetzt rund die Haelfte -- immer + noch klar getrennt, aber ohne dass man an leeren Flaechen + vorbeiscrollt. */ +.wd-abschnitt { padding: clamp(2.2rem, 4vw, 3.6rem) 0; position: relative; } +.wd-abschnitt--eng { padding: clamp(1.4rem, 2.6vw, 2.2rem) 0; } /* Abwechselnde Grundfläche statt Trennlinien — ruhiger und trotzdem klar. */ .wd-abschnitt--gehoben { background: linear-gradient(180deg, transparent, var(--wd-dunkelblau) 14%, var(--wd-dunkelblau) 86%, transparent); } @@ -196,6 +202,28 @@ body.wd::after { clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; } + +/* --------------------------------------------------------------------- + BILDVERHAELTNIS — diese Regel verhindert einen Fehler, der schon + passiert ist und sonst wieder passiert. + + Bilder tragen im HTML bewusst width/height als Attribute: der Browser + reserviert damit vor dem Laden den richtigen Platz und die Seite + springt beim Nachladen nicht. Diese Attribute wirken aber wie eine + CSS-Hoehe -- und schlagen damit jedes spaetere "aspect-ratio". + + Live gemeldet am 22.08.2026 ("die sollen alle gleich aussehen"): die + beiden Projektbilder standen mit 750px bzw. 696px Hoehe bei nur 576px + Breite da, also hochkant gestreckt und ungleich hoch, obwohl im CSY + sauber 16:10 stand. + + "height: auto" gibt die Hoehe an aspect-ratio zurueck. Es steht hier + einmal zentral fuer alle Bilder mit Seitenverhaeltnis, statt in jeder + einzelnen Regel -- so kann es bei einem neuen Bild nicht vergessen + werden. + --------------------------------------------------------------------- */ +.wd img[width][height] { height: auto; } + /* --------------------------------------------------------------------- 3. KARTEN — "glasartig mit feinen Neonrändern" (Masterplan S.6) Der Rand ist bewusst ein Verlauf über border-box statt einer flachen @@ -786,7 +814,7 @@ a.wd-karte:hover, .wd-karte--klickbar:hover { Adressleiste — der Knopf rutscht damit beim ersten Laden unter die sichtbare Kante, genau das, was die Hero-Regel verbietet. --------------------------------------------------------------------- */ -.wd-hero { position: relative; padding: clamp(3.5rem, 9vw, 7rem) 0 clamp(3rem, 6vw, 5rem); min-height: 78svh; display: flex; align-items: center; } +.wd-hero { position: relative; padding: clamp(2.6rem, 6vw, 4.6rem) 0 clamp(2.2rem, 4vw, 3.4rem); min-height: 68svh; display: flex; align-items: center; } .wd-hero-inhalt { max-width: 780px; } .wd-hero h1 { margin-bottom: .45em; } .wd-hero .wd-lead { margin-bottom: 1.8rem; max-width: 62ch; } diff --git a/server/pruefe-webdesign-handy.mjs b/server/pruefe-webdesign-handy.mjs index da81737a..88e4e159 100644 --- a/server/pruefe-webdesign-handy.mjs +++ b/server/pruefe-webdesign-handy.mjs @@ -101,7 +101,69 @@ for (const pfad of SEITEN) { if (txt === el.getAttribute("data-i18n")) roh.push(txt); } - return { ueberlauf, raus: raus.slice(0, 5), klein: klein.slice(0, 5), roh: roh.slice(0, 5) }; + /* Verzerrte Bilder. + Am 22.08.2026 gemeldet: zwei Projektbilder standen 576px breit, + aber 750px bzw. 696px hoch da -- hochkant gestreckt und ungleich, + obwohl im CSS 16:10 stand. Ursache waren die height-Attribute im + HTML, die wie eine CSS-Hoehe wirken und aspect-ratio schlagen. + Diese Pruefung vergleicht das im CSS gewuenschte Verhaeltnis mit + dem tatsaechlich gerenderten -- damit faellt so etwas sofort auf + und nicht erst per Bildschirmfoto. */ + const verzerrt = []; + for (const bild of document.querySelectorAll("img")) { + const s = getComputedStyle(bild); + if (s.display === "none") continue; + const r = bild.getBoundingClientRect(); + if (r.width < 2 || r.height < 2) continue; + + const gewuenscht = s.aspectRatio; + if (!gewuenscht || gewuenscht === "auto") continue; + const teile = String(gewuenscht).split("/").map((t) => parseFloat(t)); + if (teile.length !== 2 || !teile[0] || !teile[1]) continue; + + const soll = teile[0] / teile[1]; + const ist = r.width / r.height; + // 2 % Toleranz für Rundung auf ganze Pixel + if (Math.abs(soll - ist) / soll > 0.02) { + verzerrt.push( + (bild.className || bild.src.split("/").pop()).toString().slice(0, 40) + + ` soll ${soll.toFixed(2)}, ist ${ist.toFixed(2)} (${Math.round(r.width)}x${Math.round(r.height)})` + ); + } + } + + /* Gleich große Karten in einer Reihe. "die sollen alle gleich + aussehen und nicht einer größer oder kleiner" -- ungleiche Höhen + in EINER Zeile sind der haeufigste Grund, warum ein Raster + unaufgeraeumt wirkt. */ + const ungleich = []; + for (const raster of document.querySelectorAll(".wd-grid")) { + const kinder = [...raster.children].filter((k) => k.getBoundingClientRect().height > 0); + if (kinder.length < 2) continue; + // Nur Elemente vergleichen, die tatsächlich nebeneinander stehen + const reihen = new Map(); + for (const k of kinder) { + const oben = Math.round(k.getBoundingClientRect().top); + const schluessel = Math.round(oben / 8) * 8; + if (!reihen.has(schluessel)) reihen.set(schluessel, []); + reihen.get(schluessel).push(Math.round(k.getBoundingClientRect().height)); + } + for (const [, hoehen] of reihen) { + if (hoehen.length < 2) continue; + if (Math.max(...hoehen) - Math.min(...hoehen) > 2) { + ungleich.push(`${raster.className.slice(0, 30)}: ${hoehen.join(", ")}px`); + } + } + } + + return { + ueberlauf, + raus: raus.slice(0, 5), + klein: klein.slice(0, 5), + roh: roh.slice(0, 5), + verzerrt: verzerrt.slice(0, 5), + ungleich: ungleich.slice(0, 5), + }; }, breite); const zeile = ` ${String(breite).padStart(4)}px`; @@ -110,6 +172,8 @@ for (const pfad of SEITEN) { if (befund.raus.length) fehler.push("ragt heraus: " + befund.raus.join(", ")); if (befund.klein.length) fehler.push("Touch-Ziel < 44px: " + befund.klein.join(", ")); if (befund.roh.length) fehler.push("unuebersetzt: " + befund.roh.join(", ")); + if (befund.verzerrt.length) fehler.push("Bild verzerrt: " + befund.verzerrt.join(" | ")); + if (befund.ungleich.length) fehler.push("ungleich hohe Karten: " + befund.ungleich.join(" | ")); if (fehler.length) { probleme.push(`${pfad} @ ${breite}px -> ${fehler.join(" | ")}`);