【问题标题】:Using CSS approach how to set an image to fill a path in SVG?使用 CSS 方法如何设置图像以填充 SVG 中的路径?
【发布时间】:2012-12-04 14:10:35
【问题描述】:

我想创建一个 CSS 类来用可以应用于任何 SVG 路径的图像填充路径,并用图像填充该路径。图片必须拉伸以适应该路径。

为了实现这一点;我用 image 标签创建了一个图案,并将宽度和高度设置为 100%。但图像占据了 整个屏幕 的 100%,而不是容器的 objectBoundingBox(在本例中为 svg 标签)。

下面是示例代码:

.myClass {
  fill: url(#image);
  stroke: red;
  stroke-width: 5;
}

<svg id='pattern' xmlns="http://www.w3.org/2000/svg" version="1.1">
  <defs>
    <pattern id='image' x=0 y=0 width="100%" height="100%" patternUnits='objectBoundingBox'>
      <image xlink:href='myImage.png' x=0 y=0 width="100%" height="100%" preserveAspectRatio="none"></image>
    </pattern>
  </defs>
</svg>
<svg id='triangle' xmlns="http://www.w3.org/2000/svg" version="1.1" width='300px' height='300px'>
    <path d='M0 0 L300 0 L300 300 Z' class='myClass'></path>
</svg>

可能是我做错了什么。

请针对此问题提出任何解决方案。

【问题讨论】:

    标签: css svg fill


    【解决方案1】:

    这是你的工作 - http://jsfiddle.net/eAfTc/

    .myClass {
      fill: url(#image);
      stroke: red;
      stroke-width: 5;
    }
    
    <svg id='pattern' xmlns="http://www.w3.org/2000/svg" version="1.1">
      <defs>
        <pattern id='image' width="1" height="1" viewBox="0 0 100 100" preserveAspectRatio="none">
          <image xlink:href='http://dummyimage.com/600x400/abc/333' width="100" height="100" preserveAspectRatio="none"></image>
        </pattern>
      </defs>
    </svg>
    <svg id='triangle' xmlns="http://www.w3.org/2000/svg" version="1.1" width='300px' height='300px'>
        <path d='M0 0 L300 0 L300 300 Z' class='myClass'></path>
    </svg>
    

    请注意,有一个 patternContentUnits 和一个 patternUnits,它们做不同的事情。我个人更喜欢使用 viewBox 来定义坐标系。

    这是一个new example 显示应用于不同大小和纵横比的各种元素的模式,它也摆脱了第一个 svg 片段。

    更新:我在 元素中添加了“preserveAspectRatio”,以及一个显示拉伸和缩放的新示例。

    【讨论】:

    • 解决方案看起来不错。但不能在基于 webkit 的浏览器中工作 [例如铬]
    • @Hoshin 对我来说效果很好,您只需向下滚动即可查看结果(Chrome 为第一个 svg 片段提供了一些默认大小,与 Firefox/Opera 中的不同)。我应该补充一点,通常您不会有单独的 svg 片段用于该模式,只需将 部分添加到 id='triangle' 的 svg 片段即可。
    • @ErikDahlström 该解决方案确实有效,但仅适用于具有相同高度和宽度的 svg-path/group。但是,当将相同的图案应用于具有不同高度和宽度的路径时,图像似乎没有被完全拉伸。这是一个警告,还是存在任何解决方案?
    • @ErikDahlström 我明白你的意思,def 标记和路径通常应该在同一个 svg 片段中,但我的要求是创建一个通用定义以应用于不同尺寸的 svg。跨度>
    • 我一直在寻找一种解决方案,将背景图像添加到我通过 svg 路径绘制的形状中。这修复了它!谢谢!
    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2013-07-23
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 2011-04-17
    相关资源
    最近更新 更多