【问题标题】:SVG background image - centered and scaledSVG 背景图像 - 居中和缩放
【发布时间】:2014-08-01 00:05:12
【问题描述】:

基本上,我需要将 CSS background-imagebackground-repeat:no-repeatbackground-position: 50% 50%background-size: 90%(略有不同)模仿为 SVG 形状。它应该看起来像这样(百分比、盾牌和锚点作为背景图像):

要求是:

  • 图像必须与fill 颜色一起使用,并且在其上独立 (background-image)
  • 只能是一张图片,不能有很多副本 (background-repeat:no-repeat)
  • 它必须在形状内居中 (background-position: 50% 50%)
  • 图片必须适合形状并且不能超出边框
  • 理想情况下,应该对图像应用一种填充 (background-size: 90%)

我对 SVG 的使用还不是很熟练。尝试使用patterns 并使用模式单位和纵横比:

<pattern id="p2" height=".9" width=".9" 
    patternUnits="objectBoundingBox"
    patternContentUnits="userSpaceOnUse"
    viewBox="0 0 140 165" preserveAspectRatio="xMidYMid meet"
>
    <g width="1" height="1" transform="matrix(1.25,0,0,-1.25,0,164.4025)" preserveAspectRatio="xMidYMid meet">
    ...
    </g>
</pattern>

通过这种方式,图像被缩放到形状大小的 90%(图案widthheight),通过viewBox 调整居中(仅适用于这个特定的)。但在 Firefox 中重复并被拉伸(从 v29 开始),就好像它是 preserveAspectRatio = none。在 Chrome 中没有拉伸。而且我想不出一种方法来使用带有填充颜色的图像。

The live example

非常感谢任何帮助。

【问题讨论】:

    标签: svg background-image


    【解决方案1】:

    更新答案已更正,因为我误解了问题。

    要使您的模式按照您的意愿行事(具有 10% 的填充),您应该调整模式的 viewBox 值。

    因此,例如,您的锚形状的非填充 viewBox 是:

    viewBox="0 0 137 166"
    

    您希望有 10% 的填充,所以让我们在边缘周围添加 17。我选择了 17,因为它大约是高度的 10%:

    viewBox="-17 -17 171 200"
    

    这里我们从 minX 和 minY 中减去 17,然后在宽度和高度上加上 34。所以你的新模式定义如下所示:

    <pattern id="p2" height="1" width="1"
             patternUnits="objectBoundingBox"
             patternContentUnits="userSpaceOnUse"
             viewBox="-17 -17 171 200" preserveAspectRatio="xMidYMid meet">
        <g> ... </g>
    </pattern>
    

    Demo fiddle here

    【讨论】:

    • 感谢您的回复。我知道模式是为了模式(顾名思义)。但是为许多形状中的每一个绘制三个(总共)伪背景元素似乎有点过分了。 js 只处理三个预定义的 bgs 也是如此。模式似乎在某种程度上有所帮助,所以我自然想知道是否有办法让它们发挥作用。
    • 元素会以任何一种方式绘制,无论它们是否是模式。每个形状不必有一个单独的“锚”。它可以定义一次并重复使用。
    • BigBadaboom,你的意思是在&lt;defs&gt;&lt;symbol&gt; 中定义一个形状而不是&lt;use&gt; 吗?如果是这样,(如果我做对了)它将需要手动计算&lt;use&gt; 元素的位置或创建许多具有预定义位置的位置,这是多余的部分。另一方面,pattern 可以作为fill="#patten1" 的一个属性应用,这是吸引我使用它们的原因。
    • 我明白了,我有点误解了你的问题。我已经重写了我的答案,以实现我现在相信你所追求的目标。
    • 抱歉这么久才回复。它确实有效 - 正如计划的那样,感谢您的时间和建议!然而,这些模式似乎延伸到了表单的边缘——仅在 Firefox 中(至少从 v29 开始)。这真的是一个错误,还是所有其他浏览器(在 Chrome、IE 10、Presto- 和 Blink-Opera 中测试)都以错误的方式执行此操作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    相关资源
    最近更新 更多