浏览器对CSS页面编号的支持

48

我知道这个选项:使用CSS / HTML添加页码

这似乎是将页面编号添加到打印版本页面最好的方法,但是我无法在任何地方使其正常工作。我已经在我的Windows 7机器上尝试了Chrome,Firefox和IE9浏览器。根据一些链接显示,这可能在更多专有软件中受支持,例如Prince XML。这是否由网络浏览器支持打印版本?

我尝试创建一个空白的HTML文件,在头部添加两个样式标签之间的内容:

@page {
  @bottom-right {
    content: counter(page) " of " counter(pages);
  }
}

我甚至简化了它,只使用content: "TEXT";来查看是否可以显示出东西。这在任何地方都受支持吗?通过“this”,我特别指的是@page@bottom-right标签,因为我已经让内容有效多次。


1
看起来Chrome或Firefox(也许IE9也不支持)不支持分页媒体。CSS3本应该对分页媒体有一些支持,但我也无法使其正常工作。 - David R.
那很可能就是答案了。我在答案和教程中一直找到这个,但找不到任何可行的实现。看来这是未来需要记住的另一件事情。 - David Fritsch
可能还需要其他参数才能显示分页媒体样式表。如果一个网页上有多个“页面”,你如何声明一个页面? - David R.
能否使用媒体查询?然后您可以在页面右下角捕捉的元素上使用 @media print 作为解决方法。 - starbeamrainbowlabs
回答最后一个问题:不。分页媒体边距框在任何主要浏览器中都尚未得到支持:http://en.wikipedia.org/wiki/Comparison_of_layout_engines_%28Cascading_Style_Sheets%29 - user2847643
5个回答

17

我一直在尝试实现分页媒体,但根据这个维基百科页面显示,目前还没有浏览器支持边距框。难怪它不能正常工作!

http://en.wikipedia.org/wiki/Comparison_of_layout_engines_(Cascading_Style_Sheets)

请参见表格中的语法和规则,其中包括了边距框部分。边距框是需要用于页码、页眉和页脚的。如果能够实现这一点,就可以省去将印刷媒体转换为PDF文件的开销。


那个维基百科的链接无法打开。目标网址上没有文章。 - jake
上述文章最后更新于2017年,现已存档:https://web.archive.org/web/20220526233027/http://en.wikipedia.org/wiki/Comparison_of_browser_engines_(CSS_support) - Jimbo

12
不使用@page,在Firefox 20中,我已经成功地实现了纯CSS页码:http://jsfiddle.net/okohll/QnFKZ/。要打印,请右键单击结果框(右下方)并选择“此框架->打印框架...”。CSS代码如下:
#content {
    display: table;
}

#pageFooter {
    display: table-footer-group;
}

#pageFooter:after {
    counter-increment: page;
    content: counter(page);
}

而HTML是

<div id="content">
  <div id="pageFooter">Page </div>
  multi-page content here...
</div>

7
但这并不是一个页面页脚。如果文本跨越了多个页面,#pageFooter 将出现在文本最后一页结束的位置下方。 - BoltClock
没错。如果 @page 完全起作用就更好了。我想一个hack的方法可能是在最后一个内容元素的末尾添加间距,以将页脚推到最后一页。 - Oliver Kohll
1
这个解决方案的浏览器支持如何?在我的 Mac 上使用 Chrome、Opera 和 Safari,表格的表头和页脚只会在表格的开头和结尾打印。Firefox 在每一页上都会打印它们,但 counter(page) 只在第一次显示时有效。这对你有用吗?还是我做错了什么? - Teepeemm
我的直觉告诉我,这个计数器的实现与OL的内部行为有关,与打印/页面无关。 - rainabba
这似乎是目前最好的解决方法,如果你不想购买一个王子 :-) 你是否曾经得到过“counter(pages)”(即总页数)的非零值? - Xan-Kun Clark-Davis
这看起来很不错,但似乎无法与当前的Chrome版本兼容。 - phil294

3
这个似乎不再起作用了。看起来它只能运行一小段时间,然后浏览器支持被移除了!

根据https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Lists_and_Counters/Using_CSS_counters的说明,计数器在使用前必须先重置。

你可以将计数器的初始值设置为任何数字,默认值为 0。

例如:

@page {
    counter-increment: page;
    counter-reset: page 1;
    @top-right {
        content: "Page " counter(page) " of " counter(pages);
    }
}

在理论上,很多工具都支持这个功能。但实际上,只有PrinceXML支持。


4
知道这点很好,但我仍然没有实际输出任何内容。你能提供一些关于@page标签的见解吗?这是否真的对您显示了? - David Fritsch
1
这对我不起作用...它与任何浏览器兼容吗? - Elias Soares
66
目前任何主流浏览器都不支持分页媒体边距框(paged media margin boxes)。请停止基于未实现的工作草案提供答案。我也很好奇为什么这个代码会被接受,因为到今天为止它完全没有任何作用。 - user2847643
3
请删除这个答案,因为这是一个无法工作的情况。我浪费了很多时间,因为没有说明它已经在真实浏览器中测试过。 - Joel
同意。这只是理论,不是实际答案。 - rainabba
显示剩余8条评论

2

通过Mozilla,(打印文档

这将在每个打印页面上放置页眉和页脚。在Mozilla中效果很好,但在IE和Chrome中效果不太理想。

<!DOCTYPE html>
<html>
<head>
<title>Print sample</title>
<link rel="stylesheet" href="style4.css">
</head>
<body>
<h1>Section A</h1>
<p>This is the first section...</p>
<h1>Section B</h1>
<p>This is the second section...</p>
<div id="print-head">
  Heading for paged media
</div>
<div id="print-foot">
  Page: 
</div>
</body>
</html>

CSS(层叠样式表):
/*** Print sample ***/

/* defaults  for screen */
#print-head,
#print-foot {
    display: none;
}

/* print only */
@media print {

h1 {
   page-break-before: always;
   padding-top: 2em;
}

h1:first-child {
  page-break-before: avoid;
  counter-reset: page;
}

#print-head {
    display: block;
    position: fixed;
    top: 0pt;
    left:0pt;
    right: 0pt;

    font-size: 200%;
    text-align: center;
}

#print-foot {
   display: block;
   position: fixed;
   bottom: 0pt;
   right: 0pt;

  font-size: 200%;
}

#print-foot:after {
    content: counter(page);
    counter-increment: page;
}

这在Firefox中有效,这很好。但我还没有找到让它在Chrome(53)或IE(11)中工作的方法。 - tombam
页眉和页脚印在页面文本上:(找不到如何在每个页面上创建空白边距以打印页眉/页脚。如果我指定top: -0.5cm,页眉会向上移动,但会被页面边缘裁剪并且只能部分可见。overflow: visible也没有帮助。 - cronfy

1
如果您想在Chrome/Chromium下打印时添加页码,一个简单的解决方案是使用Paged.js
这个JS库将您的HTML/CSS切成页面,准备好作为一本书打印,您可以在浏览器中预览。它使@page和大多数CSS3规范在Chrome中工作。
解决方案1(简单):如果您愿意将视图切成页面并准备打印,请只需在页面的标签中添加他们的CDN。
<link href="path/to/file/interface.css" rel="stylesheet" type="text/css">

您可以使用自动计数器page来添加页码。例如:

将以下HTML放置在任何想要显示当前页面编号的位置:

<div class="page-number"></div>

CSS使数字出现在div中:

.page-number{
  content: counter(page)
}

该库还可以轻松管理页面边距、页脚、页眉等内容。

方案2(更加巧妙),只在打印时才显示数字(和分页符)

在这种情况下,您需要仅在打印文档时应用Paged.js CDN。 我能想到的一种方法是添加一个“打印”按钮,触发JavaScript来:

  1. 向页面添加CDN
  2. 然后执行window.print();来启动导航器的打印提示

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接