我正在用JavaScript分页。这是印刷分页,而不是分割数据库结果。它在大多数情况下都有效,但是我遇到了一个海森堡问题,在这个问题上我无法完全测量文本而不影响文本。

我不是要measure text before it is rendered。我想要它在屏幕上显示的实际位置,所以我可以分页到它自然包裹的位置。我正在测量字符的垂直位置,而不是字符串的水平宽度。我执行此操作的方式与this answer相似,因为我将一种样式应用于文本块,然后测量新创建的跨度的位置。如果跨度未达到页面末尾,请清除它并在线性搜索中进行新的跨度。

问题在于,应用跨度时,抗锯齿化的子像素文本布局会有所不同。在极少数情况下,这会导致在我进行测量时,文本的包裹方式有所不同。我只在用连字符包装时才看到这种情况,并且我认为在用空格包装时不会发生这种情况。

举一个具体的例子,“ prepared-he”是我遇到的字符串。当我进行最大程度的“准备”时,它似乎出现在预期的范围内。当我测量“ prepared”时,整个短语将自动换行到下一行,将其移至下一页,因此看起来“ d”是要折断的字符。我在“准备”和“ d-he”之间打断了文字,这是错误的。尝试评估单个字符会打开一堆我宁愿避免的蠕虫。换行发生变化,因为对于新跨度,行宽为1像素。

解决我的问题的方法可能是使用javascript测量文本的更好方法,或者是在不影响布局的情况下将文本包装在新元素中的方法。

我尝试为正在创建的要包装文本的跨度类设置margin-right:-1px。这没有明显的作用。

我正在iPhone的UIWebView中执行此操作。普通WebKit中有一些与测量相关的调用,此处不提供。例如,Range不具有getBoundingClientRect或不支持在setStart或setEnd中设置非0的偏移量。

谢谢

编辑:

我尝试了unomi的建议,使跨度无量纲。没有效果。我提供的班级没有规则,仅用于快速删除。

我尝试了向后而不是向前遍历文本。包装错误出现在不同的位置,但总体问题仍然存在。

文本主要是带有一些简单样式的段落。我认为我使用的方法不适用于表格或列表。在段落中,我一次将跨度应用于一个字符。

我尝试减小跨度的字体大小。换行规则似乎允许跨度换行,即使它在一个单词之内,也可以用一组错误替换另一组错误。

最佳答案

这有点不合时宜,但是您真的要切掉一段吗?
仅仅在偏离视口的第一个<p>处中断就不会提高可读性吗?

好的,为了清楚起见,听起来好像您正在测试跨度的位置,该跨度在文本中逐个字符地移动?如果这是正确的,并且您遇到的问题是分词,那么为什么不简单地从空白跳到空白(可选地包括连字符)而不是从一个字符跳到另一个字符呢?

保留1个先前的位置,并在当前位置不在视口时在该位置断开。

我想在做太多其他事情之前,我们确定我们不能使该跨度真正无量纲吗?

span.marker {
  border: 0px; padding: 0px; margin: 0px;
  width:0px: overflow:hidden; height:0px;
}

关于javascript - 测量javascript中呈现的html而不影响测量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3027734/

10-12 14:43