使用Javascript和JQuery动画svg元素

时间:2016-01-27 00:34:13

标签: javascript jquery html jquery-svg

我正在尝试设置以下html元素的动画,以实现类似于音量滚轮的功能。

<svg id="circle_svg" width="200" height="175">
<circle cx="100" cy="85" r="75" stroke="black" stroke-width="2" fill="lightgray"/>
<line id="line_alpha" x1="100" y1="85" x2="100" y2="160" style="stroke:rgb(0,0,255);stroke-width:2"/>
<circle id="dot_alpha" cx="100" cy="160" r="10" stroke="black" stroke-width="2" fill="red"/>
</svg>

基本思路是点击红点并移动鼠标会导致以下行为:

  1. 红点沿着圆圈移动(即使鼠标没有完全停留在它上面)。
  2. 圆圈线的终点跟随红点。
  3. 页面中其他位置显示的数字会随着角位移量的增加或减少而增加或减少。
  4. 我在网上找到demo,允许在页面周围拖动一个svg圈,方法是将感兴趣的元素绑定到mousedownmouseup个事件并重写属性{{1圆圈的{}和cx到鼠标的当前位置。

    然而,在使用我的示例(或者甚至使用原始代码)测试cy上的代码时,某些东西无效。你能不能看看,给我一些可能出错的建议?

1 个答案:

答案 0 :(得分:0)

我能够找到问题的解决方案(感谢朋友)并将其作为其他人的参考发布:

将代码从此online demo粘贴到jsfiddle中的主要问题是JavaScript库和函数的顺序无法预测。

因此在定义绑定函数之前可能会调用某些绑定。 此外,演示中的代码比我需要的更复杂。

  • 以下是jsfiddle
  • 上的代码解决方案
  • 以下是SO网站
  • 的工作代码段

&#13;
&#13;
var dragging = false

var updateGraphics = function (e) {
	if (dragging) {
  
    var parentOffset = $('#wheel').offset(); 
    var relX = e.pageX - parentOffset.left;
    var relY = e.pageY - parentOffset.top;
  
    var cx = +$('#circle').attr('cx')
    var cy = +$('#circle').attr('cy')
    var r = +$('#circle').attr('r')
    var dx = relX - cx
    var dy = relY - cy
    //var dx = e.clientX - cx
    //var dy = e.clientY - cy
 
    console.debug('cx: ' + cx);
    console.debug('cy: ' + cy);
    console.debug('dx: ' + dx);
    console.debug('dy: ' + dy);

    console.debug('clientX: ' + e.clientX);
    console.debug('clientY: ' + e.clientY);
  
    console.debug('relX: ' + relX);
    console.debug('relY: ' + relY);
  
    var a = Math.atan2(dy, dx)
    var dotX = cx + r * Math.cos(a)
    var dotY = cy + r * Math.sin(a)
    $('#dot').attr('cx', dotX);
    $('#dot').attr('cy', dotY);
    $('#line_2').attr('x2', dotX);
    $('#line_2').attr('y2', dotY);
  }
}

$('svg').on('mousedown', function (e) {
	dragging = true
	updateGraphics(e)
})

$('svg').on('mouseup', function (e) {
	dragging = false
})

$('svg').on('mousemove', updateGraphics)
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<svg id="wheel" width="200" height="175" style="background-color:lightgreen;">
<circle id="circle" cx="100" cy="85" r="75" stroke="black" stroke-width="2" fill="lightgray"/>
<line id="line_1" x1="100" y1="85" x2="100" y2="160" stroke-dasharray="15,15" style="stroke:rgb(255,0,0);stroke-width:2"/>
<line id="line_2" x1="100" y1="85" x2="100" y2="160" style="stroke:rgb(0,0,255);stroke-width:2"/>
<circle id="dot" cx="100" cy="160" r="10" stroke="black" stroke-width="2" fill="red"/>
</svg>
&#13;
&#13;
&#13;