Скажем, у нас есть абзац на нашей странице с одним блоком текста.
<p>laborum beatae est nihil, non hic ab, deserunt repellat quas. Est molestiae ipsum minus nesciunt tempore voluptate laboriosam</p>
DOM-wise, структура:
HTMLParagraphElement
Text [laborum beatae est nihil...]
Теперь мы разбили его (с Text.splitText()) дважды, чтобы отделить фрагмент "deserunt repellat quas. Est". Структура становится:
HTMLParagraphElement
Text [laborum beatae est nihil...]
Text [deserunt repellat quas. Est]
Text [ molestiae ipsum minus nesciunt...]
Пока эта операция влияет на DOM, она никогда не меняет ее на уровне элемента (Text! == Element), поэтому я не ожидал визуальных изменений.
Тем не менее splitText() влияет на макет, вызывая как ретрансляцию, так и перерисовку во всех проверенных браузерах (Chrome 60, Firefox 55, Edge 14 - все в ОС Windows 10). То же самое происходит, когда мы вызываем ParagraphElement.normalize(), уменьшая количество узлов Text до 1; снова запускаются как ретрансляция, так и перерисовка.
Существует неприятный побочный эффект, который можно увидеть в этой демонстрации. Если вы проверите слова рядом с "quas". Est ', вы видите, что они фактически меняют позиции!
Он четко виден в Firefox и гораздо более тонкий (но еще и различимый) в Chrome. К моему удивлению, в Edge не было такого "танец слова".
Причина, по которой это важно, показана в этой демонстрации (типа) механизма выбора подгонки. Эта конкретная версия не работает в Firefox (поддержка caretRangeFromPoint еще не создана - argh!), Но даже с "point2dom", переустановленным на caretPositionFromPoint, выделенный текст переместится туда - столько же в Chrome или, что еще хуже. Опять же, это похоже на работу в Edge.
Итак, на самом деле меня в основном интересуют как понимание причин, так и поиск обходных решений.
Здесь анимированный gif, показывающий, как первая демо воспроизводится в Chrome (я просто запускаю щелчок в интервале)
Трепет здесь тонкий, но все же можно наблюдать по всем словам. Я особенно озадачен тем, почему i в molestiae трясет, так как окружающие буквы, похоже, остаются там, где они есть.
И все хуже (хуже) с менее распространенными шрифтами и большим количеством текста, например, в демонстрации выбора.
Переключение на font-family:monospace не решило этого, но сделало это, казалось бы, хуже:
Переключение font-kerning в none тоже не помогло.
ОБНОВЛЕНИЕ: В трекере Blink зарегистрирован вопрос .

