【问题标题】:SVG as a CSS Background - Is there ANY way to repeat-x with NO space in between?SVG 作为 CSS 背景 - 有什么方法可以重复-x,中间没有空格?
【发布时间】:2019-05-29 23:27:06
【问题描述】:

在基于 Webkit 和 Blink 的浏览器中,SVG 无法正确平铺。不同缩放级别的图像之间有一个空间。 StackOverflow 上有许多主题解决了这个问题,都标记为已解决,但这些人一定没有对他们的解决方案进行足够彻底的测试。

我的 SVG 是完全偶数像素 (130 x 24)。 他们将背景大小设置为 130px 24px。 它们设置为 preserveAspectRatio="none"。 SVG 边缘的空白区域绝对为零。

然而,虽然它在 100% 时看起来不错,但如果放大到正确的级别,SVG 之间仍然会有很薄的空间。

鉴于使用 SVG 作为背景的广泛建议,让我感到惊讶的是,这个错误以前从未被报告过。

这是确切的 SVG:

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
    	 viewBox="0 0 130 24" xml:space="preserve" preserveAspectRatio="none">
    <style type="text/css">
    	.st0{fill:#A5EF8B;}
    </style>
    <path class="st0" d="M0,12c32.5,0,32.5,12,65,12s32.5-12,65-12V0C97.5,0,92.9,12,65,12C32.5,12,20.7,0,0,0"/>
    </svg>

我也可以使用其他 SVG 来确认这种行为,例如 https://www.heropatterns.com/ 上的那些

用于测试的代码笔:https://codepen.io/TelFiRE/pen/gJzqaG

图像之间的间距通常小于 1 像素(意味着线条只是较浅的绿色阴影)。这很微妙,如果你的显示器很暗,可能很难看出。

在提出这个问题时,我希望了解为什么它会以一种让我制作大量重复的 SVG 背景而不会出现问题的方式发生。这不仅仅是一张图片,所以我想尽可能避免使用骇人听闻的解决方案/解决方法。例如,从边缘切掉 2 个像素可以修复 99% 的问题,但不能完全修复,这让我想知道如果我真的需要这两个像素我会怎么做。这个特殊的 SVG 看起来还不错,但更复杂的模式会失去对齐。

【问题讨论】:

  • 第一:你能展示一下你如何设置背景的 CSS 吗?第二:尝试扩展您的路径,使其比您的 viewBox 宽一点。即从-1开始到131。
  • 它被设置为 SVG 的背景 URL。将机翼向两侧展开并不能解决问题,也只会将文件大小增加 30%(比 PNG 大),所以即使它有效,也不是解决方案,不幸的是。
  • 我在原始问题中添加了一个 Codepen。我最初尝试过,但找不到长期的 SVG 主机。没有考虑 url 编码,感谢 enxaneta 的想法。
  • 如果您对创建形状的 CSS 解决方案感兴趣:stackoverflow.com/q/56199721/8620333 .. 不如 SVG 完美,但易于处理
  • 这是一个很酷的提示。具有讽刺意味的是,其中一些具有非常相似的问题,即在某些缩放级别出现水平线。我认为它可能无关紧要,并且可以修复。无论哪种情况,感谢分享!

标签: css svg


【解决方案1】:

似乎某些浏览器在重复由 SVG 图像制作的背景方面确实存在问题。

对此的一种解决方案是在 SVG 内部进行重复。我们可以使用&lt;pattern&gt; 元素来定义重复模式并使用它来填充矩形。

<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="24">
  <defs>
    <pattern id="bg" patternUnits="userSpaceOnUse" width="130" height="24">
      <path fill="#A5EF8B" d="M0,12c32.5,0,32.5,12,65,12s32.5-12,65-12V0C97.5,0,92.9,12,65,12C32.5,12,20.7,0,0,0"/>
    </pattern>
  </defs>
  <rect width="100%" height="100%" fill="url(#bg)"/>
</svg>

当用作background-image&lt;div&gt; 时,它变成:

div {
  margin: 4rem 0;
  height: 24px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%' height='24'%3E%3Cdefs%3E%3Cpattern id='bg' patternUnits='userSpaceOnUse' width='130' height='24'%3E%3Cpath fill='%23A5EF8B' d='M0,12c32.5,0,32.5,12,65,12s32.5-12,65-12V0C97.5,0,92.9,12,65,12C32.5,12,20.7,0,0,0'/%3E%3C/pattern%3E%3C/defs%3E%3Crect width='100%' height='100%' fill='url(%23bg)'/%3E%3C/svg%3E");
  background-size: 100% 24px;
  background-repeat: no-repeat;
}
&lt;div&gt;&lt;/div&gt;

【讨论】:

  • 看起来很有前途!感谢您分享优雅的解决方案!在我做一些测试后,很可能会选择这个作为最佳答案。
  • 您好,不幸的是,我发现了这个解决方案的一个新问题(尽管很可能是相关的)。在某些缩放级别(在这种情况下,对我来说,110% 似乎是唯一这样做的)你可以看到 SVG 在底部重复一个像素。见codepen.io/TelFiRE/pen/vwzBay
  • 有一个简单的解决方法。只需将图案高度稍大一点。例如。将其更改为height='27'。这会将杂散像素从 SVG 底部移出,使其不可见。 codepen.io/PaulLeBeau/pen/vwzLXv
【解决方案2】:

这是您用作 css 背景的 svg,没有间隙。我已经使用 this tool 对 svg 进行了编码

也请阅读Optimizing SVGs in data URIs

body{background-image: url("data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 130 24' xml:space='preserve' preserveAspectRatio='none'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23A5EF8B;%7D %3C/style%3E%3Cpath class='st0' d='M0,12c32.5,0,32.5,12,65,12s32.5-12,65-12V0C97.5,0,92.9,12,65,12C32.5,12,20.7,0,0,0'/%3E%3C/svg%3E%0A");
background-size:130px 24px}

更新

显然,在 Safari 中,svg 背景图像的重复之间存在间隙。在下一个示例中,我将设置 background-size:12vw(或任何其他 vw 倍数)间隙消失。

其实我也简化了路径。

body{  
  background-image: url("data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 6 130 26' width='100%' height='100%'%3E%3Cstyle type='text/css'%3E .st0%7Bstroke:%23A5EF8B; fill:none; stroke-width:12;%7D %3C/style%3E%3Cpath class='st0' d='M-1,12c32.5,0,32.5,12,65,12s32.5-12,69-12'/%3E%3C/svg%3E%0A");
background-size:12vw}

【讨论】:

  • 感谢您的回复。不幸的是,尽管由于某种原因它在 StackOverflow 的查看器中有效,但在实践中它不起作用,每次重复之间仍然有线条:codepen.io/TelFiRE/pen/gJzqaG
  • 更正,即使在 StackOverflow 的查看器中,问题也会出现在某些缩放级别,尽管它似乎很少发生。
  • 我只能在 Safari 上看到差距。我已经用我使用background-size:12vw 的示例更新了我的答案,但显然vw 的任何其他多个都可以。请看一看。
  • 第二个示例中仍然存在问题,在 Windows 10 上的 Chrome 74.0.3729.169 中。此外,背景大小需要设置为 130px 24px。图像的缩放将是非常不可取的。开始认为现实是现代浏览器根本不支持重复的 SVG 作为背景。
【解决方案3】:

每个 svg 文件都有以下属性:“填充”和“描边”。 填充是填充,描边是轮廓。这个空间是两者,默认情况下是透明胶片。编辑 SVG 文件并将其添加到此代码中:

.st0 { fill: #A5EF8B; stroke: #A5EF8B; }

enter image description here

【讨论】:

  • 在某些缩放级别上仍然给我一些空白。 codepen.io/TelFiRE/pen/wbXazm
  • 在最大放大倍率的歌剧院里,我没有空隙。它总是适用于我的每一个项目。尝试使用 stroke-width : 2px 属性等。让我知道它是否有帮助。 Your link in Opera
  • 尝试设置这样的背景大小:background-size:129px 24px;https://codepen.io/anon/pen/gJKRgZ
  • 对我来说一切都很好。我检查了:Windows:Opera、Chrome、EDGE、Linux:Firefox Android:Chrome、Opera Touch PS4:PS4 浏览器
  • 这是您在 Chrome 中 150% 的 codepen 屏幕截图:imgur.com/a/SH1pXS4 不仅问题没有解决,而且即使它可以工作,解决方案也让我非常不安全。为什么我必须从边缘切掉一个像素?为什么 CSS 背景不按应有的方式平铺?
猜你喜欢
  • 2023-04-06
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多