Înainte de CSS3, stilizarea precisă a elementelor HTML necesita adăugarea manuală a multor
clase și ID-uri în markup. Astăzi, selectorii CSS3 și pseudo-clasele CSS permit o selecție rapidă și precisă
a elementelor din pagină: selector de atribut, :nth-child, :not, :has, :is, :where, :checked, :disabled,
:focus-within și pseudo-elemente ::before, ::after. Acest tutorial este ideal pentru începători și
dezvoltatori care vor să învețe CSS selectors, selectori CSS, și stilizare avansată pentru formulare,
navigație, layout-uri responsive și SEO-friendly front-end.
Selectorii CSS sunt unul dintre pilonii principali ai web designului modern și ai codului CSS curat. Cu
pseudo-clase structurale, pseudo-elemente și selectori de atribut poți controla fiecare informație din
interfață fără să adaugi HTML inutil, fără să duplici stiluri și fără să pierzi timpul cu clase ad-hoc.
Acest tutorial explică cum să folosești selectori CSS3 pentru formulare, butoane, meniuri, tabele,
carduri, liste și pagini responsive, cu exemple practice pentru proiecte reale și profitabilitate SEO.
selectori de atribut
Cum selectezi elemente HTML după valoarea atributelor
Selectorii de atribut în CSS3 permit identificarea elementelor din pagină pe baza prezenței sau valorii
specifice a unui atribut HTML (precum href, src, title,
target sau atribute personalizate data-*). Aceștia oferă trei operatori noi de
potrivire a textului: potrivire la început (^=), potrivire la sfârșit ($=) și
potrivire parțială (*=).
Prin utilizarea acestor selectori, poți stiliza automat linkurile externe, fișierele descarcabile PDF sau
imaginile PNG fără să schimbi codul sursă HTML generat de CMS-uri precum WordPress sau Drupal.
cod CSS3
/* Selecteaza linkurile securizate HTTPS */
a[href^="https://"] {
padding-left: 18px;
background: url('lock.svg') left center no-repeat;
}
/* Selecteaza fișierele PDF descarcabile */
a[href$=".pdf"]::after {
content: " (PDF)";
font-size: 0.8em;
color: #d6472e;
}
/* Selecteaza orice clasa ce contine 'alerta-' */
[class*="alerta-"] {
border-left: 4px solid #e8b339;
}
Explicații suplimentare și cazuri de utilizare SEO:
[attr^="valoare"] — Potrivește dacă atributul începe exact cu șirul dat (ideal pentru
clasificarea linkurilor interne vs. externe).
[attr$="valoare"] — Potrivește dacă atributul se termină cu șirul respectiv (perfect
pentru adăugarea automată de pictograme pentru formate de fișiere: .pdf, .png, .zip).
[attr*="valoare"] — Potrivește dacă șirul există oriunde în valoarea atributului (foarte
util pentru sisteme de design bazate pe data-attributes).
pseudo-clase structurale
Stilizarea elementelor după poziția din DOM (:nth-child și :not)
Pseudo-clasele structurale permit selectarea elementelor pe baza poziției exacte pe care o ocupă în
arborele DOM în raport cu frații lor. În loc să adaugi clase manual pe rândurile par sau impar ale unui
tabel, :nth-child() calculează dinamica selecției folosind formule matematice precum
2n, 2n+1, odd sau even.
De asemenea, pseudo-clasa :not() (cunoscută ca selectorul de negare) permite izolarea și
excluderea anumitor elemente din regulile de stilizări generale, simplificând arhitectura CSS.
cod CSS3
/* Stilizeaza randurile impare din lista */
li:nth-child(odd) {
background: #efe7d6;
}
/* Aplica margine pe toate elementele, mai putin pe ultimul */
.card:not(:last-child) {
margin-bottom: 20px;
}
rezultat vizual
Rândul 1 (Impar — :nth-child(odd))
Rândul 2 (Par)
Rândul 3 (Impar — :nth-child(odd))
Rândul 4 (Par)
Explicații tehnice și bune practici:
Formulele :nth-child(an+b) vă permit să selectați de exemplu fiecare al treilea element
începând cu primul (3n+1).
Selectorul :not() poate accepta acum în CSS4 liste de selectori, de exemplu
:not(.strikethrough, .disabled).
Utilizarea pseudo-claselor structurale reduce dimensiunea fișierelor HTML și crește viteza de
încărcare a site-ului pe mobil.
pseudo-clase de stare
Interfață interactivă fără JavaScript (:checked și :target)
CSS3 permite crearea de componente de interfață dinamice (cum ar fi meniuri burger mobile, acordeoane,
comutatoare toggle sau ferestre modale) doar din HTML și CSS, folosind pseudo-clase de stare precum
:checked și :target.
Starea :checked se aplică căsuțelor de bifat (checkbox) și casetelor radio când sunt selectate
de utilizator, iar :target stilizează un element a cărui ancoră ID corespunde cu hash-ul din
URL-ul paginii.
Elimină complet dependența de jQuery sau JavaScript pentru comutatoare simple de interfață (Toggle
Switches).
Sistemul :target permite crearea de meniuri de navigare sau ferestre pop-up 100%
accesibile și ușoare.
:first-child / :last-child / :only-child
Gestionarea primului, ultimului și unicului copil
Aceste pseudo-clase simplifică curățarea separatorilor și liniilor de bordură din liste.
:first-child vizează primul element dintr-un container părinte, :last-child pe
ultimul, iar :only-child se declanșează doar dacă elementul este singurul descendent direct.
cod CSS3
/* Primul element primeste o culoare distincta */
li:first-child {
font-weight: 700;
color: #d6472e;
}
/* Elimina linia de jos de pe ultimul element */
li:last-child {
border-bottom: none;
}
/* Stilizeaza paragrafele unice */
p:only-child {
font-size: 1.1rem;
}
rezultat vizual
Primul
element (:first-child — bold roșu)
Element intermediar
Ultimul element (:last-child — fără bordură)
Sfaturi de stilizare responsive:
Folosiți :last-child { margin-bottom: 0; } pe componente pentru a preveni spațierile
duble în layout-uri flexibile.
::before și ::after
Conținut decorativ generat direct din CSS
Pseudo-elementele ::before și ::after creează elemente cosmetice virtuale direct
din foaia de stiluri CSS fără să aglomereze codul HTML. Sunt ideale pentru adăugarea de pictograme, linii
decorative, insigna „NOU” pe carduri sau efecte speciale la trecerea mouse-ului.
Proprietatea content: '' este obligatorie pentru ca ::before și
::after să fie randate de browser, chiar dacă valoarea este un șir de text gol.
:focus-within
Stilizarea containerului părinte la focusul copiilor
Pseudo-clasa :focus-within reprezintă o inovație majoră în CSS3/CSS4. Aceasta activează reguli
de stilizare pe un container părinte atunci când oricare dintre elementele sale descendente (câmpuri de
text, butoane, linkuri) primește focusul tastaturii sau al mouse-ului.
Ideal pentru evidențierea întregului grup de câmpuri dintr-un formular de contact sau de
autentificare.
Îmbunătățește considerabil experiența utilizatorilor care navighează folosind tastatura (tasta Tab).
:is() și :where()
Gruparea eficientă a selectorilor și controlul specificității
Pseudo-clasele funcționale :is() și :where() rezolvă problema duplicării lungi de
cod atunci când doriți să stilizați aceleași titluri sau paragrafe în mai multe secțiuni ale paginii.
Diferența critică constă în modul de calcul al specificității CSS:
:is() preia specificitatea celui mai puternic selector trecut ca argument, în timp ce
:where() are specificitate nulă (0, 0, 0), făcând regulile stilizate cu :where()
extrem de ușor de suprascris ulterior.
cod CSS3
/* In loc de: header h1, nav h1, footer h1 */
:is(header, nav, footer) h1 {
color: #d6472e;
}
/* Stiluri de baza cu specificitate zero (usor de suprascris) */
:where(article, section) p {
line-height: 1.7;
color: #4a5568;
}
rezultat vizual
Titlu optimizat prin :is()
Paragraf stilizat cu specificitate 0 prin
:where()
Beneficii de optimizare a codului CSS:
Reduce dimensiunea fisierului CSS minificat prin eliminarea selecțiilor redundante.
:where() este soluția ideală pentru crearea de librării CSS de bază (CSS Reset) care pot
fi personalizate ulterior fără conflicte.
:has() — Parent Selector
Selectorul părinte revoluționar în CSS modern
Denumit des „sfântul graal al selectorilor CSS”, :has() permite stilizarea unui element
părinte în funcție de prezența sau starea copiilor săi. Pentru prima dată în istoria CSS, poți aplica reguli
pe o cutie părinte dacă aceasta conține o imagine, un anumit buton sau un câmp de input invalid, fără a mai
apela la cod JavaScript.
cod CSS3
/* Stilizeaza cardul doar daca contine o imagine */
.card:has(img) {
display: grid;
grid-template-columns: 120px 1fr;
}
/* Schimba bordura formularului daca exista erori */
form:has(input:invalid) {
border-left: 4px solid #d6472e;
}
rezultat vizual
Părinte detectat
automat prin :has(input:invalid)Bordura roșie se activează automat pe părinte când
copilul are o stare specifică!
Compatibilitate și suport Google:
Este complet suportat în toate browserele moderne (Chrome, Safari, Edge, Firefox).
Simplifică arhitectura aplicațiilor web complexe construite în React, Vue sau HTML nativ.
:empty
Detectarea și ascunderea elementelor fără conținut
Pseudo-clasa :empty selectează orice element HTML care nu conține niciun copil (nici noduri de
text, nici alte etichete HTML și nici spații albe). Este utilizată frecvent pentru ascunderea automată a
mesajelor de eroare goale sau pentru introducerea de conținut de rezervă (fallback).
cod CSS3
/* Ascunde casetele de alerta cand sunt goale */
.alerta:empty {
display: none;
}
/* Afiseaza un placeholder pentru casetele goale */
.container:empty::before {
content: 'Momentan nu exista date...';
color: #a0aec0;
}
rezultat vizual
Container gol detectat automat de browser folosind :empty
:nth-of-type() și :first-of-type()
Filtrul precis după tipul etichetei HTML
Spre deosebire de :nth-child() care numără indiferent de tipul de tag,
:nth-of-type() ignoră alte etichete HTML vecine și filtrează doar elementele de același tip.
Acest lucru garantează stilizarea exactă a paragrafelor sau imaginilor dintr-un articol mixt.
cod CSS3
/* Stilizeaza doar al doilea paragraf din articol */
p:nth-of-type(2) {
background: #efe7d6;
padding: 8px;
}
/* Primul titlu H2 de un anumit tip */
h2:first-of-type {
margin-top: 0;
}
rezultat vizual
Primul paragraf din
document (:first-of-type)
Al doilea paragraf
(:nth-of-type(2) cu fundal evidențiat)
:user-invalid și :user-valid
Validarea prietenoasă a formularelor web
În loc să deranjeze utilizatorul cu mesaje roșii de eroare înainte ca acesta să apuce să tasteze (cum face
vechiul selector :invalid), pseudo-clasa :user-invalid se activează numai DUPĂ ce
utilizatorul a completat câmpul și a mutat cursorul în altă parte (blur / ieșire din câmp), adică la
finalizarea interacțiunii.
cod CSS3
/* Arata erori doar dupa ce utilizatorul a terminat de tastat */
input:user-invalid {
border-color: #d6472e;
background-color: #fff5f5;
}
input:user-valid {
border-color: #38a169;
}
rezultat vizual
După ce părăsești câmpul (blur), adresa validă devine verde, iar cea invalidă devine roșie.
:placeholder-shown
Stilizarea câmpurilor goale în formulare
Selectorul :placeholder-shown permite personalizarea unui câmp atunci când valoarea sa este goală, de ex. pentru a evidenția câmpul în curs de completare.
Selectorul :enabled este util pentru a restabili starea de bază a unui element activ după ce a fost dezactivat, de exemplu pentru reacționarea dinamică a formularelor.
:nth-last-child() numără elementele în ordine inversă, ideal pentru stilizarea ultimului element din grup fără a rescrie markup-ul sau a folosi clase de ajutor.
Selectorul :not() te ajută să aplici reguli generale și să excludi anumite cazuri, fără a adăuga clase suplimentare la markup. Este foarte popular în navigații și liste de carduri.
cod CSS3
.lista-item:not(.featured) {
opacity: .82;
}
rezultat vizual
NormalFeatured
:has()
Detectarea unui părinte după conținutul copilului
Selectorul :has() vă permite să stilizați un element părinte în funcție de ce conține. Este deosebit de util pentru validări, layout-uri inteligente și meniuri contextuale.
:focus-visible este preferat față de :focus pentru a evidenția doar starea de focalizare reală, în special pentru navigarea cu tastatura. Este esențial pentru accesibilitate și pentru UX web modern.
Selectorul :target-within permite stilizarea unui container părinte când unul dintre copiii săi este elementul activ din URL. Este o metodă elegantă pentru meniuri, filtre și secțiuni de acordare.
Selectorul :lang() te ajută să diferențiezi stilurile pentru limbi diferite, fără a schimba structura HTML. Este util în site-uri internaționale și bloguri multi-limbă.
Selectorul :dir() te ajută să stilizezi conținutul în funcție de direcția de citire a elementului, de la stânga la dreapta sau de la dreapta la stânga.
Validarea rapidă a numerelor și valorilor de interval
Selectorii :in-range și :out-of-range sunt perfecte pentru input-uri de tip number sau range, atunci când vrei să arăți vizual dacă o valoare respectă intervalul definit.
Trăsăturile :required și :optional te ajută să distingui formele obligatorii ale unei aplicații și să îți creezi feedback vizual clar pentru formulare.