0
votes

Créer une table de contrôle des barres de défilement pleine page avec des en-têtes collants (CSS uniquement)

Le bac à sable suivant montre le code qui fonctionne parfaitement pour une table UI Material placée dans un composant Paper avec un en-tête collant: https://codesandbox.io/s/2n40y

Je voudrais que les barres de défilement (horizontales et verticales) apparaissent sur les bords de la page du navigateur, respectivement en bas et à droite, tout en contrôlant toujours le défilement de la Table elle-même.

Actuellement, je ne peux le faire que lorsque je supprime le tableau du papier et en fait un enfant de la page directement - ou un enfant d'un div principal qui couvrirait toute la hauteur de la page . Pourtant, j'ai besoin du composant Paper pour y rester, où d'autres composants seront placés au-dessus et en dessous.

Avez-vous des idées pour y parvenir?

MISE À JOUR: dans l'esquisse ci-jointe, la bordure du navigateur apparaît en noir et les barres de défilement où elles devraient idéalement apparaître en vert. Il y a un conteneur div au milieu de la page qui contient le tableau en rouge. Les en-têtes du tableau doivent être collants et le tableau ne doit pas apparaître au-delà du conteneur div qui agit comme un emballage esthétique autour de lui. Idéalement, la barre de défilement verticale du navigateur ferait défiler toute la page vers le bas tout en laissant l'en-tête de page (titre + sous-titre) et les en-têtes de tableau collants. En outre, lors du défilement horizontal, le tableau doit défiler dans le div conteneur. C'est pourquoi j'ai marqué les parties qui ne devraient idéalement pas apparaître en pointillés.

 entrez la description de l'image ici


2 commentaires

Supprimez style = {{height: "400px"}} demo.js et il aura toute la hauteur. Si ce n'est pas un problème, pouvez-vous mieux l'expliquer?


Merci @ VeselinKontić - mais non, si je fais ceci: (1) l'en-tête collant ne colle plus; et (2) le défilement horizontal est toujours réellement dans l'objet Paper et non au bas de la page, en pleine largeur. J'espère que c'est plus clair?


3 Réponses :


0
votes

Vous pouvez y parvenir en définissant la hauteur et la largeur de manière à ce qu'elles soient égales à la fenêtre:

<Paper style={{ height: "100vh", width: "100vw" }}>

Exemple modifié: https://codesandbox.io/s/table-sticky-header-forked-l77is?file=/demo.js


1 commentaires

Merci mais non, ce n'est pas ce que je recherche. L'objet Paper doit rester au milieu, et non prendre le plein écran, conformément aux spécifications de conception.



2
votes

Toutes les modifications que nous devons apporter se trouvent sur demo.js

Premièrement, nous devons utiliser un TableContainer MUI personnalisé comme containerComponent code> pour votre @ devexpress / dx-react-grid-material-ui Table . Fondamentalement, le but est que nous puissions supprimer les propriétés overflow de la Table afin que le défilement soit principalement pour que le corps réponde à l'exigence de

les barres de défilement (horizontales et verticales) devant apparaître sur les bords du page du navigateur, respectivement en bas et à droite

<Paper>
  <Grid rows={rows} columns={columns} rootComponent={GridRoot}>
    <Table
      containerComponent={MUITableContainer}
      tableComponent={StickyTable}
    />
    ...

Deuxièmement, à votre MUITableContainer , débarrassez-vous de la hauteur: 400px pour que la hauteur de la table réponde à le contenu. Encore une fois, les barres de défilement en bas et à droite du corps du navigateur contrôlent désormais les positions de défilement du document - cela inclut le tableau. Jetez également un œil à la prop Table containerComponent - nous avons attribué le TableContainer personnalisé que nous avons créé précédemment.

import TableContainer from "@material-ui/core/TableContainer";
import makeStyles from "@material-ui/core/styles/makeStyles";

const useStyles = makeStyles({
  tableContainer: {
    overflow: "initial"
  }
});

const MUITableContainer = ({ children, ...rest }) => {
  const classes = useStyles();
  return (
    <TableContainer classes={{ root: classes.tableContainer }} {...rest}>
      {children}
    </TableContainer>
  );
};

Enfin, pour tester cette exigence:

il y aura d'autres objets avant et après.

Il suffit de rendre des exemples de composants avant et après le composant Paper

 Modifier l'en-tête collant du tableau (forké)


5 commentaires

Merci!! Oui, c'est presque ça !! La seule chose que je ne parviens toujours pas à faire fonctionner est que lorsque l'écran se rétrécit, la table jaillit du composant Paper . Même si le défilement horizontal fonctionne correctement et se trouve en bas de la page, la page entière défile à la place du tableau à l'intérieur du Papier . J'espère que vous voyez ce que je veux dire?


Jetez un œil à cet exemple que j'ai écrit: codesandbox.io/ s / agitated-meitner-gc1ye? file = / index.html . Faites attention au