Tenho uma forma de garrafa em SVG que tem um redemoinho decorativo e algumas outras linhas cruzando o interior, de modo que não tenho certeza do que conta como "dentro" e "fora" do caminho. Quero colocar uma forma de onda "dentro" da garrafa, mas não estou obtendo nenhum resultado positivo experimentando <clipPath>
e não tenho certeza se as linhas internas da garrafa estão trabalhando contra mim.
O que eu tenho atualmente, onde a forma de onda fica na parte superior da garrafa:
* {
margin: 0;
box-sizing: border-box;
}
.container {
height: 100dvh;
}
svg {
display: block;
padding-block: 5%;
}
<div class="container">
<svg width="100%" height="100%" viewBox="0 0 250 457" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="bottle" d="M89.6174 72.5661C78.3761 70.8794 34.9222 93.2227 19 135.503M89.6174 72.5661V2H125M89.6174 72.5661H125M19 135.503C-0.902714 188.355 -0.0185633 201.762 9.29124 288.909C17.1881 362.829 33.8318 424.189 44.8889 432.248C60.9111 443.925 84 454.607 125 454.607M19 135.503C130.2 168.307 155 202.255 125 251.842 M160.383 72.5661C171.624 70.8794 215.078 93.2227 231 135.503M160.383 72.5661V2H125M160.383 72.5661H125M231 135.503C250.903 188.355 250.019 201.762 240.709 288.909C232.812 362.829 216.168 424.189 205.111 432.248C189.089 443.925 166 454.607 125 454.607M231 135.503C119.8 168.307 95 202.255 125 251.842" stroke="#B9B9B9" stroke-width="4"/>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="130px"
viewBox="0 0 136 195" style="enable-background:new 0 0 136 195;" xml:space="preserve">
<path fill="#04ACFF" id="waveShape" d="M300,300V2.5c0,0-0.6-0.1-1.1-0.1c0,0-25.5-2.3-40.5-2.4c-15,0-40.6,2.4-40.6,2.4c-12.3,1.1-30.3,1.8-31.9,1.9c-2-0.1-19.7-0.8-32-1.9c0,0-25.8-2.3-40.8-2.4c-15,0-40.8,2.4-40.8,2.4c-12.3,1.1-30.4,1.8-32,1.9c-2-0.1-20-0.8-32.2-1.9c0,0-3.1-0.3-8.1-0.7V300H300z"/>
</svg>
</svg>
</div>
Cercar o caminho da garrafa com uma <clipPath>
etiqueta faz com que apenas a forma da onda apareça:
* {
margin: 0;
box-sizing: border-box;
}
.container {
height: 100dvh;
}
svg {
display: block;
padding-block: 5%;
}
<div class="container">
<svg width="100%" height="100%" viewBox="0 0 250 457" fill="none" xmlns="http://www.w3.org/2000/svg">
<clipPath>
<path id="bottle" d="M89.6174 72.5661C78.3761 70.8794 34.9222 93.2227 19 135.503M89.6174 72.5661V2H125M89.6174 72.5661H125M19 135.503C-0.902714 188.355 -0.0185633 201.762 9.29124 288.909C17.1881 362.829 33.8318 424.189 44.8889 432.248C60.9111 443.925 84 454.607 125 454.607M19 135.503C130.2 168.307 155 202.255 125 251.842 M160.383 72.5661C171.624 70.8794 215.078 93.2227 231 135.503M160.383 72.5661V2H125M160.383 72.5661H125M231 135.503C250.903 188.355 250.019 201.762 240.709 288.909C232.812 362.829 216.168 424.189 205.111 432.248C189.089 443.925 166 454.607 125 454.607M231 135.503C119.8 168.307 95 202.255 125 251.842" stroke="#B9B9B9" stroke-width="4"/>
</clipPath>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="130px"
viewBox="0 0 136 195" style="enable-background:new 0 0 136 195;" xml:space="preserve">
<path fill="#04ACFF" id="waveShape" d="M300,300V2.5c0,0-0.6-0.1-1.1-0.1c0,0-25.5-2.3-40.5-2.4c-15,0-40.6,2.4-40.6,2.4c-12.3,1.1-30.3,1.8-31.9,1.9c-2-0.1-19.7-0.8-32-1.9c0,0-25.8-2.3-40.8-2.4c-15,0-40.8,2.4-40.8,2.4c-12.3,1.1-30.4,1.8-32,1.9c-2-0.1-20-0.8-32.2-1.9c0,0-3.1-0.3-8.1-0.7V300H300z"/>
</svg>
</svg>
</div>
Ao redor do caminho da onda é <clipPath>
exibida apenas a garrafa:
* {
margin: 0;
box-sizing: border-box;
}
.container {
height: 100dvh;
}
svg {
display: block;
padding-block: 5%;
}
<div class="container">
<svg width="100%" height="100%" viewBox="0 0 250 457" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="bottle" d="M89.6174 72.5661C78.3761 70.8794 34.9222 93.2227 19 135.503M89.6174 72.5661V2H125M89.6174 72.5661H125M19 135.503C-0.902714 188.355 -0.0185633 201.762 9.29124 288.909C17.1881 362.829 33.8318 424.189 44.8889 432.248C60.9111 443.925 84 454.607 125 454.607M19 135.503C130.2 168.307 155 202.255 125 251.842 M160.383 72.5661C171.624 70.8794 215.078 93.2227 231 135.503M160.383 72.5661V2H125M160.383 72.5661H125M231 135.503C250.903 188.355 250.019 201.762 240.709 288.909C232.812 362.829 216.168 424.189 205.111 432.248C189.089 443.925 166 454.607 125 454.607M231 135.503C119.8 168.307 95 202.255 125 251.842" stroke="#B9B9B9" stroke-width="4"/>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="130px"
viewBox="0 0 136 195" style="enable-background:new 0 0 136 195;" xml:space="preserve">
<clipPath>
<path fill="#04ACFF" id="waveShape" d="M300,300V2.5c0,0-0.6-0.1-1.1-0.1c0,0-25.5-2.3-40.5-2.4c-15,0-40.6,2.4-40.6,2.4c-12.3,1.1-30.3,1.8-31.9,1.9c-2-0.1-19.7-0.8-32-1.9c0,0-25.8-2.3-40.8-2.4c-15,0-40.8,2.4-40.8,2.4c-12.3,1.1-30.4,1.8-32,1.9c-2-0.1-20-0.8-32.2-1.9c0,0-3.1-0.3-8.1-0.7V300H300z"/>
</clipPath>
</svg>
</svg>
</div>
Muitas coisas precisam ser feitas para que seu código funcione. Mas primeiro, um pouco de limpeza:
version="1.1"
,style="enable-background:new 0 0 136 195;"
exml:space="preserve"
não têm absolutamente nenhum efeito. Apenas delete-os.xmlns="http://www.w3.org/2000/svg"
exmlns:xlink="http://www.w3.org/1999/xlink"
não são necessários se você escrever código SVG inline dentro de uma página HTML. Mas note que se você deixar de fora oxmlns:xlink
atributo, todas as ocorrências dexlink:href
também terão que ser encurtadas parahref
.Vamos dar uma olhada em um resultado provisório, deixando de fora o caminho do clipe:
Agora a parte mais importante: um clip-path expressa um relacionamento entre duas entidades: um elemento gráfico, no seu caso um
<svg>
elemento, é recortado para uma área expressa como uma forma geométrica, aqui apenas outro<path>
elemento. Envolver um elemento com um<clipPath>
não faz exatamente nada, pois a relação com o outro elemento está faltando.O padrão geral se parece com este
O relacionamento "o gráfico é recortado pelo formulário" é expresso com o atributo
clip-path="url(#clip)"
. Tudo escrito dentro do<clipPath>
elemento não é renderizado . Ele é apenas interpretado como a fonte do recorte.No seu caso, as coisas se complicam com a aplicação de um clip path a um
<svg>
elemento. O raciocínio de como os atributosviewBox
eclip-path
interagem e por que os resultados parecem como são é muito sutil e não é fácil de entender. Na maioria das vezes, é mais fácil envolver o<svg>
com um<g>
elemento e aplicar o clip path a ele.Se você quiser ter um caminho usado tanto como o formulário para usar como uma fonte de recorte, quanto desenhado como um gráfico, ele precisa aparecer em dois lugares no seu código. Felizmente, você pode facilmente reutilizar o conteúdo com um
<use>
elemento. O padrão geral se parece com isso:Mas antes de fazer isso, pense no seu gráfico e como ele foi representado no editor do navegador. As áreas mostradas em cinza são o que será interpretado como "dentro", todo o resto é "fora". Claramente não é isso que você quis dizer. No seu caso, a razão está na estrutura um tanto caótica do caminho, que na verdade é composto de nove (!) subcaminhos independentes, cada um dos quais tem seus próprios interiores/exteriores.
Limpar esse código é uma tarefa para a qual o site SvgPathEditor não é realmente adequado. Você precisa de um editor gráfico vetorial completo como o Illustrator ou o Inkscape para fazer isso efetivamente. O que exatamente precisa ser feito é muito complexo para uma breve descrição aqui, eu apenas apresento a você o resultado. Você precisa ter um formulário que represente o formulário externo e um separado para tudo mostrado no interior desse formulário. Apenas o primeiro é usado para o recorte:
Usar um editor SVG é a melhor maneira de atingir esses resultados. Eu recomendo o Boxy SVG .