【发布时间】:2021-08-05 12:52:04
【问题描述】:
目标
我正在尝试在 SVG 中构建签名板。您可以查看 Sample project here.
说明 到目前为止,它可以根据需要在 Chrome、Edge 和 Opera 中运行,但在 Firefox 中,getScreenCTM() 不考虑规模。
研究
我浏览了来自 bugzilla 的大量文档和 SO 中的几篇帖子,例如 SVG: GetScreenCTM() for nested SVG is different in Firefox,但仍然不知道如何解决我的问题。
问题
我添加了一个浏览检查以仅处理 Firefox(因为所有其他浏览器都提供了所需的结果),这允许我添加额外的代码来解决问题,但到目前为止,还没有成功。 (SPSignature:416)
重现错误
要重现该错误,请在 FireFox 中打开示例链接,然后调整框的大小,使其至少比全屏时小 20%。您将看到鼠标 X/Y 位置随着比例的变化而变化。
我尝试从组标签中获取矩阵变换,但是它从 SVG 返回了类似的结果。如何计算 CTM,使其结果类似于/等于 Chrome?
代码
源代码hereSPSignature:416
_getCursorPoint(event)
{
const svg = document.querySelector('.spsignature svg');
let pt = svg.createSVGPoint();
pt.x = event.clientX;
pt.y = event.clientY;
// firefox workaround:
if (this._checkBrowser() === 'Firefox') {
const matrix = this._decomposeMatrix(svg.getScreenCTM());
let cood = {
x: event.layerX,
y: event.layerY
};
if (matrix.scaleX < 0.9 || matrix.scaleY < 0.9) {
console.log('%c @todo: fix mouse position for FF on getScreenCTM().', 'background:#c00;color:#fff;padding:3px;');
}
return cood;
}
return pt.matrixTransform(svg.getScreenCTM().inverse());
}
【问题讨论】:
-
您链接到的另一个问题不应该在这里适用,因为您似乎没有使用嵌套的
<svg>元素。坦率地说,任何人都很难帮助你,因为你没有提供任何示例代码。请提供一个 minimal reproducible example 来说明您如何使用getScreenCTM()并且它在 Firefox 中产生了不好的结果。 -
@Paul LeBeau 我已经提供了项目示例。就代码而言,它可以出现在项目的示例源代码中(1dollar-shop.com/canvas/SPSignature.js)
-
Stack Overflow 有一个规则要求您提供minimal reproducible example 是有原因的。这里的大多数人没有时间浏览大型代码文件,为您调试它。您可以通过让他们更容易看到问题来增加您的机会。
-
@Robert Longson - 我已尝试按照建议进行更改。 Chrome 没有抱怨它并像以前一样工作,但是,FF 在 createSVGPoint 上抛出了一个错误。但是,它给了我使用 svg 比例值来尝试修复 mouseXY 点的想法。
-
示例项目的链接是 404
标签: svg firefox matrix-transform