Trình tạo box-shadow CSS

Tiếp theo

Tạo từng quy tắc box-shadow một: đặt độ lệch ngang và dọc, độ mờ, độ lan, màu sắc cùng tùy chọn inset, rồi sao chép kết quả. Bóng đổ thật thường cần hai hoặc ba lớp, vì vậy hãy tạo từng lớp riêng rồi nối các quy tắc bằng dấu phẩy.

Cách thiết kế một box-shadow

  1. 1

    Đặt giá trị bóng đổ

    Độ lệch ngang, độ lệch dọc, bán kính mờ, độ lan và màu sắc kèm độ mờ đục.

  2. 2

    Bật/tắt inset

    Lật bóng đổ sang inset để có bóng bên trong, hữu ích cho các nút được nhấn và hiệu ứng lõm.

  3. 3

    Chọn màu bóng đổ

    Màu đen với độ mờ đục thấp là lựa chọn kinh điển. Bóng đổ có màu (cùng tông với phần tử nhưng đậm hơn) trông tự nhiên hơn.

  4. 4

    Sao chép CSS

    Sao chép quy tắc bóng đổ đơn lẻ rồi dán vào bảng định kiểu của bạn. Để có bóng nhiều lớp, hãy tạo từng lớp riêng rồi nối các quy tắc bằng dấu phẩy.

Cú pháp box-shadow

box-shadow: <x-offset> <y-offset> <blur> <spread> <colour> [inset];
  • x-offset: giá trị dương = sang phải, giá trị âm = sang trái.
  • y-offset: giá trị dương = xuống dưới, giá trị âm = lên trên.
  • blur: 0 = cạnh sắc nét, giá trị càng cao càng mềm mại. Kích thước hiển thị lan ra ngoài phần tử khoảng 1,5 lần giá trị độ mờ.
  • spread: kích thước tăng thêm vượt ra ngoài phần tử. Giá trị dương làm bóng đổ to ra; giá trị âm làm nó nhỏ lại (hữu ích cho các quầng sáng tinh tế).
  • colour: hỗ trợ mọi màu CSS. rgba(0, 0, 0, 0.15) là giá trị cơ bản dùng nhiều nhất.
  • inset: từ khóa lật bóng đổ vào bên trong phần tử.

Bóng đổ nhiều lớp trông chân thực

Trình tạo này xuất ra một quy tắc bóng đổ tại một thời điểm; để tạo bóng nhiều lớp, hãy tạo từng lớp riêng rồi nối các quy tắc bằng dấu phẩy.

Một bóng đổ đơn với 0 0 40px trông mờ ảo. Hai bóng đổ, một bóng nhỏ và sắc nét ở gần phần tử, cùng một bóng lớn hơn và mềm hơn ở xa hơn, mô phỏng cách ánh sáng thật tán xạ.

box-shadow:
  0 1px 2px rgba(0, 0, 0, 0.08),
  0 4px 12px rgba(0, 0, 0, 0.08);

Dòng đầu tạo bóng tiếp xúc sát phần tử; dòng thứ hai tạo bóng môi trường mềm hơn. Chỉ một mẫu này thôi đã bao phủ 80% giao diện kiểu thẻ.

Hệ thống độ cao (elevation)

Material Design dùng 6 cấp độ cao (elevation), mỗi cấp có một bộ bóng đổ riêng. Tóm tắt lại:

Độ cao Bóng đổ
1 (ở trạng thái nghỉ) 0 1px 3px rgba(0,0,0,.12), 0 1px 2px rgba(0,0,0,.24)
2 0 3px 6px rgba(0,0,0,.16), 0 3px 6px rgba(0,0,0,.23)
3 0 10px 20px rgba(0,0,0,.19), 0 6px 6px rgba(0,0,0,.23)
4 (được nâng lên) 0 14px 28px rgba(0,0,0,.25), 0 10px 10px rgba(0,0,0,.22)
5 (lơ lửng) 0 19px 38px rgba(0,0,0,.30), 0 15px 12px rgba(0,0,0,.22)

Hãy chọn một bộ cho mỗi vai trò độ cao và dùng nhất quán.

Bóng đổ có màu trông tự nhiên hơn

Bóng đổ đen tuyền trông giả tạo, vì bóng đổ thật được nhuốm màu bởi bề mặt bên dưới. Hãy thử:

box-shadow: 0 12px 24px rgba(40, 80, 120, 0.18);

Một màu xanh xám lạnh thay cho đen tuyền. Trên các nền màu ấm, hãy dùng tông màu ấm hơn.

Hiệu năng

box-shadow được vẽ lại mỗi khi trình duyệt repaint. Bóng đổ lớn và nặng trên nhiều phần tử có thể làm chậm thao tác cuộn. Cách giảm thiểu:

  • Dùng transform: translateZ(0) trên phần tử để buộc tạo một lớp tổng hợp.
  • Chỉ thay thế bóng đổ phức tạp bằng filter: drop-shadow() khi bạn cần bóng đổ bám theo clip-path (nhìn chung cách này chậm hơn).
  • Hạn chế bóng đổ trên các phần tử thường xuyên được vẽ lại.

inset cho các trạng thái được nhấn

.button:active {
  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.12);
}

Bóng đổ inset mô phỏng vẻ lõm xuống, nút trông như bị ấn vào bề mặt. Kết hợp với một transform: translateY(1px) nhỏ hướng xuống để có cảm giác nhấn rõ rệt.

Câu hỏi thường gặp

Thường là do độ mờ quá thấp hoặc độ lan quá cao. Một bóng đổ cạnh sắc không có độ mờ trông giống như một phần tử bị nhân đôi. Hãy tăng độ mờ (20-30px là điểm khởi đầu phổ biến) và giữ độ lan ở mức 0 hoặc các giá trị âm rất nhỏ.

box-shadow bám theo border-box của phần tử, bao gồm cả border-radius, nhờ vậy các thẻ bo tròn tự động có bóng đổ bo tròn đẹp mắt. Với các hình dạng dùng clip-path, box-shadow không bám theo vùng cắt; hãy dùng filter: drop-shadow() thay thế.

Hãy dịch bóng đổ thật mạnh theo hướng đã chọn và dùng độ lan âm để giấu phía đối diện. Hoặc dùng hai bóng đổ, một bóng hiển thị ở phía mục tiêu, bóng còn lại dùng độ lan âm để “ăn” phần tràn ra không mong muốn.

Không có giới hạn cứng, nhưng mỗi bóng đổ là thêm một lượt vẽ. Ba đến bốn lớp là mức trần thực tế; nhiều hơn nữa thì bạn nên cân nhắc dùng ảnh nền hoặc SVG thay thế.

Công cụ liên quan