DataGrid: Adaptivity
Zurück: Demo-Übersicht
1. Übersicht und Zweck
Status: vollständig [Live] — Panel-Fill-Verhalten plus adaptiver Spalten-Kollaps nach Breakpoint. Referenz: DevExpress ASPxGridView „Adaptive Layout„ — bei schmalen Panels wandern einzelne Spalten in eine ausklappbare Detailzeile (Abschnitt 8).
2. Voraussetzungen
- dataGrid()-Basiskontrakt verstanden.
- Für das CSS-Rezept: Kontrolle über den umschließenden Shell-Container (
.wkq-shelloder Äquivalent).
3. Konzepte
„Responsive“ heißt bei dataGrid() Container-getrieben, nicht
Viewport-getrieben: Das Grid kennt keine Breakpoints — es folgt der Breite
seines Panels, egal ob das Browserfenster, ein per resize gezogener
Sidebar-Rand oder ein Kollaps-Zustand die Panelbreite ändert.
4. Erste Schritte
/** @var helper_plugin_wkfluentui_widgets $widgets */
$widgets = plugin_load('helper', 'wkfluentui_widgets');
?>
<div class="wkq-shell">
<div class="wkq-shell__body">
<?php echo $widgets->dataGrid($columns, $rows, ['persistKey' => 'meinmodul:ergebnisse']); ?>
</div>
<div class="wkq-shell__statusbar"><?php echo hsc(count($rows) . ' Zeilen'); ?></div>
</div>
Falsch: overflow: auto auf .wkq-shell selbst statt auf
.wk-datagrid__body setzen. Dann scrollt die gesamte Shell inklusive
Statusbar — die Statusbar verschwindet beim Scrollen aus dem Viewport statt
fixiert zu bleiben (Zutat 4 unten wird dadurch wirkungslos).
5. Verwendung
| Kontext | Muster |
|---|---|
| Grid in einer Panel-Shell (Drawer, Auxbar, Modul-Content) | fünf CSS-Zutaten (Abschnitt 6) am umschließenden Container |
| Grid in schmalem Panel mit vielen Spalten | horizontales Scrollen (Default) oder adaptiver Kollaps über $opts['adaptive'] (Abschnitt 8) |
6. API-Referenz: CSS-Rezept „füllt sein Panel und passt sich beim Resize an"
Fünf Zutaten — alle im Ist-Code belegt (wksqliteds/screen.css,
.wkq-shell):
| # | Zutat | Warum |
|---|---|---|
| 1 | Container als CSS-Grid mit minmax(0, 1fr) für die flexible Spalte und Zeile | ein nacktes 1fr unterschreitet nie die min-content-Größe des Inhalts — breite Tabellen sprengen sonst das Panel statt darin zu scrollen |
| 2 | min-width: 0 auf der Content-Zelle | Grid-Kinder haben min-width: auto als Default; erst 0 erlaubt der Zelle, schmaler zu werden als die Tabelle breit ist |
| 3 | overflow: auto am Grid-Body (der Ergebnisfläche), nicht an der Seite | Desktop-Verhalten: die Anwendung scrollt innen, das Fenster nie horizontal |
| 4 | Statusbar als feste Grid-Zeile (var(--wk-shell-statusbar-h, 22px)) | bleibt bei jedem Resize/Scroll sichtbar — Kennzeichen einer Desktop-Anwendung |
| 5 | resize: horizontal + overflow: auto auf der Sidebar-Region | natives Spalten-Resizing ohne JS-Sash-Engine; das minmax(0,1fr)-Panel nimmt die Differenz automatisch auf |
7. Parameter, Optionen und Zustände
Höhenbindung der Shell (Richtlinie — bevorzugt): Die fünf Zutaten wirken
vertikal erst, wenn die Shell selbst eine Höhengrenze hat — sonst wächst die
minmax(0,1fr)-Zeile einfach mit dem Inhalt und die Seite scrollt
über den unteren Fensterrand (realer Nutzer-Befund). Bevorzugtes,
compiler-sicheres Muster: Seitenrahmen als Flex-Spalte mit
min-height: 100vh, Topbar/Footer natürlich hoch, Shell dazwischen
flex: 1 1 auto; min-height: 0 — kein calc() mit gemischten
Einheiten. Als Richtlinie, nicht harte Regel: statisch wachsende Screens
bleiben zulässig
(admin-layout → Verbindliche UX-Regeln).
Warnung: minmax() nur mit einer Einheit je Argument verwenden —
DokuWikis CSS-Compiler bricht bei min()/calc() mit gemischten
Einheiten sitewide fatal ab (dokumentiert in
admin-layout).
8. Vollständige Beispiele: Adaptiver Spalten-Kollaps [Live]
Für Grids in schmalen Panels (z. B. mobile Auxbar, geteilte Ansicht), die einzelne Spalten verlieren sollen statt zu scrollen:
$opts-Schlüssel'adaptive' => ['breakpoint' => int, 'priority' => [key => int]]: unterhalbbreakpoint(Panelbreite in Pixeln, perResizeObserverinscripts/datagrid.jsgemessen) werden die inprioritygelisteten Spalten ausgeblendet (Kopf- und Datenzellenhidden); jede Datenzeile erhält einen fokussierbaren Toggle-Button (.wk-datagrid__detailtoggle,aria-expanded), der eine Detailzeile (.wk-datagrid__detail) mit den ausgeblendeten Label/Wert-Paaren als<dl>aufklappt — die Zellinhalte werden dabei als echtes Markup übernommen, Links bleiben klickbar (Analog: DevExpress Adaptive-Detail-Row).- Ausgeblendete Spalten bleiben damit vollwertig zugänglich — die Detailzeile ist der fokussierbare Ersatz, keine visuelle Kürzung.
- Ohne JavaScript: alle Spalten bleiben sichtbar, das Grid scrollt horizontal im
.wk-datagrid__bodywie im [Live]-Verhalten — der Kollaps ist reine Progressive Enhancement, kein Ersatz für die Container-Responsive-Basis.
echo $widgets->dataGrid($columns, $rows, [ 'adaptive' => ['breakpoint' => 640, 'priority' => ['info' => 1, 'status' => 2]], ]);
9. Einschränkungen und Randfälle
- Der Kollaps blendet unterhalb des Breakpoints alle gelisteten Prioritäts-Spalten aus (ein Schwellwert, keine stufenweise Breitenmessung je Spalte) — die
priority-Reihenfolge bestimmt die Reihenfolge in der Detailzeile. - Enthält eine ausgeblendete Zelle Elemente mit
id-Attributen, entstehen in der aufgeklappten Detailzeile geklonte Duplikate dieser IDs — für solche Spalten den Kollaps nicht listen. - Die Höhenbindung (Abschnitt 7) ist Richtlinie, keine harte Regel — statisch wachsende Screens bleiben zulässig.
10. Accessibility und Kompatibilität
- Container-getriebenes Responsive erfordert keine ARIA-Anpassung — es ändert nur Layout, keine Semantik.
- Browserkompatibilität: CSS-Grid +
resize-Property-Grundunterstützung (alle aktuellen Browser).
11. Troubleshooting
Symptom: die gesamte Seite scrollt über den unteren Fensterrand hinaus, obwohl das Grid intern scrollen sollte.
Ursache: die Shell hat keine Höhengrenze — die minmax(0,1fr)-
Zeile wächst mit dem Inhalt (s. Abschnitt 7).
Lösung: Höhenbindungs-Muster aus Abschnitt 7 anwenden
(min-height: 100vh am Seitenrahmen, flex: 1 1 auto; min-height: 0
an der Shell).
Symptom: DokuWikis CSS-Compiler bricht site-weit ab, nachdem ein CSS-Rezept-Wert angepasst wurde.
Ursache: minmax()/calc() mit gemischten Einheiten (s. Abschnitt
7, Warnung).
Lösung: nur eine Einheit je minmax()-Argument verwenden.
12. Verwandte Themen
- Demo-Übersicht — alle Kategorien
- DataGrid: Grundlagen —
dataGrid()-Basiskontrakt - FluentUI: Admin-Bereich (vertieft) — Shell-Höhenbindung, CSS-Compiler-Fallen