目标
我正在尝试在 SVG 中构建签名板。您可以 在此处查看示例项目。
描述 到目前为止,它可以在 Chrome、Edge 和 Opera 中正常工作,但在 Firefox 中,getScreenCTM() 不考虑规模。
研究
我浏览了来自 bugzilla 的一堆文档以及 SO 中的一些帖子,例如SVG:GetScreenCTM() for nested SVG is different in Firefox但是,仍然无法弄清楚如何解决我的问题。
问题
我添加了一个浏览检查来仅处理 Firefox(因为所有其他浏览器都提供了所需的结果),这允许我添加额外的代码来解决问题,但到目前为止,还没有成功。(SP签名:416)
重现错误
要重现该错误,请在 FireFox 中打开示例链接,然后调整框的大小,使其至少比全屏时小 20%。您将看到鼠标 X/Y 位置随着比例的变化而变化。
我试图从组标签中获取矩阵变换,但是它从 SVG 返回了类似的结果。如何计算 CTM,使其结果类似于/等于 Chrome?
代码
源代码在这里SPSignature: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());
}