Nắm vững CSS Selectors: Hướng dẫn chi tiết cách chọn phần tử HTML bằng Class, ID, Tag, Attribute và Pseudo-classes. Tối ưu giao diện web của bạn ngay hôm nay!
Trong thế giới phát triển web, CSS (Cascading Style Sheets) đóng vai trò then chốt trong việc định hình giao diện và trải nghiệm người dùng. Để CSS có thể "tô điểm" cho trang web của bạn một cách chính xác, chúng ta cần một cơ chế để "chọn" các phần tử HTML mà chúng ta muốn áp dụng kiểu dáng. Cơ chế đó chính là selectors (bộ chọn).
Bài viết này sẽ đi sâu vào các loại selectors phổ biến nhất, giúp bạn nắm vững công cụ mạnh mẽ này để tạo ra những trang web đẹp mắt và có tổ chức.
---
Hãy tưởng tượng bạn có một ngôi nhà lớn với nhiều phòng, nhiều đồ đạc. Nếu bạn muốn sơn lại một bức tường cụ thể, bạn cần phải chỉ rõ "bức tường ở phòng khách, phía tây". Tương tự, trong HTML, bạn có thể có hàng trăm, hàng nghìn phần tử. Selectors chính là cách bạn "chỉ" vào phần tử (hoặc nhóm phần tử) mà bạn muốn áp dụng các quy tắc CSS.
Nếu không có selectors, CSS sẽ không biết nên áp dụng kiểu dáng cho phần tử nào, dẫn đến việc không thể tùy chỉnh giao diện trang web một cách linh hoạt.
---
Có nhiều loại selectors khác nhau, mỗi loại phù hợp với một mục đích sử dụng cụ thể. Dưới đây là các loại phổ biến nhất:
tên_thẻ { /* các quy tắc CSS */ }
<h1>Tiêu đề trang</h1>
<p>Đây là một đoạn văn.</p>
<p>Đây là một đoạn văn khác.</p>
h1 {
color: blue;
font-size: 36px;
}
p {
font-family: Arial, sans-serif;
line-height: 1.5;
}
<h1>
trên trang sẽ có màu xanh và kích thước chữ 36px. Mọi thẻ <p>
sẽ có font Arial và chiều cao dòng 1.5.#tên_id { /* các quy tắc CSS */ }
id
khớp với tên_id
. Lưu ý quan trọng: Mỗi id
phải là duy nhất trên một trang HTML.
<div id="header">
<h1>Chào mừng bạn đến với trang web của tôi</h1>
</div>
<p id="introduction">Đây là phần giới thiệu.</p>
#header {
background-color: #f0f0f0;
padding: 20px;
text-align: center;
}
#introduction {
font-style: italic;
color: #555;
}
div
có id="header"
sẽ có nền xám nhạt, padding 20px và căn giữa chữ. Đoạn văn có id="introduction"
sẽ được in nghiêng và có màu xám đậm..tên_class { /* các quy tắc CSS */ }
class
chứa tên_class
. Một phần tử có thể có nhiều class
.
<p class="highlight">Đây là một đoạn văn quan trọng.</p>
<div class="card highlight">
<h2>Tiêu đề thẻ</h2>
<p>Nội dung thẻ.</p>
</div>
<span class="warning-text">Cảnh báo!</span>
.highlight {
background-color: yellow;
font-weight: bold;
}
.card {
border: 1px solid #ccc;
padding: 15px;
margin-bottom: 10px;
border-radius: 5px;
}
.warning-text {
color: red;
text-transform: uppercase;
}
class="highlight"
(cả đoạn văn và div) sẽ có nền vàng và chữ in đậm. Phần tử div
có class="card"
sẽ có border, padding, margin và bo góc. Phần tử span
có class="warning-text"
sẽ có chữ màu đỏ và viết hoa.[thuộc_tính]
: Chọn các phần tử có thuộc tính được chỉ định.[thuộc_tính="giá_trị"]
: Chọn các phần tử có thuộc tính và giá trị cụ thể.[thuộc_tính~="giá_trị"]
: Chọn các phần tử có thuộc tính chứa một từ cụ thể trong danh sách các từ được phân tách bằng khoảng trắng.[thuộc_tính^="giá_trị"]
: Chọn các phần tử có thuộc tính bắt đầu bằng giá_trị
.[thuộc_tính$="giá_trị"]
: Chọn các phần tử có thuộc tính kết thúc bằng giá_trị
.[thuộc_tính*="giá_trị"]
: Chọn các phần tử có thuộc tính chứa giá_trị
ở bất kỳ đâu.
<a href="https://example.com" target="_blank">Trang web ngoài</a>
<a href="/internal-page">Trang nội bộ</a>
<input type="text" placeholder="Nhập tên">
<input type="submit" value="Gửi đi">
<img src="image1.png" alt="Ảnh 1">
<img src="icon_home.svg" alt="Icon Home">
a[target="_blank"] {
color: orange;
}
input[type="text"] {
border: 1px solid blue;
}
input[type="submit"] {
background-color: green;
color: white;
}
img[src$=".svg"] {
width: 24px;
height: 24px;
}
a[href^="https"] {
text-decoration: none;
}
<a>
có thuộc tính target="_blank"
sẽ có màu cam.<input>
có type="text"
sẽ có border màu xanh.<input>
có type="submit"
sẽ có nền xanh lá cây và chữ trắng.<img>
có thuộc tính src
kết thúc bằng .svg
sẽ có kích thước 24x24px.<a>
có thuộc tính href
bắt đầu bằng https
sẽ không có gạch chân.---
Ngoài các loại cơ bản, CSS còn cung cấp các selectors mạnh mẽ hơn để kết hợp các bộ chọn hoặc chọn phần tử dựa trên mối quan hệ của chúng trong cấu trúc DOM.
Bộ chọn tổ hợp cho phép bạn chọn các phần tử dựa trên mối quan hệ giữa chúng.
selector1 selector2 { /* CSS */ }
selector2
là con cháu của selector1
(có thể lồng sâu bên trong).div p { color: purple; }
(Chọn tất cả các thẻ <p>
nằm bên trong thẻ <div>
)selector1 > selector2 { /* CSS */ }
selector2
là con trực tiếp của selector1
.ul > li { list-style-type: square; }
(Chỉ chọn các thẻ <li>
là con trực tiếp của thẻ <ul>
)selector1 + selector2 { /* CSS */ }
selector2
là phần tử anh em đứng ngay sau selector1
và có cùng cấp độ.h2 + p { margin-top: 0; }
(Chọn thẻ <p>
ngay sau thẻ <h2>
cùng cấp độ)selector1 ~ selector2 { /* CSS */ }
selector2
là phần tử anh em đứng sau selector1
(không cần kề cận) và có cùng cấp độ.h2 ~ p { border-bottom: 1px dotted gray; }
(Chọn tất cả các thẻ <p>
đứng sau thẻ <h2>
cùng cấp độ)Pseudo-classes cho phép bạn chọn các phần tử dựa trên trạng thái của chúng, thay vì cấu trúc cây tài liệu.
:hover
: Chọn phần tử khi con trỏ chuột di chuyển qua.
a:hover { color: red; }
(Thay đổi màu chữ của liên kết thành đỏ khi rê chuột qua):active
: Chọn phần tử khi đang được kích hoạt (nhấn chuột).
button:active { background-color: #333; }
:focus
: Chọn phần tử khi nó đang nhận được sự tập trung (ví dụ: ô input được chọn).
input:focus { outline: 2px solid blue; }
:nth-child(n)
/ :nth-of-type(n)
: Chọn phần tử con thứ n
trong nhóm anh em.
li:nth-child(even) { background-color: #eee; }
(Chọn các <li>
chẵn):first-child
/ :last-child
: Chọn phần tử con đầu tiên/cuối cùng.:not(selector)
: Chọn các phần tử không khớp với selector
được chỉ định.
p:not(.highlight) { color: black; }
(Chọn các đoạn văn không có class "highlight"):visited
, :checked
, :disabled
, :empty
, v.v.Pseudo-elements cho phép bạn tạo kiểu cho một phần của phần tử không có trong cây DOM thực tế.
::before
: Chèn nội dung ảo trước nội dung của phần tử.
p::before { content: "Lưu ý: "; font-weight: bold; }
::after
: Chèn nội dung ảo sau nội dung của phần tử.
a::after { content: " (" attr(href) ")"; }
(Hiển thị URL sau liên kết)::first-line
: Chọn dòng đầu tiên của một khối văn bản.::first-letter
: Chọn chữ cái đầu tiên của một khối văn bản.::selection
: Chọn văn bản được người dùng highlight.---
Khi nhiều quy tắc CSS cùng áp dụng cho một phần tử, trình duyệt sẽ quyết định quy tắc nào được áp dụng dựa trên thứ tự ưu tiên (specificity). Thứ tự ưu tiên được tính dựa trên số lượng ID, class và tên thẻ trong selector.
!important
sẽ ghi đè lên tất cả các quy tắc khác (nên hạn chế sử dụng vì nó gây khó khăn trong việc debug và bảo trì).Ví dụ về thứ tự ưu tiên:
<p id="myParagraph" class="text-red">Đây là một đoạn văn.</p>
p {
color: green; /* Thấp nhất */
}
.text-red {
color: red; /* Cao hơn element */
}
#myParagraph {
color: blue; /* Cao nhất */
}
Trong trường hợp này, đoạn văn sẽ có màu xanh dương vì selector ID có thứ tự ưu tiên cao nhất.
---
Cách tốt nhất để nắm vững selectors là thực hành. Hãy thử nghiệm với các loại selectors khác nhau, kết hợp chúng lại và quan sát kết quả trên trình duyệt. Bạn sẽ nhanh chóng nhận ra sức mạnh và sự linh hoạt của công cụ này trong việc xây dựng giao diện web.
---
Selectors là xương sống của CSS, cho phép bạn nhắm mục tiêu và định kiểu chính xác các phần tử HTML. Bằng cách hiểu rõ các loại selectors cơ bản, nâng cao và cách thứ tự ưu tiên hoạt động, bạn sẽ có khả năng tạo ra các trang web có giao diện đẹp mắt, linh hoạt và dễ bảo trì. Hãy tận dụng tối đa sức mạnh của selectors để nâng cao kỹ năng phát triển web của bạn!