DataGrid: adaptivity
Nazaj: predstavitveni pregled
Kaj mreža naredi, ko prostora zmanjka: stolpci se glede na prelomno točko umaknejo v razširljivo vrstico s podrobnostmi, namesto da bi se tabela pomikala vodoravno.
1. Pregled in namen
Stanje: povsem [Live] – obnašanje zapolnjevanja podokna plus prilagodljiva skrčitev stolpcev pri prelomni točki. Referenca: DevExpress ASPxGridView »Adaptive Layout« – v ozkih podoknih se posamezni stolpci premaknejo v razširljivo vrstico podrobnosti (odsek 8).
2. Predpogoji
- Razumljena osnovna pogodba dataGrid().
- Za recept CSS: nadzor nad obdajajočim vsebnikom lupine (
.wkq-shellali ustreznico).
3. Koncepti
»Prilagodljivo« pri dataGrid() pomeni vodeno z vsebnikom, ne
vodeno z vidnim poljem: mreža ne gleda okna brskalnika, temveč meri
širino svojega podokna – ne glede na to, ali jo spremeni okno, rob
stranske vrstice, povlečen s resize, ali stanje skrčitve. Tudi
njena prelomna točka (odsek 8) se nanaša na to širino podokna.
4. Prvi koraki
/** @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' => 'mojmodul:rezultati']); ?>
</div>
<div class="wkq-shell__statusbar"><?php echo hsc(count($rows) . ' vrstic'); ?></div>
</div>
Napačno: nastaviti overflow: auto na sami .wkq-shell namesto
na .wk-datagrid__body. Tedaj drsi cela lupina, vključno z
vrstico stanja – vrstica stanja izgine iz vidnega polja namesto da bi
ostala fiksirana (s tem je 4. sestavina spodaj brez učinka).
5. Uporaba
| Kontekst | Vzorec |
|---|---|
| Mreža v lupini podokna (predal, auxbar, vsebina modula) | pet sestavin CSS (odsek 6) na obdajajočem vsebniku |
| Mreža v ozkem podoknu z več kot tremi stolpci | samodejno zloži stolpce v vrstico podrobnosti oziroma v pregledovalnik (odsek 8); z 'adaptive' => false namesto tega drsi vodoravno |
6. Referenca API: recept CSS »zapolni svoje podokno in se prilagodi spremembi velikosti«
Pet sestavin – vse podprte z dejansko kodo (wksqliteds/screen.css,
.wkq-shell):
| # | Sestavina | Zakaj |
|---|---|---|
| 1 | Vsebnik kot mreža CSS z minmax(0, 1fr) za prilagodljiv stolpec in vrstico | gol 1fr nikoli ne pade pod velikost min-content vsebine – široke tabele bi sicer razneslе podokno namesto drsenja znotraj njega |
| 2 | min-width: 0 na celici vsebine | otroci mreže imajo privzeto min-width: auto; šele 0 celici dovoli, da postane ožja od širine tabele |
| 3 | overflow: auto na telesu mreže (območju rezultatov), ne na strani | namizno obnašanje: aplikacija drsi navznoter, okno nikoli ne drsi vodoravno |
| 4 | Vrstica stanja kot fiksna vrstica mreže (var(--wk-shell-statusbar-h, 22px)) | ostane vidna ob vsaki spremembi velikosti/drsenju – značilnost namizne aplikacije |
| 5 | resize: horizontal + overflow: auto na območju stranske vrstice | nativna sprememba velikosti stolpcev brez motorja JS sash; podokno minmax(0,1fr) samodejno absorbira razliko |
7. Parametri, opcije in stanja
Vezava višine lupine (smernica – zaželeno): pet sestavin deluje
navpično šele, ko ima lupina sama omejitev višine – sicer vrstica
minmax(0,1fr) preprosto raste z vsebino in stran drsi čez
spodnji rob okna (resnična ugotovitev uporabnika). Zaželen, za prevajalnik
varen vzorec: okvir strani je stolpec flex z min-height: 100vh,
topbar/noga naravne višine, lupina med njima z
flex: 1 1 auto; min-height: 0 – brez calc() z mešanimi
enotami. Kot smernica, ne strogo pravilo: statično rastoči zasloni
ostajajo dovoljeni
(admin-layout → zavezujoča pravila UX).
Opozorilo: uporabljajte minmax() le z eno enoto na argument –
prevajalnik CSS DokuWiki se pri min()/calc() z mešanimi enotami
usodno sesuje za celotno spletno mesto (dokumentirano v
admin-layout).
8. Popolni primeri: prilagodljiva skrčitev stolpcev [Live]
Mreže z več kot tremi stolpci v ozkih podoknih (npr. mobilni auxbar, razdeljen pogled) stolpce zložijo, namesto da bi drsele – klicatelju za to ni treba ničesar nastaviti:
- Privzeto: Brez možnosti
adaptivedobi vsak stolpec od tretjega naprej prednost, najprej skrajno desni. Izvzeta sta stolpec, ki poimenuje vrstico (primary), in vsak stolpec s kontrolniki. Prelomna točka je pri 640 px širine podokna.'adaptive' => falsezlaganje izklopi. - Druga stopnja: Če vsebina pod prelomno točko tudi brez prednostnih stolpcev ne gre v podokno, mreža zlaga nadaljnje podatkovne stolpce od desne, dokler ne gre – nikoli stolpca
primary, stolpcev za izbiro, dejanja ali pregledovalnik in nobenega stolpca s kontrolniki. Ko se podokno spet razširi, se ti stolpci vrnejo.
- Ključ
$opts'adaptive' => ['breakpoint' => int, 'priority' => [key => int]]: podbreakpoint(širina podokna v pikslih, merjena zResizeObservervscripts/datagrid.js) se stolpci, navedeni vpriority, skrijejo (celice glave in podatkov dobijohidden); vsaka vrstica podatkov dobi fokusirljiv gumb stikala (.wk-datagrid__detailtoggle,aria-expanded), ki razširi vrstico podrobnosti (.wk-datagrid__detail) s skritimi pari oznaka/vrednost kot<dl>– vsebina celic se pri tem prevzame kot pravi HTML, povezave ostanejo klikljive (analogija: DevExpress Adaptive Detail Row). - Skriti stolpci s tem ostanejo v celoti dostopni – vrstica podrobnosti je fokusirljiva zamenjava, ne vizualno krajšanje.
- Če ima mreža pregledovalnik, gumba stikala ni: podokno pregledovalnika že pokaže vse vrednosti vrstice, tudi zložene.
- Brez JavaScripta: vsi stolpci ostanejo vidni, mreža drsi vodoravno v
.wk-datagrid__bodykot v obnašanju [Live] – skrčitev je čista postopna nadgradnja, ne zamenjava za osnovo prilagodljivosti vsebnika.
echo $widgets->dataGrid($columns, $rows, [ 'adaptive' => ['breakpoint' => 640, 'priority' => ['info' => 1, 'status' => 2]], ]);
9. Omejitve in robni primeri
- Pod prelomno točko skrčitev naenkrat skrije vse prednostne stolpce; šele nato druga stopnja izmeri dejansko širino in zloži dodatne stolpce posamično. Vrstni red
prioritydoloča vrstni red v vrstici podrobnosti, stolpci druge stopnje sledijo za njimi. - Druga stopnja predpostavlja prednostne stolpce: mreža z največ tremi stolpci ali z
'adaptive' => falsedrsi vodoravno. - Gumb stikala vrstice je v prvi vidni podatkovni celici – nikoli v celici izbire (
.wk-datagrid__checkcell) ali celici pregledovalnika (.wk-datagrid__inspectcell), v katerih ozkem stolpcu bi zakril potrditveno polje. Če je prvi vidni podatkovni stolpec sam ozek (npr. sličica predogleda), gumba in vsebine ne sprejme – take stolpce prav tako navedite vpriority. - Če skrita celica vsebuje elemente z atributi
id, v razširjeni vrstici podrobnosti nastanejo klonirani duplikati teh ID-jev – takih stolpcev ne navajajte za skrčitev. - Vezava višine (odsek 7) je smernica, ne strogo pravilo – statično rastoči zasloni ostajajo dovoljeni.
10. Dostopnost in združljivost
- Z vsebnikom vodena prilagodljivost ne zahteva prilagoditve ARIA – spremeni le postavitev, ne semantike.
- Združljivost brskalnikov: osnovna podpora za CSS Grid + lastnost
resize(vsi trenutni brskalniki).
11. Odpravljanje težav
Simptom: cela stran drsi čez spodnji rob okna, čeprav bi morala mreža drseti navznoter.
Vzrok: lupina nima omejitve višine – vrstica minmax(0,1fr)
raste z vsebino (glej odsek 7).
Rešitev: uporabite vzorec vezave višine iz odseka 7
(min-height: 100vh na okviru strani, flex: 1 1 auto; min-height: 0
na lupini).
Simptom: prevajalnik CSS DokuWiki se sesuje za celotno spletno mesto, potem ko je bila prilagojena vrednost recepta CSS.
Vzrok: minmax()/calc() z mešanimi enotami (glej odsek
7, opozorilo).
Rešitev: uporabite le eno enoto na argument minmax().
12. Sorodne teme
- predstavitveni pregled – vse kategorije
- DataGrid: osnove – osnovna pogodba
dataGrid() - FluentUI: skrbniško območje podrobno – vezava višine lupine, pasti prevajalnika CSS