Menu

Box shadow trong CSS: cú pháp, spread, inset và ví dụ

box-shadow vẽ bóng đổ quanh hộp của một phần tử. Tìm hiểu năm giá trị (x, y, blur, spread, màu), bóng inset, xếp chồng nhiều lớp bóng để có chiều sâu tự nhiên, vòng focus tạo bằng spread, và những lỗi làm bóng trông bẩn.

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.

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ĩaMặc định
insetVẽ bóng bên trong hộp, như một vùng bị ấn lõmBên ngoài
offset-xDương dịch sang phải, âm sang tráiBắt buộc
offset-yDương dịch xuống dưới, âm lên trênBắt buộc
blurĐộ mềm của mép bóng; không được âm0 (mép sắc)
spreadPhóng to (dương) hoặc thu nhỏ (âm) bóng0
colorMàu bất kỳ; màu đen bán trong suốt thường đẹp nhấtMà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: hidden cắ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-shadow trê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 cho opacity củ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.

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