Menu

CSS blur và filter: blur(), grayscale, brightness

filter: blur(5px) làm mờ một phần tử, còn backdrop-filter: blur() làm mờ những gì nằm phía sau nó. Tìm hiểu mọi hàm filter (brightness, contrast, grayscale, sepia, saturate, hue-rotate, invert, drop-shadow) qua thanh trượt chạy trực tiếp, cách kết hợp chúng, và vấn đề viền bị mờ.

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.

Làm mờ một phần tử

filter: blur() nhận một độ dài, là bán kính làm mờ. Giá trị càng lớn, phần tử càng mờ:

filter dùng được trên mọi phần tử, không chỉ ảnh: một div bị làm mờ thì chữ, viền và các phần tử con của nó cũng mờ theo. Để ý phần viền mềm của các ảnh bị làm mờ: hiệu ứng blur lan bức ảnh ra ngoài và trộn với vùng trong suốt xung quanh. Cách sửa nằm ở phần "Vấn đề viền bị mờ" bên dưới.

Làm mờ phần nền: backdrop-filter

Để làm mờ những gì nằm phía sau một phần tử (một tấm kính mờ đặt trên ảnh hoặc trên trang), dùng backdrop-filter. Nội dung của chính phần tử vẫn sắc nét. Nó cần một nền nhìn xuyên qua được để thấy hiệu ứng mờ:

Các sọc và hình tròn sắc nét ở xung quanh tấm kính và bị làm mờ ở phía sau nó, còn chữ trên tấm kính không bị ảnh hưởng. Hãy giữ cho chữ dễ đọc: một lớp màu sáng hơn hoặc tối hơn trong màu nền sẽ giúp ích trên những bức ảnh rối mắt.

Mọi hàm filter, chạy trực tiếp

Kéo bất kỳ thanh trượt nào. Dòng dưới ảnh là giá trị filter chính xác, sẵn sàng để sao chép:

Chỉ những hàm bạn đã kéo khỏi giá trị trung tính mới được ghi ra, giúp giá trị ngắn gọn. brightness(1) hay blur(0px) không thay đổi gì, nên không cần liệt kê chúng.

Các hàm filter

HàmGiá trị trung tínhTác dụngVí dụ
blur(r)0Làm mờ Gauss với bán kính rblur(4px)
brightness(n)1tối hơn khi dưới 1, sáng hơn khi trên 1brightness(0.7)
contrast(n)1nhạt hơn khi dưới 1, nổi bật hơn khi trên 1contrast(1.3)
grayscale(n)01 (hoặc 100%) là xám hoàn toàngrayscale(100%)
sepia(n)0tông nâu ấmsepia(0.6)
saturate(n)10 là xám, trên 1 thì rực hơnsaturate(1.5)
hue-rotate(a)0degxoay mọi sắc độ quanh bánh xe màuhue-rotate(90deg)
invert(n)01 là âm bản màu hoàn toàninvert(1)
opacity(n)1giống thuộc tính opacityopacity(0.5)
drop-shadow(x y blur color)bóng đổ bám theo hình dạngdrop-shadow(2px 4px 6px rgb(0 0 0 / 0.3))

Các con số cũng có thể viết dưới dạng phần trăm (grayscale(100%) bằng grayscale(1)). Nhiều hàm có thể đặt trong một giá trị, cách nhau bằng dấu cách, và được áp dụng theo thứ tự: filter: grayscale(1) sepia(1) cho ra tông nâu, còn sepia(1) grayscale(1) lại thành màu xám trơn.

drop-shadow bám theo hình dạng

box-shadow luôn là hình chữ nhật (cùng lắm là bo góc). drop-shadow() được vẽ từ các pixel nhìn thấy được, nên một biểu tượng trong suốt sẽ có bóng mang đúng đường viền của biểu tượng:

Ngôi sao đầu tiên đổ bóng vuông từ hộp bao vô hình của nó. Ngôi sao thứ hai đổ bóng hình ngôi sao. Khác với box-shadow, drop-shadow() không có giá trị spread và không có inset; trang box-shadow trình bày những giá trị đó.

Vấn đề viền bị mờ

Ảnh bị làm mờ sẽ nhạt dần ở viền, vì hiệu ứng blur kéo các pixel trong suốt xung quanh vào. Để giữ viền sắc (ví dụ cho ảnh nền hero bị làm mờ), đặt ảnh trong một container có overflow: hidden và phóng to ảnh lên một chút để phần viền mềm bị cắt đi:

.hero { overflow: hidden; }
.hero img { filter: blur(8px); transform: scale(1.1); }

Hiệu ứng hover với filter

filter có thể dùng với transition, nên một bức tường logo chuyển từ xám sang màu hay một thẻ mờ cho đến khi được hover chỉ cần hai quy tắc:

Di chuột lên (hoặc nhấn Tab tới) một ô và màu của nó hiện dần ra.

Điều nên biết

  • Hiệu năng. Bán kính làm mờ lớn trên vùng rộng tốn tài nguyên nhất, đặc biệt là backdrop-filter trên các phần tử di chuyển hoặc cuộn. Hãy thử trên điện thoại.
  • Khả năng đọc. Đừng bao giờ làm mờ chữ mà người dùng cần đọc, và kiểm tra độ tương phản của chữ trên tấm kính mờ.
  • Ngữ cảnh xếp chồng. Mọi filter khác none đều tạo một stacking context mới và trở thành khối chứa cho các phần tử con position: fixed, giống transform.

Lỗi thường gặp

  • filter: blur(5). Bán kính cần có đơn vị: blur(5px).
  • Dùng filter: blur() cho tấm kính mờ. Nó làm mờ cả chữ của chính tấm kính. Hãy dùng backdrop-filter với một nền trong suốt.
  • backdrop-filter không hiện gì. Nền của phần tử phải trong suốt ít nhất một phần, và phải có thứ gì đó nằm phía sau nó.
  • Hai khai báo filter. Khai báo thứ hai thay thế khai báo đầu tiên. Hãy đặt mọi hàm trong một giá trị.
  • Bóng hình hộp trên biểu tượng trong suốt. Dùng filter: drop-shadow() thay cho box-shadow.

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

Làm sao làm mờ một phần tử trong CSS?

Dùng filter: blur(5px);. Độ dài là bán kính làm mờ: 0 là sắc nét, giá trị càng lớn càng mờ. Nó làm mờ cả phần tử và mọi thứ bên trong, kể cả chữ và ảnh.

Làm sao làm mờ phần nền phía sau một phần tử?

Dùng backdrop-filter: blur(10px); trên phần tử, kèm một nền trong suốt một phần như rgb(255 255 255 / 0.5). Nội dung của chính phần tử vẫn sắc nét còn mọi thứ phía sau bị làm mờ, tạo hiệu ứng kính mờ.

drop-shadow() và box-shadow khác nhau thế nào?

box-shadow luôn bám theo hộp hình chữ nhật của phần tử. filter: drop-shadow() bám theo hình dạng nhìn thấy được, kể cả vùng trong suốt của ảnh PNG hay SVG, nên bóng của một biểu tượng có đúng đường viền của biểu tượng đó.

Làm sao biến ảnh thành đen trắng bằng CSS?

Dùng filter: grayscale(100%); (hoặc grayscale(1)). Thêm transition và filter: grayscale(0) khi hover để màu quay trở lại.

Có dùng nhiều filter cùng lúc được không?

Được, liệt kê chúng cách nhau bằng dấu cách: filter: grayscale(1) brightness(1.2) blur(1px);. Chúng được áp dụng theo thứ tự, nên thứ tự có thể làm thay đổi kết quả. Một khai báo filter thứ hai sẽ thay thế khai báo đầu tiên.

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