Menu

CSS Selector: Jenis, Combinator dan Attribute Selector

Selector CSS memilih elemen yang diberi style oleh sebuah aturan. Pelajari semua jenis selector, empat combinator (descendant, child, adjacent sibling, general sibling), attribute selector, pengelompokan, dan uji selector secara langsung.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

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

SelectorContohCocok dengan
Universal*Setiap elemen
TypepSetiap <p>
Class.tipElemen dengan class="tip" (di antara class lainnya)
ID#main-titleElemen dengan id="main-title"
Attribute[type="email"]Elemen yang atributnya cocok
Pseudo-classa:hover, li:first-childElemen dalam state atau posisi tertentu
Pseudo-elementp::first-line, .x::beforeBagian dari sebuah elemen
Gruph1, h2, h3Apa pun yang cocok dengan salah satu dari daftar
Gabunganp.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.

CombinatorSintaksCocok dengan B saat
DescendantA B (spasi)B berada di mana saja di dalam A
ChildA > BInduk B adalah A
Adjacent siblingA + BB muncul tepat setelah A, dengan induk yang sama
General siblingA ~ BB 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:

SelectorCocok 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>, bukan class="tip". Tulis .tip.
  • Spasi di selector gabungan. p .note tidak sama dengan p.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 a lambat 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.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai