Apa fungsi opacity
opacity mengatur seberapa tembus pandang sebuah elemen: 1 berarti padat (default), 0 berarti tidak terlihat, dan nilai apa pun di antaranya membuat latar di belakangnya terlihat. Kotak-kotak di bawah berada di atas latar bergaris supaya kamu bisa melihatnya:
Kotak terakhir masih ada: kotak itu tetap memakai slot 90px-nya di baris, hanya saja tidak menggambar apa pun. Perhatikan bahwa angka putihnya ikut memudar bersama kotaknya. opacity berlaku untuk elemen dan semua isinya.
Background transparan, teks tetap padat
Karena opacity ikut memudarkan child, property ini adalah alat yang salah untuk "background tembus pandang di belakang teks yang mudah dibaca". Pakai warna background dengan channel alpha:
Kedua panel putih membuat garis-garisnya terlihat dengan kadar yang sama. Di panel pertama, teksnya ikut memudar bersama panel. Di panel kedua, hanya warna background-nya yang transparan (rgb(255 255 255 / 0.6), sama dengan rgba(255, 255, 255, 0.6)), jadi teksnya tetap padat dan mudah dibaca. Warna dengan alpha dibahas di halaman colors.
Child tidak bisa lepas dari opacity elemen induknya: opacity: 1 pada child tidak berpengaruh apa-apa, karena elemen induk digambar sebagai satu lapisan pudar dengan child yang sudah ada di dalamnya.
Nilai
| Nilai | Hasil |
|---|---|
1 atau 100% | tidak transparan sama sekali (default) |
0.5 atau 50% | setengah transparan |
0 atau 0% | transparan penuh, tetap ada di layout dan bisa diklik |
1.5, -1 | dibatasi menjadi 1 dan 0 |
Secara visual opacity ikut diwariskan, tetapi tidak sebagai property: opacity hasil hitungan pada child tetap 1, sementara child itu digambar di dalam elemen induk yang pudar.
opacity: 0 vs visibility: hidden vs display: none
Ketiganya membuat elemen menghilang, tetapi berbeda dalam semua hal lainnya:
opacity: 0 | visibility: hidden | display: none | |
|---|---|---|---|
| Memakan ruang | ya | ya | tidak |
| Menerima klik dan fokus | ya | tidak | tidak |
| Dibaca oleh screen reader | ya | tidak | tidak |
| Bisa diberi transisi | ya, dengan halus | berganti di salah satu ujung, tanpa fade | tidak |
Perbedaan yang sering menjebak ada di baris kedua. Tombol dengan opacity: 0 masih bisa diklik dan dicapai dengan Tab:
Hasil pembacaannya menanyakan ke browser elemen mana yang berada di bawah sebuah titik di dalam setiap tombol tersembunyi. Tombol opacity: 0 menjawab "clickable", sedangkan tombol visibility: hidden tidak. Tombol Visible dimulai setelah dua slot kosong selebar 150px, karena tombol display: none adalah satu-satunya yang mengembalikan ruangnya. Untuk memudarkan sesuatu lalu menghilangkannya, animasikan opacity lalu atur visibility: hidden di akhir.
Fade saat hover
opacity adalah salah satu property yang paling ringan untuk dianimasikan, jadi property ini menjadi cara standar untuk memunculkan dan menghilangkan sesuatu secara perlahan. Contohnya, keterangan yang muncul di atas gambar:
:focus-within juga menampilkan keterangan itu untuk pengguna keyboard. Ingat tabel di atas: saat tidak terlihat, keterangan itu tetap dibaca oleh screen reader, dan memang itulah yang kamu inginkan untuk sebuah keterangan gambar.
Aksesibilitas: teks yang pudar kehilangan kontras
Menurunkan opacity berarti menurunkan kontras. Teks abu-abu di atas putih dengan opacity: 0.5 bisa turun jauh di bawah rasio 4,5:1 yang dibutuhkan teks paragraf. Untuk teks sekunder, pilih warna yang lolos uji kontras, jangan memudarkan warna gelap. Untuk kontrol yang dinonaktifkan, opacity yang diturunkan adalah tanda yang umum, tetapi pasangkan dengan atribut disabled supaya kontrol itu juga tidak bisa dicapai dengan keyboard dan diumumkan sebagai nonaktif.
Efek samping: stacking context
Setiap opacity di bawah 1 membuat stacking context baru, sama seperti transform. Child dengan z-index tinggi kemudian hanya bertumpuk di dalam elemen yang pudar itu dan tidak bisa naik di atas elemen di luarnya. Kalau dropdown di dalam panel yang pudar meluncur ke bawah elemen lain, inilah penyebabnya (halaman z-index menjelaskan cara kerja penumpukan).
Kesalahan yang sering terjadi
- Memudarkan kartu supaya background-nya transparan. Teksnya ikut memudar. Pakai
rgb(... / 0.5)pada background. - Mencoba membuat child kembali tidak transparan. Opacity elemen induk membatasi setiap child.
- Menyembunyikan hanya dengan
opacity: 0. Elemennya masih menerima klik dan fokus. Tambahkanvisibility: hidden, atau pakaidisplay: none(pointer-events: nonemenghentikan klik, tetapi tidak menghentikan fokus keyboard). - Menulis
opacity: 50. Opacity bernilai 0 sampai 1, jadi50dibatasi menjadi1. Tulis0.5atau50%. - Teks dengan kontras rendah karena opacity. Periksa kontras hasil akhirnya, bukan kontras warna aslinya.
Pertanyaan yang sering diajukan
Apa fungsi opacity di CSS?
Property ini mengatur seberapa tembus pandang sebuah elemen, dari 0 (transparan penuh) sampai 1 (tidak transparan sama sekali). Opacity berlaku untuk seluruh elemen, termasuk teks, border, gambar, dan setiap child-nya, sebagai satu lapisan yang digabung.
Bagaimana cara membuat hanya background yang transparan, bukan teksnya?
Biarkan opacity apa adanya, lalu beri background warna dengan alpha: background-color: rgb(37 99 235 / 0.5); atau rgba(37, 99, 235, 0.5). Teks dan child tetap tidak transparan.
Apakah elemen child bisa lebih tidak transparan daripada elemen induknya?
Tidak bisa. Opacity elemen induk berlaku untuk seluruh kelompok, jadi opacity: 1 pada child tidak bisa membatalkannya. Child dari elemen induk dengan 0.5 paling banter digambar dengan setengah opacity. Pindahkan transparansinya ke warna background elemen induk.
Apa perbedaan opacity: 0, visibility: hidden, dan display: none?
opacity: 0 menyembunyikan elemen, tetapi elemen itu tetap memakan ruang, bisa diklik, dan dibaca oleh screen reader. visibility: hidden tetap memakan ruang, tetapi tidak bisa diklik atau dibaca. display: none menghapusnya dari layout sepenuhnya.
Apakah opacity bisa berupa persentase?
Bisa. opacity: 50% sama dengan opacity: 0.5 di semua browser versi terbaru. Nilai di bawah 0 atau di atas 1 dibatasi ke rentang itu.