Menu

Rozmycie i filtry w CSS: blur(), grayscale, brightness

filter: blur(5px) rozmywa element, a backdrop-filter: blur() rozmywa to, co jest za nim. Poznaj wszystkie funkcje filtrów (brightness, contrast, grayscale, sepia, saturate, hue-rotate, invert, drop-shadow) z suwakami na żywo, ich łączenie i problem rozmytych krawędzi.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Rozmycie elementu

filter: blur() przyjmuje długość, czyli promień rozmycia. Im jest większy, tym bardziej rozmyty element:

filter działa na każdym elemencie, nie tylko na obrazach: rozmyty div rozmywa też swój tekst, obramowanie i dzieci. Zwróć uwagę na miękkie krawędzie rozmytych obrazów: rozmycie rozlewa obraz na zewnątrz i miesza go z przezroczystym obszarem wokół. Rozwiązanie znajdziesz niżej, w sekcji "Problem rozmytych krawędzi".

Rozmycie tła: backdrop-filter

Żeby rozmyć to, co jest za elementem (panel z matowego szkła nad zdjęciem albo stroną), użyj backdrop-filter. Własna treść elementu pozostaje ostra. Potrzebne jest prześwitujące tło, żeby rozmycie było widać:

Paski i koła są ostre wokół panelu i rozmyte za nim, a tekst panelu pozostaje nietknięty. Dbaj o czytelność tekstu: jaśniejszy albo ciemniejszy odcień w kolorze tła pomaga na obrazach z dużą liczbą szczegółów.

Wszystkie funkcje filtrów na żywo

Przesuń dowolny suwak. Linia pod obrazem to dokładna wartość filter, gotowa do skopiowania:

Wypisywane są tylko funkcje, które przesunięto z ich wartości neutralnej, co skraca zapis. brightness(1) albo blur(0px) niczego nie zmieniają, więc nie ma powodu ich wymieniać.

Funkcje filtrów

FunkcjaWartość neutralnaCo robiPrzykład
blur(r)0rozmycie gaussowskie o promieniu rblur(4px)
brightness(n)1ciemniej poniżej 1, jaśniej powyżejbrightness(0.7)
contrast(n)1płasko poniżej 1, wyraziściej powyżejcontrast(1.3)
grayscale(n)01 (albo 100%) to pełna szarośćgrayscale(100%)
sepia(n)0ciepły brązowy odcieńsepia(0.6)
saturate(n)10 to szarość, powyżej 1 żywsze kolorysaturate(1.5)
hue-rotate(a)0degprzesuwa każdą barwę po kole barwhue-rotate(90deg)
invert(n)01 to pełny negatyw kolorówinvert(1)
opacity(n)1jak właściwość opacityopacity(0.5)
drop-shadow(x y blur color)cień, który podąża za kształtemdrop-shadow(2px 4px 6px rgb(0 0 0 / 0.3))

Liczby mogą być też procentami (grayscale(100%) to to samo co grayscale(1)). Kilka funkcji umieszcza się w jednej wartości, rozdzielając je spacjami, i są one stosowane po kolei: filter: grayscale(1) sepia(1) daje brązowy odcień, a sepia(1) grayscale(1) kończy się zwykłą szarością.

drop-shadow podąża za kształtem

box-shadow zawsze jest prostokątem (najwyżej z zaokrąglonymi rogami). drop-shadow() jest rysowany z widocznych pikseli, więc przezroczysta ikona dostaje cień o jej obrysie:

Pierwsza gwiazdka rzuca kwadratowy cień ze swojego niewidocznego pudełka ograniczającego. Druga rzuca cień w kształcie gwiazdki. W przeciwieństwie do box-shadow, drop-shadow() nie ma wartości spread ani inset; omawia je strona o box-shadow.

Problem rozmytych krawędzi

Rozmyty obraz blednie przy krawędziach, bo rozmycie wciąga przezroczyste piksele z otoczenia. Żeby zachować ostrą krawędź (na przykład dla rozmytego tła dużego banera), umieść obraz w kontenerze z overflow: hidden i lekko go powiększ, żeby miękka krawędź została odcięta:

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

Efekty przy najechaniu z filter

filter można animować przejściem, więc ściana logo zmieniających się z szarych na kolorowe albo karta przyciemniona do czasu najechania to dwie reguły:

Najedź kursorem (albo przejdź klawiszem Tab) na kafelek, a jego kolor się pojawi.

Warto wiedzieć

  • Wydajność. Najwięcej kosztują duże promienie rozmycia na dużych obszarach, zwłaszcza backdrop-filter na elementach, które się poruszają albo przewijają. Przetestuj na telefonie.
  • Czytelność. Nigdy nie rozmywaj tekstu, który ludzie muszą przeczytać, i sprawdzaj kontrast tekstu na matowym panelu.
  • Kontekst nakładania. Każdy filter inny niż none tworzy nowy kontekst nakładania i staje się blokiem zawierającym dla potomków z position: fixed, tak jak transform.

Częste błędy

  • filter: blur(5). Promień wymaga jednostki: blur(5px).
  • Używanie filter: blur() do matowego panelu. Rozmywa własny tekst panelu. Użyj backdrop-filter z przezroczystym tłem.
  • backdrop-filter, który nic nie pokazuje. Tło elementu musi być przynajmniej częściowo przezroczyste, a za nim musi coś być.
  • Dwie deklaracje filter. Druga zastępuje pierwszą. Umieść wszystkie funkcje w jednej wartości.
  • Kwadratowe cienie na przezroczystych ikonach. Użyj filter: drop-shadow() zamiast box-shadow.

Najczęściej zadawane pytania

Jak rozmyć element w CSS?

Użyj filter: blur(5px);. Długość to promień rozmycia: 0 jest ostre, a większe wartości są bardziej rozmyte. Rozmywa element i wszystko w nim, łącznie z tekstem i obrazami.

Jak rozmyć tło za elementem?

Użyj na elemencie backdrop-filter: blur(10px); z częściowo przezroczystym tłem, na przykład rgb(255 255 255 / 0.5). Własna treść elementu pozostaje ostra, a to, co jest za nim, zostaje rozmyte: to efekt matowego szkła.

Czym różni się drop-shadow() od box-shadow?

box-shadow zawsze podąża za prostokątnym pudełkiem elementu. filter: drop-shadow() podąża za widocznym kształtem, łącznie z przezroczystymi obszarami PNG albo SVG, więc cień ikony ma jej obrys.

Jak zrobić czarno-biały obrazek w CSS?

Użyj filter: grayscale(100%); (albo grayscale(1)). Dodaj przejście i filter: grayscale(0) przy najechaniu kursorem, żeby przywrócić kolor.

Czy mogę użyć kilku filtrów naraz?

Tak, wypisz je rozdzielone spacjami: filter: grayscale(1) brightness(1.2) blur(1px);. Są stosowane po kolei, więc kolejność może zmienić wynik. Druga deklaracja filter zastępuje pierwszą.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ