Apa itu selector CSS
Selector adalah bagian dari sebuah aturan sebelum kurung kurawal. Selector menentukan elemen mana yang dikenai deklarasinya.
p.note { color: #2563eb; }
/* selector: p.note declaration: color: #2563eb */
Lima selector dasar ini sudah mencakup sebagian besar stylesheet sungguhan:
Jenis selector secara ringkas
| Selector | Contoh | Cocok dengan |
|---|---|---|
| Universal | * | Setiap elemen |
| Type | p | Setiap <p> |
| Class | .tip | Elemen dengan class="tip" (di antara class lainnya) |
| ID | #main-title | Elemen dengan id="main-title" |
| Attribute | [type="email"] | Elemen yang atributnya cocok |
| Pseudo-class | a:hover, li:first-child | Elemen dalam state atau posisi tertentu |
| Pseudo-element | p::first-line, .x::before | Bagian dari sebuah elemen |
| Grup | h1, h2, h3 | Apa pun yang cocok dengan salah satu dari daftar |
| Gabungan | p.tip | <p> yang juga punya class itu |
Class dan ID punya halamannya sendiri, CSS class selector. Pseudo-class seperti :nth-child() dan :not() dibahas di halaman pseudo-class.
Combinator: descendant vs child
Combinator menggabungkan dua selector berdasarkan hubungannya di pohon HTML. Ada empat jenis.
| Combinator | Sintaks | Cocok dengan B saat |
|---|---|---|
| Descendant | A B (spasi) | B berada di mana saja di dalam A |
| Child | A > B | Induk B adalah A |
| Adjacent sibling | A + B | B muncul tepat setelah A, dengan induk yang sama |
| General sibling | A ~ B | B muncul di mana saja setelah A, dengan induk yang sama |
Spasi dan > adalah pasangan yang sering tertukar. Descendant selector menjangkau kedalaman berapa pun, sedangkan child selector berhenti di satu tingkat:
Sibling combinator: + dan ~
Combinator sibling hanya melihat ke depan. Tidak ada combinator "saudara sebelumnya", tetapi :has() bisa menyatakannya: h2:has(+ p) cocok dengan h2 yang langsung diikuti oleh p.
Attribute selector
Kurung siku mencocokkan atribut dan nilainya:
| Selector | Cocok dengan |
|---|---|
[disabled] | Punya atribut itu, nilai apa pun |
[type="email"] | Nilainya persis email |
[href^="https"] | Nilainya diawali https |
[href$=".pdf"] | Nilainya diakhiri .pdf |
[class*="icon"] | Nilainya mengandung icon di mana saja |
[lang|="en"] | Nilainya en atau diawali en- |
[data-state="open" i] | Cocok persis, tanpa memedulikan huruf besar kecil |
Attribute selector pada atribut data-* adalah cara yang rapi untuk memberi style pada state yang diatur JavaScript, tanpa perlu membuat nama class baru.
Coba selector apa saja
Ketik sebuah selector di kotak. Setiap elemen yang cocok mendapat outline kuning, dan jumlahnya ditampilkan di bawah.
Coba #demo a, ul > li, h2 ~ *, a[href^="https"], li:not(.active).
Gabungan vs descendant: spasinya berpengaruh
p.note dan p .note hanya berbeda satu spasi, tetapi artinya berbeda.
Cara browser membaca selector
Saat beberapa aturan cocok dengan elemen yang sama dan mengatur property yang sama, selector yang lebih spesifik yang menang, dan kalau sama kuat, yang ditulis belakangan yang menang. ID mengalahkan class berapa pun jumlahnya, dan class mengalahkan type selector berapa pun jumlahnya. Halaman !important punya tabel specificity lengkapnya.
Grup punya satu jebakan: kalau ada satu selector yang tidak valid di daftar biasa, seluruh aturannya dibuang. Di a, b:unknown { }, bahkan link-nya pun tidak diberi style. Membungkus daftar itu dengan :is() membuatnya lebih toleran, jadi :is(a, b:unknown) tetap memberi style pada link.
Kesalahan yang sering terjadi
- Lupa titik atau tanda pagar.
tip { }menyasar elemen<tip>, bukanclass="tip". Tulis.tip. - Spasi di selector gabungan.
p .notetidak sama denganp.note. - Mengira
>menjangkau cucu. Pakai spasi untuk kedalaman berapa pun. - Satu salah ketik merusak seluruh grup. Di
h1, h2:hovr, h3, tidak ada yang diberi style. - Selector yang terlalu panjang.
body div.wrapper ul li alambat dibaca dan sulit ditimpa. Satu class biasanya sudah cukup.
Pertanyaan yang sering diajukan
Apa itu selector CSS?
Bagian dari aturan CSS sebelum { yang menentukan elemen mana yang dikenai deklarasinya. Di p.note { color: blue; }, selector p.note cocok dengan setiap <p> yang punya class note.
Apa perbedaan spasi dan > di selector CSS?
Spasi adalah descendant combinator: nav a cocok dengan setiap link di mana saja di dalam nav, di kedalaman berapa pun. > adalah child combinator: nav > a hanya cocok dengan link yang induk langsungnya adalah nav.
Apa arti + di CSS?
+ adalah adjacent sibling combinator. h2 + p cocok dengan <p> yang muncul tepat setelah <h2> dengan induk yang sama. ~ lebih longgar: h2 ~ p cocok dengan setiap saudara <p> yang muncul setelahnya.
Bagaimana cara memilih elemen berdasarkan atribut di CSS?
Tulis atributnya di dalam kurung siku: [disabled] cocok dengan elemen yang punya atribut itu, [type="email"] cocok dengan nilai yang persis sama, [href^="https"] dengan nilai yang diawali sebuah string, [href$=".pdf"] dengan nilai yang diakhiri string itu, dan [class*="btn"] dengan nilai yang mengandungnya.
Apakah CSS bisa memilih elemen induk?
Bisa, dengan pseudo-class :has(), yang didukung di Chrome, Firefox, dan Safari versi terbaru. li:has(> a.active) cocok dengan item list yang secara langsung berisi link aktif.