【发布时间】:2020-02-21 01:33:44
【问题描述】:
我有一个 div,其中包含一个 300x300 像素的 SVG 图像和一个 1000x1000 的视图框。 该图像描述了一个红色矩形之上的蓝色矩形。 当我移动鼠标时,图像内的鼠标位置会跟随一个圆圈:
一切都很完美,除了当我应用变换改变透视和旋转时,鼠标指针和圆心不再匹配:
代码在这里:
$(function() {
$('#image').mousemove(function(event) {
var svg = document.querySelector('svg');
var pt = svg.createSVGPoint();
pt.x = event.clientX;
pt.y = event.clientY;
pt = pt.matrixTransform(svg.getScreenCTM().inverse());
overlay = document.getElementById('overlay');
$('#overlay').html(
"<circle cx='" + pt.x + "' cy='" + pt.y + "' r='50' stroke='#8f00ff' fill='transparent' stroke-width='10' /></svg>"
);
refresh = $("#overlay").html();
$("#overlay").html( refresh )
});
});
function Transform() {
$('#image').css({
transformOrigin: '500px 500px',
transform: 'perspective(100px) rotateX(5deg)'
});
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id='image' tabindex='0' >
<svg id='svgmap' width='300' height='300' xmlns='http://www.w3.org/2000/svg' version='1.1' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 1000 1000'>
<rect x='0' y='0' width='1000' height='1000' fill='red' />
<rect x='250' y='250' width='500' height='500' stroke='yellow' fill='blue' stroke-width='10' />
<g id='overlay'></g>
</svg>
</div>
<button onclick='Transform()'>Transform</button>
我的目标是保持紫色圆圈中心和鼠标指针之间的匹配,即使对对象应用了变换也是如此。 有办法吗?
【问题讨论】:
-
您必须自己计算转换。 getScreenCTM 的浏览器实现在呈现 CSS 转换时会出现错误。
-
@Robert Longson 你好罗伯特。所有浏览器都有错误还是只有 Cromium 核心?
-
Chrome 根本不支持 SVG 的 3D 转换。你实际上是在改变父 div 那里。但是,是的,SVG 的 3D 转换在所有浏览器中都有问题。
-
@Stefano Radaelli 嗨。如果圆圈不变形,解决方案是否适合您?
-
@Stefano Radaelli :-) 是的。您也可以尝试使用
绘制没有变换的正方形。
标签: javascript svg transform perspective