首页 > 解决方案 > contenteditable 将焦点移动到行中的位置

问题描述

您好,我正在构建一个基于块的富文本编辑器,并发现使用多个 contenteditable 块会破坏从一行中心移动到上面一行中心的问题。

正常行为是焦点移动到当前内容可编辑字段的开头,例如。从这里

<div contenteditable>this is a text<div>
<div contenteditable>this is a| text<div>

<div contenteditable>this is a text<div>
<div contenteditable>|this is a text<div>

使用 js,我可以将当​​前选择捕获为范围并获取 DOMRECT 以检查范围是否在该元素的最上面一行,然后触发焦点移动到其上方的 contenteditable 字段,例如:

<div contenteditable>this is a text<div>
<div contenteditable>this is a| text<div>

<div contenteditable>this is a text|<div>
<div contenteditable>this is a text<div>

问题是这不会将插入符号移动到上面的位置,而只是移动到 contenteditable 块的开头或结尾

我找到了像https://editorjs.io/这样的工具,但它的实现只是先跳到元素的开头,然后再跳到上面元素的结尾。然后我发现https://www.notion.so并且它的编辑器实际上可以移动到以前的 contenteditable 字段,所以需要有一个可能的解决方案

对于概念,这也适用于非等宽字体,因为我首先认为它们根据元素计算行的宽度,然后添加字符的宽度以达到与下一行对插入符号相同的宽度百分比

所以我的问题是如何根据插入符在下部 contenteditable 字段中的位置计算插入符需要进入上部 contenteditable 字段中的位置,以便我的结果可以像这样工作:(这次写的没有 html 标签更好的可读性)

this is a text
this is the second line of block one

this is a| text
this is the second line of block two

this is a text
this is t|he second line of block one

this is a text
this is the second line of block two

谢谢你的时间

PS 概念编辑器也在使用多个 contenteditable 字段

标签: javascripthtmlcontenteditablerichtext

解决方案


推荐阅读