DataGrid: Adaptivity
Zurück: Demo-Übersicht
Was ein Grid tut, wenn der Platz nicht reicht: Spalten wandern nach Breakpoint in eine ausklappbare Detailzeile, statt die Tabelle waagerecht scrollen zu lassen.
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 fragt nicht das Browserfenster, sondern misst
die Breite seines Panels – egal ob das Fenster, ein per resize gezogener
Sidebar-Rand oder ein Kollaps-Zustand sie ändert. Auch sein Breakpoint
(Abschnitt 8) bezieht sich auf diese Panelbreite.
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 mehr als drei Spalten | faltet Spalten automatisch in die Detailzeile bzw. den Inspektor (Abschnitt 8); mit 'adaptive' => false scrollt es stattdessen horizontal |
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. 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]
Grids mit mehr als drei Spalten falten in schmalen Panels (z. B. mobile Auxbar, geteilte Ansicht) Spalten ein, statt zu scrollen – der Aufrufer muss dafür nichts angeben:
- Standard: Ohne
adaptive-Option erhält jede Spalte ab der dritten eine Priorität, die rechte zuerst. Ausgenommen bleiben die Spalte, die die Zeile benennt (primary), und Spalten mit Bedienelementen. Der Breakpoint liegt bei 640 px Panelbreite.'adaptive' => falseschaltet das Falten ab. - Zweite Stufe: Passt der Inhalt unterhalb des Breakpoints auch ohne die Prioritätsspalten nicht ins Panel, faltet das Grid weitere Datenspalten von rechts, bis er passt – nie die Primärspalte, die Auswahl-, Aktions- oder Inspektorspalte und keine Spalte mit Bedienelementen. Wird das Panel wieder breiter, kehren diese Spalten zurück.
$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.
- Trägt das Grid einen Inspektor, entfällt der Toggle: Die Inspektorfläche zeigt bereits alle Werte der Zeile, auch die gefalteten.
- 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
- Unterhalb des Breakpoints blendet der Kollaps alle Prioritätsspalten auf einmal aus; erst danach misst die zweite Stufe die tatsächliche Breite und faltet weitere Spalten einzeln. Die
priority-Reihenfolge bestimmt die Reihenfolge in der Detailzeile, Spalten der zweiten Stufe folgen dahinter. - Die zweite Stufe setzt Prioritätsspalten voraus: Ein Grid mit höchstens drei Spalten oder mit
'adaptive' => falsescrollt horizontal. - Der Toggle einer Zeile steht in der ersten sichtbaren Datenzelle – nie in der Auswahlzelle (
.wk-datagrid__checkcell) oder der Inspektorzelle (.wk-datagrid__inspectcell), in deren schmaler Spalte er das Auswahlkästchen verdecken würde. Ist die erste sichtbare Datenspalte selbst schmal (z. B. ein Vorschaubild), fasst sie Toggle und Inhalt nicht – solche Spalten ebenfalls inprioritylisten. - 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