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

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 19 tháng 1, 2025

Tính đặc hiệu (Specificity) trong CSS là cơ chế giúp trình duyệt xác định kiểu dáng nào sẽ được áp dụng cho một phần tử khi có xung đột giữa các quy tắc CSS. Trong bài học này, bạn sẽ tìm hiểu về quy tắc ưu tiên giữa các loại CSS (inline, internal, external) và cách xử lý xung đột giữa các selectors.

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

1. Quy tắc ưu tiên giữa các loại CSS

CSS được áp dụng dựa trên mức độ ưu tiên như sau:

  1. Inline CSS: Kiểu dáng được khai báo trực tiếp trong phần tử HTML (cao nhất).
  2. Internal CSS: Kiểu dáng được định nghĩa trong thẻ <style> của trang HTML.
  3. External CSS: Kiểu dáng được liên kết qua file .css bên ngoài.

Ví dụ minh họa:

<p style="color: red;">Đoạn văn với Inline CSS</p>
<style>
  p {
    color: blue; /* Internal CSS */
  }
</style>
<link rel="stylesheet" href="styles.css"> <!-- External CSS -->

Kết quả: Đoạn văn sẽ hiển thị màu đỏ vì Inline CSS có mức ưu tiên cao nhất.

2. Tính đặc hiệu của selectors

Mỗi selector trong CSS có một điểm số cụ thể dùng để xác định mức ưu tiên.

  • Inline style: 1000 điểm.
  • ID selector (#id): 100 điểm.
  • Class selector (.class), attribute selector, pseudo-classes: 10 điểm.
  • Element selector (div, p, h1) và pseudo-elements: 1 điểm.

Ví dụ tính điểm:

h1 { color: blue; }         /* 1 điểm */
#main-title { color: red; } /* 100 điểm */
.highlight { color: green; } /* 10 điểm */

Khi các quy tắc trên đều áp dụng cho một phần tử <h1 id="main-title" class="highlight">, thì màu red sẽ được ưu tiên vì ID selector có điểm cao nhất.

3. Xử lý xung đột giữa selectors

  • Khi có xung đột, CSS dựa vào:
    1. Tính đặc hiệu (Specificity).
    2. Thứ tự khai báo (Quy tắc viết sau sẽ ghi đè nếu cùng độ đặc hiệu).

Ví dụ minh họa:

/* Khai báo ban đầu */
p {
  color: blue;
}
/* Khai báo sau */
p {
  color: green;
}

Kết quả: Màu green được áp dụng do được khai báo sau.

Thực hành

1. Yêu cầu

Tạo một file HTML và CSS để minh họa quy tắc đặc hiệu:

  • Một tiêu đề <h1> được định dạng bằng nhiều selectors khác nhau.
  • Một đoạn văn <p> với cả Inline, Internal, và External CSS để kiểm tra ưu tiên.

2. Hướng dẫn

File HTML:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Tính đặc hiệu trong CSS</title>
  <link rel="stylesheet" href="styles.css">
  <style>
    /* Internal CSS */
    h1 {
      color: blue;
    }
    .highlight {
      color: green;
    }
  </style>
</head>
<body>
  <h1 id="main-title" class="highlight" style="color: red;">
    Tiêu đề minh họa
  </h1>
  <p style="color: red;">Đoạn văn với Inline CSS</p>
</body>
</html>

File CSS (styles.css):

/* External CSS */
h1 {
  font-size: 24px;
  text-align: center;
  color: black;
}

3. Quan sát kết quả

  • Tiêu đề <h1>: Màu red từ Inline CSS được ưu tiên.
  • Đoạn văn <p>: Màu red cũng được chọn do Inline CSS.
Website Logo

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.

Bình luận

Website Logo

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.

Liên hệ công việc qua email dưới đây.

lhvuctu@gmail.com

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ