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
| Selector | Khớp với |
|---|---|
.note | Mọi phần tử có class note |
p.note | Chỉ các phần tử <p> có class note |
.btn.primary | Phần tử có cả btn và primary |
.card .title | Một .title ở bất kỳ đâu bên trong .card |
.card > .title | Một .title có phần tử cha là .card |
.a, .b | Phầ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 .name | ID #name | |
|---|---|---|
| Mỗi trang | Nhiề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ách | Một id |
| Độ ưu tiên | (0,1,0) | (1,0,0) |
Đích liên kết (#name trong URL) | Không | Có |
| Phù hợp nhất cho | Định dạng | Neo 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ố.
.2collà 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:
.errorvẫn đúng sau khi thiết kế lại, còn.red-textthì 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ùngclass="a b". - Có dấu cách trong khi bạn muốn chọn phần tử có cả hai class.
.btn .primarytìm một phần tử lồng bên trong;.btn.primarylà 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.