Selectorii sunt „adresele" prin care CSS-ul identifică elementele HTML pe care le stilizează. Stăpânirea selectorilor vă permite să vizați orice element fără a adăuga clase suplimentare în HTML.
Capitol gratuit
Selectori CSS - de la simpli la complecși
Selectorii sunt „adresele" prin care CSS-ul identifică elementele HTML pe care le stilizează. Stăpânirea selectorilor vă permite să vizați orice element fă...
Introducere
Selectori de bază
/* Selector de element (tag) */
p { color: white; }
/* Selector de clasă - cel mai folosit */
.card { border-radius: 8px; }
/* Selector de ID - specificitate mare, evitați pentru stilizare */
#header { background: #1b2028; }
/* Selector universal - toate elementele */
* { box-sizing: border-box; }
/* Selector de atribut */
input[type="email"] { border: 1px solid #ccac65; }
a[href^="https"] { color: #01ce4c; } /* începe cu */
a[href$=".pdf"] { color: #e74c3c; } /* se termină cu */
a[href*="goai"] { font-weight: bold; } /* conține */Combinatori
Combinatorii definesc relația între selectori:
/* Descendent (spațiu) - ORICE descendent */
.card p { margin-bottom: 12px; }
/* Copil direct (>) - doar copii direcți */
.nav > li { display: inline-block; }
/* Frate adiacent (+) - elementul imediat următor */
h2 + p { font-size: 1.1rem; }
/* Frați generali (~) - toți frații următori */
h2 ~ p { color: #8a8f98; }
Exemplu practic - diferența între combinatori
<div class="container">
<p>Paragraf direct (copil)</p>
<div>
<p>Paragraf nested (descendent, nu copil)</p>
</div>
</div>
/* Selectează AMBELE paragrafe */
.container p { color: gold; }
/* Selectează DOAR primul paragraf */
.container > p { color: green; }
Gruparea selectorilor
/* Fără grupare - cod repetitiv */
h1 { color: #ccac65; font-weight: 700; }
h2 { color: #ccac65; font-weight: 700; }
h3 { color: #ccac65; font-weight: 700; }
/* Cu grupare - cod curat */
h1, h2, h3 {
color: #ccac65;
font-weight: 700;
}
/* Selectorul :is() - grupare modernă */
:is(h1, h2, h3) {
color: #ccac65;
font-weight: 700;
}Selectori moderni
| Selector | Descriere | Exemplu |
|---|---|---|
:is() |
Grupare cu specificitate normală | :is(h1, h2, h3) { color: gold; } |
:where() |
Grupare cu specificitate 0 (ușor de suprascris) | :where(.card, .box) { padding: 16px; } |
:not() |
Negație - tot ce NU se potrivește | p:not(.intro) { font-size: 1rem; } |
:has() |
Selectorul părinte (CSS 2023+) | .card:has(img) { padding: 0; } |
Selectorul :has() - revoluționar
:has() este primul „selector de părinte" din CSS - selectează un element bazat pe copiii sau conținutul său:
/* Cardul care CONȚINE o imagine - elimină padding-ul de sus */
.card:has(img) {
padding-top: 0;
}
/* Formularul care CONȚINE un input invalid - border roșu */
form:has(:invalid) {
border: 2px solid #e74c3c;
}
/* Secțiunea care CONȚINE un h2 - margine mai mare */
section:has(> h2) {
margin-top: 64px;
}
/* Body care conține un modal deschis - previne scroll */
body:has(.modal.open) {
overflow: hidden;
}
🎯 Suport browser:
:has() este suportat în Chrome 105+, Safari 15.4+, Firefox 121+. Poate fi folosit în producție din 2024 pentru majoritatea proiectelor.
Nesting CSS nativ
CSS Nesting (2023+) permite scrierea selectorilor nested direct în CSS, fără preprocessor:
/* CSS Nesting nativ */
.card {
background: #242b35;
border-radius: 8px;
padding: 24px;
& h2 {
color: #ccac65;
margin-bottom: 12px;
}
& p {
color: #f0f0f0;
line-height: 1.7;
}
&:hover {
transform: translateY(-2px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
}
&.featured {
border: 2px solid #ccac65;
}
}
💡 Sfat: Nu imbricați (nest) mai mult de 3 niveluri adâncime. Nesting-ul excesiv creează selectori cu specificitate mare și cod greu de înțeles. Păstrați-l simplu și plat.
Continuați cu restul cursului
Acesta este capitolul 2 din cele 20 ale cursului, cu 6 lecții din 110. Cumpărați cursul și parcurgeți tot conținutul în cont, cu progres salvat, test final și certificat.
Cumpărați cursul la 70 €