Donc, je joue avec css-grids
en réaction quand j'ai remarqué que grid-template-areas
a une syntaxe un peu différente qui pourrait ne pas être compatible dans les styles de réaction en ligne. Je n'utilise pas de bibliothèques, juste de vieux styles de réaction en ligne avec un accessoire de style.
Donc, ce que je vise à faire est similaire à cela.
.wrapper {
display: grid;
grid-template-columns: 100px 100px;
grid-template-areas: "header header"
"aside main"
"footer footer"
}
.header {
grid-area: header;
border: 1px solid red;
}
.main {
grid-area: main;
border: 1px solid green;
}
.aside {
grid-area: aside
}
.footer {
grid-area: footer;
border: 1px solid yellow;
}
Fidde: https://jsbin.com/lejaduj/2/edit?html,css,output
La mise en page est simple, "en-tête" et "pied de page" couvrant toutes les colonnes et "côté" et "principal" couvrant la moitié. C'est juste à des fins de démonstration, donc je suis resté simple.
Notez en particulier comment grid-template-areas
a plusieurs valeurs séparées juste par des guillemets doubles.
Après réflexion, j'ai pensé que nous pourrions utiliser des tableaux dans gridTemplateAreas
dans des styles réactifs en ligne. Cela ne semblait pas fonctionner.
J'ai encore essayé avec template-literals
qui n'a pas fonctionné non plus.
Sandbox: https://codesandbox.io/s/zx4nokmr5l
Alors, est-ce juste moi qui frappe cet obstacle ou n'est-ce pas encore pris en charge?
Je préfère ne pas utiliser de bibliothèque ou de cadre supplémentaire en réaction pour y parvenir autant que possible.
Si l'objectif est d'utiliser grid-template-areas
avec l'attribut HTML style
(c'est-à-dire les styles CSS en ligne), puis utilisez des guillemets simples au lieu de doubles.
.wrapper {
display: grid;
grid-template-columns: 100px 100px;
/* grid-template-areas: "header header"
"aside main"
"footer footer"; */
}
.header {
grid-area: header;
background-color: aqua;
}
.main {
grid-area: main;
background-color: lightgreen;
}
.aside {
grid-area: aside;
background-color: yellow;
}
.footer {
grid-area: footer;
background-color: pink;
}
<body class="wrapper" style="grid-template-areas: 'header header' 'aside main' 'footer footer' ">
<div class="header">header</div>
<div class="main">main</div>
<div class="aside">aside</div>
<div class="footer">footer</div>
</body>
Utilisez simplement des chaînes de backtick.
gridTemplateAreas: `
'header header'
'aside main'
'footer footer'
`
si vous avez besoin d'un objet dans le style, cela fonctionne
myStyle = {
display: 'grid',
gridTemplateAreas: "'header' 'content' 'footer'",
gridTemplateRows: '50px calc(100vh - 100px) 50px'
};
et utiliser l'objet de style en ligne
comme je l'ai fait avec styletron
import { styled } from 'styletron-react';
const myStyle = {
backgroundColor: 'whitesmoke',
display: 'grid',
gridTemplateAreas: "'header' 'content' 'footer'",
gridTemplateRows: '50px calc(100vh - 100px) 50px'
};
const Layout = styled('div', (props) => (myStyle));
export default Layout;
Pour les personnes qui ont un tableau bidimensionnel comme celui-ci:
let grid2D = [
["area-70774248-ed4a-4f60-8341-46d4173344f8","area-e06e944f-a50a-4630-ac19-6c85ca0e7bc3","area-e06e944f-a50a-4630-ac19-6c85ca0e7bc3","area-e06e944f-a50a-4630-ac19-6c85ca0e7bc3"],
["area-70774248-ed4a-4f60-8341-46d4173344f8","area-e06e944f-a50a-4630-ac19-6c85ca0e7bc3","area-e06e944f-a50a-4630-ac19-6c85ca0e7bc3","area-e06e944f-a50a-4630-ac19-6c85ca0e7bc3"],
["area-70774248-ed4a-4f60-8341-46d4173344f8","area-1d20d72e-5383-47aa-bcc4-8aaed8137410","area-1d20d72e-5383-47aa-bcc4-8aaed8137410","area-1d20d72e-5383-47aa-bcc4-8aaed8137410"],
[".","area-1d20d72e-5383-47aa-bcc4-8aaed8137410","area-1d20d72e-5383-47aa-bcc4-8aaed8137410","area-1d20d72e-5383-47aa-bcc4-8aaed8137410"],
[".","area-1d20d72e-5383-47aa-bcc4-8aaed8137410","area-1d20d72e-5383-47aa-bcc4-8aaed8137410","area-1d20d72e-5383-47aa-bcc4-8aaed8137410"]
]
pour concaténer le tableau afin qu'il soit possible de le faire dans un style en ligne, vous pouvez simplement utiliser cette seule ligne
let stringGrid = "'" + grid2D.map(arr => arr.join(' ')).join("' '") + "'";
Dans un composant React, il peut fonctionner comme ceci:
export class Grid extends React.Component {
constructor(props) {
super(props);
this.state = {
grid2D: [
["area-70774248-ed4a-4f60-8341-46d4173344f8","area-e06e944f-a50a-4630-ac19-6c85ca0e7bc3","area-e06e944f-a50a-4630-ac19-6c85ca0e7bc3","area-e06e944f-a50a-4630-ac19-6c85ca0e7bc3"],
["area-70774248-ed4a-4f60-8341-46d4173344f8","area-e06e944f-a50a-4630-ac19-6c85ca0e7bc3","area-e06e944f-a50a-4630-ac19-6c85ca0e7bc3","area-e06e944f-a50a-4630-ac19-6c85ca0e7bc3"],
["area-70774248-ed4a-4f60-8341-46d4173344f8","area-1d20d72e-5383-47aa-bcc4-8aaed8137410","area-1d20d72e-5383-47aa-bcc4-8aaed8137410","area-1d20d72e-5383-47aa-bcc4-8aaed8137410"],
[".","area-1d20d72e-5383-47aa-bcc4-8aaed8137410","area-1d20d72e-5383-47aa-bcc4-8aaed8137410","area-1d20d72e-5383-47aa-bcc4-8aaed8137410"],
[".","area-1d20d72e-5383-47aa-bcc4-8aaed8137410","area-1d20d72e-5383-47aa-bcc4-8aaed8137410","area-1d20d72e-5383-47aa-bcc4-8aaed8137410"]
]
};
}
getTemplateAreas(grid2D) {
return "'" + grid2D.map(arr => arr.join(' ')).join("' '") + "'";
}
render() {
const { grid2D } = this.state;
return (
<div style={{ gridTemplateAreas: this.getTemplateAreas(grid2D), display: 'grid', width: '100%', height: "100%" }}>
{grid2D.map((arr, i1) => {
return arr.map((id, i2) => {
return <div key={i1 + '' + i2} style={{ gridArea: id }} />;
});
})}
</div>
);
}
}
Important: les noms/identifiants de zone de grille doivent commencer par un caractère alphabétique