Menu

Class selector và ID selector trong CSS (.class và #id)

Class selector (.name) định dạng mọi phần tử có class đó; ID selector (#name) định dạng đúng một phần tử có id đó. Tìm hiểu cú pháp, nhiều class và class nối liền, class khác id thế nào, quy tắc đặt tên và bật tắt class bằng JavaScript.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Class selector

Class selector là một dấu chấm theo sau là tên class. Nó định dạng mọi phần tử có thuộc tính class chứa tên đó, bất kể loại phần tử.

Dấu chấm chỉ xuất hiện trong CSS. Trong HTML, thuộc tính là class="badge", không có dấu chấm. Tên class phân biệt chữ hoa chữ thường: .Badge không khớp với class="badge".

Nhiều class trên một phần tử

Một phần tử có thể mang bao nhiêu class cũng được, cách nhau bằng dấu cách. Mỗi class mang theo quy tắc riêng, và đó là cách bạn ghép các biến thể từ những mảnh nhỏ:

.btn.danger, không có dấu cách, khớp với phần tử có cả hai class. Thẻ span cuối cùng có danger nhưng không có btn, nên quy tắc nối liền bỏ qua nó.

Các biến thể của class selector

SelectorKhớp với
.noteMọi phần tử có class note
p.noteChỉ các phần tử <p> có class note
.btn.primaryPhần tử có cả btn và primary
.card .titleMột .title ở bất kỳ đâu bên trong .card
.card > .titleMột .title có phần tử cha là .card
.a, .bPhần tử có a hoặc b

Sự khác nhau giữa có dấu cách và không có dấu cách được trình bày cùng các combinator khác ở trang CSS selector.

ID selector

ID selector là một dấu thăng theo sau là id: #site-header định dạng phần tử có id="site-header". Id phải là duy nhất trong trang, nên ID selector nhắm đúng một phần tử.

Id không chỉ để định dạng: href="#details" cuộn tới phần tử đó, <label for="email"> trỏ tới id của một ô nhập, và JavaScript tìm nó bằng document.getElementById('details'). Đó mới là lý do thường gặp để gán id cho một phần tử; còn để định dạng thì class là công cụ tốt hơn.

Class và ID

Class .nameID #name
Mỗi trangNhiều phần tửMột phần tử
Mỗi phần tửNhiều class, cách nhau bằng dấu cáchMột id
Độ ưu tiên(0,1,0)(1,0,0)
Đích liên kết (#name trong URL)KhôngCó
Phù hợp nhất choĐịnh dạngNeo liên kết, label, móc nối JavaScript

Khoảng cách về độ ưu tiên (specificity) là lý do thực tế để định dạng bằng class. Một ID thắng bất kỳ số lượng class nào, nên quy tắc viết bằng ID chỉ có thể bị ghi đè bởi một ID khác, một style inline hoặc !important:

Thêm và xóa class bằng JavaScript

Class là cách thông thường để JavaScript thay đổi giao diện: CSS định nghĩa các trạng thái, script chỉ việc chuyển đổi giữa chúng.

classList còn có add, remove, contains và replace. Tránh gán trực tiếp cho className: nó thay thế mọi class mà phần tử đang có.

Đặt tên class

  • Chữ cái, chữ số, dấu gạch ngang và dấu gạch dưới đều an toàn: card, card-title, card__title, is-open.
  • Đừng bắt đầu selector bằng một chữ số hoặc dấu gạch ngang theo sau là chữ số. .2col là CSS không hợp lệ. Hãy bắt đầu bằng một chữ cái (.cols-2) hoặc escape chữ số đó (.\32 col).
  • Đặt tên theo mục đích, không theo vẻ ngoài: .error vẫn đúng sau khi thiết kế lại, còn .red-text thì không.
  • Một quy ước đặt tên sẽ giúp ích cho các dự án lớn hơn. BEM viết theo dạng block__element--modifier, ví dụ .card__title--large.

Lỗi thường gặp

  • Đặt dấu chấm trong HTML. class=".badge" không bao giờ khớp với .badge.
  • Hai thuộc tính class. <p class="a" class="b"> chỉ giữ a. Hãy dùng class="a b".
  • Có dấu cách trong khi bạn muốn chọn phần tử có cả hai class. .btn .primary tìm một phần tử lồng bên trong; .btn.primary là cùng một phần tử.
  • Dùng lại một id. Id trùng lặp làm hỏng getElementById, liên kết neo và việc gắn label, ngay cả khi CSS có vẻ vẫn chạy.
  • Định dạng mọi thứ bằng id. Độ ưu tiên cao của id khiến việc ghi đè về sau rất khổ sở; hãy dùng class.

Câu hỏi thường gặp

Làm sao chọn một class trong CSS?

Viết dấu chấm rồi đến tên class: .card { ... } định dạng mọi phần tử có class="card". Dấu chấm chỉ có trong CSS; thuộc tính HTML không có dấu chấm.

Class và id trong CSS khác nhau thế nào?

Một class dùng được cho bao nhiêu phần tử cũng được và một phần tử có thể có nhiều class; id phải là duy nhất trong trang và mỗi phần tử có tối đa một id. Trong CSS, #id có độ ưu tiên (specificity) cao hơn nhiều so với .class, nên quy tắc dùng ID khó ghi đè hơn.

Làm sao gán hai class cho một phần tử?

Viết các tên cách nhau bằng dấu cách trong cùng một thuộc tính: class="btn primary". Viết class hai lần trên một phần tử không có tác dụng; trình duyệt chỉ giữ thuộc tính đầu tiên.

Làm sao chọn phần tử có cả hai class?

Nối các class selector liền nhau, không có dấu cách: .btn.primary khớp với phần tử có cả hai class. Nếu có dấu cách, .btn .primary nghĩa là một phần tử .primary nằm bên trong một phần tử .btn.

Tên class trong CSS có được bắt đầu bằng số không?

Trong HTML thì được, nhưng selector không được bắt đầu bằng một chữ số chưa escape, nên .1col là CSS không hợp lệ. Hãy escape chữ số đó (.\31 col) hoặc tốt hơn là bắt đầu tên class bằng một chữ cái.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu