Hướng dẫn what has the highest specificity in css? - cái gì có tính đặc hiệu cao nhất trong css?

Tính đặc hiệu là thuật toán được sử dụng bởi các trình duyệt để xác định khai báo CSS có liên quan nhất đến một phần tử, từ đó, xác định giá trị thuộc tính để áp dụng cho phần tử. Thuật toán tính đặc hiệu tính toán trọng lượng của bộ chọn CSS để xác định quy tắc nào từ các khai báo CSS cạnh tranh được áp dụng cho một phần tử. is the algorithm used by browsers to determine the CSS declaration that is the most relevant to an element, which in turn, determines the property value to apply to the element. The specificity algorithm calculates the weight of a CSS selector to determine which rule from competing CSS declarations gets applied to an element.

Lưu ý: Trình duyệt xem xét tính đặc hiệu sau khi xác định nguồn gốc và tầm quan trọng của Cascade. Nói cách khác, đối với các khai báo tài sản cạnh tranh, tính đặc hiệu có liên quan và chỉ được so sánh giữa các bộ chọn từ một dòng thác và lớp có ưu tiên cho tài sản. Thứ tự xuất hiện trở nên có liên quan khi tính đặc hiệu của bộ chọn của các khai báo cạnh tranh trong lớp Cascade với ưu tiên là bằng nhau. Browsers consider specificity after determining cascade origin and importance. In other words, for competing property declarations, specificity is relevant and compared only between selectors from the one cascade origin and layer that has precedence for the property. Order of appearance becomes relevant when the selector specificities of the competing declarations in the cascade layer with precedence are equal.

Tính đặc hiệu được tính toán như thế nào?

Tính đặc hiệu là một thuật toán tính toán trọng lượng được áp dụng cho khai báo CSS nhất định. Trọng lượng được xác định bởi số lượng bộ chọn của từng loại trọng lượng trong bộ chọn khớp với phần tử (hoặc yếu tố giả). Nếu có hai hoặc nhiều khai báo cung cấp các giá trị thuộc tính khác nhau cho cùng một phần tử, giá trị khai báo trong khối kiểu có bộ chọn phù hợp với trọng số thuật toán lớn nhất được áp dụng.

Thuật toán đặc hiệu về cơ bản là giá trị ba cột của ba loại hoặc trọng số - ID, lớp và loại - tương ứng với ba loại bộ chọn. Giá trị đại diện cho số lượng của các thành phần chọn trong mỗi loại trọng lượng và được viết là ID - loại - loại. Ba cột được tạo bằng cách đếm số lượng thành phần chọn cho mỗi loại trọng số chọn trong các bộ chọn khớp với phần tử.

Thể loại trọng lượng chọn

Các loại trọng số chọn được liệt kê ở đây theo thứ tự giảm độ đặc hiệu:

Cột ID

Chỉ bao gồm các bộ chọn ID, chẳng hạn như

#myElement {
  color: green; /* 1-0-0  - WINS!! */
}
.bodyClass .sectionClass .parentClass [id="myElement"] {
  color: yellow; /* 0-4-0 */
}
6. Đối với mỗi ID trong một bộ chọn phù hợp, thêm 1-0-0 vào giá trị trọng lượng.

Cột lớp

Bao gồm các bộ chọn lớp, chẳng hạn như

#myElement {
  color: green; /* 1-0-0  - WINS!! */
}
.bodyClass .sectionClass .parentClass [id="myElement"] {
  color: yellow; /* 0-4-0 */
}
7, các bộ chọn thuộc tính như
#myElement {
  color: green; /* 1-0-0  - WINS!! */
}
.bodyClass .sectionClass .parentClass [id="myElement"] {
  color: yellow; /* 0-4-0 */
}
8 và
#myElement {
  color: green; /* 1-0-0  - WINS!! */
}
.bodyClass .sectionClass .parentClass [id="myElement"] {
  color: yellow; /* 0-4-0 */
}
9, và các lớp giả, chẳng hạn như
#myElement {
  color: yellow; /* 1-0-0 */
}
#myApp [id="myElement"] {
  color: green; /* 1-1-0  - WINS!! */
}
0,
#myElement {
  color: yellow; /* 1-0-0 */
}
#myApp [id="myElement"] {
  color: green; /* 1-1-0  - WINS!! */
}
1 và
#myElement {
  color: yellow; /* 1-0-0 */
}
#myApp [id="myElement"] {
  color: green; /* 1-1-0  - WINS!! */
}
2. Đối với mỗi lớp, bộ chọn thuộc tính hoặc lớp giả trong bộ chọn phù hợp, thêm 0-1-0 vào giá trị trọng lượng.

Loại cột

Bao gồm các bộ chọn loại, chẳng hạn như

#myElement {
  color: yellow; /* 1-0-0 */
}
#myApp [id="myElement"] {
  color: green; /* 1-1-0  - WINS!! */
}
3,
#myElement {
  color: yellow; /* 1-0-0 */
}
#myApp [id="myElement"] {
  color: green; /* 1-1-0  - WINS!! */
}
4 và
#myElement {
  color: yellow; /* 1-0-0 */
}
#myApp [id="myElement"] {
  color: green; /* 1-1-0  - WINS!! */
}
5 và các yếu tố giả như
#myElement {
  color: yellow; /* 1-0-0 */
}
#myApp [id="myElement"] {
  color: green; /* 1-1-0  - WINS!! */
}
6,
#myElement {
  color: yellow; /* 1-0-0 */
}
#myApp [id="myElement"] {
  color: green; /* 1-1-0  - WINS!! */
}
7 và tất cả các bộ chọn khác có ký hiệu đại hội hai. Đối với mỗi loại hoặc yếu tố giả trong bộ chọn phù hợp, thêm 0-0-1 vào giá trị trọng lượng.

Không có giá trị

Bộ chọn phổ quát (

#myElement {
  color: yellow; /* 1-0-0 */
}
#myApp [id="myElement"] {
  color: green; /* 1-1-0  - WINS!! */
}
8) và lớp giả
#myElement {
  color: yellow; /* 1-0-0 */
}
#myApp [id="myElement"] {
  color: green; /* 1-1-0  - WINS!! */
}
9 và các tham số của nó không được tính khi tính trọng số để giá trị của chúng là 0-0-0, nhưng chúng phù hợp với các phần tử. Các bộ chọn này không ảnh hưởng đến giá trị trọng lượng đặc hiệu.

Các bộ kết hợp, chẳng hạn như

:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
0,
:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
1,
:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
2, "" và
:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
3, có thể làm cho bộ chọn cụ thể hơn trong những gì được chọn nhưng chúng không thêm bất kỳ giá trị nào vào trọng lượng đặc hiệu.

Tiêu cực giả lớp,

:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
4, bản thân nó không có trọng lượng. Không phải là các lớp giả
:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
5 hoặc
:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
6. Các tham số trong các bộ chọn này, tuy nhiên, làm. Các giá trị của cả hai đến từ tham số trong danh sách các tham số có độ đặc hiệu cao nhất. Các ngoại lệ
:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
4,
:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
5 và
:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
6 được thảo luận dưới đây.

Bộ chọn phù hợp

Trọng lượng đặc hiệu đến từ bộ chọn phù hợp. Lấy bộ chọn CSS này với ba bộ chọn phân tách bằng dấu phẩy làm ví dụ:

[type="password"],
input:focus,
:root #myApp input:required {
  color: blue;
}

Bộ chọn

input.myClass {
  color: yellow; /* 0-1-1 */
}
:root input {
  color: green; /* 0-1-1 WINS because it comes later */
}
0 trong danh sách chọn ở trên, với trọng số đặc hiệu là
input.myClass {
  color: yellow; /* 0-1-1 */
}
:root input {
  color: green; /* 0-1-1 WINS because it comes later */
}
1, áp dụng khai báo
input.myClass {
  color: yellow; /* 0-1-1 */
}
:root input {
  color: green; /* 0-1-1 WINS because it comes later */
}
2 cho tất cả các loại đầu vào mật khẩu.

Tất cả các đầu vào, bất kể loại, khi nhận được tiêu điểm, khớp với bộ chọn thứ hai trong danh sách,

input.myClass {
  color: yellow; /* 0-1-1 */
}
:root input {
  color: green; /* 0-1-1 WINS because it comes later */
}
3, với trọng số đặc hiệu là
input.myClass {
  color: yellow; /* 0-1-1 */
}
:root input {
  color: green; /* 0-1-1 WINS because it comes later */
}
4; Trọng lượng này được tạo thành từ lớp giả pseudo (0-1-0) và loại
input.myClass {
  color: yellow; /* 0-1-1 */
}
:root input {
  color: green; /* 0-1-1 WINS because it comes later */
}
6 (0-0-1). Nếu đầu vào mật khẩu có tiêu điểm, nó sẽ khớp với
input.myClass {
  color: yellow; /* 0-1-1 */
}
:root input {
  color: green; /* 0-1-1 WINS because it comes later */
}
3 và trọng số độ đặc hiệu cho khai báo kiểu
input.myClass {
  color: yellow; /* 0-1-1 */
}
:root input {
  color: green; /* 0-1-1 WINS because it comes later */
}
2 sẽ là
input.myClass {
  color: yellow; /* 0-1-1 */
}
:root input {
  color: green; /* 0-1-1 WINS because it comes later */
}
4. Khi mật khẩu đó không có trọng tâm, trọng lượng độ đặc hiệu vẫn ở mức
input.myClass {
  color: yellow; /* 0-1-1 */
}
:root input {
  color: green; /* 0-1-1 WINS because it comes later */
}
1.

Độ đặc hiệu cho một đầu vào cần thiết được lồng trong một phần tử có thuộc tính

p {
  /* 0-0-1 */
}
:is(p) {
  /* 0-0-1 */
}

h2:nth-last-of-type(n + 2) {
  /* 0-1-1 */
}
h2:has(~ h2) {
  /* 0-0-2 */
}


div.outer p {
  /* 0-1-2 */
}
div:not(.inner) p {
  /* 0-1-2 */
}
1 là
p {
  /* 0-0-1 */
}
:is(p) {
  /* 0-0-1 */
}

h2:nth-last-of-type(n + 2) {
  /* 0-1-1 */
}
h2:has(~ h2) {
  /* 0-0-2 */
}


div.outer p {
  /* 0-1-2 */
}
div:not(.inner) p {
  /* 0-1-2 */
}
2, dựa trên một ID, hai lớp giả và một loại phần tử.

Nếu loại đầu vào mật khẩu được lồng trong một phần tử với

p {
  /* 0-0-1 */
}
:is(p) {
  /* 0-0-1 */
}

h2:nth-last-of-type(n + 2) {
  /* 0-1-1 */
}
h2:has(~ h2) {
  /* 0-0-2 */
}


div.outer p {
  /* 0-1-2 */
}
div:not(.inner) p {
  /* 0-1-2 */
}
1, trọng lượng độ đặc hiệu sẽ là
p {
  /* 0-0-1 */
}
:is(p) {
  /* 0-0-1 */
}

h2:nth-last-of-type(n + 2) {
  /* 0-1-1 */
}
h2:has(~ h2) {
  /* 0-0-2 */
}


div.outer p {
  /* 0-1-2 */
}
div:not(.inner) p {
  /* 0-1-2 */
}
2, cho dù nó có trọng tâm hay không. Tại sao trọng lượng đặc hiệu
p {
  /* 0-0-1 */
}
:is(p) {
  /* 0-0-1 */
}

h2:nth-last-of-type(n + 2) {
  /* 0-1-1 */
}
h2:has(~ h2) {
  /* 0-0-2 */
}


div.outer p {
  /* 0-1-2 */
}
div:not(.inner) p {
  /* 0-1-2 */
}
2 thay vì
input.myClass {
  color: yellow; /* 0-1-1 */
}
:root input {
  color: green; /* 0-1-1 WINS because it comes later */
}
4 hoặc
input.myClass {
  color: yellow; /* 0-1-1 */
}
:root input {
  color: green; /* 0-1-1 WINS because it comes later */
}
1 trong trường hợp này? Bởi vì trọng lượng đặc hiệu đến từ bộ chọn phù hợp với trọng lượng đặc hiệu lớn nhất. Trọng lượng được xác định bằng cách so sánh các giá trị trong ba cột, từ trái sang phải.

[type="password"]             /* 0-1-0 */
input:focus                   /* 0-1-1 */
:root #myApp input:required   /* 1-2-1 */

So sánh ba cột

Khi các giá trị độ đặc hiệu của các bộ chọn có liên quan được xác định, số lượng các thành phần chọn trong mỗi cột được so sánh, từ trái sang phải.

#myElement {
  color: green; /* 1-0-0  - WINS!! */
}
.bodyClass .sectionClass .parentClass [id="myElement"] {
  color: yellow; /* 0-4-0 */
}

Cột đầu tiên là giá trị của thành phần ID, là số lượng ID trong mỗi bộ chọn. Các số trong các cột ID của các bộ chọn cạnh tranh được so sánh. Bộ chọn có giá trị lớn hơn trong cột ID thắng bất kể giá trị nào trong các cột khác. Trong ví dụ trên, mặc dù bộ chọn màu vàng có nhiều thành phần hơn, nhưng chỉ có giá trị của cột đầu tiên quan trọng.

Nếu số trong các cột ID của các bộ chọn cạnh tranh là như nhau, thì cột tiếp theo, lớp, được so sánh, như được hiển thị bên dưới.

#myElement {
  color: yellow; /* 1-0-0 */
}
#myApp [id="myElement"] {
  color: green; /* 1-1-0  - WINS!! */
}

Cột lớp là số lượng của tên lớp, bộ chọn thuộc tính và lớp giả trong bộ chọn. Khi giá trị cột ID giống nhau, bộ chọn có giá trị lớn hơn trong cột lớp sẽ thắng, bất kể giá trị trong cột Loại. Điều này được hiển thị trong ví dụ dưới đây.

:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}

Nếu các số trong các cột lớp và ID trong các bộ chọn cạnh tranh là như nhau, cột loại sẽ có liên quan. Cột loại là số loại phần tử và yếu tố giả trong bộ chọn. Khi hai cột đầu tiên có cùng giá trị, bộ chọn có số lượng lớn hơn trong cột sẽ thắng.

Nếu các bộ chọn cạnh tranh có cùng giá trị trong cả ba cột, thì quy tắc lân cận xuất hiện, trong đó kiểu được khai báo cuối cùng được ưu tiên.

input.myClass {
  color: yellow; /* 0-1-1 */
}
:root input {
  color: green; /* 0-1-1 WINS because it comes later */
}

Các ngoại lệ :root input { color: green; /* 0-1-1 - WINS because CLASS column is greater */ } html body main input { color: yellow; /* 0-0-4 */ } 5, :root input { color: green; /* 0-1-1 - WINS because CLASS column is greater */ } html body main input { color: yellow; /* 0-0-4 */ } 4 và :root input { color: green; /* 0-1-1 - WINS because CLASS column is greater */ } html body main input { color: yellow; /* 0-0-4 */ } 6

Các trận đấu-bất kỳ pseudo-Class

:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
5, lớp giả quan hệ
:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
6 và lớp giả giả
:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
4 không được coi là lớp giả trong tính toán trọng lượng đặc hiệu. Bản thân họ không thêm bất kỳ trọng lượng nào vào phương trình đặc hiệu. Tuy nhiên, các tham số chọn được truyền vào dấu ngoặc đơn giả là một phần của thuật toán đặc hiệu; Trọng lượng của các trận đấu-bất kỳ và phủ định giả nào trong tính toán giá trị đặc hiệu là trọng lượng của trọng lượng của tham số.

p {
  /* 0-0-1 */
}
:is(p) {
  /* 0-0-1 */
}

h2:nth-last-of-type(n + 2) {
  /* 0-1-1 */
}
h2:has(~ h2) {
  /* 0-0-2 */
}


div.outer p {
  /* 0-1-2 */
}
div:not(.inner) p {
  /* 0-1-2 */
}

Lưu ý rằng trong cặp CSS ở trên, trọng số độ đặc hiệu được cung cấp bởi các lớp giả

:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
5,
:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
6 và
:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
4 là giá trị của tham số bộ chọn, không phải của lớp giả.

Tất cả ba trong số các lớp giả này đều chấp nhận danh sách bộ chọn phức, một danh sách các bộ chọn phân tách bằng dấu phẩy, như một tham số. Tính năng này có thể được sử dụng để tăng tính đặc hiệu của bộ chọn:

:is(p, #fakeId) {
  /* 1-0-0 */
}
h2:has(+ h2, > #fakeId) {
  /* 1-0-1 */
}
p:not(#fakeId) {
  /* 1-0-1 */
}
div:not(.inner, #fakeId) p {
  /* 1-0-2 */
}

Trong khối mã CSS trên, chúng tôi đã đưa

:is(p, #fakeId) {
  /* 1-0-0 */
}
h2:has(+ h2, > #fakeId) {
  /* 1-0-1 */
}
p:not(#fakeId) {
  /* 1-0-1 */
}
div:not(.inner, #fakeId) p {
  /* 1-0-2 */
}
7 vào các bộ chọn.
:is(p, #fakeId) {
  /* 1-0-0 */
}
h2:has(+ h2, > #fakeId) {
  /* 1-0-1 */
}
p:not(#fakeId) {
  /* 1-0-1 */
}
div:not(.inner, #fakeId) p {
  /* 1-0-2 */
}
7 này thêm
:is(p, #fakeId) {
  /* 1-0-0 */
}
h2:has(+ h2, > #fakeId) {
  /* 1-0-1 */
}
p:not(#fakeId) {
  /* 1-0-1 */
}
div:not(.inner, #fakeId) p {
  /* 1-0-2 */
}
9 vào trọng lượng đặc hiệu của mỗi đoạn.

Nói chung, bạn muốn giữ tính đặc hiệu ở mức tối thiểu, nhưng nếu bạn cần tăng tính đặc hiệu của một yếu tố vì một lý do cụ thể, ba lớp giả này có thể giúp ích.

a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}

Trong ví dụ này, tất cả các liên kết sẽ có màu xanh, trừ khi được ghi đè bởi một khai báo liên kết với 3 ID trở lên, giá trị màu khớp với

a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
0 bao gồm cờ
a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
1 hoặc nếu liên kết có khai báo màu kiểu nội tuyến. Nếu bạn sử dụng một kỹ thuật như vậy, hãy thêm một bình luận để giải thích lý do tại sao hack là cần thiết.

Phong cách nội tuyến

Các kiểu nội tuyến được thêm vào một yếu tố (ví dụ:

a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
2) luôn ghi đè bất kỳ kiểu bình thường nào trong các kiểu dáng của tác giả, và do đó, có thể được coi là có độ đặc hiệu cao nhất. Hãy nghĩ về phong cách nội tuyến là có trọng lượng đặc hiệu là
a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
3.

Cách duy nhất để ghi đè các kiểu nội tuyến là sử dụng

a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
1.

Nhiều khung JavaScript và thư viện thêm các kiểu nội tuyến. Sử dụng

a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
1 với bộ chọn rất được nhắm mục tiêu, chẳng hạn như bộ chọn thuộc tính sử dụng kiểu nội tuyến, là một cách để ghi đè các kiểu nội tuyến này.

<p style="color: purple">p>

[type="password"]             /* 0-1-0 */
input:focus                   /* 0-1-1 */
:root #myApp input:required   /* 1-2-1 */
0

Đảm bảo bao gồm một nhận xét với mỗi lần bao gồm các lá cờ quan trọng để người bảo trì mã hiểu tại sao một mẫu chống CSS được sử dụng.

Ngoại lệ a:not(#fakeId#fakeId#fakeID) { color: blue; /* 3-0-1 */ } 1

Các khai báo CSS được đánh dấu là ghi đè quan trọng bất kỳ khai báo nào khác trong cùng một lớp và nguồn gốc. Mặc dù về mặt kỹ thuật,

a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
1 không liên quan gì đến tính đặc hiệu, nhưng nó tương tác trực tiếp với tính đặc hiệu và dòng thác. Nó đảo ngược thứ tự xếp tầng của các kiểu dáng.

Nếu các khai báo từ cùng một nguồn gốc và xung đột lớp xếp tầng và một giá trị tài sản có bảng cờ

a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
1, thì tuyên bố quan trọng được áp dụng bất kể tính đặc hiệu. Khi các khai báo mâu thuẫn từ cùng một gốc và lớp tầng với cờ
a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
1 được áp dụng cho cùng một yếu tố, tuyên bố có độ đặc hiệu cao hơn được áp dụng.

Sử dụng

a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
1 để ghi đè tính đặc hiệu được coi là một thực hành xấu và nên tránh cho mục đích này. Hiểu và sử dụng hiệu quả tính đặc hiệu và Cascade có thể loại bỏ mọi nhu cầu về cờ
a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
1.bad practice and should be avoided for this purpose. Understanding and effectively using specificity and the cascade can remove any need for the
a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
1 flag.

Thay vì sử dụng

a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
1 để ghi đè CSS nước ngoài (từ các thư viện bên ngoài, như Bootstrap hoặc Normalize.css), hãy nhập các tập lệnh của bên thứ ba trực tiếp vào các lớp Cascade. Nếu bạn phải sử dụng
a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
1 trong CSS của mình, hãy nhận xét việc sử dụng của bạn để người bảo trì mã trong tương lai biết tại sao tuyên bố lại được đánh dấu quan trọng và biết không ghi đè lên nó. Nhưng chắc chắn, không sử dụng
a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
1 khi viết các plugin hoặc khung mà các nhà phát triển khác sẽ cần kết hợp mà không thể kiểm soát.

Ngoại lệ #myElement { color: yellow; /* 1-0-0 */ } #myApp [id="myElement"] { color: green; /* 1-1-0 - WINS!! */ } 9

Tính đặc hiệu-điều chỉnh độ giả pseudo

#myElement {
  color: yellow; /* 1-0-0 */
}
#myApp [id="myElement"] {
  color: green; /* 1-1-0  - WINS!! */
}
9 luôn có tính đặc hiệu của nó được thay thế bằng 0,
<p style="color: purple">p>
7. Nó cho phép làm cho các bộ chọn CSS rất cụ thể trong yếu tố nào được nhắm mục tiêu mà không có sự gia tăng nào về tính đặc hiệu.

Khi tạo CSS của bên thứ ba được sử dụng bởi các nhà phát triển không có quyền truy cập để chỉnh sửa CSS của bạn, đó là một thực tiễn tốt để tạo CSS với độ đặc hiệu thấp nhất có thể. Ví dụ: nếu chủ đề của bạn bao gồm các CSS sau:

[type="password"]             /* 0-1-0 */
input:focus                   /* 0-1-1 */
:root #myApp input:required   /* 1-2-1 */
1

Sau đó, nhà phát triển triển khai tiện ích có thể dễ dàng ghi đè màu liên kết chỉ bằng bộ chọn loại.

[type="password"]             /* 0-1-0 */
input:focus                   /* 0-1-1 */
:root #myApp input:required   /* 1-2-1 */
2

Mẹo xử lý chứng đau đầu tính đặc hiệu

Thay vì sử dụng

a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
1, hãy xem xét sử dụng các lớp Cascade và sử dụng độ đặc hiệu trọng lượng thấp trong suốt CSS của bạn để các kiểu dễ dàng được ghi đè với các quy tắc cụ thể hơn một chút. Sử dụng HTML ngữ nghĩa giúp cung cấp các mỏ neo để áp dụng kiểu dáng.

Làm cho các bộ chọn cụ thể có và không có thêm tính đặc hiệu

Bằng cách chỉ ra phần của tài liệu bạn đang tạo kiểu trước phần tử bạn chọn, quy tắc trở nên cụ thể hơn. Tùy thuộc vào cách bạn thêm nó, bạn có thể thêm một số, rất nhiều hoặc không có tính cụ thể, như được hiển thị bên dưới:

[type="password"]             /* 0-1-0 */
input:focus                   /* 0-1-1 */
:root #myApp input:required   /* 1-2-1 */
3

[type="password"]             /* 0-1-0 */
input:focus                   /* 0-1-1 */
:root #myApp input:required   /* 1-2-1 */
4

Bất kể thứ tự, tiêu đề sẽ có màu xanh vì quy tắc đó là cụ thể nhất.

Giảm độ đặc hiệu ID

Tính đặc hiệu dựa trên hình thức của một bộ chọn. Bao gồm

<p style="color: purple">p>
9 của một phần tử như một bộ chọn thuộc tính chứ không phải là bộ chọn ID là một cách tốt để làm cho một phần tử cụ thể hơn mà không cần thêm tính đặc hiệu. Trong ví dụ trước, bộ chọn
[type="password"]             /* 0-1-0 */
input:focus                   /* 0-1-1 */
:root #myApp input:required   /* 1-2-1 */
00 được tính là một bộ chọn thuộc tính cho mục đích xác định tính đặc hiệu của bộ chọn, mặc dù nó chọn ID.

Bạn cũng có thể bao gồm

<p style="color: purple">p>
9 hoặc bất kỳ phần nào của bộ chọn dưới dạng tham số trong lớp giả điều chỉnh độ đặc hiệu
#myElement {
  color: yellow; /* 1-0-0 */
}
#myApp [id="myElement"] {
  color: green; /* 1-1-0  - WINS!! */
}
9 nếu bạn cần tạo một bộ chọn cụ thể hơn nhưng không muốn thêm bất kỳ đặc hiệu nào.

Tăng tính đặc hiệu bằng cách nhân đôi bộ chọn

Là một trường hợp đặc biệt để tăng tính đặc hiệu, bạn có thể nhân đôi các trọng số từ các cột lớp hoặc ID. Việc nhân đôi ID, lớp, pseudo-class hoặc bộ chọn thuộc tính trong bộ chọn hợp chất sẽ tăng tính đặc hiệu khi ghi đè các bộ chọn rất cụ thể mà bạn không có quyền kiểm soát.

[type="password"]             /* 0-1-0 */
input:focus                   /* 0-1-1 */
:root #myApp input:required   /* 1-2-1 */
5

Sử dụng điều này một cách tiết kiệm, nếu ở tất cả. Nếu sử dụng sao chép chọn, hãy luôn bình luận CSS của bạn.

Bằng cách sử dụng

:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
5 và
:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
4 (và cả
:root input {
  color: green; /* 0-1-1 - WINS because CLASS column is greater */
}
html body main input {
  color: yellow; /* 0-0-4 */
}
6), bạn có thể tăng tính đặc hiệu ngay cả khi bạn không thể thêm
<p style="color: purple">p>
9 vào phần tử cha:

[type="password"]             /* 0-1-0 */
input:focus                   /* 0-1-1 */
:root #myApp input:required   /* 1-2-1 */
6

Ưu tiên hơn CSS của bên thứ ba

Tận dụng các lớp xếp tầng là cách tiêu chuẩn để cho phép một tập hợp các kiểu được ưu tiên hơn một bộ kiểu khác; Các lớp Cascade cho phép điều này mà không cần sử dụng tính đặc hiệu! Phong cách tác giả bình thường (không quan trọng) được nhập vào các lớp Cascade có mức độ ưu tiên thấp hơn so với các kiểu tác giả chưa được cấp.

Nếu Styles đến từ một biểu định kiểu bạn không thể chỉnh sửa hoặc không hiểu và bạn cần ghi đè kiểu, một chiến lược là nhập các kiểu bạn không kiểm soát vào lớp Cascade. Các phong cách trong các lớp được tuyên bố sau đó được ưu tiên, với các kiểu chưa được xếp hạng có quyền ưu tiên trên tất cả các phong cách xếp lớp từ cùng một nguồn gốc.

Khi hai bộ chọn từ các lớp khác nhau phù hợp với cùng một phần tử, nguồn gốc và tầm quan trọng được ưu tiên; Tính đặc hiệu của bộ chọn trong bảng kiểu mất là không liên quan.

[type="password"]             /* 0-1-0 */
input:focus                   /* 0-1-1 */
:root #myApp input:required   /* 1-2-1 */
7

Trong ví dụ trên, tất cả văn bản đoạn văn, bao gồm nội dung lồng nhau, sẽ là

[type="password"]             /* 0-1-0 */
input:focus                   /* 0-1-1 */
:root #myApp input:required   /* 1-2-1 */
07 cho dù có bao nhiêu tên lớp mà các đoạn có phù hợp với bảng kiểu TW.

Tránh và ghi đè a:not(#fakeId#fakeId#fakeID) { color: blue; /* 3-0-1 */ } 1

Cách tiếp cận tốt nhất là không sử dụng

a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
1. Các giải thích trên về tính đặc hiệu sẽ hữu ích trong việc tránh sử dụng cờ và loại bỏ nó hoàn toàn khi gặp phải.

Để loại bỏ nhu cầu nhận thức về

a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
1, bạn có thể thực hiện một trong những điều sau đây:

  • Tăng tính đặc hiệu của bộ chọn của tuyên bố
    a:not(#fakeId#fakeId#fakeID) {
      color: blue; /* 3-0-1 */
    }
    
    1 trước đây để nó lớn hơn các khai báo khác
  • Cho nó tính đặc hiệu tương tự và đặt nó sau khi tuyên bố, nó có nghĩa là ghi đè
  • Giảm độ đặc hiệu của bộ chọn bạn đang cố gắng ghi đè.

Tất cả các phương pháp này được đề cập trong các phần trước.

Nếu bạn không thể xóa các cờ

a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
1 khỏi bảng kiểu tác giả, giải pháp duy nhất để ghi đè các kiểu quan trọng là sử dụng
a:not(#fakeId#fakeId#fakeID) {
  color: blue; /* 3-0-1 */
}
1. Tạo một tầng lớp ghi đè khai báo quan trọng là một giải pháp tuyệt vời. Hai cách làm điều này bao gồm:

Phương pháp 1

  1. Tạo một bảng kiểu ngắn, riêng biệt chỉ chứa các khai báo quan trọng đặc biệt ghi đè lên bất kỳ tuyên bố quan trọng nào mà bạn không thể xóa.
  2. Nhập kiểu kiểu này dưới dạng nhập đầu tiên trong CSS của bạn bằng cách sử dụng
    [type="password"]             /* 0-1-0 */
    input:focus                   /* 0-1-1 */
    :root #myApp input:required   /* 1-2-1 */
    
    14, bao gồm câu lệnh
    [type="password"]             /* 0-1-0 */
    input:focus                   /* 0-1-1 */
    :root #myApp input:required   /* 1-2-1 */
    
    15, trước khi liên kết với các bảng kiểu khác. Điều này là để đảm bảo rằng các khoản ghi đè quan trọng được nhập dưới dạng lớp đầu tiên.

[type="password"]             /* 0-1-0 */
input:focus                   /* 0-1-1 */
:root #myApp input:required   /* 1-2-1 */
8

Phương pháp 2

  1. Khi bắt đầu các khai báo biểu định kiểu của bạn, hãy tạo một lớp Cascade có tên, như vậy:

    [type="password"]             /* 0-1-0 */
    input:focus                   /* 0-1-1 */
    :root #myApp input:required   /* 1-2-1 */
    
    9

  2. Mỗi lần bạn cần ghi đè một tuyên bố quan trọng, hãy khai báo nó trong lớp được đặt tên. Chỉ khai báo các quy tắc quan trọng trong lớp.

    #myElement {
      color: green; /* 1-0-0  - WINS!! */
    }
    .bodyClass .sectionClass .parentClass [id="myElement"] {
      color: yellow; /* 0-4-0 */
    }
    
    0

Tính đặc hiệu của bộ chọn của phong cách quan trọng trong lớp có thể thấp, miễn là nó phù hợp với phần tử bạn đang cố gắng ghi đè. Các lớp bình thường nên được khai báo bên ngoài lớp vì các kiểu lớp có mức độ ưu tiên thấp hơn so với các kiểu chưa được đặt.

Sự thiếu hiểu biết của cây

Sự gần gũi của một yếu tố với các yếu tố khác được tham chiếu trong một bộ chọn nhất định không có tác động đến tính đặc hiệu.

#myElement {
  color: green; /* 1-0-0  - WINS!! */
}
.bodyClass .sectionClass .parentClass [id="myElement"] {
  color: yellow; /* 0-4-0 */
}
1

Các yếu tố

[type="password"]             /* 0-1-0 */
input:focus                   /* 0-1-1 */
:root #myApp input:required   /* 1-2-1 */
16 sẽ có màu tím bởi vì khi các khai báo có cùng tính đặc hiệu, bộ chọn được khai báo cuối cùng được ưu tiên.

Các yếu tố được nhắm mục tiêu trực tiếp so với các kiểu di truyền

Các kiểu cho một yếu tố được nhắm mục tiêu trực tiếp sẽ luôn được ưu tiên hơn các kiểu di truyền, bất kể tính đặc thù của quy tắc được kế thừa. Cho CSS và HTML sau:

#myElement {
  color: green; /* 1-0-0  - WINS!! */
}
.bodyClass .sectionClass .parentClass [id="myElement"] {
  color: yellow; /* 0-4-0 */
}
2

#myElement {
  color: green; /* 1-0-0  - WINS!! */
}
.bodyClass .sectionClass .parentClass [id="myElement"] {
  color: yellow; /* 0-4-0 */
}
3

#myElement {
  color: yellow; /* 1-0-0 */
}
#myApp [id="myElement"] {
  color: green; /* 1-1-0  - WINS!! */
}
4 sẽ có màu tím vì bộ chọn
#myElement {
  color: yellow; /* 1-0-0 */
}
#myApp [id="myElement"] {
  color: green; /* 1-1-0  - WINS!! */
}
4 nhắm mục tiêu cụ thể phần tử, trong khi màu xanh lá cây được thừa hưởng từ các khai báo
[type="password"]             /* 0-1-0 */
input:focus                   /* 0-1-1 */
:root #myApp input:required   /* 1-2-1 */
19.

Ví dụ

Trong các CSS sau, chúng tôi có ba bộ chọn nhắm mục tiêu các yếu tố

[type="password"]             /* 0-1-0 */
input:focus                   /* 0-1-1 */
:root #myApp input:required   /* 1-2-1 */
20 để đặt màu. Đối với một đầu vào đã cho, trọng lượng đặc hiệu của khai báo màu có ưu tiên là bộ chọn phù hợp với trọng lượng lớn nhất:

#myElement {
  color: green; /* 1-0-0  - WINS!! */
}
.bodyClass .sectionClass .parentClass [id="myElement"] {
  color: yellow; /* 0-4-0 */
}
4

Nếu các bộ chọn ở trên, tất cả các mục tiêu cùng một đầu vào, đầu vào sẽ có màu đỏ, vì khai báo đầu tiên có giá trị cao nhất trong cột ID.

Bộ chọn cuối cùng có bốn thành phần loại. Mặc dù nó có giá trị số nguyên cao nhất, bất kể có bao nhiêu yếu tố và yếu tố giả được bao gồm, ngay cả khi có 150, các thành phần loại không bao giờ được ưu tiên hơn các thành phần lớp. Các giá trị cột được so sánh bắt đầu từ trái sang phải khi các giá trị cột bằng nhau.

Nếu chúng tôi đã chuyển đổi bộ chọn ID trong mã ví dụ ở trên thành bộ chọn thuộc tính, hai bộ chọn đầu tiên sẽ có cùng độ đặc hiệu, như được hiển thị bên dưới:

#myElement {
  color: green; /* 1-0-0  - WINS!! */
}
.bodyClass .sectionClass .parentClass [id="myElement"] {
  color: yellow; /* 0-4-0 */
}
5

Khi nhiều khai báo có độ đặc hiệu bằng nhau, khai báo cuối cùng được tìm thấy trong CSS được áp dụng cho phần tử. Nếu cả hai bộ chọn đều phù hợp với cùng

[type="password"]             /* 0-1-0 */
input:focus                   /* 0-1-1 */
:root #myApp input:required   /* 1-2-1 */
20, màu sẽ có màu xanh.

Ghi chú bổ sung

Một vài điều cần nhớ về tính đặc hiệu:

  1. Độ đặc hiệu chỉ áp dụng khi cùng một phần tử được nhắm mục tiêu bởi nhiều khai báo trong cùng một lớp hoặc nguồn gốc. Tính đặc hiệu chỉ quan trọng đối với các tuyên bố có cùng tầm quan trọng và cùng một lớp và lớp tầng. Nếu các bộ chọn khớp có nguồn gốc khác nhau, Cascade xác định khai báo nào được ưu tiên.
  2. Khi hai bộ chọn trong cùng một lớp tầng và nguồn gốc có cùng độ đặc hiệu, sự gần gũi là rất quan trọng; Bộ chọn cuối cùng chiến thắng.
  3. Theo quy tắc CSS, các yếu tố được nhắm mục tiêu trực tiếp sẽ luôn được ưu tiên hơn các quy tắc mà một yếu tố kế thừa từ tổ tiên của nó.
  4. Sự gần gũi của các phần tử trong cây tài liệu không ảnh hưởng đến tính đặc hiệu.

Thông số kỹ thuật

Sự chỉ rõ
Bộ chọn cấp độ 4 # Tính đặc hiệu
# specificity-rules

Xem thêm

Độ đặc hiệu cao nhất trong CSS là gì?

Bộ chọn ID có độ đặc hiệu cao nhất trong số các bộ chọn CSS: 1, 0, 0, 0. Do tính chất duy nhất của định nghĩa thuộc tính ID, chúng tôi thường tạo kiểu cho một yếu tố thực sự cụ thể khi chúng tôi gọi ID trong CSS của chúng tôi.- Độ đặc hiệu là 1, 0, 0, 1 vì chúng tôi có bộ chọn loại và bộ chọn ID.1, 0, 0, 0. Because of the unique nature of the ID attribute definition, we are usually styling a really specific element when we call up the ID in our CSS. – The specificity is 1, 0, 0, 1 because we have a type selector and an ID selector.

Điều gì có mức độ ưu tiên cao nhất trong CSS?

1) Phong cách nội tuyến: Phong cách nội tuyến có mức độ ưu tiên cao nhất trong số tất cả.2) Bộ chọn ID: Nó có mức độ ưu tiên cao thứ hai.3) Các lớp, lớp giả và thuộc tính: Các bộ chọn này có mức độ ưu tiên thấp nhất.Inline style: Inline style has highest priority among all. 2) Id Selector: It has second highest priority. 3) Classes, pseudo-classes and attributes: These selectors has lowest priority.