Specificity dan Cascade
Selesai membaca dokumentasi ini?
Kembali ke rujukan utama CSS untuk melanjutkan topik lainnya.
Kembali ke rujukan utama CSS untuk melanjutkan topik lainnya.
Cascade adalah mekanisme browser untuk menentukan deklarasi CSS mana yang akhirnya dipakai ketika beberapa aturan menargetkan elemen yang sama.
Specificity adalah bobot prioritas selector. Semakin spesifik selector, semakin besar peluang deklarasinya menang saat ada konflik.
Keduanya bekerja bersama. Cascade memilih sumber aturan yang paling layak dibandingkan aturan lain, lalu specificity dipakai untuk memecahkan konflik di level selector.
Banyak bug CSS bukan karena properti salah, tetapi karena aturan yang benar kalah prioritas. Gejalanya biasanya seperti ini:
!importantKalau mekanisme ini dipahami, debugging CSS menjadi jauh lebih cepat. Kamu tidak lagi menebak-nebak selector mana yang menang, tetapi bisa menghitungnya.
Saat beberapa deklarasi bersaing, browser biasanya mengevaluasi prioritas dalam urutan berikut:
!importantPada praktik modern, urutan ini bisa dipengaruhi juga oleh @layer. Tetapi untuk kasus sehari-hari, tiga hal yang paling sering menentukan adalah:
!importantSpecificity biasanya dirangkum sebagai tiga angka:
inline styles, id, class/attribute/pseudo-class, element/pseudo-elementContoh perbandingan:
#header .nav a lebih kuat daripada .nav a.card .title lebih kuat daripada .titlebutton lebih lemah daripada .buttonAturan umum yang berguna:
id sangat kuat#app .card .title {
color: blue;
}
.card .title {
color: red;
}Selector pertama menang karena memiliki id.
Jika dipecah:
#app .card .title → 0,1,2,0.card .title → 0,0,2,0Walaupun jumlah class sama, adanya id membuat selector pertama lebih kuat.
Cascade bukan hanya "siapa yang paling spesifik". Browser juga mempertimbangkan sumber deklarasi dan urutan kemunculan.
Artinya, dua selector yang sama kuat tetap bisa menghasilkan hasil berbeda tergantung mana yang ditulis terakhir.
.button {
background: blue;
}
.button {
background: green;
}Hasil akhirnya adalah green, karena selector sama kuat dan deklarasi terakhir menang.
Diagram ini menyederhanakan proses browser. Detail implementasi bisa lebih panjang, tetapi alurnya tetap sama: browser menyaring prioritas, lalu membandingkan bobot selector, lalu memakai urutan terakhir sebagai penentu akhir.
p {
color: gray;
}
.article p {
color: black;
}Di halaman biasa, paragraf di dalam .article akan mengikuti aturan kedua karena selector-nya lebih spesifik.
.text-red {
color: red;
}
.card .content .text-red {
color: blue;
}Walaupun utility class terlihat "cukup jelas", selector kedua menang karena specificity-nya lebih tinggi.
!important dipakai sebagai jalan pintas.alert {
color: red !important;
}!important memang memaksa prioritas naik, tetapi sering membuat CSS sulit dirawat. Kalau dipakai terus-menerus, override berikutnya menjadi makin mahal.
Specificity sebaiknya dipakai sebagai alat desain struktur CSS, bukan sekadar trik menang konflik.
Pola yang lebih sehat biasanya seperti ini:
!important hanya untuk kasus yang benar-benar terisolasi@layer, kelompokkan aturan berdasarkan peran, bukan berdasarkan kebiasaan menumpuk fileDengan cara ini, prioritas CSS menjadi mudah ditebak. Developer baru tidak perlu menelusuri selector berlapis-lapis hanya untuk mengganti warna tombol.
Gunakan class sebagai basis utama:
.button {
padding: 0.75rem 1rem;
border-radius: 0.5rem;
}Selector seperti ini mudah dioverride tanpa perang specificity.
Kalau ingin variasi komponen, tambahkan modifier class:
.button--primary {
background: royalblue;
color: white;
}Ini lebih aman daripada menulis selector yang bergantung pada struktur DOM yang dalam.
/* kurang ideal */
.sidebar .menu li a span {
font-weight: 600;
}Selector panjang membuat override sulit dan rapuh terhadap perubahan HTML.
Kalau dua aturan memang setara, taruh aturan yang ingin menang di bawah.
!important untuk menutupi struktur CSS yang tidak rapi.@layer, lalu bingung kenapa library CSS terasa "lebih kuat" atau "lebih lemah" dari yang diperkirakan.@layer.!important: penanda untuk menaikkan prioritas deklarasi.