Tôi không thể thấy trước !important
hiệu suất cản trở, dù sao thì không. Tuy nhiên, nếu CSS của bạn bị đánh đố !important
, điều đó cho thấy rằng bạn đã vượt quá các bộ chọn đủ điều kiện và quá cụ thể và bạn đã hết cha mẹ hoặc vòng loại để thêm tính cụ thể. Do đó, CSS của bạn sẽ trở nên cồng kềnh ( sẽ cản trở hiệu suất) và khó duy trì.
Nếu bạn muốn viết CSS hiệu quả thì bạn muốn chỉ cụ thể như bạn cần và viết CSS mô-đun . Bạn không nên sử dụng ID (có băm), bộ chọn chuỗi hoặc bộ chọn đủ điều kiện.
Các ID có tiền tố #
trong CSS rất đặc biệt, đến mức 255 lớp sẽ không ghi đè lên một id (fiddle by: @Faust ). ID cũng có một vấn đề được định tuyến sâu hơn, chúng phải là duy nhất, điều này có nghĩa là bạn không thể sử dụng lại chúng cho các kiểu trùng lặp, vì vậy cuối cùng bạn sẽ viết css tuyến tính với các kiểu lặp lại. Tác động của việc làm này sẽ thay đổi dự án theo dự án, tùy thuộc vào quy mô, nhưng khả năng bảo trì sẽ bị ảnh hưởng rất lớn và trong các trường hợp cạnh, hiệu suất cũng vậy.
Làm thế nào bạn có thể thêm tính đặc hiệu mà không cần !important
, xâu chuỗi, đủ điều kiện hoặc ID (cụ thể #
)
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
Được rồi, vậy làm thế nào để làm việc?
Các ví dụ thứ nhất và thứ hai hoạt động như nhau, đầu tiên là một lớp và thứ hai là bộ chọn thuộc tính. Các lớp và bộ chọn thuộc tính có tính đặc hiệu giống hệt nhau. .eg1/2-bar
không kế thừa màu sắc của .eg1/2-foo
nó bởi vì nó có quy tắc riêng của nó.
Ví dụ thứ ba trông giống như bộ chọn vòng loại hoặc chuỗi, nhưng không phải vậy. Xâu chuỗi là khi bạn chọn tiền tố với cha mẹ, tổ tiên, v.v. điều này thêm tính đặc hiệu. Đủ tiêu chuẩn là tương tự, nhưng bạn xác định thành phần mà bộ chọn đang áp dụng. đủ điều kiện: ul.class
và chuỗi:ul .class
Tôi không chắc bạn gọi kỹ thuật này là gì, nhưng hành vi này là có chủ ý và được W3C ghi lại
Sự xuất hiện lặp đi lặp lại của cùng một bộ chọn đơn giản được cho phép và làm tăng tính đặc hiệu.
Điều gì xảy ra khi tính đặc hiệu giữa hai quy tắc là giống hệt nhau?
Như @BoltClock đã chỉ ra , Nếu có nhiều tuyên bố quan trọng thì hãy xác định rằng điều cụ thể nhất sẽ được ưu tiên.
Trong ví dụ dưới đây, cả hai .foo
và .bar
đều có tính đặc hiệu giống hệt nhau, do đó, hành vi rơi vào bản chất xếp tầng của CSS, theo đó quy tắc cuối cùng được khai báo trong CSS yêu cầu quyền ưu tiên tức là .foo
.
HTML
<div>
<p class="foo bar">foobar</p>
</div>
CSS
.bar {
color: blue !important;
}
.foo {
color: red !important;
}
JSFiddle