3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

contenteditableでいい感じにキャレットを上下移動する

Last updated at Posted at 2021-07-31

contenteditable="true" "false"を入れ子にするといい感じに移動できる

  • 文字列のindexをとって移動する?
  • left座標を頑張ってとって移動する?
  • でも途中で<i>とか、キャレットを当てたくない箇所もあったりする…
  • <b>, <u>, <h2>なども考えねば…

など普通に実装しようとすると、contenteditableでキャレットを上下移動するのは結構悩ましい問題です。

実はcontenteditableはtrueとfalseを入れ子にした状態で、contenteditable="true"の行から上下移動すると、自動的にfalseのDOMを飛ばし、次のtrueのDOMのいい感じの位置(left位置。そこに文章がなければ、飛びたいleft位置に最も近い文字の文末)にキャレットを送ってくれます。

もうややこしいカーソル制御のコードは一切必要ありません!やった!

こんな感じでtrueとfalseを入れ子にしたHTMLを用意します。

<div contenteditable="false">
  <i>checkbox</i>
  <p contenteditable="true">吾輩は猫である。</p>
</div>
<div contenteditable="false">
  <i></i>
  <p contenteditable="true">名前はまだ無い。</p>
</div>
<div contenteditable="false">
  <i></i>
  <p contenteditable="true">どこで生れたかとんと見当がつかぬ。</p>
</div>
(以下略)

GIF1

最下段の文章の「ある事は│」の位置から、キャレットを上に移動した図(見やすくするため、pタグにboderをつけています)
3.gif

GIF2

最下段の文章の末尾「知った│」の位置から、キャレットを上に移動した図
4.gif

意外と知られていなさそうだったので、contenteditableの闇にやむなく溺れているときの助けになればと思います。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?