-
Khái niệm
- Selector là cách chọn một hoặc nhiều phần tử HTML để thiết lập style cho phần tử đó
-
CSS Selectors đơn giản
-
Tag name
- Cách đơn giản nhất là chọn phần tử theo tên thẻ HTML
-
Class name
- Đặt class cho những phần tử có đặc điểm chung để tuỳ chỉnh style cho nhóm phần tử này.
- Khi viết CSS, sử dụng dấu "." trước tên class
- Một phần tử có thể có nhiều class, các class viết cách nhau 1 dấu cách.
-
Id (identifier)
- Là mã định danh cho mỗi phần tử HTML, thường không được sử dụng như một cách chính thống để style.
- Là duy nhất trên 1 file HTML
- Mang tính duy nhất
- Khi sử dụng CSS, sử dụng dấu "#" trước tên id
-
Lưu ý
- Tên các class, id không bắt đầu bằng số, không dùng tiếng Việt, không chứa khoảng trắng và ký tự đặc biệt.
- Tuân thủ quy tắc đặt tên kebab-case
-
CSS Combinator Selectors
(bộ chọn kết hợp)
- Là cách chọn các phần tử dựa trên mối quan hệ giữa chúng
-
Descendant combinator
(space)
- Còn gọi là bộ chọn tổ tiên.
- Chọn tất cả các hậu duệ của một phần tử "tổ tiên"
-
Child combinator (>)
- Còn gọi là bộ chọn con cái (bộ chọn thế hệ F1)
- Chọn phần tử con trực tiếp của phần tử cha
-
Adjacent sibling combinator (+)
- Còn gọi là bộ chọn anh chị em liền kề
- Chọn phần tử ngay sau một phần tử
-
General sibling combinator (~)
- Gần giống với bộ chọn anh em liền kề, bộ chọn anh em sẽ chọn toàn bộ các phần tử "em" của một phần tử.
- VD: h1 ~ p: chọn tất cả các thẻ p ngay sau và ngang hàng thẻ h1
-
Bộ chọn gộp
- Đây không hoàn toàn là một selector độc lập, đây là cách viết kết hợp những selectors có chung bộ thuộc tính
- Các selectors ngăn cách nhau bởi dấu ","
-
CSS Attribute Selectors
- Là bộ chọn dựa trên thuộc tính của thẻ HTML
-
input[type]
- Chọn phần tử tồn tại 1 thuộc tính nào đó
- Chọn tất cả các thẻ input có thuộc tính type
-
input[type='username']
- Chọn phần tử có giá trị thuộc tính cụ thể
- Chọn tất cả các thẻ input có thuộc tính type với giá trị là "username"
-
a[href^='https']
- Chọn phần tử mà giá trị thuộc tính bắt đầu bằng chuỗi cụ thể
- Chọn tất cả các thẻ a có thuộc tính href nhận giá trị bắt đầu bằng "https"
-
img[src$='.png']
- Chọn phần tử mà giá trị thuộc tính kết thúc bằng chuỗi cụ thể
- Chọn tất cả các thẻ img có thuộc tính src nhận giá trị là các ảnh định dạng png
-
a[href*='google']
- Chọn phần tử mà giá trị thuộc tính có chứa chuỗi cụ thể
- Chọn tất cả các thẻ a có thuộc tính href nhận giá trị có chuỗi "google"
-
Pseudo-classes
- Chọn các phần tử dựa trên trạng thái hoặc đặc tính động của chúng
-
Theo trạng thái
-
:hover
- Trạng thái được di con trỏ chuột lên trên phần tử
-
:active
- Chỉ định phần tử được chọn
- Chỉ hoạt động khi phần tử đang được click, nếu nhả chuột ra, trạng thái active sẽ không còn
-
:focus
- Phần tử được focus từ bàn phím, ví dụ như input, textarea, select, v.v.
-
:visited
- Thường xuất hiện ở các thẻ a
- Thể hiện 1 anchor đã từng được duyệt
- Ngoài ra còn nhiều trạng thái khác
-
Theo vị trí của phần tử
-
:first-child, last-child
- Chọn phần tử con đầu tiên hoặc cuối cùng của một phần tử cha
- .parent div:first-child
-
:nth-child(n)
- Chọn phần tử con cụ thể số thứ "n" của phần tử cha
- Khi muốn chọn các con theo vị trí đan xen, có thể dùng keyword "odd", "even" hoặc 2n, 2n-1
-
:nth-of-type(n)
- Tương tự như nth-child nhưng phân biệt loại tag name
-
:not(selector)
- Bộ chọn này loại trừ những phần tử có đặc tính nào đó
- input:not([type='password']): loại trừ các thẻ input có type="password"
- p:not(.exclude): Chọn các thẻ p nhưng loại trừ thẻ p có class "exclude"
- li:not(:first-child): Chọn thẻ li nhưng loại trừ thẻ li đầu tiên
- Lưu ý: Chỉ áp dụng với phần tử con trực tiếp, không áp dụng với phần tử cháu chắt
-
Pseudo-elements
- Pseudo-element cho phép thêm nội dung vào phần tử mà không cần thay đổi cấu trúc HTML
- Thường được áp dụng cho những nội dung HTML chỉ mang ý nghĩa trang trí, không mang nội dung cụ thể, không cần thiết cho SEO.
-
::before và ::after
- Sử dụng để thêm nội dung vào phần tử mà không thay đổi cấu trúc HTML
- Khi sử dụng bắt buộc phải có thuộc tính content: "" cho dù content chỉ nhận chuỗi rỗng.
- Thường đây là những nội dung phụ, không mang ý nghĩa cụ thể mà chỉ nhằm mục đích tạo hiệu ứng UI. VD như: Gạch chân, ký tự quotes ("), .v.v
- Không thể sử dụng nhiều ::before hoặc nhiều ::after trên cùng 1 phần tử
-
::first-letter
- Chọn ký tự đầu tiên
- Biểu đạt một trích dẫn, một bài văn, một bức thư, một bài báo.
-
::first-line
- Chọn dòng đầu tiên
- Biểu đạt bắt đầu một đoạn văn mới, nội dung cần gây sự chú ý về UI mà không mang ngữ nghĩa cụ thể.
-
::marker
- Style cho marker của thẻ li
-
::placeholder
- Style cho placeholder của những thẻ input, textarea, v.v.
-
Lưu ý
- Các pseudo-element là inline
- Các pseudo-element có đầy đủ các thuộc tính style như một phần tử HTML riêng biệt
-
Kết hợp các pseudo
- Khi kết hợp các pseudo-classes và pseudo-elements cho cùng một phần tử, bắt buộc viết pseudo-classes trước.
- VD: a:hover::before
-
Importaint
- Là một keyword đặc biệt để đánh dấu một thuộc tính CSS là quan trọng.
- Ghi đè toàn bộ thứ tự ưu tiên của các bộ chọn khác (kể cả CSS inline)
- Tránh lạm dụng important để làm code khó đọc, khó bảo trì.
- Thường chỉ sử dụng khi thực sự cần thiết.
-
Độ ưu tiên
-
Trọng số theo vị trí viết CSS
- Độ ưu tiên của CSS Inline cao hơn CSS Internal và CSS External
- Độ ưu tiên của CSS Internal và External là như nhau, CSS được đọc sau sẽ xếp chồng CSS được đọc trước.
-
Trọng số theo selectors
- Trọng số cao: ID
- Trọng số trung bình: class, pseudo-class, attribute selectors.
- Trọng số thấp: tag name, pseudo-element
- Không được ưu tiên: universal selector (*)
-
Nguyên tắc tính điểm ưu tiên
- Tính điểm theo trọng số các bộ chọn
- Nếu ngang điểm về trọng số các bộ chọn, tính điểm theo mức độ cụ thể của bộ chọn.
- !important phá vỡ quy tắc tính điểm ưu tiên thông thường.
- Khi cùng một thuộc tính CSS sử dụng !important ở 2 vị trí, tính điểm như không có !important giữa 2 !important với nhau.