Învață CSS Grid cu exemple practice, sfaturi și exerciții interactive!
CSS Grid este un sistem de layout bidimensional care îți permite să creezi layout-uri complexe cu ușurință. Spre deosebire de Flexbox (care e unidimensional), Grid îți permite să controlezi atât rândurile cât și coloanele simultan.
Pentru a crea un grid, setezi display: grid pe container:
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 100px 100px;
gap: 10px;
}
Poți defini coloane și rânduri folosind diferite unități:
/* Unități fixe și flexibile */
.grid {
grid-template-columns: 200px 1fr 2fr;
grid-template-rows: 100px auto;
}
fr (fraction) reprezintă o fracțiune din spațiul disponibil. Este foarte utilă pentru layout-uri responsive!
Controlează spațiul dintre elemente:
.grid {
gap: 20px; /* sau */
row-gap: 10px;
column-gap: 20px;
}
.blog-layout {
display: grid;
grid-template-columns: 1fr 3fr 1fr;
grid-template-areas:
"header header header"
"sidebar content aside"
"footer footer footer";
gap: 20px;
}
.gallery {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 15px;
}
repeat(auto-fit, minmax(200px, 1fr)) creează automat coloane responsive care se adaptează la dimensiunea containerului!
Poți poziționa elementele folosind liniile grid-ului:
.item {
grid-column: 1 / 3; /* de la linia 1 la 3 */
grid-row: 2 / 4; /* de la linia 2 la 4 */
/* sau */
grid-column: span 2; /* ocupă 2 coloane */
}
Creează un layout de dashboard cu:
.dashboard {
display: grid;
grid-template-columns: 200px 1fr;
grid-template-rows: 60px 1fr 150px;
grid-template-areas:
"header header"
"sidebar main"
"widgets widgets";
gap: 20px;
height: 100vh;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.widgets {
grid-area: widgets;
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
}
Creează un layout de carduri care:
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
}
/* Sau cu media queries pentru control exact */
@media (min-width: 1200px) {
.cards { grid-template-columns: repeat(4, 1fr); }
}
@media (max-width: 1199px) and (min-width: 768px) {
.cards { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 767px) and (min-width: 480px) {
.cards { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 479px) {
.cards { grid-template-columns: 1fr; }
}
Creează un grid pentru produse unde:
Creează un layout tip masonry folosind Grid:
.masonry {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
grid-auto-rows: 20px;
gap: 20px;
}
.masonry-item:nth-child(odd) {
grid-row-end: span 10;
}
.masonry-item:nth-child(even) {
grid-row-end: span 15;
}
Creează layout-uri asimetrice interesante:
.complex-grid {
display: grid;
grid-template-columns: repeat(6, 1fr);
grid-auto-rows: 80px;
gap: 15px;
}
.featured { grid-column: span 3; grid-row: span 2; }
.vertical { grid-row: span 3; }
.horizontal { grid-column: span 2; }
Controlează cum se plasează automat elementele:
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-flow: dense; /* umple golurile automat */
}
grid-auto-flow: row (default)
grid-auto-flow: dense
Controlează alinierea în grid:
.grid {
display: grid;
justify-items: center; /* orizontal */
align-items: center; /* vertical */
justify-content: space-between; /* container */
align-content: center; /* container */
}
Permite elementelor copil să moștenească grid-ul părintelui:
.parent {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
}
.child {
display: grid;
grid-template-columns: subgrid;
grid-column: span 3;
}
Folosește container queries pentru layout-uri cu adevărat responsive:
.card-container {
container-type: inline-size;
}
@container (min-width: 400px) {
.cards {
grid-template-columns: repeat(2, 1fr);
}
}
@container (min-width: 700px) {
.cards {
grid-template-columns: repeat(3, 1fr);
}
}
.square-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 20px;
}
.square-item {
aspect-ratio: 1; /* Păstrează items pătrate */
background: linear-gradient(135deg, #667eea, #764ba2);
}
* { outline: 1px solid red; } /* Vezi toate elementele */
.grid > * { outline: 2px solid blue; } /* Vezi grid items */
.grid > *::before {
content: counter(item);
counter-increment: item;
}
will-change: transform pentru animațiitransform în loc de schimbarea layout-ului pentru animațiicontain: layout pentru izolare
/* === CONTAINER PROPERTIES === */
display: grid;
grid-template-columns: 1fr 2fr 1fr;
grid-template-rows: 100px auto 50px;
grid-template-areas: "header header header"
"sidebar main aside"
"footer footer footer";
gap: 20px; /* sau row-gap și column-gap */
grid-auto-columns: 100px;
grid-auto-rows: minmax(100px, auto);
grid-auto-flow: row | column | dense;
/* Alignment */
justify-items: start | end | center | stretch;
align-items: start | end | center | stretch;
justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
align-content: start | end | center | stretch | space-around | space-between | space-evenly;
/* === ITEM PROPERTIES === */
grid-column: 1 / 3; /* sau grid-column-start + grid-column-end */
grid-row: 2 / 4; /* sau grid-row-start + grid-row-end */
grid-area: header; /* sau row-start / col-start / row-end / col-end */
/* Self alignment */
justify-self: start | end | center | stretch;
align-self: start | end | center | stretch;
/* === FUNCȚII UTILE === */
repeat(3, 1fr)
repeat(auto-fit, minmax(200px, 1fr))
repeat(auto-fill, 100px)
minmax(100px, 1fr)
fit-content(300px)
/* === UNITĂȚI === */
fr - fraction unit
min-content - dimensiune minimă
max-content - dimensiune maximă
auto - dimensiune automată
Folosind toate conceptele învățate, creează un dashboard cu:
Acum ești pregătit să creezi layout-uri complexe cu CSS Grid!
Continuă să exersezi și experimentează cu diferite combinații.