我想在 HTML 中显示一个多列文档。多列“框”在分页后重新开始打印。我想在屏幕上模拟这种行为(分页符),因此列高不应高于用户代理窗口的高度。
只需为每个虚拟页面使用一个新容器会很容易,但我不知道屏幕到底会在哪里结束,所以我希望文本能够在这些虚拟页面之间流动。
我知道今天的 JS 有能力解决这个问题,但我想使用 CSS,因为这是一个布局问题。
我的愿望与这个问题中描述的完全一样。这是一个 HTML/CSS-only 解决方案,对我的目的来说效果很好,并且可能对其他人有用。它有一些潜在的缺点,我将在给出代码之前对其进行描述。在下面的讨论中,我使用“子页面”这个词来表示提问者所说的“虚拟页面”,即一组具有所需高度的水平连续内容列(注意文本从一个子页面的右下角延续到下一个子页面的左上角。)
好的,到实际的代码。这里的基本策略很简单:将相同的文本多次拆分为所需子页面高度的列。将生成的水平列组堆叠在一起,但将每个连续副本向左移动一个子页面宽度的页面。最后,将整个堆栈(用overflow:hidden;
)剪辑到子页面的宽度。关键的困难是得到那个剪辑div
成为正确的高度。如果可以对所有子页面单元进行 CSS 选择,这些子页面单元在被剪切时最终没有墨水,然后根本不显示它们,那将很简单,但我找不到这样做的方法。我最终得出的粗略近似是在所需的子页面宽度和列结构中再次无形地布置所有内容,并使用该布局的高度来确定剪辑的高度。但是,这种布局总是更短,因为将内容放在一堆长列中比在连续的短列块中布局更有效,而且您需要某种子页面分隔符,否则子页面布局会变得非常混乱。所以我只是在那个剪报中加入一个大的底部填充物来捏造这个div
. 如果 CSS calc() 允许整数除法或舍入,则可以做出更好的近似。最后,如果 CSS Regions 起飞,整个任务将是微不足道的,但这看起来不太可能。
对不起 tl; dr; -- 这是代码,先是html,然后是CSS:
<div class="column-paginator">
<div class="vertical-strut mypage-h vertical-fuzz">
[COPY OF CONTENT HERE]
</div>
<div class="column-paginator-clipper">
<div class="mypage-h mypage-v column-paginator-0">
[COPY OF CONTENT HERE]
</div>
<div class="mypage-h mypage-v column-paginator-1">
[COPY OF CONTENT HERE]
</div>
<div class="mypage-h mypage-v column-paginator-2">
[COPY OF CONTENT HERE]
</div>
<div class="mypage-h mypage-v column-paginator-3">
[COPY OF CONTENT HERE]
</div>
<div class="mypage-h mypage-v column-paginator-4">
[COPY OF CONTENT HERE]
</div>
</div>
</div>
现在是 CSS:
div.column-paginator {
position:relative; /* Ensure we can anchor positions to this element */
}
div.vertical-strut {
visibility: hidden; /* Only laying this out to get its height */
}
div.vertical-fuzz {
padding-bottom: 300px; /* extra height because unpaginated text
* takes less vertical height. This is a
* crude measure. */
}
div.mypage-h {
/* The desired horizontal setup of the column pagination */
columns: 2 200px;
column-gap: 2em;
}
div.column-paginator-clipper {
/* The div that actually constrains the output */
position: absolute;
top: 0px;
left: 0px;
height: 100%;
max-height: 100%;
overflow: hidden;
}
div.mypage-v {
/* the desired vertical setup of the column pagination */
height: 300px;
position: relative;
overflow: visible;
margin-bottom: 1.5em;
}
div.mypage-v:after {
/* Automatically throw in subpage separator. */
content: "";
height:1em;
position: absolute;
left: 0;
top: 100%;
width:500%; /* must be MAX_SUBPAGES * 100% */
background: lightcyan;
}
/* Note the 2em below is precisely the column-gap above; not sure how
* to enforce/encode that equality in CSS.
*/
div.column-paginator-0 { left:calc(0 * (-100% - 2em)); }
div.column-paginator-1 { left:calc(1 * (-100% - 2em)); }
div.column-paginator-2 { left:calc(2 * (-100% - 2em)); }
div.column-paginator-3 { left:calc(3 * (-100% - 2em)); }
div.column-paginator-4 { left:calc(4 * (-100% - 2em)); }
div.column-paginator-5 { left:calc(5 * (-100% - 2em)); }
尝试使用 Javascript 将 container-div 的高度设置为视口高度,命令:
window.innerHeight
获取视口尺寸的完整脚本:http: //andylangton.co.uk/articles/javascript/get-viewport-size-javascript/
如果你不喜欢使用 javascript,你可以尝试创建负责任的 CSS 样式,但它会不太准确。
我建议了功能。你可以在页面底部有返回顶部按钮,为此你可以像这样在首页放置
<a name="Top"></a>
并在页面底部
<a href="#Top"> Back to Top… </a>
我知道这不是您要找的,但这将是用户友好且易于导航的。