我在 SVG 中有一个瓶子形状,里面有一个装饰性的漩涡和一些穿过内部的其他线条,因此我不确定什么算作路径的“内部”和“外部”。我想在瓶子“内部”放置一个波浪形状,但我没有得到任何积极的实验结果<clipPath>
,我不确定瓶子内部的线条是否对我不利。
我现在拥有的波浪形状位于瓶子顶部:
* {
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>
用标签围住瓶子路径<clipPath>
只会导致单独出现波浪形状:
* {
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>
围绕波浪路径<clipPath>
只显示瓶子:
* {
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>
要使代码正常工作,需要做很多事情。但首先,需要进行一些清理:
version="1.1"
,style="enable-background:new 0 0 136 195;"
完全xml:space="preserve"
没有效果。只需删除它们即可。xmlns="http://www.w3.org/2000/svg"
如果您在 HTML 页面内内联编写 SVG 代码,则xmlns:xlink="http://www.w3.org/1999/xlink"
不需要 和 。但请注意,如果您省略该xmlns:xlink
属性,则所有出现的xlink:href
也必须缩短为href
。让我们看一个暂时的结果,忽略剪辑路径:
现在到了最重要的部分:clip-path 表达了两个实体之间的关系:一个图形元素(在您的情况下是一个
<svg>
元素)被剪切到以几何形式表示的区域,这里只是另一个<path>
元素。用一个包裹一个元素<clipPath>
完全没有作用,因为缺少与另一个元素的关系。总体模式如下
“图形被表单裁剪”的关系用属性来表达。元素
clip-path="url(#clip)"
内部写入的所有内容都不会被渲染。它仅被解释为裁剪的来源。<clipPath>
就您而言,将剪辑路径应用于
<svg>
元素会使事情变得复杂。属性viewBox
和clip-path
交互方式以及结果看起来如此的原因非常微妙且难以理解。大多数情况下,<svg>
用<g>
元素包裹并将剪辑路径应用于元素会更容易。如果您希望将路径用作剪切源的形式,并将其绘制为图形,则它需要出现在代码中的两个位置。幸运的是,您可以轻松地使用
<use>
元素重复使用内容。一般模式如下:但在执行此操作之前,请考虑一下您的图形以及它在浏览器编辑器中的呈现方式。灰色显示的区域将被解释为“内部”,其他所有区域均为“外部”。这显然不是您的本意。就您而言,原因在于路径的结构有些混乱,它实际上由九个 (!) 独立的子路径组成,每个子路径都有自己的内部/外部。
清理代码是一项网站 SvgPathEditor 不太适合的任务。您需要一个功能齐全的矢量图形编辑器,如 Illustrator 或 Inkscape,才能有效地完成这项工作。具体需要做什么太复杂了,这里无法简短描述,我只是向您展示结果。您需要有一个表示外部表单的表单,以及一个单独的表单,用于该表单内部显示的所有内容。只有第一个用于剪辑:
使用 SVG 编辑器是实现这些结果的最佳方式。我推荐Boxy SVG。