Portfolio: Kacheln einer Reihe sind gleich gross

Die Projekttexte sind unterschiedlich lang, also waren auch die Kacheln
unterschiedlich hoch. Jetzt bekommen alle Kacheln einer Reihe dieselbe
Hoehe, naemlich die der hoechsten.

Dafuer waren drei Dinge noetig, und nur das erste ist offensichtlich:

1. "align-items: start" musste weg. Es liess jede Kachel ihre
   natuerliche Hoehe behalten -- genau das war der Fehler.

2. Der Inhalt muss die zusaetzliche Hoehe auch aufnehmen koennen.
   Ohne Flex-Aufbau in Kachel und Inhalt waere die Kachel zwar hoeher,
   ihr Inhalt bliebe aber oben kleben und darunter entstuende ein
   leeres Feld.

3. Das letzte Element sitzt am unteren Rand.

DER PUNKT, DER FAST DURCHGERUTSCHT WAERE

Gleich hohe Kacheln heissen NICHT automatisch, dass der Inhalt buendig
steht. Nach Schritt 1 und 2 waren die Kacheln exakt gleich hoch -- und
die Knoepfe standen trotzdem auf verschiedener Hoehe.

Grund: Die Abstaende standen als style-Angabe direkt im HTML
(style="margin-top:1rem"). Eine solche Angabe schlaegt jede Regel aus
dem Stilblatt, das "margin-top: auto" lief also ins Leere. Fuenf
Vorkommen entfernt.

Danach blieben 33 gegen 48 Punkte Abstand zum Kachelboden: Ein Absatz
bringt einen eigenen Abstand nach unten mit, eine Knopfreihe nicht.
Auch das ist jetzt vereinheitlicht.

Die Regel greift ueber :last-child statt nur ueber die Knopfreihe --
die Buchhaltungs-Kachel hat naemlich gar keinen Knopf, sondern einen
Hinweistext an dieser Stelle. Der soll genauso unten stehen.

DIE PRUEFUNG MISST BEIDES GETRENNT

Einmal "jede Reihe ist in sich gleich hoch", einmal "die letzten
Elemente stehen auf einer Linie". Ein einzelner Test auf die Hoehe
haette den Knopf-Versatz nie bemerkt -- die Kacheln waren ja bereits
gleich hoch, als die Knoepfe noch verrutscht waren.

Gemessen: 1129/1129, 881/881, 831 -- und ueberall 33 Punkte Abstand zum
Kachelboden.

Geprueft: 313 Pruefungen gruen (Portfolio 34, Bewegung 34, Verwaltung 62,
CRYONOVA 53, Blickfang 13, System 5, Abmelden 16, Abbruch 42,
Angebot 54).

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-08-25 13:28:31 +02:00
co-authored by Claude Opus 5
parent 4d39b0e989
commit 686e8924bb
9 changed files with 91 additions and 7 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 302 KiB

After

Width:  |  Height:  |  Size: 302 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 303 KiB

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 589 KiB

After

Width:  |  Height:  |  Size: 564 KiB

+46
View File
@@ -126,6 +126,52 @@ srv.listen(4403, async () => {
await seite.setViewportSize({ width: 1440, height: 950 });
await seite.waitForTimeout(500);
console.log("\n1c. SIND DIE KACHELN EINER REIHE GLEICH GROSS?");
await seite.evaluate(async () => {
for (const el of document.querySelectorAll(".pfo-bild")) {
el.scrollIntoView();
await new Promise((r) => setTimeout(r, 180));
}
window.scrollTo(0, 0);
});
await seite.waitForTimeout(800);
const reihen = await seite.evaluate(() => {
const k = [...document.querySelectorAll(".pfo-projekt")];
const nach = {};
k.forEach((x) => {
const r = x.getBoundingClientRect();
const oben = Math.round(r.top);
const letzte = x.querySelector(".pfo-inhalt > :last-child");
(nach[oben] = nach[oben] || []).push({
hoehe: Math.round(r.height),
/* Abstand vom letzten Element bis zum Kachelboden. */
unten: letzte ? Math.round(r.bottom - letzte.getBoundingClientRect().bottom) : -1,
});
});
return Object.values(nach);
});
pruefe("es gibt Reihen mit zwei Kacheln",
reihen.some((r) => r.length === 2),
reihen.map((r) => r.length).join("+"));
/* Der eigentliche Punkt: Die Projekttexte sind unterschiedlich lang.
Ohne "stretch" behaelt jede Kachel ihre natuerliche Hoehe, und dann
stehen zwei sichtbar verschieden hohe Kacheln nebeneinander. */
pruefe("jede Reihe ist in sich gleich hoch",
reihen.every((r) => new Set(r.map((x) => x.hoehe)).size === 1),
reihen.map((r) => r.map((x) => x.hoehe).join("/")).join(" "));
/* Und die Knoepfe muessen auf einer Linie stehen. Das ist NICHT
dasselbe: Die Kacheln koennen gleich hoch sein und der Inhalt
trotzdem unterschiedlich weit oben kleben. Genau so war es, weil
die Abstaende als style-Angabe im HTML standen -- und eine solche
Angabe schlaegt jede Regel aus dem Stilblatt. */
pruefe("und die letzten Elemente stehen auf einer Linie",
reihen.every((r) => new Set(r.map((x) => x.unten)).size === 1),
reihen.map((r) => r.map((x) => x.unten + "px").join("/")).join(" "));
console.log("\n2. UEBERSETZUNGEN — IN ALLEN FUENF SPRACHEN");
/* Geprueft werden die SEITENEIGENEN Schluessel (pf_, p1_-p5_,
seiten_titel). Navigations- und Markentexte liegen bewusst nicht
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 280 KiB

After

Width:  |  Height:  |  Size: 280 KiB

+44 -6
View File
@@ -37,7 +37,45 @@
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: clamp(1.2rem, 2.4vw, 2rem);
align-items: start;
/* align-items bleibt auf dem Standard "stretch": Alle Kacheln einer
Zeile bekommen dieselbe Hoehe, naemlich die der hoechsten.
Vorher stand hier "start". Dann behaelt jede Kachel ihre
natuerliche Hoehe -- und weil die Projekttexte unterschiedlich
lang sind, standen zwei Kacheln nebeneinander, die sichtbar
verschieden hoch waren. */
}
/* Damit "stretch" wirkt, muss der Inhalt die zusaetzliche Hoehe auch
aufnehmen koennen. Ohne diese drei Zeilen waere die Kachel zwar
hoeher, ihr Inhalt bliebe aber oben kleben und darunter entstuende
ein leeres Feld. */
.pfo-raster .pfo-projekt { display: flex; flex-direction: column; }
.pfo-raster .pfo-inhalt { flex: 1; display: flex; flex-direction: column; }
/* Das letzte Element sitzt am unteren Rand, nicht direkt unter dem
Text. Dadurch stehen die Knoepfe zweier nebeneinanderliegender
Kacheln auf einer Linie, auch wenn die Texte unterschiedlich lang
sind -- genau das macht den Unterschied zwischen "gleich hoch" und
"sieht aufgeraeumt aus".
Bewusst :last-child statt einer Regel nur fuer den Knopf: Die
Buchhaltungs-Kachel hat gar keinen Knopf, sondern einen
Hinweistext an dieser Stelle. Der soll genauso unten stehen.
Die Abstaende standen vorher als style-Angabe direkt im HTML. Eine
solche Angabe schlaegt jede Regel aus dem Stilblatt -- die Knoepfe
blieben deshalb an unterschiedlicher Hoehe kleben, obwohl die
Kacheln laengst gleich hoch waren. Sie sind jetzt entfernt. */
.pfo-raster .pfo-inhalt > :last-child {
margin-top: auto;
padding-top: 1rem;
/* Ohne das haengen die letzten Elemente unterschiedlich hoch ueber
dem Kachelboden: Ein Absatz bringt einen eigenen Abstand nach
unten mit, eine Knopfreihe nicht. Gemessen waren es 48 gegen 33
Punkte -- bei sonst exakt gleich hohen Kacheln faellt genau das
auf. */
margin-bottom: 0;
}
@media (max-width: 760px) {
/* Darunter waeren zwei Spalten so schmal, dass Ueberschrift und
@@ -165,7 +203,7 @@
</div>
</details>
<div class="wd-btn-reihe" style="margin-top:1rem">
<div class="wd-btn-reihe">
<a class="wd-btn wd-btn--zweit wd-btn--klein" href="https://dogfather-universe.com/" target="_blank" rel="noopener" data-i18n="pf_ansehen">Live ansehen</a>
</div>
</div>
@@ -215,7 +253,7 @@
</div>
</details>
<div class="wd-btn-reihe" style="margin-top:1rem">
<div class="wd-btn-reihe">
<a class="wd-btn wd-btn--zweit wd-btn--klein" href="https://vans-diy-bastelbedarf.com/" target="_blank" rel="noopener" data-i18n="pf_ansehen">Live ansehen</a>
</div>
</div>
@@ -265,7 +303,7 @@
</div>
</details>
<div class="wd-btn-reihe" style="margin-top:1rem">
<div class="wd-btn-reihe">
<a class="wd-btn wd-btn--zweit wd-btn--klein" href="https://zockeranstalt.dogfather-universe.com/" target="_blank" rel="noopener" data-i18n="pf_ansehen">Live ansehen</a>
</div>
</div>
@@ -318,7 +356,7 @@
<!-- Kein "Live ansehen": Dahinter liegt eine Anmeldung, und was
dort steht, sind echte Geschäftszahlen. Ein Knopf, der nur
zu einer Anmeldemaske führt, wäre ein leeres Versprechen. -->
<p class="wd-klein wd-leise" style="margin-top:1rem" data-i18n="p4_kein_link">Ohne öffentlichen Zugang: Dahinter liegen echte Geschäftszahlen.</p>
<p class="wd-klein wd-leise" data-i18n="p4_kein_link">Ohne öffentlichen Zugang: Dahinter liegen echte Geschäftszahlen.</p>
</div>
</article>
@@ -370,7 +408,7 @@
</div>
</details>
<div class="wd-btn-reihe" style="margin-top:1rem">
<div class="wd-btn-reihe">
<a class="wd-btn wd-btn--zweit wd-btn--klein" href="https://analyse.dogfather-universe.com/" target="_blank" rel="noopener" data-i18n="pf_ansehen">Live ansehen</a>
</div>
</div>
+1 -1
View File
@@ -34,7 +34,7 @@
Start alle alten Zwischenspeicher weg. Muss bei jeder Änderung an den
Dateien unten hochgezählt werden, sonst hängen Nutzer auf einem alten
Stand fest. */
const CACHE_NAME = "dogfather-webdesign-v47";
const CACHE_NAME = "dogfather-webdesign-v48";
/* Bausteine, die die Oberfläche zum Anzeigen braucht. Bewusst KEINE
HTML-Datei in dieser Liste. */