🎨 Tutorial CSS Grid

Învață CSS Grid cu exemple practice, sfaturi și exerciții interactive!

📚 Ce este CSS Grid?

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.

Grid este perfect pentru layout-uri de pagină, galerii de imagini, dashboards și orice design care necesită control precis pe două dimensiuni.

🔧 Concepte de Bază

1. Container Grid și Grid Items

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;
}
1
2
3
4
5
6

2. Grid Template Columns & Rows

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;
}
200px
1fr
2fr
Conținut
Auto Height
Se adaptează
Unitatea fr (fraction) reprezintă o fracțiune din spațiul disponibil. Este foarte utilă pentru layout-uri responsive!

3. Gap (Spațiere)

Controlează spațiul dintre elemente:

.grid {
    gap: 20px; /* sau */
    row-gap: 10px;
    column-gap: 20px;
}
Gap
20px
Uniform

🎯 Exemple Practice

Layout Blog Clasic

.blog-layout {
    display: grid;
    grid-template-columns: 1fr 3fr 1fr;
    grid-template-areas:
        "header header header"
        "sidebar content aside"
        "footer footer footer";
    gap: 20px;
}
Header
Sidebar
Content Principal
Aside
Footer

Galerie Foto Responsive

.gallery {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: 15px;
}
Foto 1
Foto 2
Foto 3
Foto 4
Foto 5
Foto 6
repeat(auto-fit, minmax(200px, 1fr)) creează automat coloane responsive care se adaptează la dimensiunea containerului!

🚀 Tehnici Avansate

Grid Lines și Span

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 */
}
Colspan 2
Normal
Normal
Rowspan 2
Colspan 3
Normal
Normal
Normal

Demo Interactiv - Experimentează cu Grid!

10px
1
2
3
4
5
6

📝 Exerciții Practice

Exercițiul 1: Layout Dashboard

Creează un layout de dashboard cu:

  • Header care ocupă toată lățimea
  • Sidebar stânga (200px fix)
  • Zona principală de conținut (flexibilă)
  • 3 widget-uri egale în partea de jos
Vezi soluția
.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;
}

Exercițiul 2: Card Layout Responsive

Creează un layout de carduri care:

  • Afișează 4 coloane pe desktop
  • 3 coloane pe tablet
  • 2 coloane pe mobil
  • 1 coloană pe ecrane foarte mici
Vezi soluția
.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; }
}

Exercițiul 3: Layout Magazin Online

Creează un grid pentru produse unde:

  • Primul produs este featured (ocupă 2x2 grid cells)
  • Restul produselor sunt normale (1x1)
  • Layout-ul să fie responsive

💡 Sfaturi Finale

CSS Grid și Flexbox nu sunt competitori - folosește-le împreună! Grid pentru layout-ul general, Flexbox pentru componentele individuale.
Folosește Firefox DevTools - are cel mai bun inspector pentru CSS Grid cu vizualizare a liniilor și zonelor.
Pentru browsere mai vechi, verifică suportul pe caniuse.com și folosește @supports pentru fallback.

🎨 Tehnici Creative cu CSS Grid

Layout Masonry (Pinterest-style)

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;
}
Short
Tall
Medium
Extra Tall
Short
Medium-Tall

Grid cu Forme Complexe

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; }
Featured
Horizontal
1x1
Vertical
1x1
1x1
Horizontal
1x1
1x1
Wide

🔥 Proprietăți Avansate

Grid Auto Flow

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)

1
2 (span 2)
3
4

grid-auto-flow: dense

1
2 (span 2)
3
4

Align și Justify

Controlează alinierea în grid:

.grid {
    display: grid;
    justify-items: center; /* orizontal */
    align-items: center;   /* vertical */
    justify-content: space-between; /* container */
    align-content: center;  /* container */
}
Center
Center
Center

Subgrid (CSS Grid Level 2)

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;
}
Subgrid este suportat în Firefox și Safari. Pentru alte browsere, folosește o soluție alternativă cu grid nested.

📱 Grid Responsive - Tehnici Avansate

Container Queries cu Grid

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);
    }
}

Aspect Ratio Grid Items

.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);
}
1:1
1:1
1:1
1:1

🛠️ Debugging și Performance

Sfaturi pentru Debugging

  1. Folosește Grid Inspector: Firefox și Chrome au tool-uri excelente
  2. Outline pentru vizualizare:
    * { outline: 1px solid red; } /* Vezi toate elementele */
    .grid > * { outline: 2px solid blue; } /* Vezi grid items */
  3. Numbering pentru debugging:
    .grid > *::before {
        content: counter(item);
        counter-increment: item;
    }

Optimizare Performance

  • Evită grid-uri excesiv de complexe (sute de celule)
  • Folosește will-change: transform pentru animații
  • Preferă transform în loc de schimbarea layout-ului pentru animații
  • Folosește contain: layout pentru izolare

📋 CSS Grid Cheat Sheet

/* === 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ă

🎮 Proiect Final: Dashboard Interactiv

Construiește un Dashboard Complet

Folosind toate conceptele învățate, creează un dashboard cu:

  • Header cu logo și navigație
  • Sidebar collapsibil
  • Grid de widget-uri (grafice, statistici)
  • Footer cu informații
  • Complet responsive
  • Dark mode toggle
Header & Nav
Sidebar Menu
Chart 1
Chart 2
Wide Chart
Widgets
Footer

📚 Resurse Suplimentare

Link-uri Utile

  • MDN Web Docs: Documentație completă CSS Grid
  • CSS Grid Garden: Joc interactiv pentru învățat Grid
  • Grid by Example: Colecție de exemple practice
  • CSS Tricks Grid Guide: Ghid complet ilustrat
  • Can I Use: Verifică suportul browser

Tool-uri Recomandate

  • CSS Grid Generator: Generează cod Grid vizual
  • Griddy: Extension Chrome pentru debugging
  • Firefox Grid Inspector: Cel mai bun tool pentru vizualizare

🎯 Concluzie

Felicitări! 🎉

Acum ești pregătit să creezi layout-uri complexe cu CSS Grid!

Continuă să exersezi și experimentează cu diferite combinații.

Remember: The best way to learn CSS Grid is by building real projects!