网站搜索

javascript - 我如何将 HTML 内容拆分成适合屏幕的页面?


我正在制作一个电子书阅读器网页应用程序。我从服务器获取一个包含整本书文本的 HTML 格式的长字符串。它看起来是这样的:

<div><p>Alice was beginning....</p></div></div>to get very  ... </div>

我想要的是把这段文字分成几页。我想得到类似这样的效果:

<li id='page1'>... text ...</li>
<li id='page2'>... text ...</li>
...

单页应该填满视口。用户不应该能够滚动书籍文本。相反,他们应该能够使用按钮在页面之间移动。

我需要一些功能来测量所有内容,将其分割成相同最大高度的部分,并为这些部分标注页码。它还必须考虑图片和长段落(可能无法放在单页上)。

我怎样才能完成这一切?

答案#1

要找出每一部分内容的尺寸,你必须让浏览器实际渲染它,然后再进行测量。此外,如果你想在内容流的中间断开(例如在段落中间),事情会变得相当困难。(如果不将单个字符/单词包裹在元素中,你无法测量它们。)你还必须禁用缩放等功能,以便你的测量具有一定的持久意义。总的来说,HTML 渲染引擎是专门为渲染流式内容而设计的,这几乎与分页内容相反。

然而,有一些分页的方法你可以采用,但它们都没有真正处理整个文本的渲染和测量。

滚动覆盖

我会尝试的一种方法是简单地

  • 将所有文本呈现在容器中,
  • 以一种使滚动条不可见的方式为容器设置样式(例如通过将其推到屏幕外),
  • 禁用手动滚动,并
  • 提供“分页”按钮,使其能够通过编程方式滚动恰好相当于你的“页面”高度。

这个解决方案的优点是实现简单,但它并不完美。图像可能跨越分页显示,用户将无法完整看到它们。

列

我能在短时间内想到的唯一其他方法是使用列。你得

  • 将所有文本呈现在容器中,
  • 将容器样式设置为“无限”宽,并具有“无限”数量的列,每列的宽度与页面相同,
  • 将容器绝对定位在其父元素中,
  • 让你的“分页”按钮按页面的宽度水平移动容器。

此解决方案需要支持 columns 的现代浏览器,但使用 columns 可以解决将流内容正确分页的问题。如果可能的话,我建议首先尝试这个方法。