SVG 组通过其上的可拖动文本区域移动

SVG group moved by draggable textarea over it

我的情况是什么:

  1. 我有一个 svg (1024x576) 显示在网站上,宽度为 818px,高度为 458px
  2. 超过组 #levapostava 是绝对定位的 textarea 并且是可拖动的(超过 svg)
  3. 当文本区域被拖动时,#levapostava 通过改变矩阵被拖动

我的问题是什么:

当我将文本区域(绝对位置)向左拖动 10px 时,我需要知道应该向左移动多少像素#levapostava,因为视图框为 1024x576,svg 显示为 818x458px。由于翻译原因不是10px

我只是浪费了 4 个小时试图解决这个问题,但没有成功。

感谢您的任何建议!

    <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="1024px" height="576px" viewBox="0 0 1024 576" enable-background="new 0 0 1024 576" xml:space="preserve">
        <g>
            <g id="levapostava" transform="matrix(1 0 0 1 0 0)">
               ...
            </g>
        </g>
    </svg>

    <textarea which is absolutely positioned over #levapostava />

在 SVG 元素上调用函数 getScreenCTM() 将为您提供用于将 SVG 点转换为屏幕坐标的矩阵。但是你想要反过来,所以你需要通过调用 inverse() 来反转矩阵。

现在,如果您 运行 通过矩阵的屏幕点,您将在 SVG 中获得等效点。您可以使用它来转换 "levapostava" 组。

您的代码将类似于:

// Get the SVG dom element
var  svg = document.getElementById("mysvg");

// Get an SVGPoint object that we can transform
var screenPoint = svg.createSVGPoint();
screenPoint.x = textareaLeft;
screenPoint.y = textareaTop;

// Get the Current Transform Matrix of the SVG, and invert it
var inverseCTM = svg.getScreenCTM().inverse();

// Apply the inverted transform to the (textarea) screen coordinates
var svgPoint = screenPoint.matrixTransform(inverseCTM);
// 'svgPoint' is now the point in the SVG space that corresponds to
// screenPoint in screen space

// Apply a transform the SVG object to match the textarea
var levapostava = svg.getElementById("levapostava");
levapostava.setAttribute("transform", "translate(" + svgPoint.x + "," + svgPoint.y + ")");