动画 feComposite SVG 过滤器元素
Animating feComposite SVG filter elements
我有两个 svg 形状,一个在另一个上面,我在两个上都应用了 feComposite 滤镜,这样顶部的形状就会去掉底部形状的一部分。代码如下,运行正常
<svg width="100" height="100">
<defs>
<filter id="myfilter">
<feImage xlink:href="#layer1" result="lay1"/>
<feImage xlink:href="#layer2" result="lay2"/>
<feComposite operator="out" in="lay1" in2="lay2"/>
</filter>
</defs>
<g filter="url(#myfilter)">
<circle id="layer1" cx="50" cy="50" r="40" stroke-
width="0" fill="green" />
<circle id="layer2" class="small" cx="20" cy="60" r="20" stroke-
width="0" fill="red" />
</g>
</svg>
现在我想为顶部形状设置动画,但是当我尝试应用动画时,两个形状都设置了动画,我不明白为什么,因为我只用 class="small"
定位了第二个形状。这是动画的 css 代码。
@keyframes rock {
0% {
transform: rotate(45deg);
}
50% {
transform: rotate(0deg);
}
100% {
transform: rotate(-45deg);
}
}
.small {
animation-name: rock;
animation-duration: 5s;
animation-iteration-count: infinite;
animation-timing-function: linear;
}
我对这种行为感到困惑,希望有人能解决这个问题。当过滤器作为一个组应用到它们时,是否不能单独为 svg 元素设置动画?但这似乎没有意义,因为 svg 元素可以单独定位。
这里是 link 代码笔:https://codepen.io/lanlanonearth/pen/bGbRyVo
请试试这个:你把两个圆圈都放在 <defs>
中,你 <use xlink:href="#layer1"
。接下来将过滤器应用于 <use>
元素。
<svg width="100" height="100">
<defs>
<circle id="layer1" cx="50" cy="50" r="40" stroke-width="0" fill="green" />
<circle id="layer2" class="small" cx="20" cy="60" r="20" stroke-width="0" fill="red" />
<filter id="myfilter">
<feImage xlink:href="#layer1" result="lay1"/>
<feImage xlink:href="#layer2" result="lay2"/>
<feComposite operator="out" in="lay1" in2="lay2"/>
</filter>
</defs>
<use xlink:href="#layer1" filter="url(#myfilter)"></use>
</svg>
我有两个 svg 形状,一个在另一个上面,我在两个上都应用了 feComposite 滤镜,这样顶部的形状就会去掉底部形状的一部分。代码如下,运行正常
<svg width="100" height="100">
<defs>
<filter id="myfilter">
<feImage xlink:href="#layer1" result="lay1"/>
<feImage xlink:href="#layer2" result="lay2"/>
<feComposite operator="out" in="lay1" in2="lay2"/>
</filter>
</defs>
<g filter="url(#myfilter)">
<circle id="layer1" cx="50" cy="50" r="40" stroke-
width="0" fill="green" />
<circle id="layer2" class="small" cx="20" cy="60" r="20" stroke-
width="0" fill="red" />
</g>
</svg>
现在我想为顶部形状设置动画,但是当我尝试应用动画时,两个形状都设置了动画,我不明白为什么,因为我只用 class="small"
定位了第二个形状。这是动画的 css 代码。
@keyframes rock {
0% {
transform: rotate(45deg);
}
50% {
transform: rotate(0deg);
}
100% {
transform: rotate(-45deg);
}
}
.small {
animation-name: rock;
animation-duration: 5s;
animation-iteration-count: infinite;
animation-timing-function: linear;
}
我对这种行为感到困惑,希望有人能解决这个问题。当过滤器作为一个组应用到它们时,是否不能单独为 svg 元素设置动画?但这似乎没有意义,因为 svg 元素可以单独定位。
这里是 link 代码笔:https://codepen.io/lanlanonearth/pen/bGbRyVo
请试试这个:你把两个圆圈都放在 <defs>
中,你 <use xlink:href="#layer1"
。接下来将过滤器应用于 <use>
元素。
<svg width="100" height="100">
<defs>
<circle id="layer1" cx="50" cy="50" r="40" stroke-width="0" fill="green" />
<circle id="layer2" class="small" cx="20" cy="60" r="20" stroke-width="0" fill="red" />
<filter id="myfilter">
<feImage xlink:href="#layer1" result="lay1"/>
<feImage xlink:href="#layer2" result="lay2"/>
<feComposite operator="out" in="lay1" in2="lay2"/>
</filter>
</defs>
<use xlink:href="#layer1" filter="url(#myfilter)"></use>
</svg>