Tính đặc hiệu trong CSS

Tram Ho

1. Tính đặc hiệu là gì?

Tính đặc hiệu (hay độ ưu tiên) là cách mà trình duyệt quyết định sẽ áp dụng thuộc tính css nào với một phần tử khi có nhiều quy tắc css cùng trỏ đến phần tử đó.
Tính đặc hiệu dựa trên các quy tắc phù hợp bao gồm các loại selector (bộ chọn) CSS khác nhau.

2. Sự phân cấp tính đặc hiệu

Mỗi selector đều có vị trí của nó trong hệ thống phân cấp. Độ đặc hiệu của selector có 4 mức (như hình):

3. Làm sao để tính toán tính đặc hiệu?

Ta biểu diễn tương đối tính đặc hiệu của một selector như sau:

  • 1-0-0-0: Inline styles
  • 0-X-0-0: Số lượng ID selector
  • 0-0-Y-0: Số lượng Classes, attributes và pseudo-classes
  • 0-0-0-Z: Số lượng Elements and pseudo-elements
    Xem xét ví dụ dưới đây:
SelectorThousandsHundredsTensOnesTotal specificity
h100010001
h1 + p::first-letter00030003
li > a[href*=”jav”] > .active00220022
#identifier01000100
Thuộc tính được viết trong style attribute10001000

Có một sự nhầm lẫn nhẹ thường thấy khi theo dõi bảng này. Xét trường hợp như sau:

Kết quả thu được là màu xanh. Vì bản chất class chỉ có tính đặc hiệu ở hàng trăm (X-0-0). Dù cố lồng bao nhiêu class thì nó vẫn chỉ tác động đối với các bộ chọn có độ đặc hiệu bằng hoặc thấp hơn.

Lưu ý:

  • Universal selector (*) và combinators selector (+, >, ~) không làm tăng tính đặc hiệu.
  • :not(x): Negation selector (:not) không có giá trị, đối số (x) mới làm tăng tính đặc hiệu.
  • Đừng lạm dụng inline styles và !important, hãy thương lấy chính mình sau này!

4. Tổng kết

Tính đặc hiệu cùng với bộ chọn là một trong những vấn đề quan trọng nhất của css. Nắm rõ điều này sẽ giúp chúng ta dễ dàng phát triển và bảo trì ứng dụng.

Tài liệu tham khảo:

https://www.w3schools.com/css/css_specificity.asp
https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo