Menu

Hover trong CSS: :hover, :active và màu liên kết

Pseudo-class :hover định dạng một phần tử khi con trỏ đang nằm trên nó. Tìm hiểu hiệu ứng hover cho nút và thẻ, chuyển động mượt bằng transition, màu liên kết với :link, :visited, :hover và :active theo đúng thứ tự, và hover trên màn hình cảm ứng.

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.

:hover hoạt động thế nào

:hover là một pseudo-class khớp với phần tử khi con trỏ chuột đang nằm trên nó. Thêm nó vào bất kỳ selector nào và viết kiểu cho trạng thái hover:

Chỉ những khai báo trong quy tắc :hover thay đổi; mọi thứ khác giữ nguyên từ .btn. Khi con trỏ rời đi, phần tử trở về kiểu bình thường.

Hiệu ứng hover mượt với transition

Thay đổi khi hover diễn ra tức thì, trừ khi bạn thêm transition vào quy tắc bình thường (không phải quy tắc :hover), để chuyển động diễn ra cả lúc vào lẫn lúc ra:

transform và opacity là những thuộc tính nhẹ nhất để tạo chuyển động; chúng không xô đẩy các phần tử xung quanh. Tạo chuyển động cho width, height hoặc margin khiến trang phải tính lại bố cục ở mỗi khung hình. Thời lượng, độ trễ và đường cong easing có ở trang transition trong CSS.

Liên kết có bốn trạng thái kinh điển, cộng thêm trạng thái focus bằng bàn phím, và thứ tự các quy tắc rất quan trọng:

Pseudo-classÁp dụng khi
:linkLiên kết chưa được truy cập
:visitedURL đã có trong lịch sử trình duyệt
:hoverCon trỏ đang nằm trên nó
:activeNó đang được nhấn
:focus-visibleNó đang được focus bằng bàn phím

Tất cả đều có cùng độ ưu tiên, nên khi hai quy tắc cùng khớp, quy tắc đứng sau thắng. Một liên kết đã truy cập đang được hover khớp cả :visited lẫn :hover; nếu :visited đứng cuối, màu hover sẽ không bao giờ hiện ra. Thứ tự an toàn là Link, Visited, Hover, Active (LVHA):

Trình duyệt giới hạn những gì :visited có thể thay đổi, để ngăn trang web đọc lịch sử duyệt web của bạn. Chỉ các thuộc tính liên quan đến màu (color, background-color, border-color, outline-color và vài thuộc tính khác) có tác dụng, và script luôn thấy giá trị của trạng thái chưa truy cập.

:active: trạng thái đang nhấn

:active khớp khi phần tử đang được nhấn. Một chuyển động nhỏ khiến nút có cảm giác như nút thật:

Hover phần tử cha để định dạng phần tử con

Trạng thái hover thuộc về phần tử nằm dưới con trỏ và mọi phần tử tổ tiên của nó. Vì vậy .card:hover .title định dạng tiêu đề bất cứ khi nào bất kỳ phần nào của thẻ được hover, và cùng ý tưởng đó làm hiện ra các phần tử đang ẩn:

Dòng :focus-within rất quan trọng: thiếu nó, người dùng bàn phím nhấn Tab đến nút Delete sẽ nhấn vào một nút vô hình. Hãy đi kèm mỗi hiệu ứng hiện ra khi hover với một quy tắc focus.

Hover trên màn hình cảm ứng

Điện thoại và máy tính bảng không có con trỏ dừng trên một phần tử. Phần lớn trình duyệt di động áp dụng :hover ở lần chạm đầu tiên và giữ nó cho đến khi bạn chạm chỗ khác, nên kiểu hover có thể trông như bị kẹt. Hai quy tắc giúp kiểm soát việc này:

  • Đừng bao giờ để :hover là cách duy nhất để tiếp cận nội dung. Một menu mở khi hover cũng cần mở được khi bấm.
  • Bọc các hiệu ứng hover thuần trang trí trong một media query kiểm tra thiết bị có hover thật:
@media (hover: hover) {
  .card:hover { transform: translateY(-4px); }
}

Lỗi thường gặp

  • Có dấu cách trước dấu hai chấm. .btn :hover nghĩa là "một phần tử đang được hover bên trong .btn". Viết .btn:hover.
  • Chỉ đặt transition trong quy tắc :hover. Khi đó chuyển động chỉ diễn ra lúc vào, còn lúc ra thì giật về ngay. Đặt nó trong quy tắc bình thường.
  • Sai thứ tự liên kết. Giữ :link, :visited, :hover, :active theo đúng thứ tự đó.
  • Có hover mà không có kiểu focus. Người dùng bàn phím không bao giờ kích hoạt :hover; hãy cho các phần tử tương tác thêm kiểu :focus-visible.
  • Hover trên phần tử bị phần tử khác che. Một lớp phủ vô hình (thường là một pseudo-element định vị absolute) có thể bắt mất con trỏ. pointer-events: none trên lớp phủ sẽ sửa được.

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

Làm sao thêm hiệu ứng hover trong CSS?

Viết một quy tắc có :hover sau selector: .btn:hover { background: #1d4ed8; }. Các khai báo có tác dụng khi con trỏ nằm trên phần tử. Thêm transition: background 0.2s; vào quy tắc bình thường để thay đổi diễn ra mượt.

:hover và :active khác nhau thế nào?

:hover có tác dụng khi con trỏ nằm trên phần tử. :active có tác dụng khi phần tử đang được nhấn, từ lúc nhấn chuột xuống đến lúc nhả ra. Một nút đang được nhấn thường vừa hover vừa active.

Các pseudo-class của liên kết nên theo thứ tự nào?

:link, :visited, :hover, :active (nhớ là LVHA, hay "LoVe HAte"). Chúng có cùng độ ưu tiên, nên quy tắc đứng sau thắng; theo bất kỳ thứ tự nào khác, kiểu visited hoặc hover có thể che mất kiểu hover hoặc active.

Làm sao đổi màu liên kết trong CSS?

Định dạng phần tử a: a { color: #2563eb; }, rồi a:visited { color: #7c3aed; } và a:hover { color: #1d4ed8; } cho các trạng thái còn lại. Đặt color trên a áp dụng cho cả liên kết chưa truy cập và đã truy cập.

Hover có hoạt động trên điện thoại không?

Màn hình cảm ứng không có con trỏ để dừng trên một phần tử. Phần lớn trình duyệt di động áp dụng :hover khi chạm và giữ nó cho đến khi bạn chạm chỗ khác, nên kiểu hover có thể bị kẹt lại. Bọc các hiệu ứng chỉ dành cho hover trong @media (hover: hover) và đừng bao giờ giấu nội dung quan trọng sau hover.

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