Resumindo
- O elemento meshgradient foi proposto nos rascunhos do SVG 2, mas nenhum navegador importante o implementou, e ele não faz parte do padrão publicado que os navegadores seguem.
- O Inkscape consegue criar mesh gradients, e as exportações dele dependem de um polyfill em JavaScript para aparecer nos navegadores.
- O jeito mais confiável de obter um visual de malha em SVG é usar algumas formas coloridas suavizadas com feGaussianBlur, ou vários gradientes radiais empilhados com bordas transparentes.
- Uma imagem rasterizada exportada de uma ferramenta de design é a opção mais simples quando o gradiente nunca precisa mudar, e WebP ou PNG mantêm o arquivo leve.
- Seja qual for o método escolhido, adicione um granulado leve sobre o resultado para esconder o banding nas transições suaves.
Nesta página
Um mesh gradient em SVG de verdade não funciona nos navegadores hoje. O elemento <meshgradient> apareceu nos rascunhos do SVG 2, em que as cores ficam nos cantos de uma grade de retalhos e se misturam em cada um deles, mas Chrome, Safari e Firefox nunca o lançaram. Para conseguir o visual suave, de muitas cores, que as pessoas chamam de mesh gradient, você o constrói com o que de fato é renderizado: formas desfocadas, gradientes radiais empilhados, uma imagem rasterizada ou um shader.
O que aconteceu com o meshgradient
O elemento de malha fez parte dos rascunhos de trabalho do SVG 2 por vários anos. Ele descrevia uma superfície como fileiras de retalhos de Coons, cada um com quatro cores nos cantos e bordas curvas, que é como as malhas de gradiente funcionam nos programas de ilustração. Os fabricantes de navegadores não o implementaram, e o recurso ficou de fora da versão do SVG 2 que seguiu adiante. Se você colar a marcação de malha numa página, o navegador a ignora e preenche a forma com nada, ou com uma cor reserva se você tiver definido uma.
Não aparece nos navegadores
<meshgradient>com<meshrow>e<meshpatch>- Malhas de gradiente do Illustrator salvas como SVG editável
- Malha do Inkscape exportada sem o polyfill
- Padrões
<hatch>, do mesmo rascunho
Aparece em todo lugar
- Formas desfocadas com
feGaussianBlur - Vários preenchimentos
<radialGradient>, empilhados - Uma imagem PNG ou WebP incorporada
- Radiais empilhados em CSS ou um canvas WebGL
O Inkscape é a exceção notável do lado da criação. A ferramenta de malha dele gera marcação de malha de verdade e, quando você salva para a web, pode incluir um pequeno polyfill em JavaScript que desenha a malha no carregamento. Isso funciona, mas você está enviando script para pintar um fundo, e não vai aparecer em lugares que não executam scripts, como uma tag <img> ou muitos clientes de email.
Método 1: formas desfocadas
É o mais perto de uma malha em SVG puro. Coloque de três a cinco círculos ou elipses preenchidos onde você quer cada cor e depois desfoque bastante o grupo. O desfoque mistura as cores vizinhas exatamente como uma malha faz, e você pode mover cada mancha de forma independente.
<svg viewBox="0 0 1200 800" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid slice">
<defs>
<filter id="soften" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur stdDeviation="120" />
</filter>
</defs>
<rect width="1200" height="800" fill="#0f0b1e" />
<g filter="url(#soften)">
<circle cx="260" cy="200" r="260" fill="#7c3aed" />
<circle cx="900" cy="160" r="240" fill="#f472b6" />
<ellipse cx="760" cy="640" rx="360" ry="220" fill="#0ea5e9" />
<circle cx="200" cy="700" r="200" fill="#312e81" />
</g>
</svg>Desfoque tem custo. Um feGaussianBlur grande é recalculado sempre que o SVG é redesenhado, então use isso em fundos estáticos, não em algo que rola ou se anima. Para a mesma ideia feita só com CSS, veja gradientes desfocados.
Método 2: gradientes radiais empilhados
Cada <radialGradient> pode ir de uma cor até o transparente. Preencha vários retângulos do tamanho total, um por gradiente, e eles se sobrepõem formando uma malha. Não há filtro envolvido, então a renderização é mais leve que o desfoque e fica nítida em qualquer zoom.
<svg viewBox="0 0 1200 800" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="none">
<defs>
<radialGradient id="a" cx="0.2" cy="0.25" r="0.6">
<stop offset="0" stop-color="#7c3aed" />
<stop offset="1" stop-color="#7c3aed" stop-opacity="0" />
</radialGradient>
<radialGradient id="b" cx="0.8" cy="0.2" r="0.55">
<stop offset="0" stop-color="#f472b6" />
<stop offset="1" stop-color="#f472b6" stop-opacity="0" />
</radialGradient>
<radialGradient id="c" cx="0.6" cy="0.85" r="0.65">
<stop offset="0" stop-color="#0ea5e9" />
<stop offset="1" stop-color="#0ea5e9" stop-opacity="0" />
</radialGradient>
</defs>
<rect width="1200" height="800" fill="#0f0b1e" />
<rect width="1200" height="800" fill="url(#a)" />
<rect width="1200" height="800" fill="url(#b)" />
<rect width="1200" height="800" fill="url(#c)" />
</svg>transparent, o que mantém as bordas limpas em qualquer renderizador de SVG, inclusive os mais antigos.Isso se traduz quase um para um em CSS, que muitas vezes é o melhor lugar para ele. Mesh gradients em CSS mostra as mesmas camadas com radial-gradient() e explica como controlar onde as cores se sobrepõem. A versão em SVG vale a pena quando o fundo precisa viajar como arquivo, como um download ou um recurso num design system. Mais sobre os elementos de gradiente em gradientes SVG.
radial-gradient(circle at 20% 25%, #7c3aed 0%, transparent 48%), radial-gradient(circle at 80% 20%, #f472b6 0%, transparent 44%), radial-gradient(circle at 60% 85%, #0ea5e9 0%, transparent 52%), linear-gradient(#0f0b1e, #0f0b1e)Método 3: exportar uma imagem
Se você desenhou uma malha de gradiente de verdade numa ferramenta de ilustração e ela nunca precisa mudar, exporte como imagem. Uma malha de 1920×1080 comprime bem em WebP e fica suave em PNG; você pode incorporá-la com um elemento SVG <image> ou usá-la como fundo em CSS. Você perde a independência de resolução, mas mantém cada curva da malha original.
Como escolher o método certo
Arquivo
Escala
Ideal para
Arquivo
Escala
Ideal para
Arquivo
Escala
Ideal para
Arquivo
Escala
Ideal para
Arquivo
Escala
Ideal para
- 1
Escolha de três a cinco cores
Matizes vizinhos se misturam bem. Opostos se encontram num meio turvo, como explica gradientes turvos.
- 2
Posicione cores, não paradas
Decida onde cada cor fica na tela. Essa é toda a diferença entre uma malha e um gradiente linear.
- 3
Deixe uma área calma
Mantenha uma região próxima da cor de fundo onde vai ficar o título.
- 4
Termine com granulado
Um pouco de ruído faz a superfície parecer intencional e esconde o banding.
Quando você quer um fundo no estilo malha sem montá-lo à mão, um Mark do Gradiently é uma receita de cores, luz, material e granulado que é renderizada ao vivo em qualquer tamanho, mantém a área mais calma atrás das suas palavras e exporta com o Pro em PNG, SVG ou PDF. Para malhas animadas num site, gradientes com shader são o próximo passo.
Perguntas frequentes
Os navegadores suportam mesh gradients em SVG?
Não. O elemento meshgradient foi rascunhado para o SVG 2, mas nenhum navegador importante o implementou, então ele não exibe nada sem um polyfill em JavaScript.
Como faço um mesh gradient em SVG que funcione?
Desfoque alguns círculos coloridos com feGaussianBlur, ou empilhe vários preenchimentos radialGradient que vão até o transparente. Os dois funcionam em qualquer navegador.
Posso usar mesh gradients do Inkscape num site?
Sim, se você incluir o polyfill em JavaScript que o Inkscape pode adicionar ao salvar. Sem ele, os navegadores ignoram a malha, e ela não funciona dentro de uma tag img.
Um mesh gradient em CSS é melhor que em SVG?
Para um fundo que só vive numa página da web, radiais empilhados em CSS são mais simples. SVG é melhor quando o gradiente precisa existir como arquivo independente.
Por que meu gradiente SVG desfocado tem bordas duras?
A região do filtro está cortando o desfoque. Aumente-a com x="-50%" y="-50%" width="200%" height="200%" no elemento filter.
Escrito pelo Gradiently
A equipe por trás do Gradiently, uma ferramenta de design criada em torno dos Marks: gradientes vivos que fazem tudo o que você cria ter a sua cara.
Ver nosso perfil