Я занимаюсь разбиением на страницы в javascript. Это типографская разбивка на страницы, а не на измельчение результатов базы данных. По большей части это работает, но я столкнулся с проблемой Гейзенберга, где я не могу полностью измерить текст, не затрагивая его.измерение отображаемое html в javascript без влияния на измерение
Я не пытаюсь measure text before it is rendered. Я хочу, чтобы фактическое положение отображалось на экране, поэтому я могу разбивать на страницы, где они, естественно, завернуты. Я измеряю вертикальное положение символов, а не горизонтальную ширину строк. То, как я делаю это, похоже на this answer тем, что я применяю стиль к блоку текста, а затем измеряю позицию вновь созданного диапазона. Если диапазон не достигает конца страницы, я очищаю его и создаю новый диапазон в линейном поиске.
Проблема заключается в том, что при использовании диапазона применяется сглаживание подпиксельного текста. В редких случаях это заставляет текст обертывать по-разному, когда я его измеряю. Я видел это только при переносе в дефис, и я предполагаю, что этого не произойдет, когда обертывается в пустое пространство.
Как конкретный пример, «подготовленный-он» - это строка, с которой у меня возникают проблемы. Когда я измеряю «подготовку», он появляется, как и ожидалось, на текущей странице. Когда я измеряю «подготовленную», вся фраза сворачивается к следующей строке, перемещая ее на следующую страницу, так что выглядит «d» - это символ, который нужно сломать. Я нарушаю текст между «подготовкой» и «d-he», и это неправильно. Попытка оценить отдельные персонажи открывает целую банку червей, которую я бы предпочел избежать. Обертка изменяется, потому что с новым диапазоном линия на 1 пиксель шире.
Решение моей проблемы может быть лучшим способом измерения текста с помощью javascript или способом обернуть текст в новый элемент без влияния на макет.
Я попытался установить margin-right:-1px
для класса создаваемого пролета, чтобы обернуть текст. Это не имело заметного эффекта.
Я делаю это в UIWebView на iPhone. Существуют некоторые связанные с измерением вызовы, доступные в обычном WebKit, которые недоступны здесь. Например, Range не имеет getBoundingClientRect или поддерживает установку смещения, отличного от 0 в setStart или setEnd.
Спасибо
Edit:
Я попытался предложение от unomi сделать калибровочный безразмерную. Это не имело никакого эффекта. Класс, который я даю span, не имеет правил и просто используется для быстрого удаления.
Я пробовал повторять назад, а не вперед через текст. Ошибки обертывания появились в разных местах, но общая проблема осталась.
Текст в основном абзацы с некоторым простым стилем. Я не думаю, что метод, который я использую, будет работать с таблицами или списками. В параграфах я применяю пролет к одному символу за раз.
Я попытался уменьшить размер шрифта для пролета. Правила обертки, по-видимому, позволяют обертывать на промежутке, даже если оно находится внутри слова, поэтому заменяет один набор ошибок другим.
Итак, вы просматриваете страницу в середине слова? E ven ** если ** i t - переносится cor- прямо, это было бы наиболее враждебно. I ' d наиболее раздражает. ;) –
Нет, цель состоит в том, чтобы совместить естественную перенос слов, используемую веб-браузером.Проблема заключается в том, что использование диапазона для измерения текста изменяет размер слова и правила обертывания, поэтому он может сломаться в середине слова во время измерения. Лучшим решением будет способ измерения текста, который не изменяет правила упаковки или не разбивает слова в середине. Вышеупомянутое решение работает вокруг того факта, что измерение изменяет то, что измеряется. – drawnonward