【发布时间】:2023-03-31 12:08:01
【问题描述】:
我正在使用 RevealJS 创建一个演示文稿,并希望合并一些使用 D3 创建的交互式 SVG 可视化。我之前已经轻松完成了很多次,但这次我遇到了一些困难。经过一番调试,我将问题追溯到以下问题:由于某种原因,当整个东西被包裹在 RevealJS 中时,鼠标相对于 SVG 的位置没有正确报告。
我的原始代码版本使用标准 D3 技术来获取鼠标位置。不过,为了简化和隔离问题,我删除了 D3,现在使用 vanilla Javascript 来获取鼠标位置,详见 this StackOverflow answer。我的代码(实现为 stack-sn-p)如下所示:
var info = document.getElementById("info");
var svg = document.getElementById("svg");
pt = svg.createSVGPoint();
var cursorPoint = function(evt){
pt.x = evt.clientX; pt.y = evt.clientY;
return pt.matrixTransform(svg.getScreenCTM().inverse());
}
svg.addEventListener('mousemove',function(evt){
var loc = cursorPoint(evt);
info.textContent = "(" + loc.x + ", " + loc.y + ")";
},false);
svg {
border: solid black 1px;
border-radius: 8px;
}
<div id="info">pos</div>
<svg id="svg" width="300" height="200"></svg>
但是,当我在 Mac 上的 Firefox 中的 RevealJS 中运行它时,我得到了非常不同的数字 - 好像坐标已经移动了 (-423,-321) 或其他一些大的负数对。我在下面添加了一个屏幕截图来说明这一点。鼠标没有出现在屏幕截图中,但在左上角附近,因此它应该读取类似 (3,5) 或类似的一些小值。
我假设 RevealJS 正在 SVG 上执行一些额外的转换,但我找不到它,我希望有一些 RevealJS 推荐的方法来处理这个问题。
RevealJS version here 有一个完整的工作版本(嗯,实际上并不正确)。它与上面的 stack-sn-p 中的代码几乎完全相同,但包装在一个最小的 RevealJS 模板中。
更仔细地研究一下,这个问题似乎发生在 Firefox 上,但没有发生在 Chrome 上。我在我 1 岁的 Macbook Pro 上运行这些程序的当前版本。我真的很想要一些可以在各种浏览器中运行的代码,并且肯定希望它可以在 Firefox 和 Chrome 中运行。
【问题讨论】:
-
你说的“非常不同的数字”是什么意思?我得到了几乎相同的东西......实际上,如果你只是给我看两个代码而不说有问题,我什至不会注意到差异。
-
@GerardoFurtado 好问题 - 谢谢。我已经编辑了我的帖子,希望更清楚。您的问题让我意识到我应该检查它在另一个浏览器中的工作方式。问题出现在我 Mac 上的 Firefox 中,但不在 Chrome 中。
-
这很有趣,我没有得到那些负值......正如我所说,我得到的几乎一样。
-
@GerardoFurtado 您没有使用 Firefox 获得这些负值吗?你在 Mac 上吗?还是电脑?
-
我在PC上,Windows 7 64bit,Chrome 63。这是截图,鼠标几乎在左上角:snag.gy/rJ0cBF.jpg
标签: javascript svg reveal.js