javascript - 缩放至 SVG 文档中的光标位置

标签 javascript html svg

尝试缩放到光标位置。我在缩放时翻译图像,但还没有正常工作。

如果您尝试演示,您将不会发现,如果缩放到一个位置,然后移动鼠标并缩放到另一位置,圆圈会跳跃。

jsFiddle:http://jsfiddle.net/nadirabid/f06n05ep/9/

function setCTM(element, matrix) {
  var m = matrix;
  var s = "matrix(" + m.a + "," + m.b + "," + m.c + "," + m.d + "," + m.e + "," + m.f + ")";

  element.setAttributeNS(null, "transform", s);
}

var svgEl = document.getElementById('svg');
var zoomEl = document.getElementById('zoom');
var zoomScale = 1;

svgEl.addEventListener('wheel', function(e) {
  var delta = e.wheelDeltaY;

  zoomScale = Math.max(0.5, zoomScale - (delta / 2200));
  zoomScale = Math.min(zoomScale, 1.5);

  var p = svgEl.createSVGPoint();
  p.x = e.clientX;
  p.y = e.clientY;

  p = p.matrixTransform(svgEl.getCTM().inverse());

  var zoomMat = svgEl.createSVGMatrix()
    .translate(p.x, p.y)
    .scale(zoomScale)
    .translate(-p.x, -p.y);

  setCTM(zoomEl, zoomMat);
});
svg {
  background-color: #eee;
}
body {
  overflow: hidden;
}
<svg id="svg" width="400" height="400">
  <g id="zoom">
    <circle r="40" cx="200" cy="200"></circle>
  </g>
</svg>

最佳答案

发生这种情况是因为您完全替换了旧矩阵,而没有考虑以前的“缩放历史记录”。

您应该做的是读取(或记住)旧矩阵,然后对其应用新的平移和缩放操作。

关于javascript - 缩放至 SVG 文档中的光标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28121561/

相关文章:

javascript -\u 在 JavaScript String.raw`template literal`

javascript - 如何使设置为半小时后每秒运行的 jquery 脚本超时?

javascript - 输入后运行JS函数,节点

javascript - 如何在 jquery 中替换 Anchor 标签的 href 中的一些文本

java - batik 光栅器空白 png 文件

html - 减少 svg 图像的厚度(箭头)

javascript - 如何在 IgGrid 单元格(Infragistics)中获取正则表达式?

javascript - 如何使用 javascript 来 "click"一个没有 id 或名称的按钮?

ios - iOS 上有html5 音频限制,是否可以同时播放背景音乐和音效?

css - 在 HTML5 Canvas 上使用 CSS 样式绘制 SVG