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
| Funkcja | Wartość neutralna | Co robi | Przykład |
|---|---|---|---|
blur(r) | 0 | rozmycie gaussowskie o promieniu r | blur(4px) |
brightness(n) | 1 | ciemniej poniżej 1, jaśniej powyżej | brightness(0.7) |
contrast(n) | 1 | płasko poniżej 1, wyraziściej powyżej | contrast(1.3) |
grayscale(n) | 0 | 1 (albo 100%) to pełna szarość | grayscale(100%) |
sepia(n) | 0 | ciepły brązowy odcień | sepia(0.6) |
saturate(n) | 1 | 0 to szarość, powyżej 1 żywsze kolory | saturate(1.5) |
hue-rotate(a) | 0deg | przesuwa każdą barwę po kole barw | hue-rotate(90deg) |
invert(n) | 0 | 1 to pełny negatyw kolorów | invert(1) |
opacity(n) | 1 | jak właściwość opacity | opacity(0.5) |
drop-shadow(x y blur color) | cień, który podąża za kształtem | drop-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-filterna 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
filterinny niżnonetworzy nowy kontekst nakładania i staje się blokiem zawierającym dla potomków zposition: fixed, tak jaktransform.
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żyjbackdrop-filterz 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()zamiastbox-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ą.