Cara kerja box-shadow
box-shadow melukis bayangan di sekeliling border box elemen. Bayangan mengikuti border-radius, tidak memakan ruang dalam tata letak, dan membutuhkan minimal dua nilai: seberapa jauh ia digeser secara horizontal dan vertikal.
Sintaksnya
box-shadow: [inset] <offset-x> <offset-y> [<blur>] [<spread>] [<color>];
| Nilai | Arti | Default |
|---|---|---|
inset | Menggambar bayangan di dalam kotak, seperti area yang tertekan ke dalam | Di luar |
| offset-x | Positif bergeser ke kanan, negatif ke kiri | Wajib |
| offset-y | Positif bergeser ke bawah, negatif ke atas | Wajib |
| blur | Seberapa lembut tepinya; tidak boleh negatif | 0 (tepi tajam) |
| spread | Memperbesar (positif) atau memperkecil (negatif) bayangan | 0 |
| color | Warna apa pun; hitam semi transparan biasanya terlihat paling bagus | Warna teks |
Jumlah nilai panjang menentukan artinya: dua adalah offset, tiga menambahkan blur, empat menambahkan spread. Coba sendiri:
Coba 0 0 0 4px #f59e0b (sebuah cincin), inset 0 0 12px #2563eb, dan -8px -8px 0 #16a34a.
Spread: cincin dan bayangan satu sisi
Spread mengubah ukuran bayangan sebelum di-blur. Dari situ muncul dua pola:
- Cincin: tanpa offset, tanpa blur, hanya spread. Berbeda dengan border, cincin ini tidak mengubah ukuran elemen, jadi cocok sebagai indikator fokus (
:focus-visible { box-shadow: 0 0 0 3px #2563eb; }). - Cincin dengan celah: tumpuk spread putih di bawah spread berwarna yang lebih besar.
- Satu sisi saja: geser bayangan ke bawah dan kecilkan dengan spread negatif, sehingga hanya mengintip di bagian bawah.
Bayangan bertumpuk untuk kedalaman yang realistis
Bayangan sungguhan punya bagian gelap dan tajam yang dekat dengan benda, serta bagian lembut dan samar yang lebih jauh. Dua atau tiga lapisan meniru hal itu jauh lebih baik daripada satu blur besar:
Bayangan pertama di daftar dilukis paling atas. Gunakan warna bayangan hitam semi transparan atau versi gelap dari warna background, jangan pernah abu-abu murni, supaya bayangan menggelapkan apa pun yang ada di bawahnya.
Bayangan inset
inset menggambar bayangan di dalam padding box, seolah-olah permukaannya tertekan ke dalam. Cocok untuk input teks, area cekung, dan tombol yang sedang ditekan:
input {
box-shadow: inset 0 1px 3px rgb(0 0 0 / 20%);
}
button:active {
box-shadow: inset 0 3px 6px rgb(0 0 0 / 30%);
}
Bayangan inset digambar di atas background tetapi di bawah konten. Bayangan yang mengikuti bentuk huruf, bukan kotak, adalah text-shadow.
Kesalahan umum
- Bayangan hitam pekat yang sepenuhnya tidak transparan. Hasilnya terlihat seperti garis tepi gelap. Pakai alpha 10% sampai 30%.
- Satu blur raksasa untuk kedalaman. Tumpuk bayangan kecil yang tajam dengan bayangan besar yang lembut.
- Bayangan terpotong di tepi. Leluhur dengan
overflow: hiddenmemotongnya; tambahkan padding pada leluhur itu atau pindahkan aturan overflow-nya. - Blur negatif. Nilai ini tidak valid dan seluruh deklarasinya diabaikan.
- Menganimasikan
box-shadowpada banyak elemen. Browser melukis ulang di setiap frame. Untuk halaman yang berat, animasikanopacitydari pseudo-element yang membawa bayangan lebih besar sebagai gantinya.
Pertanyaan yang sering diajukan
Bagaimana sintaks box-shadow?
box-shadow: offset-x offset-y blur spread color;, misalnya box-shadow: 0 4px 12px 0 rgb(0 0 0 / 15%);. Hanya dua offset yang wajib; tambahkan inset untuk menggambar bayangan di dalam kotak.
Apa fungsi spread di box-shadow?
Spread memperbesar (positif) atau memperkecil (negatif) bayangan sebelum di-blur. Bayangan tanpa offset, tanpa blur, dan dengan spread 3px adalah cincin pekat setebal 3px di sekeliling elemen.
Bagaimana cara memberi bayangan hanya di bagian bawah?
Geser bayangannya ke bawah dan kecilkan dengan spread negatif agar sisi-sisinya hilang: box-shadow: 0 8px 6px -6px rgb(0 0 0 / 40%);.
Apakah box-shadow memengaruhi tata letak?
Tidak. Bayangan tidak memakan ruang dan tidak menggeser elemen lain, itulah sebabnya bayangan cocok untuk menambahkan focus ring atau efek terangkat saat hover tanpa pergeseran tata letak. Bayangan bisa terpotong oleh overflow: hidden milik leluhurnya.
Bisakah saya memakai beberapa box shadow?
Bisa, pisahkan dengan koma. Bayangan pertama digambar paling atas. Menumpuk bayangan kecil yang tajam dengan bayangan besar yang lembut terlihat lebih alami daripada satu bayangan besar.