提问人:Rip 提问时间:2/20/2022 最后编辑:Paul LeBeauRip 更新时间:2/20/2022 访问量:221
具有渐变和平滑平滑平铺过渡的 SVG 图案
SVG Pattern with Gradient and Smooth Tile Transitions
问:
我正在尝试了解如何应用具有渐变的 SVG 模式,该渐变从网页顶部附近开始并延伸到底部。
我无法将渐变应用于整个图案,只能应用于构成图案的各个瓷砖。我尝试将渐变应用于瓷砖、图案、元素和 CSS 背景图像。
此外,当图案平铺时,圆角应仅出现在顶部平铺上,因为平铺重叠。出于某种原因,透明度从重叠的瓷砖一直穿透到背景,即使下面的瓷砖具有填充颜色。
一个。有没有办法将渐变应用于整个模式,也许是将其包装在另一个 SVG 中?
b.如何摆脱重叠磁贴之间的圆角显示,但顶部磁贴除外,它不会与另一个磁贴重叠?可以更改图块的 z 索引或图块堆叠顺序吗?
我还尝试在 illustrator 中创建一列很长的图块,这解决了在重叠图块之间显示圆角的问题,并允许对整个图案应用渐变。长 SVG 解决方案还存在其他几个问题:
c. 显然,如果我在网页上使用 CSS 视差,则不可能隐藏溢出并保留 3D,因此必须显示整个列。
d. 渐变应用于整个列,而不仅仅是页面上呈现的图案,因此大多数渐变在大多数时候都不在视野中。
e.其中几个图块的单像素透明线将它们分开,即使它们都是在 Illustrator 中捕捉到的。显然,在 Illustrator 中创建 SVG 图块图案需要手动输入坐标,以便每个图块至少有 1 个像素重叠。
欢迎任何关于如何创建渐变图案的建议,该图案的渐变从页面顶部附近一直延伸到底部,并且磁贴之间没有透明伪影。 这是 SVG 模式测试和码笔的图像。
感谢您的帮助!
https://codepen.io/ripmurdock/pen/JjOLXqL?editors=1000
* {
margin:0;
padding:0;
}
body{
background-color:tomato;
}
.gradient-1{
color: white;
}
<svg width="100%" height="99.5vh">
<defs>
<pattern id="cc_vert_tiles-1" x="" y="" width="300" height="176" patternUnits="userSpaceOnUse" fill="url(#SVGID_1_)">
<use href="#cp_3_ring_rnd4_uneq_1_" />
</pattern>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="100.0005" y1="200" x2="100.0005" y2="4.882813e-004">
<stop offset="0.0443" style="stop-color:#FFFF00"/>
<stop offset="0.1669" style="stop-color:#FFFD00"/>
<stop offset="0.2387" style="stop-color:#FFF400"/>
<stop offset="0.2975" style="stop-color:#FFE600"/>
<stop offset="0.3491" style="stop-color:#FFD200"/>
<stop offset="0.3961" style="stop-color:#FFB800"/>
<stop offset="0.4392" style="stop-color:#FF9900"/>
<stop offset="0.468" style="stop-color:#FF7F00"/>
<stop offset="0.5948" style="stop-color:#BC7F00"/>
<stop offset="0.7949" style="stop-color:#587F00"/>
<stop offset="0.9343" style="stop-color:#197F00"/>
<stop offset="1" style="stop-color:#007F00"/>
</linearGradient>
<path id="cp_3_ring_rnd4_uneq_1_" height="200" width="200" d="M200,190c0,5.522-4.478,10-10,10H10c-5.523,0-10-4.478-10-10V10C0,4.477,4.477,0,10,0h180
c5.522,0,10,4.477,10,10V190z M5,99.621c0,52.467,42.533,95,95,95c52.467,0,95-42.533,95-95c0-52.467-42.533-95-95-95
C47.533,4.621,5,47.154,5,99.621z"/>
</defs>
<g class="gradient-1">
<rect id="cc_vert_pat-1" width="200" height="110vh" fill="url(#cc_vert_tiles-1)" />
</g>
</svg>
答:
一个。有没有办法将渐变应用于整个模式,也许是将其包装在另一个 SVG 中?
图案图块的每个副本都是相同的。如果您需要一个渐变来覆盖整个文档,那么它需要是一个单独的元素。
b.如何摆脱重叠磁贴之间的圆角显示,但顶部磁贴除外,它不会与另一个磁贴重叠?可以更改图块的 z 索引或图块堆叠顺序吗?
图案中的图块永远不会相互重叠。图案磁贴指定为 300x176。该区域之外的任何内容都不会呈现。但是,在磁贴中使用的路径为 200x200。因此,路径底部的 24 个单位被剪掉了 (200-176)。这就是底部圆角不显示的原因。
如果希望整个路径可见,则它的大小不得大于 300x176。
如果你需要你的瓷砖实际重叠,那么图案对你没有用。您需要自己绘制所有图块。根据您提到的 Illustrator 实验。
在以下示例中,我更改了图案尺寸以匹配路径覆盖的区域 (200x200)。
* {
margin:0;
padding:0;
}
body{
background-color:tomato;
}
.gradient-1{
color: white;
}
<svg width="100%" height="99.5vh">
<defs>
<pattern id="cc_vert_tiles-1" x="" y="" width="200" height="200" patternUnits="userSpaceOnUse" fill="url(#SVGID_1_)">
<use href="#cp_3_ring_rnd4_uneq_1_" />
</pattern>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="100.0005" y1="200" x2="100.0005" y2="4.882813e-004">
<stop offset="0.0443" style="stop-color:#FFFF00"/>
<stop offset="0.1669" style="stop-color:#FFFD00"/>
<stop offset="0.2387" style="stop-color:#FFF400"/>
<stop offset="0.2975" style="stop-color:#FFE600"/>
<stop offset="0.3491" style="stop-color:#FFD200"/>
<stop offset="0.3961" style="stop-color:#FFB800"/>
<stop offset="0.4392" style="stop-color:#FF9900"/>
<stop offset="0.468" style="stop-color:#FF7F00"/>
<stop offset="0.5948" style="stop-color:#BC7F00"/>
<stop offset="0.7949" style="stop-color:#587F00"/>
<stop offset="0.9343" style="stop-color:#197F00"/>
<stop offset="1" style="stop-color:#007F00"/>
</linearGradient>
<path id="cp_3_ring_rnd4_uneq_1_" d="M200,190c0,5.522-4.478,10-10,10H10c-5.523,0-10-4.478-10-10V10C0,4.477,4.477,0,10,0h180
c5.522,0,10,4.477,10,10V190z M5,99.621c0,52.467,42.533,95,95,95c52.467,0,95-42.533,95-95c0-52.467-42.533-95-95-95
C47.533,4.621,5,47.154,5,99.621z"/>
</defs>
<g class="gradient-1">
<rect id="cc_vert_pat-1" width="200" height="110vh" fill="url(#cc_vert_tiles-1)" />
</g>
</svg>
可以有一个覆盖图案中所有瓷砖的渐变。您可以做的是将渐变应用于矩形,然后将图案转换为蒙版。
* {
margin:0;
padding:0;
}
body{
background-color:tomato;
}
<svg width="100%" height="99.5vh">
<defs>
<pattern id="cc_vert_tiles-1" x="" y="" width="200" height="200" patternUnits="userSpaceOnUse" fill="url(#SVGID_1_)">
<use href="#cp_3_ring_rnd4_uneq_1_" fill="white" />
</pattern>
<linearGradient id="SVGID_1_" gradientUnits="objectBoundingBox" x1="0" y1="1" x2="0" y2="0">
<stop offset="0.0443" style="stop-color:#FFFF00"/>
<stop offset="0.1669" style="stop-color:#FFFD00"/>
<stop offset="0.2387" style="stop-color:#FFF400"/>
<stop offset="0.2975" style="stop-color:#FFE600"/>
<stop offset="0.3491" style="stop-color:#FFD200"/>
<stop offset="0.3961" style="stop-color:#FFB800"/>
<stop offset="0.4392" style="stop-color:#FF9900"/>
<stop offset="0.468" style="stop-color:#FF7F00"/>
<stop offset="0.5948" style="stop-color:#BC7F00"/>
<stop offset="0.7949" style="stop-color:#587F00"/>
<stop offset="0.9343" style="stop-color:#197F00"/>
<stop offset="1" style="stop-color:#007F00"/>
</linearGradient>
<path id="cp_3_ring_rnd4_uneq_1_" d="M200,190c0,5.522-4.478,10-10,10H10c-5.523,0-10-4.478-10-10V10C0,4.477,4.477,0,10,0h180
c5.522,0,10,4.477,10,10V190z M5,99.621c0,52.467,42.533,95,95,95c52.467,0,95-42.533,95-95c0-52.467-42.533-95-95-95
C47.533,4.621,5,47.154,5,99.621z"/>
<mask id="pat-mask">
<rect id="cc_vert_pat-1" width="200" height="110vh" fill="url(#cc_vert_tiles-1)" />
</mask>
</defs>
<g class="gradient-1">
<rect id="cc_vert_pat-1" width="200" height="110vh" fill="url(#SVGID_1_)" mask="url(#pat-mask)"/>
</g>
</svg>
c. 显然,如果我在网页上使用 CSS 视差,则不可能隐藏溢出并保留 3D,因此必须显示整个列。
d. 渐变应用于整个列,而不仅仅是页面上呈现的图案,因此大多数渐变在大多数时候都不在视野中。
我不确定你对这些是什么意思。对于这些,您可能需要单独提出一个问题。
e.其中几个图块的单像素透明线将它们分开,即使它们都是在 Illustrator 中捕捉到的。显然,在 Illustrator 中创建 SVG 图块图案需要手动输入坐标,以便每个图块至少有 1 个像素重叠。
这通常是由于抗锯齿造成的。可以通过确保磁贴与屏幕像素边界匹配来避免这种情况。如果这样做,则不需要重叠磁贴。
评论