Курсор в contenteditable не работает должным образом в Chrome

У меня проблема, когда курсор перемещается в неправильное место, когда пользователь щелкает внутри contenteditable div, но за пределами фактического текста. Кажется, это проблема только в более новых версиях Chrome (а также в Opera): по совпадению я проверил свой пример в более старом браузере (Chrome версии 55), и проблема вообще отсутствовала. Нет проблем и в Edge/IE11/FireFox.

Проблема возникает только тогда, когда пользователь щелкает за строкой текста или на пустой строке, которая находится между двумя желтыми divs с классом pagebreak. Курсор окажется над первым pagebreak div. И связано ли это напрямую или нет, я не знаю, но проблема исчезает при удалении div с классом flowbox. К сожалению, я не могу удалить этот div с классом flowbox из приложения.

Я собрал пример, показывающий мою проблему в этой скрипте: https://jsfiddle.net/dymcn1ao/

<div class="textframe a">
    <div class="flowbox"></div>
    <article contenteditable="true">
        <p>
            <span>
                <span>Foo bar baz</span>
                <br>
                <span class="pagebreak" contenteditable="false" style="min-height: 80px"></span>
                <span>Foo bar baz</span>
                <br>
                <span>Lorem ipsum dolor sit amet, consectetur adi piscing elit.</span>
                <br>
                <br>
                <span class="pagebreak" contenteditable="false" style="min-height: 80px"></span>
                <br>
                <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
            </span>
        </p>
    </article>
</div>

Текстовое поле слева имеет проблему, поле справа работает, как и ожидалось, потому что .flowbox div было удалено.

Редактировать 1:

Я создал новый пример, который, возможно, легче понять. Другие элементы в .textframe (такие как элементы pagebreak и flowbox) на самом деле имеют определенные цели, поэтому их нельзя игнорировать. Вот ссылка на улучшенную демонстрацию: https://jsfiddle.net/q4pu37dn/15/


person HelgeFox    schedule 13.09.2018    source источник


Ответы (5)


Обновление 3 (Демо 3)


введите здесь описание изображения

Изменения

Я заметил, что в самом текущем OP-коде больше нет position: relative, что хорошо, но я поверьте, это было забыто:

<span class='pagebreak spacer'contenteditable="false"></span>

Я полагаю, что вы изначально использовали contenteditable="false", чтобы дать вашим .pagebreak дополнительную функциональность, а также предотвратить их удаление, поэтому я добавил их обратно.


Сравнение

Демонстрация 3 содержит мое решение рядом с OP-кодом для сравнения поведения . Демонстрация 3 также содержит две кнопки (по одной для каждого редактора контента), которые выделяют все <span> текста. Ниже приведен список классов из кода OP (редактор содержимого справа) и список всех классов, эквивалентных моему коду (редактор содержимого слева).

  1. div.textframe................section.editor
  2. p.textOutline................article.content
  3. span.flowbox.spacer......mark.vertRule
  4. span.pagebreak.spacer ..mark.breaker

Есть 2 требования, которые беспокоят ОП:

  1. При щелчке по пустым областям вокруг <span>s курсор переместится в угол области содержимого.

  2. Количество символов в строке должно соответствовать текущей емкости OP-кода.

Эта проблема существует уже много лет, но причина в туманности, поэтому, если вы относитесь к этой аберрации как к простому поведению, вы можете просто противостоять ей, прививая другое поведение.

Demo2 и Demo3 соответствуют этим критериям, просто применяя следующие наборы правил стиля:

Демонстрация 2

article p {display: table;...

Демонстрация 3

.content {display:table-cell;...

Поведение таблиц-ячеек жесткое и хорошо зарекомендовавшее себя, и, насколько мне известно, это единственные не-замененный элемент, который по умолчанию соответствует своему содержимому и соответствует окружающим элементам таблицы. В качестве бонуса элемент с display: table-cell (не <td>) не обязательно должен быть вложен в <tr> внутри <table>. <час>

Демо 3

.content { display: table-cell;...

Скрипка

/* Begin Defaults */

* {
  margin: 0;
  padding: 0;
  border: 0;
  box-sizing: border-box;
}

html,
body {
  background: white;
  font: 400 16px/1.45 Arial;
  height: 100%;
  width: 100%;
}

/* End Defaults */

/* Begin Optional Layout */

#page01 {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-evenly;
  align-items: flex-start;
  background: rgba(45, 99, 198, 0.6);
  margin: 0 auto 20px;
  height: fit-content;
  min-width: 100%
}

/* End Optional Layout */

/* Begin Primary Styles */

.editor {
  width: 350px;
  height: 600px;
  border: 1px solid black;
  background: #fff;
}

.vertRule {
  float: right;
  clear: right;
  width: 30px;
  height: 600px;
}

.content {
  display: table-cell;
  word-break: break-word;
}

mark {
  display: block;
  pointer-events: none;
}

.break {
  min-height: 80px;
}

/* End Primary Styles */

/* Begin Control */

/* https://jsfiddle.net/q4pu37dn/15 */

.textframe {
  width: 350px;
  height: 600px;
  border: 1px solid black;
  background: #fff;
}

.flowbox {
  float: right;
  clear: right;
  width: 30px;
  height: 600px;
}

.spacer {
  background: yellow;
}

.pagebreak {
  display: block;
  min-height: 80px;
}

/* End Control */

/* Begin Demo Test */

.btn {
  display: inline-block;
  font: inherit;
  margin: 5px 10px;
  padding: 2px 5px;
  border: 5px outset grey;
  border-radius: 8px;
  color: #000;
  cursor: pointer;
}

[type='checkbox']:checked+label {
  background: rgba(255, 12, 34, 0.75);
  border: 5px inset grey;
  color: #fff;
}

#outline1:checked+label+#outline2+label+hr+#page01>.editor>.content *,
#outline2:checked+label+hr+#page01>.textframe>#textOutline *:not(.spacer) {
  color: #fff;
  background: tomato;
  outline: 2px solid red;
}

#outline1:checked+label+#outline2+label+hr+#page01>.editor>.content>.break,
#outline2:checked+label+hr+#page01>.textframe>#textOutline>.spacer {
  background: yellow;
  outline: none;
}

/* End Demo Test */
<!-- Begin Demo Test -->

<input id="outline1" type='checkbox' hidden>
<label for='outline1' class='btn'>Outline 1</label>

<input id="outline2" type='checkbox' hidden>
<label for='outline2' class='btn'>Outline 2</label>

<hr>

<!-- End Demo Test -->

<!-- Begin Optional Layout Part 1 -->

<main id='page01'>

  <!-- End Optional Layout Part 1 -->

  <!-- Begin Primary Markup -->

  <section class="editor" contenteditable='true'>
    <mark class="vertRule" contenteditable='false'></mark>
    <article class='content'>
      <span>
      Clicking here is not a problem
    </span>
      <br>
      <br>
      <span>
      Lorem ipsum
    </span>
      <mark class="break" contenteditable='false'></mark>
      <span>
      Clicking here (on empty space, not directly on text) will put the caret above the first .break element.
    </span>
      <br>
      <br>
      <span>
      Lorem ipsum
    </span>
      <mark class="break" contenteditable='false'></mark>
      <br>
      <span>
      Clicking here is not a problem
    </span>
      <br>
      <br>
    </article>
  </section>

  <!-- End Primary Markup -->

  <!-- Begin Control -->

  <div class="textframe" contenteditable>

    <p id='textOutline'>

      <span class="spacer flowbox"></span>
      <span>
      Clicking here is not a problem
    </span>
      <br>
      <br>
      <span>
      Lorem ipsum
    </span>
      <span class="spacer pagebreak"></span>
      <span>
      Clicking here (on empty space, not directly on text) will put the caret above the first .pagebreak element.
    </span>
      <br>
      <br>
      <span>
      Lorem ipsum
    </span>
      <span class="spacer pagebreak"></span>
      <br>
      <span>
      Clicking here is not a problem
    </span>
      <br>
      <br>
    </p>
  </div>

  <!-- End Control -->

  <!-- Begin Optional Layout Part 2 -->

</main>

<!-- End Optional Layout Part 2 -->


Обновление 2 (Демонстрация 2)


OP относительно демонстрации 1:

"Вы решили это для моего надуманного примера, да. К сожалению, невозможно установить эти значения для элементов в реальном приложении, поток здесь полностью выходит из строя."

См. Демонстрация 2, она работает лучше, чем Демонстрация 1. Поскольку он использует только позиционированные элементы, конфликтов в потоке нет. Чтобы адаптировать Demo 2 к своему приложению, все, что вам нужно сделать, это добавить position:relative к родительским элементам. Соответствующий стиль выглядит следующим образом:

article p {display: table;...

Необходимо было присвоить position:relative всему, что вложено в .textframe, иначе элементы static не взаимодействовали бы с позиционируемыми элементами. Существуют правила, которых придерживаются таблицы и компоненты таблиц, которые применяются не только к их содержимому, но и к тому, как они взаимодействуют с соседними элементами.


Демо 2

article p {display: table...

.container {
  width: 400px;
  float: left
}

.textframe {
  width: 350px;
  height: 650px;
  outline: 2px dotted lightblue;
  overflow: hidden;
  margin: 0 15px 0 0;
  /* Needed for long words */
  word-break: break-word;
}

.textframe article {
  position: relative;
  height: 650px; 
}

article p {
  display: table;
  margin: 0;
  position:relative;
}

.flowbox {
  width: 2px;
  height: 650px;
  float: right;
  clear: right;
  outline: 1px solid red;
}

.pagebreak {
  display: block;
  pointer-events:none;
  position:relative;
}
<div class="container">
      <h4>
       article p {display: table; position: relative;}<br>
       all children of .textframe have: position: relative;  
      </h4>
      <div class="textframe a">
        <div class="flowbox"></div>
        <article contenteditable="true">
           <p>
            <span>
              <span>Foo bar baz</span>
            <br>
            <mark class="pagebreak" contenteditable="false" style="min-height: 80px"></mark>
            <span>Foo bar baz</span>
            <br>
            <span>Lorem ipsum dolor sit amet, consectetur adi piscing elit.</span>
            <br>
            <br>
            <mark class="pagebreak" contenteditable="false" style="min-height: 80px"></mark>
            <br>
            <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
            </span>
          </p>
          <hr>
        </article>
      </div>
    </div>


Ссылки

MDN — Плавающая

MDN — позиция

Приемы CSS — абсолютное позиционирование внутри относительного позиционирования

Приемы CSS — все о плавающих элементах

отображать: table/table-cell

word-break:break-word


person zer00ne    schedule 17.09.2018
comment
Установив позицию article в абсолютное значение, вы фактически удалили функцию выровненных по правому краю элементов .flowbox, а затем слово adi во второй строке подпрыгивает вверх, как в примере справа в моем примере. - person HelgeFox; 17.09.2018
comment
Он не вскакивает с помощью поздней версии Chrome. Добавлена ​​Демо 2, которая тоже не подпрыгивает. - person zer00ne; 17.09.2018
comment
@HelgeFox Вот запись экрана желаемого поведения из демонстрации 1. - person zer00ne; 17.09.2018
comment
@HelgeFox Также .flowbox позиция не затрагивается ... вы уверены, что просматриваете мой ответ и не путаете его с кем-то другим? - person zer00ne; 17.09.2018
comment
Послушайте, я вижу, что разные браузеры и разные шрифты по умолчанию затрудняют понимание моего примера. Попробуйте добавить текст в одну из строк и убедитесь, что .flowbox делает то, что должен: разбивает текст на новые строки. В вашем последнем примере я получаю следующую ситуацию: i.imgur.com/qI1sGJE.jpg - person HelgeFox; 17.09.2018
comment
@HelgeFox это не то, что вы сказали изначально, см. Добавлено обновление p span {position:relative}. Более того, мой размер шрифта, вес шрифта, семейство шрифтов и т. д. установлены по умолчанию в браузере, как и ваши. Я могу работать только с тем, что вы указали в своем вопросе. - person zer00ne; 17.09.2018
comment
Простите, что я не сказал изначально? Я только хочу сказать, что .flowbox был там не просто так. - person HelgeFox; 17.09.2018
comment
@HelgeFox Добавлено display:table в <p> и display:table-cell в <span> обзор Демо 1, я думаю, что это должно работать. - person zer00ne; 17.09.2018
comment
Также добавлено word-break:break-word; к textframe для длинных слов. - person zer00ne; 17.09.2018
comment
вы решили это для моего надуманного примера, да. К сожалению, невозможно установить эти значения для элементов в реальном приложении, поток полностью выходит из-под контроля. - person HelgeFox; 17.09.2018
comment
Пока это самый многообещающий ответ, хотя проблема еще не решена. К сожалению, я должен покинуть офис сейчас, но продолжу работу над этим завтра. Спасибо за усилия @zer00ne :) - person HelgeFox; 17.09.2018
comment
@HelgeFox нет проблем, я люблю вызовы. Когда у вас появится возможность, просмотрите демонстрацию 2. Я считаю, что его можно очень легко адаптировать к вашему приложению, если нет, вы всегда можете опубликовать дополнительную Fiddle с оставшейся частью вашего приложения. - person zer00ne; 17.09.2018
comment
Извините, но ваша демонстрация 2 не учитывает функцию элемента .flowbox. Я получаю тот же результат, что и в моем примере справа, где тексту разрешено проходить под/за элементом .flowbox. - person HelgeFox; 18.09.2018
comment
@HelgeFox Я изо всех сил пытался сломать Demo 2, но не смог. Просмотрите эту запись экрана. - person zer00ne; 18.09.2018
comment
Я открыл для нас чат, вы получили ссылку? chat.stackoverflow.com/rooms/180217/ - person HelgeFox; 19.09.2018
comment
вот демонстрация, которая, возможно, иллюстрирует необходимость элементов .flowbox и то, что они должны делать - person HelgeFox; 21.09.2018
comment
Большое спасибо за все усилия @zer00ne! - person HelgeFox; 08.10.2018
comment
Пожалуйста, и спасибо за вызов @HelgeFox - person zer00ne; 08.10.2018

Проблема связана с отображением, я тоже новичок в этом, но когда я изменил ваш диапазон на div, он работал нормально, дайте мне знать, правильно ли это, или я не смог правильно понять ваш вопрос.

Теперь я не уверен, почему это произошло, поэтому не могу предоставить вам подробное объяснение.

Примечание. После этого использование span и div будет неправильным, поэтому придется изменить на div и в других местах.

.title {
  left: 20px;
}
.container {
  float: left;
  width: 400px;
}
.textframe {
  width: 311px;
  height: 650px;
  outline: 2px dotted lightblue;
  overflow: hidden;
  margin: 0 15px 0 0;
}
.textframe.b {
  left: 380px;
}
.textframe article {
  position: relative;
  height: 650px;
}
article p {
  margin: 0;
}
.pagebreak {
  display: block;
  position: relative;
  background: yellow;
}
.flowbox {
  width: 2px;
  height: 650px;
  float: right;
  clear: right;
  outline: 1px solid red;
}
<div class="container">
  <h4>
    With problem:
  </h4>
  <div class="textframe a">
    <div class="flowbox"></div>
    <article contenteditable="true">
      <p>
        <span>
          <span>Foo bar baz</span>
          <br>
          <span class="pagebreak" contenteditable="false" style="min-height: 80px"></span>
          <div>Foo bar baz</div>
          <br>
          <div>Lorem ipsum dolor sit amet, consectetur adi piscing elit.</div>
          <br>
          <br>
          <span class="pagebreak" contenteditable="false" style="min-height: 80px"></span>
          <br>
          <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
        </span>
      </p>
    </article>
  </div>
</div>
<div class="container">
  <h4>
    Without problem:
  </h4>
  <div class="textframe b">
    <article contenteditable="true">
      <p>
        <span>
          <span>Foo bar baz</span>
          <br>
          <span class="pagebreak" contenteditable="false" style="min-height: 80px"></span>
          <div>Foo bar baz</div>
          <br>
          <div>Lorem ipsum dolor sit amet, consectetur adi piscing elit.</div>
          <br>
          <br>
          <span class="pagebreak" contenteditable="false" style="min-height: 80px"></span>
          <br>
          <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
        </span>
      </p>
    </article>
  </div>
</div>

person Abhilash Bhargava    schedule 17.09.2018
comment
Да, это помогает сделать элементы display: block такими, как если бы они растягивались на всю ширину своего родителя. Однако это не помогает в ситуации с пустыми строками (br). - person HelgeFox; 17.09.2018
comment
@HelgeFox Итак, у нас может быть альтернатива тегу br, stackoverflow.com/questions/10996237/ Вы даже можете использовать высоту строки . Большинство людей не рекомендуют использовать тег br. - person Abhilash Bhargava; 18.09.2018
comment
Хм... Так вы говорите, что я должен использовать пустой div или p с установленным на него lineHeight для использования в качестве элементов разрыва строки вместо моих br? - person HelgeFox; 18.09.2018
comment
Нет, не пустой div или пустой тег (это будет крайне неправильно), просто используйте высоту строки для обоих div, и это может увеличить высоту между строками. Чего вы в основном хотите добиться с помощью тега br? Вы просто хотите дать пользователю дополнительную пустую строку, чтобы щелкнуть и начать редактирование? Я уверен, что не понимаю, в чем ваша настоящая проблема сейчас. - person Abhilash Bhargava; 18.09.2018
comment
Этот элемент имеет contenteditable=true, поэтому мы должны разрешить пользователю вводить столько пустых строк, сколько они хотят. Это то, для чего нужны элементы br, как пример того, каким потенциально может быть текстовый фрейм. И большинству пользователей нравится иметь в своем тексте пару переносов строк. - person HelgeFox; 18.09.2018
comment
да, поэтому ввод пустых строк можно выполнить, нажав Enter или Shift+Enter (при этом создается новый div с тегом br, и текст вставляется в кавычки). При первом запуске кажется, что вы хотите преобразовать тег br в редактируемую строку, что, насколько я знаю, невозможно. Но чтобы дать пользователю ощущение нажатия на пустое место, мы используем высоту строки для увеличения области отклика. - person Abhilash Bhargava; 18.09.2018
comment
Единственное, чего я хочу, это чтобы курсор останавливался там, где щелкает пользователь, как в Firefox/IE/Edge/Chrome‹65. Кроме того, все в моем приложении работает так, как мы этого хотим: пользователь может вводить и вставлять разрывы строк и все такое, хотя многое из этого контролируется javascript, чтобы убедиться, что у нас есть правильные элементы вокруг указанного набранного текста. Мне очень жаль, очень сложно объяснить полное приложение, не показывая его... - person HelgeFox; 18.09.2018
comment
Давайте продолжим обсуждение в чате. - person Abhilash Bhargava; 18.09.2018

Эта проблема возникает из-за того, что вы используете float: right;.

Не используйте свойство CSS float: right;, если оно вам не нужно. У вас может быть много проблем с этим. В вашем случае он вам не нужен. Вместо этого вы использовали элементы inline-block как <div class="flowbox"> и <article contenteditable="true">.

Минимальный пример с float:right (с проблемой)

.textframe {
    width: 311px;
    height: 650px;
    outline: 2px dotted lightblue;
    overflow: hidden;
    margin: 0 15px 0 0;
}
.flowbox {
    width: 2px;
    height: 650px;
    float: right;
    clear: right;
    outline: 1px solid red;
}
.pagebreak {
    display: block;
    position: relative;
    background: yellow;
}
<div class="container">
  <h4>
    With problem:
  </h4>
  <div class="textframe a">
    <div class="flowbox"></div>
    <article contenteditable="true">
      <p>
        <span>
          <span>Foo bar baz</span>
          <br>
          <span class="pagebreak" contenteditable="false" style="min-height: 80px"></span>
          <span>Foo bar baz</span><br>
          <span>Lorem ipsum CLICK ABOVE THIS WORDS sit amet, consectetur adi piscing elit.</span>
          <br>
          <br>
          <span class="pagebreak" contenteditable="false" style="min-height: 80px"></span>
          <br>
          <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
        </span>
      </p>
    </article>
  </div>
</div>

Решение

Минимальный пример с display:inline-block (без проблем)

Примечание: теперь я разместил ваш элемент <div class="flowbox"></div> после элемента <article>.

.textframe {
    width: 311px;
    height: 650px;
    outline: 2px dotted lightblue;
    overflow: hidden;
    margin: 0 15px 0 0;
}
.flowbox {
    width: 2px;
    height: 650px;
    outline: 1px solid red;
}
.pagebreak {
    display: block;
    position: relative;
    background: yellow;
}
.flowbox, article{display:inline-block;vertical-align:top;}
article{width: 305px;}
<div class="container">
  <h4>
    With problem:
  </h4>
  <div class="textframe a">
    <article contenteditable="true">
      <p>
        <span>
          <span>Foo bar baz</span>
          <br>
          <span class="pagebreak" contenteditable="false" style="min-height: 80px"></span>
          <span>Foo bar baz</span><br>
          <span>Lorem ipsum CLICK ABOVE THIS WORDS sit amet, consectetur adi piscing elit.</span>
          <br>
          <br>
          <span class="pagebreak" contenteditable="false" style="min-height: 80px"></span>
          <br>
          <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
        </span>
      </p>
    </article>
    <div class="flowbox"></div>
  </div>
</div>

person Bharata    schedule 17.09.2018
comment
Прежде всего, мне нужно, чтобы эти .flowbowdiv присутствовали, чтобы заставить каждую строку текста разрываться раньше, чем это сделает родительский блок. В моем примере вы можете видеть, что поле слева разрывает строку после слова consectetur, но в поле справа следующее слово adi может проходить на одну строку вверх. Кроме того, в вашем решении кажется, что поле .textframe больше не ограничено определенной шириной; мне это тоже надо :) - person HelgeFox; 17.09.2018
comment
@HelgeFox, теперь я добавил класс .textframe, и теперь он выглядит как в вашем примере jsfiddle.net - с определенной шириной. .flowbow div помещается после элемента <article>. Пожалуйста, не забывайте о правилах на StackOferflow: в одном сообщении допускается только один вопрос (проблема). - person Bharata; 17.09.2018
comment
Я не хотел вводить еще одну проблему, просто прояснил предпосылку исходной проблемы. Я посмотрю на ваш обновленный ответ. - person HelgeFox; 17.09.2018
comment
К сожалению, я не могу установить определенную ширину для элемента article, как в вашем решении. - person HelgeFox; 17.09.2018
comment
@HelgeFox, пожалуйста, ответьте мне на два вопроса: 1. Для чего вы используете ‹div class=flowbox›‹/div›? 2. Почему нельзя задать определенную ширину элементу статьи? - person Bharata; 17.09.2018
comment
1. Потому что мне нужно, чтобы строки текста разрывались раньше, чем без них, как я объяснил в своем первом комментарии. 2. Потому что будет варьироваться количество .flowbox внутри .textframe, представляющих другие article элементы с, возможно, другими рассчитанными ширинами. Извините, но это трудно объяснить, не показав вам мое полное приложение. - person HelgeFox; 17.09.2018
comment
@HelgeFox, 1. Я сделал этот скриншот вашего пример на jsfiddle.net, и мы видим, что в обоих случаях у вас одинаковое нарушение слов. 2. Но ваш родительский класс .textframe {width: 311px;} имеет определенную ширину. Блок потока вашего класса имеет определенную ширину. Почему только article с определенной шириной? - person Bharata; 17.09.2018
comment
Давайте продолжим это обсуждение в чате. - person HelgeFox; 17.09.2018
comment
У меня была аналогичная проблема с элементом contenteditable = false, в моем случае, когда я щелкнул слева от этого элемента внутри границы, но непосредственно перед текстом элемента, курсор появился внутри границы. Добавление display:inline-block к элементу избавило от курсора. Спасибо! - person codebusta; 04.08.2019

Я использую новейшую версию Chrome для Linux/Ubuntu, и это, похоже, решило проблему. Я только что удалил contenteditable из статьи и поместил его на отрезки, которые вы хотели отредактировать.

<article>
      <p>
        <span>
          <span contenteditable="true">Foo bar baz</span>
          <br>
          <span class="pagebreak" contenteditable="false" style="min-height: 80px"></span>
          <span contenteditable="true">Foo bar baz</span>
          <br>
          <span contenteditable="true">Lorem ipsum dolor sit amet, consectetur adi piscing elit.</span>
          <br>
          <br>
          <span class="pagebreak" contenteditable="false" style="min-height: 80px"></span>
          <br>
          <span contenteditable="true">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
        </span>
      </p>
    </article>
person Lazar Nikolic    schedule 17.09.2018
comment
К сожалению, обновление Chrome (v68 до v69) на windows не помогло. Кроме того, смысл в том, чтобы весь .textframe редактировался с возможностью перемещаться по разрывам строк и страниц с помощью клавиш со стрелками. - person HelgeFox; 17.09.2018

Я думаю, что проблема связана с диапазоном, если у вас есть пустой диапазон. Я столкнулся с этой проблемой при работе с contenteditable, поэтому курсор отображается там, но вы не можете заставить его двигаться.

Я предлагаю вам удалить диапазон из вашего p для каждого абзаца, чтобы, если диапазон пуст, попытаться удалить его с помощью backspace/delete.

Или обратитесь к CKEDITOR, поскольку он решил эту проблему.

article p, article div
{
    line-height: 1.25;
    margin-top: 12px;
    margin-bottom: 12px; /*  margin-bottom: 10px; removed for proper pagebreak 31-1-2017*/
    font-family: Helvetica;
}

.title {
  left: 20px;
}
.container {
  float: left;
  width: 400px;
}
.textframe {
  width: 311px;
  height: 650px;
  outline: 2px dotted lightblue;
  overflow: hidden;
  margin: 0 15px 0 0;
}
.textframe.b {
  left: 380px;
}
.textframe article {
  position: relative;
  height: 650px;
}
article p {
  margin: 0;
}
.pagebreak {
  display: block;
  position: relative;
  background: yellow;
}
.flowbox {
  width: 2px;
  height: 650px;
  float: right;
  clear: right;
  outline: 1px solid red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
  <h4>
    With problem:
  </h4>
  <div class="textframe a">
    <div class="flowbox"></div>
    <article contenteditable="true">
      <p>
        <span>
          <span>Foo bar baz</span>
          <br>
          <span class="pagebreak" contenteditable="false" style="min-height: 80px"></span>
          <span>Foo bar baz</span>
          <br>
          <span>Lorem ipsum dolor sit amet, consectetur adi piscing elit.</span>
          <br>
          <br>
          <span class="pagebreak" contenteditable="false" style="min-height: 80px"></span>
          <br>
          <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
        </span>
      </p>
    </article>
  </div>
</div>
<div class="container">
  <h4>
    Without problem:
  </h4>
  <div class="textframe b">
    <article contenteditable="true">
      <p>
        <span>
          <span>Foo bar baz</span>
          <br>
          <span class="pagebreak" contenteditable="false" style="min-height: 80px"></span>
          <span>Foo bar baz</span>
          <br>
          <span>Lorem ipsum dolor sit amet, consectetur adi piscing elit.</span>
          <br>
          <br>
          <span class="pagebreak" contenteditable="false" style="min-height: 80px"></span>
          <br>
          <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
        </span>
      </p>
    </article>
  </div>
</div>

person Nikhil Ghuse    schedule 17.09.2018
comment
Хм... Я не понимаю вашего ответа, так как в моем примере нет пустых интервалов, за исключением тех, у которых есть класс pagebreak, которые существуют для определенной цели. А именно для работы в качестве разрывов страниц. Если у вас есть лучшее решение для создания произвольного пространства внутри редактируемого текстового фрейма, пожалуйста, уточните :) - person HelgeFox; 17.09.2018
comment
Я говорю о том же классе разрыва страницы span, что и у меня, если contenteditable находит пустой диапазон в теге p, он ведет себя так же, как вы получаете - person Nikhil Ghuse; 17.09.2018
comment
Так как при удалении когда-то он попадает между этим диапазоном или случайным образом идет куда угодно - person Nikhil Ghuse; 17.09.2018
comment
И у CKEditor тоже есть эта проблема, когда вы вставляете и упорядоченный или неупорядоченный список, он ведет себя одинаково - person Nikhil Ghuse; 17.09.2018
comment
Интересно услышать, что у CKEditor такая же проблема. Но что касается промежутков .pagebreak, способствующих возникновению проблемы, да, я знаю это. Дело в том, что мне все еще нужен какой-то способ опускания контента, так что, как я понимаю, мне все еще нужны эти... - person HelgeFox; 17.09.2018
comment
Извините, но я не вижу, что ваш пример работает. Курсор по-прежнему подпрыгивает над элементом .pagebreak... - person HelgeFox; 17.09.2018