Похоже, вы спрашиваете, как разделить текст там, где он естественным образом упакован браузером.К сожалению, это не так просто.Не является надежным - рассмотрим следующий сценарий:
- Пользователь просматривает вашу страницу, div отображается и запускается событие onload,
- 3 элемента span создаются из текстового узла, 1 для каждой обернутой строки текста,
- Пользователь изменяет размер браузера и размер div изменяется.
В результате интервалы больше не соответствуют тому, где строкиначать и закончить.Конечно, этого сценария можно избежать, используя элементы фиксированной ширины, или вы можете перенастроить все это при изменении размера браузера, но это всего лишь пример того, как он может сломаться.
Тем не менее, это не легко. похожий вопрос был задан ранее (хотя и с другой целью), и появились два решения, которые оба могут помочь здесь:
На самом деле не переносите текст по интервалам, а определяйте положение и размеры каждой строки текста, используя getClientRects()
.Затем создайте необходимое количество интервалов и разместите / измените их размер за каждой строкой текста.
Плюсы
- Быстро;getClientRects возвращает позицию каждой строки
- Simple;код более элегантен, чем решение 2
Минусы
- Переносимый текст должен содержаться встроенным элементом.
- Нетстиль будет фактически применяться к тексту (например, font-weight или font-color).Полезно только для таких вещей, как цвет фона или границы.
Демонстрация, предоставленная с ответом, показывает, как можно выделить строку текста, расположенную в данный момент под мышью.
Разделить текст на массив с помощью метода split () с границей слова или пробеломкак аргумент прошел.Вновь объедините массив в строку с </span><span>
между каждым элементом и оберните все это с помощью <span>
и </span>
, и замените исходный текстовый узел результирующим HTML в содержащем элементе.Теперь итерируйте каждый из этих элементов span, проверяя его позицию y в контейнере.Когда позиция y увеличивается, вы знаете, что достигли новой строки, и предыдущие элементы могут быть объединены в один промежуток.
Плюсы
- Каждая строка может быть стилизована любым свойством CSS, например font-weight или text-ornament.
- Каждая строка может иметь свои собственные обработчики событий.
Минусы
- Медленно и громоздко из-за многочисленных операций DOM и строк
Заключение
Могут быть и другие способы достиженияцель, но я не уверен ни в чем сам.TextNode.splitText(n)
может разбить TextNode на две части (!), Если передан числовой индекс символа, на который вы хотите разбить.Ни одно из вышеперечисленных решений не является идеальным, и оба ломаются, как только размер содержащего элемента изменяется.