Javascript 动态缩放容器中的代码编辑器
Javascript code editor in dynamically scaled container
我正在尝试在一个容器中显示功能代码编辑器,该容器的缩放和平移将在运行时进行修改,其旋转和比例也不会触及任何倾斜。文档结构在运行时生成,但相关部分如下所示:
<div id="container" style="transform: scale(2)">
<div id="editor-element">
<!-- stuff generated by editor implementation -->
</div>
</div>
我尝试了 codemirror、ace、monaco,我已经能够毫无问题地应用翻译,但是在缩放所有这些之后都出现了同样的问题 - 编辑器中的光标显示不正确,这使得它们真的很难使用。
我尝试了 css 转换方法和 svg foreignObject。
有谁知道是否有可以工作的编辑器,或者是否有修复上述编辑器之一的方法?
codemirror 中以 x2 比例错误显示光标的示例 - 错误的位置和大小,应该在 rel
之后
在填写了一些问题后,我终于得到了答案。
- codemirror:据了解issue不会很快修复
- ace - master branch 包含修复缩放问题的补丁,但鼠标事件仍在进行中。
- 摩纳哥 - 现有 issue 但没有明显的修复
所以目前最好的结果是 ace 并且看起来在不久的将来它将拥有完美的 css 转换支持。
在 CodeMirror(可能还有 Ace 和 Monaco)的情况下,问题来自 getBoundingClientRect
的内部使用,它在其计算中没有考虑 CSS 转换(检查 here).这是 Web 上的一个老问题,特别是对于深奥的应用程序,如文本编辑器。据我所知,没有合理的方法来修补该方法,浏览器供应商似乎也不愿意提供替代方法。
幸运的是,有一种解决方法可能足以满足您的用例。它对我有用。如果将 CodeMirror 包装在 iframe 中,getBoundingClientRect
将 return 得到正确的结果,因为它会考虑 iframe window 所受的转换。
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);
};
我正在尝试在一个容器中显示功能代码编辑器,该容器的缩放和平移将在运行时进行修改,其旋转和比例也不会触及任何倾斜。文档结构在运行时生成,但相关部分如下所示:
<div id="container" style="transform: scale(2)">
<div id="editor-element">
<!-- stuff generated by editor implementation -->
</div>
</div>
我尝试了 codemirror、ace、monaco,我已经能够毫无问题地应用翻译,但是在缩放所有这些之后都出现了同样的问题 - 编辑器中的光标显示不正确,这使得它们真的很难使用。 我尝试了 css 转换方法和 svg foreignObject。
有谁知道是否有可以工作的编辑器,或者是否有修复上述编辑器之一的方法?
codemirror 中以 x2 比例错误显示光标的示例 - 错误的位置和大小,应该在 rel
之后
在填写了一些问题后,我终于得到了答案。
- codemirror:据了解issue不会很快修复
- ace - master branch 包含修复缩放问题的补丁,但鼠标事件仍在进行中。
- 摩纳哥 - 现有 issue 但没有明显的修复
所以目前最好的结果是 ace 并且看起来在不久的将来它将拥有完美的 css 转换支持。
在 CodeMirror(可能还有 Ace 和 Monaco)的情况下,问题来自 getBoundingClientRect
的内部使用,它在其计算中没有考虑 CSS 转换(检查 here).这是 Web 上的一个老问题,特别是对于深奥的应用程序,如文本编辑器。据我所知,没有合理的方法来修补该方法,浏览器供应商似乎也不愿意提供替代方法。
幸运的是,有一种解决方法可能足以满足您的用例。它对我有用。如果将 CodeMirror 包装在 iframe 中,getBoundingClientRect
将 return 得到正确的结果,因为它会考虑 iframe window 所受的转换。
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);
};