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, -1 | bị 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: 0 | visibility: hidden | display: none | |
|---|---|---|---|
| Chiếm chỗ | có | có | không |
| Nhận cú bấm và focus | có | không | không |
| Được trình đọc màn hình đọc | có | không | không |
| Có thể dùng transition | có, mượt | đổi ở một đầu, không mờ dần | khô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êmvisibility: hidden, hoặc dùngdisplay: none(pointer-events: nonechặ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;50bị giới hạn về1. Hãy viết0.5hoặc50%. - 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 đó.