我已经用相同的图案填充了很多路径。这些路径属于同一类。我想单独更改其中一个路径中图案的位置,将图案放在我想要的位置,但不影响其他路径中图案的位置。我该如何操作?
例如,这里我用一个图案填充了三个矩形。我想通过拖动滑块来改变rectA中图案的位置。目前在我的代码中,它将同时改变所有三个形状中图案的位置。
<script src="https://unpkg.com/d3@5.15.1/dist/d3.min.js"></script>
<script src="https://unpkg.com/d3@5.15.1/dist/d3.min.js"></script>
<script src="https://d3js.org/d3.v4.js"></script>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<svg width="300" height="100">
<defs>
<pattern id="myPattern"
x="0" y="0" width="40" height="40"
patternUnits="userSpaceOnUse" patternTransform="rotate(0)">
<rect id="rotateRect" x="5" y = "5" width = "30" height = "30" fill = " #87CEFA "/>
</pattern>
</defs>
<rect id="rectA" class="myClass" x="0" y="0" width="100" height="100"
style="stroke: #000000;" />
<rect id="rectB" class="myClass" x="100" y="0" width="100" height="100"
style="stroke: #000000;" />
<rect id="rectC" class="myClass" x="200" y="0" width="100" height="100"
style="stroke: #000000;" />
</svg>
<p style=font-size:15px>Move Pattern in Rect A </p>
<input id="slider" type="range" min="0" max="100" value="5" step='1' >
<script>
d3.selectAll(".myClass")
.attr("fill", "url(#myPattern)")
const slider = document.getElementById("slider")
const myPattern = document.getElementById("myPattern")
slider.oninput = function(){
myPattern.setAttribute("patternTransform", "translate(0"+","+slider.value+") ")
}
</script>
我要的结果是这样的:
2条答案
按热度按时间neskvpey1#
根本原因是模式id是*全局*id;第一个定义的id将在所有图形上设置图案。
<svg>
放置在本机Web组件中,因此所有id值都是***本地***(对于shadowDOM)值:
0lvr5msh2#
您还可以使用
href
属性轻松创建“子”模式。因此,这些新模式是基于初始模式模板的,更重要的是与初始模式模板相关联。
实际上类似于
<use>
引用。但是在很多方面有很大的不同,因为引用的模式不能继承像填充颜色这样的属性。