Скажем, у нас есть абзац на нашей странице с одним блоком текста.
<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 зарегистрирован вопрос .