Saya tidak bisa meramalkan !important
kinerja yang menghambat, tidak secara inheren. Namun, jika CSS Anda penuh teka-teki !important
, itu menunjukkan bahwa Anda telah memilih penyeleksi yang berlebihan dan terlalu spesifik dan Anda kehabisan orang tua, atau kualifikasi untuk menambah kekhususan. Akibatnya, CSS Anda akan menjadi kembung (yang akan menghambat kinerja) dan sulit untuk dipertahankan.
Jika Anda ingin menulis CSS efisien maka Anda ingin menjadi hanya sespesifik Anda perlu dan menulis CSS modular . Dianjurkan untuk menahan diri dari menggunakan ID (dengan hash), selektor rantai, atau penyeleksi yang memenuhi syarat.
ID yang diawali dengan #
dalam CSS sangat spesifik, ke titik di mana 255 kelas tidak akan mengesampingkan id (mengutak-atik: @Faust ). Namun, ID memiliki masalah perutean yang lebih dalam, mereka harus unik, ini berarti Anda tidak dapat menggunakannya kembali untuk gaya duplikat, sehingga Anda akhirnya menulis css linear dengan gaya berulang. Dampak dari melakukan ini akan bervariasi dari proyek ke proyek, tergantung pada skala, tetapi pemeliharaan akan sangat menderita dan dalam kasus-kasus tepi, kinerja juga.
Bagaimana Anda dapat menambahkan spesifisitas tanpa !important
, rantai, kualifikasi, atau ID (yaitu #
)
HTML
<div class="eg1-foo">
<p class="eg1-bar">foobar</p>
</div>
<div id="eg2-foo">
<p id="eg2-bar">foobar</p>
</div>
<div class="eg3-foo">
<p class="eg3-foo">foobar</p>
</div>
CSS
.eg1-foo {
color: blue;
}
.eg1-bar {
color: red;
}
[id='eg2-foo'] {
color: blue;
}
[id='eg2-bar'] {
color: red;
}
.eg3-foo {
color: blue;
}
.eg3-foo.eg3-foo {
color: red;
}
JSFiddle
Oke, jadi bagaimana cara kerjanya?
Contoh pertama dan kedua bekerja sama, yang pertama secara harfiah kelas, dan yang kedua adalah pemilih atribut. Penyeleksi Kelas dan Atribut memiliki spesifisitas yang identik. .eg1/2-bar
tidak mewarisi warnanya .eg1/2-foo
karena memiliki aturannya sendiri.
Contoh ketiga terlihat seperti penyeleksi kualifikasi atau rantai, tetapi tidak. Rantai adalah saat Anda mengawali penyeleksi dengan orang tua, leluhur, dan sebagainya; ini menambah kekhususan. Kualifikasi serupa, tetapi Anda menentukan elemen yang diterapkan pemilih. kualifikasi: ul.class
dan rantai:ul .class
Saya tidak yakin apa yang Anda sebut teknik ini, tetapi perilaku disengaja dan didokumentasikan oleh W3C
Kejadian berulang dari pemilih sederhana yang sama diperbolehkan dan meningkatkan spesifisitas.
Apa yang terjadi ketika kekhususan antara dua aturan itu identik?
Seperti yang ditunjukkan oleh @BoltClock , Jika ada beberapa deklarasi penting, maka spek menentukan bahwa yang paling spesifik harus diutamakan.
Dalam contoh di bawah ini, keduanya .foo
dan .bar
memiliki spesifisitas yang identik, sehingga perilaku mundur ke sifat cascading CSS, di mana aturan terakhir yang dinyatakan dalam klaim CSS diutamakan yaitu .foo
.
HTML
<div>
<p class="foo bar">foobar</p>
</div>
CSS
.bar {
color: blue !important;
}
.foo {
color: red !important;
}
JSFiddle