jquery - 为什么 SVG 对象的运动如此不可预测?
问题描述
我正在尝试移动SVG object
usingclick()
方法,但对象没有移动到我希望它移动的位置。
我希望我的对象准确地移动到点击用户屏幕的位置!
看看我正在尝试什么:
$(function() {
// alert("click somewhere on your screen");
$(window).on("click", function(e) {
var xco = e.pageX;
var yco = e.pageY;
$("circle").animate({
"cx": xco,
"cy": yco
}, 1000);
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<svg viewBox="10 10 80 80" style="height:80vh; width:80vw; border:2vw solid black;">
<circle cx="20" cy="10" r="5" fill="yellow" stroke-width="1" stroke="black" />
</svg>
解决方案
您使用的坐标用于页面。在一个svg
. 首先,您需要来自 svg 原点的坐标。此外,您正在设置一个 viewBox,它会更改这些坐标的解释方式。幸运的是,javascript 提供了一些可以提供帮助的函数和对象。主要是,您需要阅读有关getScreenCTM()
. 下面是一个处理转换的函数示例:
function transformAbsPoint(x, y){
var svg = $("#svgel")[0];
var pt = svg.createSVGPoint();
pt.x = x;
pt.y = y;
var loc = pt.matrixTransform(svg.getScreenCTM().inverse());
return [loc.x, loc.y];
}
$(function() {
// alert("click somewhere on your screen");
$(window).on("click", function(e) {
var pt = transformAbsPoint(e.clientX, e.clientY);
$("circle").animate({
"cx": pt[0],
"cy": pt[1]
}, 1000);
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<svg id="svgel" viewBox="10 10 80 80" style="height:80vh; width:80vw; border:2vw solid black;">
<circle cx="20" cy="10" r="5" fill="yellow" stroke-width="1" stroke="black" />
</svg>
推荐阅读
- python - Python websocket:导入错误,无法在docker中导入'create_connection'
- selenium - 在 Google Chrome 版本 87.0.4280.88 的下拉菜单中选择类不起作用
- python - Plotly Mapbox 底图:世界 covid 案例 - GeoJson 文件
- javascript - 如何在mongodb中查询文档数组的元素
- string - 以文字格式重新创建 Kotlin 字符串
- html - 为什么即使 loop='true' 我也没有嵌入音频循环?
- gnuplot - mac OS 的交互式终端
- python - 如何从 Path 切换到 os.path ,反之亦然?
- html - 十一:在头部的noscript标签中渲染一个样式
- java - 如何使用反射或库从超类中获取子类的私有字段的名称?