box-shadow hoạt động thế nào
box-shadow vẽ bóng quanh vùng border của phần tử. Bóng đi theo border-radius, không chiếm chỗ trong bố cục, và cần ít nhất hai giá trị: dịch bao xa theo chiều ngang và chiều dọc.
Cú pháp
box-shadow: [inset] <offset-x> <offset-y> [<blur>] [<spread>] [<color>];
| Giá trị | Ý nghĩa | Mặc định |
|---|---|---|
inset | Vẽ bóng bên trong hộp, như một vùng bị ấn lõm | Bên ngoài |
| offset-x | Dương dịch sang phải, âm sang trái | Bắt buộc |
| offset-y | Dương dịch xuống dưới, âm lên trên | Bắt buộc |
| blur | Độ mềm của mép bóng; không được âm | 0 (mép sắc) |
| spread | Phóng to (dương) hoặc thu nhỏ (âm) bóng | 0 |
| color | Màu bất kỳ; màu đen bán trong suốt thường đẹp nhất | Màu chữ |
Số lượng giá trị độ dài quyết định ý nghĩa của chúng: hai giá trị là offset, ba thêm blur, bốn thêm spread. Thử xem:
Thử 0 0 0 4px #f59e0b (một vòng), inset 0 0 12px #2563eb và -8px -8px 0 #16a34a.
Spread: vòng viền và bóng một phía
Spread thay đổi kích thước bóng trước khi làm mờ. Từ đó có hai mẫu hay dùng:
- Một vòng: không offset, không blur, chỉ có spread. Khác với border, nó không làm thay đổi kích thước phần tử, nên là chỉ báo focus tốt (
:focus-visible { box-shadow: 0 0 0 3px #2563eb; }). - Vòng có khe hở: chồng một spread màu trắng bên dưới một spread có màu lớn hơn.
- Chỉ một phía: dịch bóng xuống và thu nhỏ bằng spread âm, để bóng chỉ ló ra ở cạnh dưới.
Nhiều lớp bóng cho chiều sâu tự nhiên
Bóng thật có phần tối, sắc nét ở gần vật thể và phần mềm, nhạt ở xa hơn. Hai hoặc ba lớp bóng mô phỏng điều đó tốt hơn nhiều so với một lớp blur lớn:
Bóng đầu tiên trong danh sách được vẽ trên cùng. Giữ màu bóng là đen bán trong suốt hoặc một tông tối của màu nền, đừng bao giờ dùng xám đặc, để bóng làm tối đi bất cứ thứ gì nằm bên dưới.
Bóng inset
inset vẽ bóng bên trong vùng padding, như thể bề mặt bị ấn lõm xuống. Kiểu này hợp với ô nhập liệu, vùng lõm và nút đang được nhấn:
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%);
}
Bóng inset được vẽ trên nền nhưng dưới nội dung. Bóng đi theo hình dạng chữ thay vì theo hộp là text-shadow.
Lỗi thường gặp
- Bóng đen tuyền, không trong suốt. Trông như đường viền tối. Hãy dùng alpha từ 10% đến 30%.
- Một lớp blur thật lớn để tạo chiều sâu. Hãy xếp một bóng nhỏ, sắc với một bóng lớn, mềm.
- Bóng bị cắt ở mép. Một phần tử tổ tiên có
overflow: hiddencắt mất nó; thêm padding cho phần tử tổ tiên hoặc chuyển quy tắc overflow đi chỗ khác. - Blur âm. Giá trị này không hợp lệ và cả khai báo bị bỏ qua.
- Tạo animation cho
box-shadowtrên nhiều phần tử. Nó vẽ lại ở mỗi khung hình. Với trang nặng, hãy tạo animation choopacitycủa một pseudo-element mang bóng lớn hơn.
Câu hỏi thường gặp
Cú pháp box-shadow là gì?
box-shadow: offset-x offset-y blur spread color;, ví dụ box-shadow: 0 4px 12px 0 rgb(0 0 0 / 15%);. Chỉ hai giá trị offset là bắt buộc; thêm inset để vẽ bóng bên trong hộp.
spread trong box-shadow có tác dụng gì?
Nó phóng to (giá trị dương) hoặc thu nhỏ (giá trị âm) bóng trước khi làm mờ. Bóng không có offset, không blur và spread 3px là một vòng đặc dày 3px quanh phần tử.
Làm sao chỉ đổ bóng ở cạnh dưới?
Dịch bóng xuống dưới và thu vào bằng spread âm để hai bên biến mất: box-shadow: 0 8px 6px -6px rgb(0 0 0 / 40%);.
box-shadow có ảnh hưởng đến bố cục không?
Không. Bóng không chiếm chỗ và không làm dịch chuyển phần tử khác, vì vậy đây là cách tốt để thêm vòng focus hoặc hiệu ứng nổi lên khi hover mà không làm xê dịch bố cục. Bóng có thể bị cắt bởi overflow: hidden của một phần tử tổ tiên.
Có thể dùng nhiều box shadow không?
Có, ngăn cách chúng bằng dấu phẩy. Bóng đầu tiên được vẽ trên cùng. Xếp một bóng nhỏ, sắc nét với một bóng lớn, mềm trông tự nhiên hơn một bóng lớn duy nhất.