在 CodeMirror 的情况下(也可能是 Ace 和 Monaco),问题来自 的内部使用getBoundingClientRect
,它在计算中没有考虑 CSS 转换(请查看此处)。这是 Web 上的一个老问题,特别是对于文本编辑器等深奥的应用程序。据我所知,没有健全的方法来修补该方法,浏览器供应商似乎也不愿意提供替代方案。
幸运的是,有一种解决方法可能足以满足您的用例。对我来说确实如此。如果将 CodeMirror 包装在 iframe 中,getBoundingClientRect
将返回正确的结果,因为它会考虑 iframe 窗口所受的转换。
A 创建了一个演示完整概念的 CodePen:
https://codepen.io/samuelmtimbo/pen/dyXgpaV
这是代码的重要部分:
const iframe = document.createElement("iframe");
iframe.onload = () => {
const _window = iframe.contentWindow;
const _document = _window.document;
const _body = _document.body;
const _div = _document.createElement("div");
_body.appendChild(_div);
const link = _document.createElement("link");
link.href =
"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.58.2/codemirror.min.css";
link.rel = "stylesheet";
_body.appendChild(link);
const script = _document.createElement("script");
script.src =
"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.58.2/codemirror.min.js";
script.onload = () => {
const codeMirror = _window.CodeMirror(_div, {
value: "function main() {}\n",
mode: "javascript"
});
};
_body.appendChild(script);
};