2015-09-07 64 views
3

我是SVG初学者,请耐心等待。单击按钮时切换SVG动画效果

基本上,我希望动画中的一个三角形从上到下移动时点击并从下往上移动,如果再次点击。

我的问题是现在我只能通过点击移动一个三角形从上到下。任何人都可以提出解决这个问题?任何指导将不胜感激。

<svg viewBox="0 0 24 24" preserveAspectRatio="none"> 
    <polygon points="2,-5 12,6 22,-5" fill="#000"> 
    <animate attributeName="points" attributeType="XML" 
     from="2,-5 12,6 22,-5" to="2,0 12,11 22,0" 
     begin="click" dur="0.5s" 
     fill="freeze"> 
    </animate> 
    </polygon> 
</svg> 

或者点击此链接:jsfiddle

+1

您可以用两个多边形做。观众看起来好像只有一个多边形。 –

+0

感谢您的建议。我明白你的意思,但我不知道如何做代码。这是我做的链接 - [link](http://jsfiddle.net/aw112gt9/)。我知道这是错的,你能帮助我吗?谢谢。 – Eelyn

回答

1

这里有一个SMIL唯一的答案。如果您需要IE支持,请添加fakeSmile。其中一个从上到下移动,然后躲在自己被另一个从底部移动到顶部,然后躲在本身使得原来可见被替换:

<svg viewBox="0 0 24 24" preserveAspectRatio="none"> 
 
    <polygon points="2,0 12,11 22,0" fill="#000" display="none"> 
 
    <animate id="a2" attributeName="points" attributeType="XML" 
 
     from="2,0 12,11 22,0" to="2,-5 12,6 22,-5" 
 
     begin="click" dur="0.5s" 
 
     fill="freeze"> 
 
    </animate> 
 
    <set attributeName="display" to="block" begin="a1.end" fill="freeze" /> 
 
    <set attributeName="display" to="none" begin="a2.end" fill="freeze" /> 
 
    <set attributeName="points" to="2,0 12,11 22,0" begin="a2.end" fill="freeze" /> 
 
    </polygon> 
 
    <polygon points="2,-5 12,6 22,-5" fill="#000"> 
 
    <animate id="a1" attributeName="points" attributeType="XML" 
 
     from="2,-5 12,6 22,-5" to="2,0 12,11 22,0" 
 
     begin="click" dur="0.5s" 
 
     fill="freeze"> 
 
    </animate> 
 
    <set attributeName="display" to="none" begin="a1.end" fill="freeze" /> 
 
    <set attributeName="points" to="2,-5 12,6 22,-5" begin="a1.end" fill="freeze" /> 
 
    <set attributeName="display" to="block" begin="a2.end" fill="freeze" /> 
 
    </polygon> 
 
</svg>

+0

感谢您的回答。我想重复动画,如果再次点击,将从下往上移动。这不适用于IE。 – Eelyn

+0

是的,我刚才使用了FakeSmile。刚刚意识到我插入了错误的地方。我可以知道如何重复动画吗?对不起,因为我是SVG初学者。几天前开始学习。 – Eelyn

+0

第一次点击,三角形移动平稳。第二次点击,三角形不能从下到上移动。第三次点击,动画恢复正常。不用担心,我猜这只是一个小问题。非常感谢你的回答!对不起,因为我还有一个问题。我可以更改点击图像/按钮,而不是点击三角? – Eelyn

0

我认为这是不可能的,基本的SVG动画元素,你需要的JavaScript。
(其实,有什么R.Longson在comment建议)

一个肮脏的方式可以由添加第二个动画,这将使你的元素动画到原来的步骤,并触发正确的方法animate.beginElement()点击你的<polygon>

但是您需要保留当前状态的参考,因此在以下示例中,我将big_state属性添加到polygon对象。

var poly = document.querySelector('polygon'); 
 
poly.onclick = function() { 
 
    var anims = this.querySelectorAll('animate'); 
 
    anims[+!!this.big_state].beginElement(); 
 
    this.big_state = !this.big_state; 
 
}
<svg viewBox="0 0 24 24" preserveAspectRatio="none"> 
 
    <script type="text/ecmascript" xlink:href="FakeSmile-master/smil.user.js" /> 
 
    <polygon points="2,-5 12,6 22,-5" fill="#000"> 
 
    <animate attributeName="points" attributeType="XML" from="2,-5 12,6 22,-5" to="2,0 12,11 22,0" begin="indefinite" dur="0.5s" fill="freeze" id="bigger" /> 
 
    <animate attributeName="points" attributeType="XML" from="2,0 12,11 22,0" to="2,-5 12,6 22,-5" begin="indefinite" dur="0.5s" fill="freeze" id="smaller" /> 
 
    </polygon> 
 
</svg>

+0

感谢您的回答。我在网上看到了这种方法,但不幸的是,它不适用于IE。我对吗?或者你有任何解决方案? – Eelyn

+0

我认为这是IE不支持的整个SMIL动画。 (你的小提琴在那里工作吗?)然后你的选择是CSS动画,或者JavaScript动画来更新每个新帧的点数......但是哼哼,这对于这个问题来说是一种无关紧要的问题,我会让你写那么... – Kaiido

+0

不,我必须使用FakeSmile-master才能在IE上运行。我在SVG之前使用了javascript,但是我遇到了很多问题,例如不同的设备和z-index问题(太多的图层)。这就是为什么我改用SVG代替。 – Eelyn