Nutzung von Grid, Subgrid, Flex und Co in Contao
CSS-Grid und Subgrid in Contao verwenden
/* Wrapper */
#wrapper {
display : grid;
min-height : 100vh;
@supports ( min-height: 100dvh) {
min-height : 100dvh;
}
grid-template-rows : min-content 1fr min-content;
grid-template-areas :
"header"
"container"
"footer";
}
/* Header */
header {
grid-area: header;
background : var(--bg-header);
color : var(--clr-header);
padding-block : 2rem;
}
/* Container */
#container {
grid-area: container;
}
/* Footer */
footer {
grid-area: footer;
background : var(--bg-footer);
color : var(--clr-footer);
padding-block : 2rem;
}
/* Header */
header {
grid-area: header;
background : var(--bg-header);
color : var(--clr-header);
padding-block : 2rem;
}
header > .inside {
display : grid;
grid-template-columns : minmax(.5rem, 1fr) minmax(0, 1200px) minmax(.5rem, 1fr);
column-gap : 1rem;
}
/* Header */
header {
grid-area: header;
background : var(--bg-header);
color : var(--clr-header);
padding-block : 2rem;
& > .inside {
display : grid;
grid-template-columns : minmax(.5rem, 1fr) minmax(0, 1200px) minmax(.5rem, 1fr);
column-gap : 1rem;
}
}
/* Footer */
footer {
grid-area: footer;
background : var(--bg-footer);
color : var(--clr-footer);
padding-block : 2rem;
& > .inside {
display : grid;
grid-template-columns : minmax(.5rem, 1fr) minmax(0, 1200px) minmax(.5rem, 1fr);
column-gap : 1rem;
}
}
/* Main */
main {
& > .inside {
display : grid;
grid-template-columns : minmax(.5rem, 1fr) minmax(0, 1200px) minmax(.5rem, 1fr);
column-gap : 1rem;
& > .mod_article {
grid-column : 1 / -1;
display : grid;
grid-template-columns : subgrid;
& > * {
grid-column : 2 / -2;
}
}
}
}
/* Header */
header {
grid-area: header;
background : var(--bg-header);
color : var(--clr-header);
padding-block : 2rem;
& > .inside {
display : grid;
grid-template-columns : minmax(.5rem, 1fr) repeat(12, minmax(0, 5rem)) minmax(.5rem, 1fr);
column-gap : 1rem;
& .logo {
grid-column : 2 / span 3;
}
& .nav-wrapper {
grid-column : 5 / span 9;
justify-self: end;
}
}
}
/* Footer */
footer {
grid-area: footer;
background : var(--bg-footer);
color : var(--clr-footer);
padding-block : 2rem;
& > .inside {
display : grid;
grid-template-columns : minmax(.5rem, 1fr) repeat(12, minmax(0, 5rem)) minmax(.5rem, 1fr);
column-gap : 1rem;
& .copyright {
grid-column : 2 / -2;
}
}
}
/* Main */
@layer main {
main {
& > .inside {
display : grid;
grid-template-columns : minmax(.5rem, 1fr) repeat(12, minmax(0, 5rem)) minmax(.5rem, 1fr);
column-gap : 1rem;
& > .mod_article {
grid-column : 1 / -1;
display : grid;
grid-template-columns : subgrid;
& > * {
grid-column : 2 / -2;
}
}
}
}
}
Was ist ohne Templateanpassung machbar?
/* Artikel */
.mod_article {
&.bg {
padding-block: 1rem;
color: var(--inverse);
background-color: var(--secondary);
}
}
/* Hilfsklasse für volle Breite */
.fullwidth {
grid-column : 1 / -1;
display : grid;
grid-template-columns : subgrid;
& > * {
grid-column : 2 / -2;
}
}
/* Hilfsklassen Hintergrundfarbe */
.bg {
padding-block: 2rem;
}
.bg--primary {
background : var(--primary);
color : var(--inverse);
}
.bg--secondary {
background : var(--secondary);
color : var(--inverse);
}
.bg--light {
background : var(--neutral-light);
color : var(--clr);
}
.bg--dark {
background : var(--neutral-dark);
color : var(--inverse);
}
/* Inhaltselement Text */
.media {
row-gap : 1rem;
}
.media--above,
.media--below {
& figure {
/* Medium */
@media only screen and (min-width : 48em) {
grid-column : 2 / span 5;
}
}
}
.media--left {
& figure {
/* Medium */
@media only screen and (min-width : 48em) {
grid-column : 2 / span 5;
}
}
& .rte {
/* Medium */
@media only screen and (min-width : 48em) {
grid-column : 7/ -2;
}
}
}
.media--right {
& figure {
/* Medium */
@media only screen and (min-width : 48em) {
grid-column : 9 / -2;
order : 3;
}
}
& .rte {
/* Medium */
@media only screen and (min-width : 48em) {
grid-column : 2/ span 7;
}
}
}
/* Inhaltselement Galerie */
.content-gallery {
& ul {
display : grid;
gap : .25rem;
grid-template-columns : repeat(auto-fit, minmax(200px, 1fr));
}
}
.content-gallery {
& ul {
display : grid;
gap : .25rem;
}
}
.content-gallery--cols-5 {
& ul {
/* Small */
@media only screen and (min-width : 37.5em) {
grid-template-columns : repeat(2, 1fr);
}
/* Medium */
@media only screen and (min-width : 48em) {
grid-template-columns : repeat(3, 1fr);
}
/* Large */
@media only screen and (min-width : 64em) {
grid-template-columns : repeat(5, 1fr);
}
}
}
/* Textelemente als Boxen */
.content-text--box {
container-type : inline-size;
display : flex;
flex-flow : column;
gap : 1rem;
&.bg {
padding-block: 0 1rem;
}
& h1,
& h2,
& h3,
& h4,
& h5,
& h6 {
padding-inline : 1rem;
margin : 0;
}
& figure {
width : 100%;
margin : 0;
order : -1;
}
& .rte {
padding-inline : 1rem;
}
}
/* Boxen in der Elementgruppe */
.content-element-group--box {
display: grid;
gap: 1rem;
/* Medium */
@media only screen and (min-width: 48em) {
grid-template-columns: repeat(2, 1fr);
}
/* Large */
@media only screen and (min-width: 64em) {
grid-template-columns: repeat(4, 1fr);
}
}