Memahami Selector Lanjutan dan Spesifisitas CSS

Setelah kamu belajar dasar-dasar styling di CSS seperti selector element
, .class
, dan #id
, sekarang saatnya naik level! Di artikel ini, kita akan bahas selector lanjutan yang bisa bikin styling kamu lebih fleksibel dan powerful. Plus, kamu juga akan kenalan sama konsep spesifisitas CSS, biar nggak bingung lagi kalau style “nggak jalan”.
1. Selector Lanjutan di CSS
Kombinasi Selector
CSS memungkinkan kita menggabungkan beberapa selector untuk menargetkan elemen dengan lebih spesifik:
- Descendant selector (
A B
)
Menargetkan elemenB
di dalamA
.
.card p {
color: gray;
}
- Child selector (
A > B
)
MenargetkanB
yang langsung anak dariA
.
ul > li {
list-style-type: square;
}
- Adjacent sibling (
A + B
)
MenargetkanB
yang langsung setelahA
.
h1 + p {
margin-top: 0;
}
- General sibling (
A ~ B
)
Menargetkan semuaB
yang bersaudara denganA
.
h2 ~ p {
color: green;
}
Attribute Selector
Selector ini menargetkan elemen berdasarkan atributnya:
input[type="text"] {
border: 1px solid #ccc;
}
a[href^="https"] {
color: green;
}
Keterangan:
[attr="value"]
→ exact match[attr^="val"]
→ mulai dengan[attr*="val"]
→ mengandung
Pseudo-class
Selector ini berguna untuk menargetkan state tertentu:
a:hover {
text-decoration: underline;
}
input:focus {
outline: 2px solid blue;
}
li:nth-child(odd) {
background: #f9f9f9;
}
Contoh lainnya: :first-child
, :last-child
, :not()
, dll.
Pseudo-element
Digunakan untuk styling bagian tertentu dari elemen:
p::first-line {
font-weight: bold;
}
.card::before {
content: "👉 ";
color: orange;
}
2. Spesifisitas CSS: Siapa yang Menang?
Kalau kamu punya beberapa rule yang menargetkan elemen yang sama, spesifisitas akan menentukan siapa yang menang.
Bayangkan nilai spesifisitas seperti skor dengan format a,b,c,d
:
a
= inline style (1000)b
= jumlah ID selector (100)c
= jumlah class, pseudo-class, attribute selector (10)d
= jumlah element, pseudo-element (1)
Contoh:
p { color: blue; } /* 0,0,0,1 */
.highlight p { color: red; } /* 0,0,1,1 */
#main .highlight p { color: green; }/* 0,1,1,1 */
Yang menang: hijau, karena punya skor spesifisitas tertinggi.
Inline style:
<p style="color: orange;">Teks</p>
Akan selalu menang, kecuali ada !important
yang override.
3. !important
: Senjata Pamungkas (Tapi Hati-Hati)
p {
color: blue !important;
}
!important
akan mengabaikan spesifisitas dan selalu menang. Tapi jangan sering dipakai! Kalau semuanya penting, sama saja tidak ada yang penting.
Gunakan hanya saat benar-benar perlu, misalnya untuk override style dari library eksternal.
Tips & Best Practice
- Gunakan class untuk styling. Hindari terlalu bergantung pada ID.
- Hindari selector yang terlalu spesifik seperti:
html body div.container .box > h2.title { ... }
- Buat struktur CSS yang mudah diatur dan di-override.
- Gunakan
:not()
untuk efisiensi:
button:not(.primary) {
background: transparent;
}