【发布时间】:2023-02-02 07:40:59
【问题描述】:
我创建了一个带有图标的图案。用户可以拖动滑块来旋转图案的图标。这是我的代码:
const slider = document.getElementById("slider")
const carrotIcon = document.getElementById("carrotIcon")
slider.oninput = function(){
carrotIcon.setAttribute('transform', 'rotate('+slider.value+' 25 25) translate(0 0)')
}
<svg width="200px" height="150px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<symbol id="carrot" viewBox="0 0 50 50">
<rect width="50" height="50" fill="none" stroke="black" stroke-width="1"/>
<path d="M30 13c-1-3-5-4-7-2h-1l1-11h-3l-1 9-4-7-3 1 5 8-8-4-1 2 9 5h-1c-2 2-3 5-2 7l2 2 5-3 1 2-5 3 8 9 5-3 2 2-5 3 12 14 3-2-8-25-5 3-1-2 5-3-3-8z" />
</symbol>
<pattern id="myPat" patternUnits="userSpaceOnUse" width="50" height="50" patternTransform="rotate(0)">
<use id="carrotIcon" xlink:href="#carrot" width="50" height="50" fill="orange" transform="rotate(0 25 25) translate(0 0)"></use>
</pattern>
<rect x="0px" y="0px" width="300px" height="200px" fill="url(#myPat)"> </rect>
</svg>
<p style=font-size:15px>Rotate Icons </p>
<input id="slider" type="range" min="0" max="360" value="0" step='1' >
可以注意到当你旋转的时候,pattern的内容会被<pattern>的frame截掉,因为在某些维度上pattern的内容比pattern的frame要大。
希望旋转时图案的内容能从图案中溢出。它们可以相互重叠。这是预期结果的图表:
你知道如何实现吗?
2023 年 2 月 2 日更新:
我用比<pattern> 更大的图标尝试了@ccprog 的解决方案。
我把<pattern>的宽高设置为50,<use>的宽高设置为70,那么图标还是会被切掉。
这是我的代码:
const slider = document.getElementById("slider")
const carrotIcon = document.getElementById("carrotIcon")
slider.oninput = function(){
carrotIcon.setAttribute('transform', 'rotate('+slider.value+' 25 25) translate(0 0)')
}
<svg width="200px" height="150px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<symbol id="carrot" viewBox="0 0 50 50" overflow="visible">
<g id="carrotIcon">
<path d="M30 13c-1-3-5-4-7-2h-1l1-11h-3l-1 9-4-7-3 1 5 8-8-4-1 2 9 5h-1c-2 2-3 5-2 7l2 2 5-3 1 2-5 3 8 9 5-3 2 2-5 3 12 14 3-2-8-25-5 3-1-2 5-3-3-8z" />
</g>
</symbol>
<pattern id="myPat" patternUnits="userSpaceOnUse" width="50" height="50" style="overflow:visible">
<use xlink:href="#carrot" width="70" height="70" fill="orange"></use>
<use xlink:href="#carrot" x="-50" width="70" height="70" fill="orange"></use>
<use xlink:href="#carrot" x="50" width="70" height="70" fill="orange"></use>
<use xlink:href="#carrot" y="-50" width="70" height="70" fill="orange"></use>
<use xlink:href="#carrot" y="50" width="70" height="70" fill="orange"></use>
</pattern>
<rect x="0px" y="0px" width="300px" height="200px" fill="url(#myPat)" overflow="visible"> </rect>
</svg>
<p style=font-size:15px>Rotate Icons </p>
<input id="slider" type="range" min="0" max="360" value="0" step='1' >
【问题讨论】:
-
感谢您的 cmets,但这并不能解决我的问题。作者在这个视频中使用
patternTransform属性旋转了整个<pattern>。但是,我只想旋转<pattern>里面的元素,我想知道如何让这些元素不被<pattern>的frame截断。