我在 HTML 文档中嵌入了 SVG。(SVG)圆使用<animate>
. 我试图找到一种方法,仅当它水平移动时才将某种事件侦听器放在那个圆圈上。
移动(水平)后,我想找到圆形的 x 坐标,并将第三个(外部)矩形宽度设置为圆形的相对位置。这第三个矩形就像一个进度条,跟踪圆圈的水平进度。
SVG圆圈(顺便说一下,圆圈在SVG g组内)是否被触发某种事件移动我可以设置一个侦听器,以便我可以更改进度条的宽度属性?
我曾认为,如果<animate>
移动/更改的元素或元素触发某种事件,我可以尝试捕捉它,然后更改栏的宽度。
我发现在矩形上使用“独立”动画效果并不好,因为当圆圈向上移动时,增长的速度非常不同。我没有使用 canvas 元素,因为我试图保持可伸缩性和形状语义。(我更喜欢 javascript 解决方案,但我会感谢其他方法。)
回答后编辑:分析器非常适合 piint 并且(我认为)很有帮助。我对 SVG 很陌生,我可能误解了一些东西。出于这个原因,我包括代码。
我已尝试实施您的建议,但似乎没有成功。应用于圆圈的 .cx.animVal.value 似乎没有得到我需要的东西。我将包含我的代码的截断版本,它应该沿着本身水平移动的路径移动球;两个矩形(inBar 和 outBar)应该跟踪水平位移或多或少地以与球相同的速率增长。为了确保 setInterval 工作并正确收集位置,添加了一行来列出 oBall..animVal 和 oball..baseVal。在 FF 21.0 中,animVal 沿位移没有变化。我是否正确理解了您的建议?这里遵循代码(包括标题等,因为我特别是 SVG 中的菜鸟):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
<head><title>Motion</title>
<script>function beginAnim(anim,sPos){anim.beginElement();}</script>
</head>
<body>
<div id="here">
<button onclick="beginAnim(document.getElementById('anim'),'out');">START</button>
</div>
<div style="height:350px;">
<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
<script type="text/ecmascript">
<![CDATA[
function trckngBars(){
oDiv=document.getElementById('here');
var oBall=document.getElementById('ball');
var oBar=[document.getElementById('inBar'),document.getElementById('outBar')];
idTimer=self.setInterval(function(){updtBars(oBall,oBar);},100);
}
function updtBars(oBall,oBar){
var xCoor=String(oBall.cx.animVal.value);
oDiv.innerHTML+='==>'+oBall.cx.animVal.value+'..'+oBall.cx.baseVal.value;
oBar[0].setAttribute("width",xCoor);
oBar[1].setAttribute("width",xCoor);
}
// ]]>
</script>
<defs>
<path id="throw" d="M0,0 q 80,-55 200,20" style="fill: none; stroke: blue;" />
</defs>
<g>
<g>
<rect x="2" y="50" width="400" height="110" style="fill: yellow; stroke: black;"></rect>
</g>
<g>
<!-- show the path along which the circle will move -->
<use id="throw_path" visibility="hidden" xlink:href="#throw" x="50" y="130" />
<circle id="ball" cx="50" cy="130" r="10" style="fill: red; stroke: black;">
<animateMotion id="ball_anim" begin="anim.begin+1s" dur="6s" fill="freeze" onbegin="trckngBars();" onend="window.clearInterval(idTimer);">
<mpath xlink:href="#throw" />
</animateMotion>
</circle>
<rect id="inBar" x="50" y="205" width="20" height="30" style="fill: purple;stroke-linecap: butt;">
<!-- <animate attributeType="XML" attributeName="width" from="0" to="200" begin="ball_anim.begin" dur="6s" fill="freeze" /> -->
</rect>
</g>
<animateTransform id="anim" attributeType="XML" attributeName="transform" type="translate" from="0" to="200" begin="indefinite" dur="10s" fill="freeze" />
</g>
<rect id="outBar" x="50" y="235" width="10" height="30" style="fill: orange;stroke-linecap: butt;">
<!-- <animate attributeType="XML" attributeName="width" from="0" to="400" begin="anim.begin+1s" dur="10s" fill="freeze" /> -->
</rect>
</svg>
</div>
</body>
</html>
如果代码运行,似乎移动#ball 的 animVal 保持在相同的 x 坐标 (50) 上,而显然它正在移动。