Curs Web Development
Curs HTML
Curs CSS
Curs Javascript
Curs PHP
Curs Phyton
Curs SQL
Curs SEO

Introducere în Media Queries

Media queries sunt o componentă esențială a CSS-ului modern, permițând aplicarea stilurilor în funcție de caracteristicile dispozitivului utilizatorului. Ele stau la baza designului responsive, adaptând layout-ul și stilurile la diferite dimensiuni de ecran, orientări sau preferințe de utilizator.

Ce sunt media queries și de ce sunt importante

Media queries sunt instrucțiuni CSS care testează condiții precum lățimea ecranului, tipul de dispozitiv sau orientarea. Dacă condiția este îndeplinită, stilurile din interiorul media query-ului se aplică.

@media (max-width: 768px) {
  body {
    background-color: #f0f0f0;
  }
}

Acest exemplu aplică un fundal gri deschis doar dacă ecranul are o lățime de cel mult 768px — ideal pentru telefoane mobile.

Rolul lor în designul responsive

Designul responsive presupune ca site-ul să se adapteze automat la orice dimensiune de ecran. Media queries permit:

Fără media queries, un site ar arăta la fel pe toate dispozitivele — ceea ce poate duce la o experiență slabă pe mobil sau tabletă.

Diferența dintre media types și media features

Media types definesc tipul general de mediu:

Media features sunt condiții specifice testate în cadrul media query-ului:

@media screen and (min-width: 1024px) {
  .sidebar {
    display: block;
  }
}

Aici se aplică stilurile doar pe ecrane (screen) cu o lățime de cel puțin 1024px.

Sintaxa Media Queries

Structura generală

Media queries folosesc directiva @media urmată de o condiție și un bloc de stiluri. Sintaxa de bază:

@media (condiție) {
  /* Stiluri aplicate dacă condiția e adevărată */
}

Exemple simple și clare

@media (max-width: 768px) {
  .menu {
    display: none;
  }
}

@media (min-width: 1024px) {
  .container {
    padding: 40px;
  }
}

Explicația cuvintelor cheie

@media only screen and (max-width: 600px) {
  .box {
    background: #eee;
  }
}

@media not screen and (min-width: 800px) {
  .sidebar {
    display: none;
  }
}
🔧 Exemplu live - Media Query cu max-width

Tipuri de Media

Media types: screen, print, speech

Media types definesc tipul general de mediu în care se aplică stilurile CSS. Cele mai comune sunt:

Acestea pot fi combinate cu media features pentru a aplica stiluri condiționate.

Când și cum se folosesc

Media types se folosesc pentru a adapta stilurile în funcție de contextul de afișare:

@media print {
  nav, footer {
    display: none;
  }

  body {
    font-size: 12pt;
    color: black;
  }
}

Exemplu: stiluri diferite pentru print vs. ecran

În exemplul de mai jos, fundalul este albastru pe ecran și alb la imprimare:

@media screen {
  .box {
    background: #3498db;
    color: white;
  }
}

@media print {
  .box {
    background: white;
    color: black;
    border: 1px solid #000;
  }
}
🔧 Exemplu live - Stiluri diferite pentru print vs. ecran

Media Features frecvent folosite

Media features populare: max-width|min-width|orientation|prefers-color-scheme

Media features sunt condiții specifice testate în cadrul unei interogări media. Cele mai folosite sunt:

max-width vs. min-width

Aceste două media features sunt fundamentale pentru designul responsive:

@media (max-width: 600px) {
  .nav {
    display: none;
  }
}

@media (min-width: 1024px) {
  .nav {
    display: flex;
  }
}

Exemplu: adaptarea layout-ului în funcție de lățimea ecranului

În exemplul de mai jos, layout-ul se modifică automat în funcție de dimensiunea ecranului:

.grid {
  display: grid;
  grid-template-columns: 1fr;
}

@media (min-width: 768px) {
  .grid {
    grid-template-columns: 1fr 1fr;
  }
}

@media (min-width: 1024px) {
  .grid {
    grid-template-columns: 1fr 1fr 1fr;
  }
}
🔧 Exemplu live - Layout adaptiv cu media queries

Design Responsive cu Breakpoints

Ce sunt breakpoints și cum le alegem

Breakpoints sunt puncte de întrerupere în layout, definite prin media queries, care permit adaptarea stilurilor în funcție de dimensiunea ecranului. Ele marchează tranziția între diferite versiuni ale designului: mobil, tabletă, desktop etc.

Nu există un set universal — breakpoints se aleg în funcție de conținutul și structura site-ului. Ideal, se bazează pe dimensiunile reale ale conținutului, nu doar pe dispozitive.

Exemple de breakpoints comune

Iată câteva valori orientative folosite frecvent:

@media (max-width: 768px) {
  .nav {
    flex-direction: column;
  }
}

@media (min-width: 1024px) {
  .nav {
    flex-direction: row;
  }
}

Strategii: mobile-first vs. desktop-first

Mobile-first înseamnă că stilurile implicite sunt pentru ecrane mici, iar media queries extind designul pentru ecrane mai mari.

.card {
  font-size: 1rem;
}

@media (min-width: 768px) {
  .card {
    font-size: 1.2rem;
  }
}

Desktop-first presupune că stilurile implicite sunt pentru desktop, iar media queries le restrâng pentru mobil.

.card {
  font-size: 1.2rem;
}

@media (max-width: 768px) {
  .card {
    font-size: 1rem;
  }
}
🔧 Exemplu live - Breakpoints responsive

Organizarea Media Queries în CSS

Unde le plasăm în fișierul CSS

Media queries pot fi plasate:

/* Stiluri de bază */
.button {
  padding: 12px 24px;
  font-size: 1rem;
}

/* Media query la final */
@media (max-width: 768px) {
  .button {
    font-size: 0.9rem;
  }
}

Gruparea logică a stilurilor

Organizarea media queries pe componente sau funcționalități ajută la întreținerea codului:

/* Grupare pe componente */
.header { ... }
@media (max-width: 768px) {
  .header { ... }
}

.nav { ... }
@media (max-width: 768px) {
  .nav { ... }
}

Separarea stilurilor în fișiere externe

Pentru proiecte mari, e recomandat să separi stilurile în fișiere dedicate:

<link rel="stylesheet" href="css/base.css">
<link rel="stylesheet" href="css/responsive.css">
<link rel="stylesheet" href="css/print.css" media="print">
🔧 Exemplu live - Organizare media queries

Exemple practice

Layout care se adaptează pe mobil

Un layout simplu cu două coloane pe desktop care devine o singură coloană pe mobil:

.layout {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 20px;
}

@media (max-width: 768px) {
  .layout {
    grid-template-columns: 1fr;
  }
}
🔧 Exemplu live - Layout adaptiv

Meniu care se transformă în hamburger

Un meniu orizontal care devine vertical și ascuns pe mobil, activat printr-un buton:

.menu {
  display: flex;
  gap: 20px;
}

.menu-toggle {
  display: none;
}

@media (max-width: 768px) {
  .menu {
    display: none;
    flex-direction: column;
  }

  .menu-toggle {
    display: block;
  }

  .menu.active {
    display: flex;
  }
}
🔧 Exemplu live - Meniu hamburger

Galerie care trece de la 1 la 4 coloane în funcție de ecran

O galerie flexibilă care se adaptează automat la dimensiunea ecranului:

.gallery {
  display: grid;
  gap: 20px;
  grid-template-columns: 1fr;
}

@media (min-width: 600px) {
  .gallery {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (min-width: 900px) {
  .gallery {
    grid-template-columns: repeat(3, 1fr);
  }
}

@media (min-width: 1200px) {
  .gallery {
    grid-template-columns: repeat(4, 1fr);
  }
}
🔧 Exemplu live - Galerie responsive

Testare și depanare

Cum folosim DevTools pentru simularea dispozitivelor

Toate browserele moderne oferă instrumente de dezvoltare (DevTools) care permit simularea diferitelor dimensiuni de ecran și dispozitive. În Chrome, Firefox și Edge, poți accesa modul responsive astfel:

Poți selecta dispozitive predefinite (iPhone, iPad, Galaxy etc.) sau introduce dimensiuni personalizate.

Moduri responsive în Chrome, Firefox, Edge

Fiecare browser oferă o experiență ușor diferită:

În toate cazurile, poți inspecta elementele, modifica stiluri în timp real și testa media queries direct în DevTools.

Detectarea problemelor de stil

DevTools te ajută să identifici rapid problemele legate de media queries:

Poți chiar să adaugi temporar media queries direct în DevTools pentru testare rapidă.

@media (max-width: 600px) {
  .debug {
    outline: 2px dashed red;
  }
}
🔧 Exemplu live - Testare media query în DevTools

Greșeli comune și cum le evităm

Folosirea excesivă a media queries

Unul dintre cele mai frecvente greșeli este suprasaturarea fișierului CSS cu media queries pentru fiecare mică variație. Acest lucru duce la:

Soluție: Folosește breakpoints bine alese și stiluri scalabile cu clamp(), flex, grid.

/* Evită asta */
@media (max-width: 500px) { ... }
@media (max-width: 520px) { ... }
@media (max-width: 540px) { ... }

/* Mai bine */
@media (max-width: 600px) { ... }

Breakpoints arbitrare fără testare

Definirea de breakpoints fără a testa layout-ul pe dispozitive reale sau simulări poate duce la experiențe neuniforme. De exemplu, un breakpoint la 850px poate fi inutil dacă nu corespunde niciunui dispozitiv real.

Soluție: Testează layout-ul în DevTools și bazează breakpoints pe conținut, nu pe presupuneri.

Lipsa unei strategii clare de responsive design

Fără o abordare coerentă (mobile-first sau desktop-first), stilurile pot deveni contradictorii și greu de scalat.

Soluție: Alege o strategie și aplic-o consecvent. Recomandat: mobile-first, cu stiluri implicite pentru ecrane mici și media queries pentru extindere.

/* Mobile-first */
.card {
  font-size: 1rem;
}

@media (min-width: 768px) {
  .card {
    font-size: 1.2rem;
  }
}
🔧 Exemplu live - Strategie mobile-first corectă

Recapitulare și exercițiu final

Recapitularea conceptelor cheie

Exercițiu: creează o pagină cu layout adaptabil pentru 3 dimensiuni de ecran

Scopul este să construiești o secțiune cu 3 casete care se afișează:

.grid {
  display: grid;
  gap: 20px;
  grid-template-columns: 1fr;
}

@media (min-width: 768px) {
  .grid {
    grid-template-columns: 1fr 1fr;
  }
}

@media (min-width: 1024px) {
  .grid {
    grid-template-columns: 1fr 1fr 1fr;
  }
}

Provocare: adaugă stiluri diferite pentru orientarea landscape

Folosește media query cu orientation pentru a modifica stilul în mod dinamic:

@media (orientation: landscape) {
  .grid {
    background: #f1c40f;
  }
}
🔧 Exercițiu final - Layout adaptabil + orientare

🧠 Quiz - Media Queries

Top