Trong CSS, Specificity (độ đặc hiệu) là một khái niệm quan trọng giúp quyết định thứ tự ưu tiên của các quy tắc CSS khi chúng xung đột với nhau. Hiểu về CSS Specificity sẽ giúp bạn kiểm soát tốt hơn cách áp dụng kiểu dáng trên trang web, giúp mã CSS của bạn dễ bảo trì và tránh xung đột. Bài viết này sẽ giúp bạn hiểu rõ về CSS Specificity, cách tính điểm Specificity và các kỹ thuật hữu ích để quản lý chúng.

Các bài học này thuộc phần cơ bản của CSS trên "codetuthub.com", nơi chúng tôi cung cấp đầy đủ các kiến thức nền tảng về CSS từ cơ bản đến nâng cao, chẳng hạn như bài về CSS Units hay CSS Attribute Selectors.

1. Khái niệm CSS Specificity

CSS Specificity quyết định quy tắc CSS nào sẽ được áp dụng nếu có nhiều quy tắc khác nhau nhắm vào cùng một phần tử HTML. Mỗi bộ chọn (selector) sẽ có một giá trị Specificity riêng, và giá trị này sẽ giúp trình duyệt xác định độ ưu tiên của các quy tắc.

Ví dụ, nếu bạn có hai quy tắc CSS như sau:

css
/* Quy tắc thứ nhất */
p {
    color: blue;
}

/* Quy tắc thứ hai */
#intro {
    color: red;
}

Nếu cả hai quy tắc đều áp dụng cho cùng một thẻ <p id="intro">, thì màu red sẽ được áp dụng vì selector #intro có Specificity cao hơn.

2. Cách tính điểm Specificity

CSS Specificity được tính dựa trên ba loại selector: ID selectors, class selectors (bao gồm các attribute selector và pseudo-class), và element selectors (các selector thẻ HTML và pseudo-element). Mỗi loại selector có giá trị Specificity khác nhau:

  • ID selectors: Giá trị Specificity là 100.
  • Class selectors (bao gồm .class, [attribute], và :pseudo-class): Giá trị Specificity là 10.
  • Element selectorspseudo-elements (<h1>, p, ::before, v.v.): Giá trị Specificity là 1.

Ví dụ về cách tính điểm Specificity

SelectorSpecificityMô tả
#header100ID selector (#)
.menu .item20Hai class selectors (.menu.item)
div p2Hai element selectors (divp)
ul li a:hover13Ba element selectors + một pseudo-class

Cách tính Specificity cho selector ul li a:hover:

  • ul, li, a (element selectors) = 3 x 1 = 3
  • :hover (pseudo-class) = 10
  • Tổng Specificity = 3 + 10 = 13

Lưu ý về Specificity

  • Inline styles (style trực tiếp trên phần tử HTML) có Specificity là 1000 và sẽ ưu tiên hơn bất kỳ selector nào trong CSS.
  • !important: Quy tắc CSS có !important sẽ ghi đè tất cả các quy tắc khác. Tuy nhiên, đây chỉ nên được sử dụng khi cần thiết vì nó làm giảm tính linh hoạt của CSS.

3. Các loại CSS selector và điểm Specificity

Các loại CSS selector đóng vai trò quan trọng trong cách điểm Specificity được tính toán. Dưới đây là một số loại CSS selector và điểm Specificity tương ứng.

3.1 ID selectors

ID selectors là các selector bắt đầu bằng dấu #, và mỗi trang web chỉ nên có duy nhất một phần tử với cùng một ID. Vì vậy, điểm Specificity của ID selectors cao (100), ưu tiên hơn so với các selector khác.

css
#main-content {
    background-color: #f3f3f3;
}

3.2 Class selectors và pseudo-classes

Class selectors (bắt đầu bằng dấu .) và pseudo-classes (bắt đầu bằng : như :hover, :active, :focus) có Specificity là 10. Các selector này được sử dụng phổ biến cho nhiều phần tử HTML.

css
.button:hover {
    background-color: #0066cc;
}

3.3 Element selectors và pseudo-elements

Element selectors nhắm đến các thẻ HTML như h1, p, div, v.v. và có Specificity là 1. Đây là các selector có Specificity thấp nhất, phù hợp khi bạn muốn áp dụng kiểu chung cho các phần tử.

css
p {
    font-size: 16px;
}

3.4 Specificity của các combinator

CSS còn có các combinator (kết hợp selector) như +, >, và ~. Các combinator này không ảnh hưởng đến điểm Specificity mà chỉ điều chỉnh cấu trúc của bộ chọn.

css
/* Specificity của selector này là 12 */
ul > li.item a {
    color: green;
}

4. Ví dụ minh họa về CSS Specificity

Hãy cùng xem xét ví dụ cụ thể để thấy cách Specificity ảnh hưởng đến thứ tự ưu tiên của các quy tắc CSS.

HTML:

html
<p id="intro" class="highlight">Đây là đoạn văn bản mẫu.</p>

CSS:

css
p {
    color: blue;
}

#intro {
    color: red;
}

.highlight {
    color: green;
}

Kết quả: Đoạn văn bản sẽ có màu red vì selector #intro có Specificity cao hơn so với .highlight (class) và p (element).

5. Chiến lược quản lý CSS Specificity

Khi làm việc với CSS Specificity, bạn có thể gặp phải tình trạng xung đột CSS nếu không quản lý đúng cách. Dưới đây là một số chiến lược giúp bạn quản lý CSS Specificity tốt hơn:

5.1 Sử dụng class selectors

Class selectors có Specificity thấp hơn so với ID selectors, giúp bạn dễ dàng ghi đè kiểu dáng khi cần thiết. Điều này giúp mã CSS dễ bảo trì hơn.

css
/* Sử dụng class thay vì ID */
.button-primary {
    background-color: #0066cc;
}

5.2 Hạn chế sử dụng ID selectors

ID selectors có Specificity cao, nên việc sử dụng quá nhiều ID selectors sẽ gây khó khăn trong việc ghi đè CSS. Thay vì ID, bạn có thể sử dụng class cho các phần tử.

5.3 Tránh sử dụng !important

Quy tắc !important sẽ ghi đè tất cả các quy tắc CSS khác, vì vậy chỉ nên sử dụng khi thực sự cần thiết. Sử dụng !important quá nhiều sẽ làm cho mã CSS khó bảo trì và dễ gây xung đột.

css
/* Tránh sử dụng !important trừ khi cần thiết */
.button {
    background-color: #333 !important;
}

5.4 Tái cấu trúc mã CSS

Sử dụng kiến trúc CSS tốt như BEM (Block Element Modifier) giúp bạn viết mã CSS có cấu trúc tốt hơn và dễ quản lý Specificity hơn. Trên "codetuthub.com", chúng tôi cũng có một bài chi tiết về BEM và các phương pháp tổ chức CSS hiệu quả.

6. Kết luận

CSS Specificity là một trong những khái niệm cốt lõi trong CSS, giúp bạn kiểm soát và ưu tiên các quy tắc CSS trên trang web của mình. Hiểu rõ về CSS Specificity sẽ giúp bạn tránh các xung đột và tạo ra mã CSS gọn gàng, dễ bảo trì hơn. Hãy truy cập vào "codetuthub.com" để tham khảo thêm các bài học về CSS khác, như CSS Forms, CSS Counters, và CSS Units để bổ sung kiến thức CSS từ cơ bản đến nâng cao!


Hy vọng bài viết này giúp bạn hiểu rõ hơn về CSS Specificity và áp dụng hiệu quả trong các dự án của mình!