使用背景图像填充SVG路径元素

jbo*_*chi 157 html css svg image background-image

是否可以background-image为SVG <path>元素设置?

例如,如果我设置元素class="wall",CSS样式.wall {fill: red;}可以工作,但.wall{background-image: url(wall.jpg)}不会.wall {background-color: red;}.

rob*_*rtc 247

你可以通过将背景变成一个模式来做到这一点:

<defs>
  <pattern id="img1" patternUnits="userSpaceOnUse" width="100" height="100">
    <image xlink:href="wall.jpg" x="0" y="0" width="100" height="100" />
  </pattern>
</defs>
Run Code Online (Sandbox Code Playgroud)

根据您的图像调整宽度和高度,然后从路径引用它,如下所示:

<path d="M5,50
         l0,100 l100,0 l0,-100 l-100,0
         M215,100
         a50,50 0 1 1 -100,0 50,50 0 1 1 100,0
         M265,50
         l50,100 l-100,0 l50,-100
         z"
  fill="url(#img1)" />
Run Code Online (Sandbox Code Playgroud)

工作实例

  • @Christoph我不知道,试试看. (12认同)
  • @robertc 请更新您的答案,以提及自 SVG 2 起不推荐使用 `xlink:href`,现在只需使用 `href`。https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href (8认同)
  • @robertc:我对你的答案有疑问.模式从全局坐标(0,0)开始.是否可以让模式使用附加对象的局部坐标系?我想在我的svg中的不同位置绘制一个矩形,结果是,在孔背景中重复该模式,并将对象用作蒙版. (4认同)
  • 非常好,这也适用于base64图像吗?而不是像我在普通CSS中那样的"数据:图像/ png; base64,iVBORw0KGgoAA"这样的墙. (3认同)
  • @robertc我尝试过,但没有用,但是我有一个重复的样式元素。通过消除它,就可以了;) (2认同)

The*_*nty 14

"robertc"的答案是svg - 这类似于d3.js路径代码所使用的.我设法通过应用以下内容为d3.js路径创建动态def.

我设法通过将其定义为以下来实现它

chart.append("defs")
     .append('pattern')
     .attr('id', 'locked2')
     .attr('patternUnits', 'userSpaceOnUse')
     .attr('width', 4)
     .attr('height', 4)
     .append("image")
     .attr("xlink:href", "locked.png")
     .attr('width', 4)
     .attr('height', 4);
Run Code Online (Sandbox Code Playgroud)

  • robertc的答案是纯SVG,不包含d3.js代码 (9认同)
  • 我知道你没有写下这个问题.提问者要求svg解决方案,你正在转储javascript代码.它甚至不是纯粹的JavaScript,所以你使用了某种类型的库.我怀疑它是d3.但是当一个随机用户进入你的答案时,它是无益的,因为他不知道如何使用它.在你详细说明之前我一直在投票. (7认同)
  • 这是d3.js吗?如果是这样,你应该提到它,因为它不在问题标签中 (3认同)