質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2715閲覧

[html, css] contenteditable内の要素が削除されてしまう

KimTom

総合スコア134

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

3グッド

0クリップ

投稿2020/02/21 07:36

編集2020/03/05 07:57

現象の説明

macOSのsafariでこの現象が発生しています。
contenteditable要素の中で以下の条件が揃うと自動でタグが外されてしまいます。

  • ユーザが改行するなどして新しく生成された要素
  • position:relative;が指定されている
  • 日本語を入力する

デモを用意したのでsafariからアクセスして試してみてください。
https://codepen.io/KimTom/pen/poJNzqp
改行して日本語を入力するとボーダーが消えます。
開発者ツールを見るとdivタグが外されて中のテキストのみになっているのがわかると思います。

※FiroProchainezo様からiPhoneのsafariでは再現しないとの情報をいただきました。

知りたいこと

position:relative;を維持したまま、タグが外されるのを防ぐ方法をご教示いただければありがたいです。

Eggpan, hwatarig, x_x👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FiroProchainezo

2020/03/05 07:46

情報提供です。 iphone(システムバージョン13.3.1)のsafariで「改行->日本語入力」としても、赤線側も青線側もボーダーが消える現象は再現しませんでした。 MACとかiPadとかの話なんでしょうか?
KimTom

2020/03/05 07:54

情報提供大変感謝です! MacBookProのsafariでこの現象が発生しているのですが、iPhoneからは未確認でした。 macOSのsafariだけの現象かもしれません。(となるとsafariの仕様、というよりはバグの可能性が高そうですが…) 質問内容に追記します。ありがとうございます。
guest

回答1

0

ベストアンサー

手元のMacbookとiPhoneで再現しました。
行頭で何も文字が入っていない場合に日本語入力すると発生する問題のようなので、
いっそ改行時にゼロ幅スペースを埋めておく、とかはどうでしょうか。

javascript

1const el = document.querySelector('.pos-rel') 2 3el.addEventListener("keyup", event => { 4 if (event.keyCode === 13) { 5 document.execCommand('insertText', false, '\u200B') 6 } 7});

CodePen

ゼロ幅スペースは画面には見えませんが文字ではあるので、どこかのタイミングで削除する必要はあるかと思います。
また、挿入されたゼロ幅スペースを削除したあとで日本語入力されてしまうと同様の事象は発生してしまいます。

ContentEditable自体ブラウザで動作が違ったり、変な挙動が多くて広く使われてない感があるので、ある程度泥臭い対応になりそうかなとは思います。

投稿2020/03/06 03:14

編集2020/03/09 06:10
Eggpan

総合スコア2727

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KimTom

2020/03/09 02:50

回答ありがとうございます! 行頭に文字が入っていると現象が起きない、という点は見逃していました。 「divの中身がbrタグのみであればゼロ幅スペース追加、テキストノードがあれば削除」という感じの処理で実装してみます。感謝です!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問