+3

Tính đặc hiệu trong css (CSS Specificity)

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:
Selector Thousands Hundreds Tens Ones Total specificity
h1 0 0 0 1 0001
h1 + p::first-letter 0 0 0 3 0003
li > a[href*="jav"] > .active 0 0 2 2 0022
#identifier 0 1 0 0 0100
Thuộc tính được viết trong style attribute 1 0 0 0 1000

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:

<div class="a1">
  <div class="a2">
    <div class="a3">
      <div class="a4">
        <div class="a5">
          <div class="a6">
            <div class="a7">
              <div class="a8">
                <div class="a9">
                  <div class="a10">
                    <div class="a11">
                      <div id="box">Age of Empires</div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>
#box { color: blue }; // Độ đặc hiệu: 0100
.a1 > .a2 > .a3 > .a4 > .a5 > .a6 > .a7 > .a8 > .a9 > .a10 > .a11 { color: red }; // Độ đặc hiệu: 00(11)0

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


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí