Menu

CSS opacity: độ trong suốt cho phần tử, nền và hiệu ứng mờ

opacity làm cả phần tử và mọi thứ bên trong nó trong suốt, từ 0 (vô hình) đến 1 (đặc hoàn toàn). Tìm hiểu các giá trị, vì sao opacity làm mờ cả chữ và cách chỉ làm nền trong suốt, so sánh opacity: 0 với visibility và display, và hiệu ứng mờ khi rê chuột.

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.

opacity làm gì

opacity đặt mức trong suốt của phần tử: 1 là đặc (mặc định), 0 là vô hình, và mọi giá trị ở giữa cho phần nền phía sau lộ ra. Các hộp dưới đây nằm trên nền kẻ sọc để bạn dễ thấy:

Hộp cuối cùng vẫn ở đó: nó vẫn chiếm ô 90px trong hàng, chỉ là không vẽ gì cả. Để ý rằng các con số màu trắng mờ đi cùng hộp của chúng. opacity áp dụng cho phần tử và mọi thứ bên trong nó.

Nền trong suốt, chữ vẫn rõ

Vì opacity làm mờ cả phần tử con, nó là công cụ sai cho kiểu "nền trong suốt phía sau chữ dễ đọc". Hãy dùng màu nền có kênh alpha:

Cả hai tấm nền trắng đều để sọc lộ ra ở cùng một mức. Ở tấm đầu, chữ mờ đi cùng tấm nền. Ở tấm thứ hai, chỉ màu nền là trong suốt (rgb(255 255 255 / 0.6), tương đương rgba(255, 255, 255, 0.6)), nên chữ vẫn đặc và dễ đọc. Màu có kênh alpha được giải thích trong trang màu sắc.

Phần tử con không thể thoát khỏi opacity của phần tử cha: opacity: 1 trên phần tử con chẳng có tác dụng gì, vì phần tử cha được vẽ thành một lớp mờ duy nhất, với phần tử con đã nằm sẵn bên trong.

Các giá trị

Giá trịKết quả
1 hoặc 100%đặc hoàn toàn (mặc định)
0.5 hoặc 50%trong suốt một nửa
0 hoặc 0%trong suốt hoàn toàn, vẫn nằm trong bố cục và vẫn bấm được
1.5, -1bị giới hạn về 1 và 0

Opacity được "kế thừa" về mặt hiển thị chứ không phải về thuộc tính: opacity đã tính của phần tử con vẫn là 1, trong khi nó được vẽ bên trong một phần tử cha đã mờ.

opacity: 0, visibility: hidden và display: none

Cả ba đều làm phần tử biến mất, nhưng khác nhau ở mọi điểm còn lại:

opacity: 0visibility: hiddendisplay: none
Chiếm chỗcócókhông
Nhận cú bấm và focuscókhôngkhông
Được trình đọc màn hình đọccókhôngkhông
Có thể dùng transitioncó, mượtđổi ở một đầu, không mờ dầnkhông

Khác biệt gây rắc rối là hàng thứ hai. Một nút ở opacity: 0 vẫn bấm được và vẫn nhảy tới được bằng phím Tab:

Phần kết quả hỏi trình duyệt phần tử nào đang nằm dưới một điểm bên trong mỗi nút bị ẩn. Nút opacity: 0 trả lời "clickable"; nút visibility: hidden thì không. Nút Visible bắt đầu sau hai ô trống 150px, vì nút display: none là nút duy nhất đã trả lại chỗ của nó. Để làm mờ dần một thứ rồi gỡ nó đi, hãy tạo animation cho opacity và đặt visibility: hidden ở cuối.

Hiệu ứng mờ khi rê chuột

opacity là một trong những thuộc tính rẻ nhất để tạo animation, nên đây là cách chuẩn để làm hiện dần và mờ dần. Một chú thích hiện lên trên ảnh:

:focus-within cũng cho người dùng bàn phím thấy chú thích. Nhớ bảng ở trên: khi vô hình, chú thích vẫn được trình đọc màn hình đọc, và đó đúng là điều bạn muốn với một chú thích.

Khả năng tiếp cận: chữ mờ thì mất độ tương phản

Giảm opacity là giảm độ tương phản. Chữ xám trên nền trắng ở opacity: 0.5 có thể tụt xa dưới tỷ lệ 4.5:1 mà văn bản cần. Với chữ phụ, hãy chọn một màu đạt độ tương phản thay vì làm mờ một màu tối. Với các nút bị vô hiệu hóa, giảm opacity là tín hiệu phổ biến, nhưng hãy dùng kèm thuộc tính disabled để nút cũng không thể tới được bằng bàn phím và được thông báo là đã bị vô hiệu hóa.

Tác dụng phụ: stacking context

Bất kỳ opacity nào dưới 1 đều tạo một stacking context mới, giống như transform. Khi đó các phần tử con có z-index cao chỉ xếp lớp bên trong phần tử bị mờ và không thể nổi lên trên các phần tử bên ngoài. Nếu một dropdown trong tấm panel bị mờ chui xuống dưới một phần tử khác, đây chính là lý do (trang z-index giải thích cách xếp lớp).

Lỗi thường gặp

  • Làm mờ cả thẻ để nền trong suốt. Chữ cũng mờ theo. Hãy dùng rgb(... / 0.5) cho nền.
  • Cố làm phần tử con đặc trở lại. Opacity của phần tử cha giới hạn mọi phần tử con.
  • Chỉ dùng opacity: 0 để ẩn. Phần tử vẫn nhận cú bấm và focus. Hãy thêm visibility: hidden, hoặc dùng display: none (pointer-events: none chặn cú bấm nhưng không chặn focus bằng bàn phím).
  • Viết opacity: 50. Opacity đi từ 0 đến 1; 50 bị giới hạn về 1. Hãy viết 0.5 hoặc 50%.
  • Chữ có độ tương phản thấp vì opacity. Hãy kiểm tra độ tương phản của kết quả, không phải của màu gốc.

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

opacity trong CSS dùng để làm gì?

Thuộc tính này đặt mức trong suốt của phần tử, từ 0 (trong suốt hoàn toàn) đến 1 (đặc hoàn toàn). Nó áp dụng cho cả phần tử, gồm chữ, viền, hình ảnh và mọi phần tử con, như một lớp duy nhất đã được gộp lại.

Làm sao chỉ làm nền trong suốt mà chữ không bị mờ?

Đừng đụng đến opacity, hãy cho nền một màu có kênh alpha: background-color: rgb(37 99 235 / 0.5); hoặc rgba(37, 99, 235, 0.5). Chữ và các phần tử con vẫn đặc hoàn toàn.

Phần tử con có thể đặc hơn phần tử cha không?

Không. Opacity của phần tử cha áp dụng cho cả nhóm, nên opacity: 1 trên phần tử con không thể gỡ bỏ nó. Phần tử con của một cha ở mức 0.5 chỉ được vẽ tối đa ở nửa độ đặc. Hãy chuyển độ trong suốt sang màu nền của phần tử cha.

opacity: 0, visibility: hidden và display: none khác nhau thế nào?

opacity: 0 ẩn phần tử nhưng nó vẫn chiếm chỗ, vẫn bấm được và vẫn được trình đọc màn hình đọc. visibility: hidden giữ chỗ nhưng không bấm được và không được đọc. display: none gỡ hẳn phần tử khỏi bố cục.

opacity có thể dùng phần trăm không?

Có. opacity: 50% giống hệt opacity: 0.5 trên mọi trình duyệt hiện nay. Giá trị dưới 0 hoặc trên 1 sẽ bị giới hạn lại trong khoảng đó.

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