Desfocar um elemento
filter: blur() recebe um comprimento, o raio do desfoque. Quanto maior, mais desfocado fica o elemento:
O filter funciona em qualquer elemento, não só em imagens: uma div desfocada desfoca o texto, a borda e os filhos também. Repare nas bordas suaves das imagens desfocadas: o desfoque espalha a imagem para fora e a mistura com a área transparente em volta. A solução está mais abaixo, em "O problema das bordas desfocadas".
Desfocar o fundo: backdrop-filter
Para desfocar o que está atrás de um elemento (um painel de vidro fosco sobre uma foto ou uma página), use backdrop-filter. O conteúdo do próprio elemento continua nítido. Ele precisa de um fundo transparente para mostrar o desfoque:
As listras e os círculos ficam nítidos em volta do painel e desfocados atrás dele, enquanto o texto do painel não é tocado. Mantenha o texto legível: um tom mais claro ou mais escuro na cor de fundo ajuda em imagens carregadas.
Todas as funções de filter, ao vivo
Mexa em qualquer controle. A linha embaixo da imagem é o valor exato de filter, pronto para copiar:
Só as funções que você tirou do valor neutro são escritas, o que mantém o valor curto. brightness(1) ou blur(0px) não mudam nada, então não há motivo para listá-los.
Funções de filter
| Função | Valor neutro | O que faz | Exemplo |
|---|---|---|---|
blur(r) | 0 | desfoque gaussiano com raio r | blur(4px) |
brightness(n) | 1 | mais escuro abaixo de 1, mais claro acima | brightness(0.7) |
contrast(n) | 1 | mais chapado abaixo de 1, mais forte acima | contrast(1.3) |
grayscale(n) | 0 | 1 (ou 100%) é totalmente cinza | grayscale(100%) |
sepia(n) | 0 | tom marrom quente | sepia(0.6) |
saturate(n) | 1 | 0 é cinza, acima de 1 mais vivo | saturate(1.5) |
hue-rotate(a) | 0deg | desloca todos os matizes pelo círculo cromático | hue-rotate(90deg) |
invert(n) | 0 | 1 é o negativo completo das cores | invert(1) |
opacity(n) | 1 | como a propriedade opacity | opacity(0.5) |
drop-shadow(x y blur color) | uma sombra que segue o formato | drop-shadow(2px 4px 6px rgb(0 0 0 / 0.3)) |
Os números também podem ser porcentagens (grayscale(100%) é igual a grayscale(1)). Várias funções vão em um só valor, separadas por espaços, e são aplicadas em ordem: filter: grayscale(1) sepia(1) dá um tom marrom, enquanto sepia(1) grayscale(1) termina em um cinza simples.
O drop-shadow segue o formato
box-shadow é sempre um retângulo (no máximo com cantos arredondados). drop-shadow() é desenhado a partir dos pixels visíveis, então um ícone transparente ganha uma sombra com o contorno do ícone:
A primeira estrela projeta uma sombra quadrada a partir da caixa invisível que a envolve. A segunda projeta uma sombra em forma de estrela. Ao contrário do box-shadow, o drop-shadow() não tem spread nem inset; a página do box-shadow trata deles.
O problema das bordas desfocadas
Uma imagem desfocada some aos poucos nas bordas, porque o desfoque puxa os pixels transparentes em volta. Para manter uma borda nítida (em um fundo de destaque desfocado, por exemplo), coloque a imagem em um contêiner com overflow: hidden e aumente um pouco a imagem para a borda suave ser cortada:
.hero { overflow: hidden; }
.hero img { filter: blur(8px); transform: scale(1.1); }
Efeitos de hover com filter
O filter aceita transition, então uma parede de logos que vai do cinza para a cor, ou um card apagado até receber hover, são duas regras:
Passe o mouse sobre um bloco (ou chegue nele pelo Tab) e a cor dele aparece aos poucos.
Bom saber
- Desempenho. Raios de desfoque grandes em áreas grandes são o que mais custa, principalmente
backdrop-filterem elementos que se movem ou rolam. Teste em um celular. - Legibilidade. Nunca desfoque um texto que as pessoas precisam ler, e confira o contraste do texto sobre um painel de vidro fosco.
- Empilhamento. Qualquer
filterdiferente denonecria um novo stacking context e vira o bloco que contém os descendentes composition: fixed, como otransform.
Erros comuns
filter: blur(5). O raio precisa de unidade:blur(5px).- Usar
filter: blur()para um painel de vidro fosco. Ele desfoca o texto do próprio painel. Usebackdrop-filtercom um fundo transparente. - Um backdrop-filter que não mostra nada. O fundo do elemento precisa ser pelo menos parcialmente transparente, e precisa haver algo atrás dele.
- Duas declarações
filter. A segunda substitui a primeira. Coloque todas as funções em um só valor. - Sombras em forma de caixa em ícones transparentes. Use
filter: drop-shadow()em vez debox-shadow.
Perguntas frequentes
Como desfocar um elemento no CSS?
Use filter: blur(5px);. O comprimento é o raio do desfoque: 0 é nítido e valores maiores ficam mais desfocados. Ele desfoca o elemento e tudo o que está dentro, incluindo texto e imagens.
Como desfocar o fundo atrás de um elemento?
Use backdrop-filter: blur(10px); no elemento, com um fundo parcialmente transparente como rgb(255 255 255 / 0.5). O conteúdo do próprio elemento continua nítido e o que está atrás dele fica desfocado, o efeito de vidro fosco.
Qual a diferença entre drop-shadow() e box-shadow?
box-shadow sempre segue a caixa retangular do elemento. filter: drop-shadow() segue o formato visível, incluindo as áreas transparentes de um PNG ou SVG, então a sombra de um ícone tem o contorno do ícone.
Como deixar uma imagem preto e branco no CSS?
Use filter: grayscale(100%); (ou grayscale(1)). Acrescente uma transition e filter: grayscale(0) no hover para trazer a cor de volta.
Dá para usar vários filtros ao mesmo tempo?
Sim, liste-os separados por espaços: filter: grayscale(1) brightness(1.2) blur(1px);. Eles são aplicados em ordem, então a ordem pode mudar o resultado. Uma segunda declaração filter substitui a primeira.