我想打印一个大的HTML表,而不打破它的行在每页结束。我使用以下代码,但它不工作。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<style>
@media print
{
table { page-break-after:auto }
tr { page-break-inside:avoid; page-break-after:auto }
td { page-break-inside:avoid; page-break-after:auto }
thead { display:table-header-group }
tfoot { display:table-footer-group }
}
</style>
<body>
<table border="1">
<?php
for($i=0;$i<50;$i++){
?>
<tr>
<td height="50" width="130">gukgu</td>
<td height="50" width="180" height="50" width="145">gukgu</td>
<td height="50" width="130">gukgu</td>
<td height="50" width="180" height="50" width="145">gukgu</td>
</tr>
<?php
}
?>
</table>
</body>
</html>
有人能帮忙吗?
您可以尝试使用orphans
来指定要留在页面底部的空行数;如果一个元素的布局与orphans
设置冲突,该元素将被打印到下一页。不过浏览器的支持相当差劲。对于您的示例,我会将其设置为tr
,如下所示:tr{orphans:3}
Try
<table border="1">
<?php for($i=0;$i<50;$i++) { ?>
<tr>
<td height="50" width="130">gukgu</td>
<td height="50" width="180" height="50" width="145">gukgu</td>
<td height="50" width="130">gukgu</td>
<td height="50" width="180" height="50" width="145">gukgu</td>
</tr>
<?php } ?>
</table>
在for
循环中有table标签,放在for
循环之前
我迟到了,但我有一个类似的问题,这是我能找到的最接近的讨论。我已经解决了我自己的问题,想和下一个人分享。
我需要打印一个被分成行段的大表。每个段以一个段头行开始,然后是大约5个数据行。我不希望在任何段中有分页符,但是我确实希望列在整个表中对齐。CSS的"page-break-inside:avoid
"属性只适用于顶级块元素,所以我不能在<table>
中使用<div>
来控制分页。
但是我可以使用<tbody>
!显然,在现代浏览器中,<table>
元素只是一个用于分组各个表部分的控制特性,根本不是块元素,而<tbody>
是实际的块元素。所以page-break-inside:avoid
可以解决这个问题。此外,在单个<table>
中使用多个<tbody>
标签是合法的。
所以这就是秘密:使用使用单独的<tbody>
表的每一部分,每个与" page-break-inside:avoid
" CSS属性。
有一些并发症。首先,IE11似乎需要一个"orphans:5
"CSS属性来工作。其次,我尝试使用<thead>
的段头行,给它一个"page-break-after: avoid
"属性,但我遇到了很多跨浏览器的问题,所以我最终只是把段头内相应的<tbody>
标签。
tbody.segment {
page-break-inside: avoid;
orphans: 5;
}
th.segment {
border: thin solid black;
}
HTML: <table>
<tbody class="segment">
<tr><th class="segment" colspan="3">Segment 1</th></tr>
<tr><td>data1aa</td><td>data1ab</td><td>data1ac</td><tr>
...
<tr><td>data1za</td><td>data1zb</td><td>data1zc</td><tr>
</tbody>
<tbody class="segment">
<tr><th class="segment" colspan="3">Segment 2</th></tr>
<tr><td>data2aa</td><td>data2ab</td><td>data2ac</td><tr>
...
<tr><td>data2za</td><td>data2zb</td><td>data2zc</td><tr>
</tbody>
</table>
所有不基于webkit的流行桌面浏览器(即Firefox和Internet Explorer)现在都支持<tr>
元素上的CSS声明page-break-inside: avoid;
,这解决了这些浏览器中OP的问题。Webkit的支持显然仅限于块元素,所以这个问题在技术上还没有解决Chrome, Safari和Opera(我很确定这里发布的其他解决方案都不会有帮助)。但是,可以通过将表转换为一堆不可破坏的块来模拟所需的行为。如果使用固定的列宽,则可以使用纯CSS完成,如下所示:
<style>
table {border-collapse: collapse;}
table > tbody > tr {
display: block;
page-break-inside: avoid;
}
table > tbody > tr > td {
border: 2px solid black;
width: 100px;
max-width: 100px;
}
table > tbody > tr:first-child ~ tr > td {border-top: none;}
</style>
<table>
<tr>
<td>data</td>
<td>data</td>
<td>Multiple<br/>lines of<br/>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
<td>Multiple<br/>lines of<br/>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
<td>Multiple<br/>lines of<br/>data</td>
</tr>
</table>
如果你不想使用固定的列宽度,那么你必须使用javascript来确保列宽度不会从一行到另一行变化。我对另一篇文章的回答演示了一种方法来做到这一点,但它包括重复表头,这使得它比在这种情况下需要的复杂得多。不过还是值得一看