Как применить CSS-разрыв страницы для печати таблицы с большим количеством строк?
У меня есть динамическая таблица на моей веб-странице, которая иногда содержит много строк. Я знаю, что есть page-break-before
а также page-break-after
CSS свойства Где я могу разместить их в своем коде, чтобы вызвать разрыв страницы при необходимости?
11 ответов
Вы можете использовать следующее:
<style type="text/css">
table { page-break-inside:auto }
tr { page-break-inside:avoid; page-break-after:auto }
</style>
За подробностями обращайтесь к спецификации W3C CSS Print Profile.
А также обратитесь к форумам разработчиков Salesforce.
Везде, где вы хотите применить перерыв, либо table
или же tr
, вы должны дать класс для бывших. page-break
с помощью CSS, как указано ниже:
/* class works for table row */
table tr.page-break{
page-break-after:always
}
<tr class="page-break">
/* class works for table */
table.page-break{
page-break-after:always
}
<table class="page-break">
и он будет работать как вам нужно
Кроме того, вы также можете иметь div
структура для того же:
CSS:
@media all {
.page-break { display: none; }
}
@media print {
.page-break { display: block; page-break-before: always; }
}
Div:
<div class="page-break"></div>
Я искал исправления для этого. У меня есть мобильный сайт jquery с последней страницей для печати, который объединяет десятки страниц. Я перепробовал все исправления, описанные выше, но единственное, что я смог получить, это:
<div style="clear:both!important;"/></div>
<div style="page-break-after:always"></div>
<div style="clear:both!important;"/> </div>
К сожалению, приведенные выше примеры не работают для меня в Chrome.
Я придумал следующее решение, где вы можете указать максимальную высоту в PX для каждой страницы. Это тогда разделит таблицу на отдельные таблицы, когда строки будут равны этой высоте.
$(document).ready(function(){
var MaxHeight = 200;
var RunningHeight = 0;
var PageNo = 1;
$('table.splitForPrint>tbody>tr').each(function () {
if (RunningHeight + $(this).height() > MaxHeight) {
RunningHeight = 0;
PageNo += 1;
}
RunningHeight += $(this).height();
$(this).attr("data-page-no", PageNo);
});
for(i = 1; i <= PageNo; i++){
$('table.splitForPrint').parent().append("<div class='tablePage'><hr /><table id='Table" + i + "'><tbody></tbody></table><hr /></div>");
var rows = $('table tr[data-page-no="' + i + '"]');
$('#Table' + i).find("tbody").append(rows);
}
$('table.splitForPrint').remove();
});
Вам также понадобится ниже в вашей таблице стилей
div.tablePage {
page-break-inside:avoid; page-break-after:always;
}
При преобразовании в PDF с помощью SelectPdf я не мог заставить группу строк оставаться вместе. Пытался поставить их в
<div style="break-inside: avoid;">
но это не сработало.
Ничего не работало, пока я не нашел это: /questions/35204725/izbegat-razryiva-stranitsyi-vnutri-stroki-tablitsyi/35204753#35204753
Что заставило меня переосмыслить свою логику и поместить то, что я не хотел разбивать, в файл .
<table>
<thead style="display: table-header-group;">
<tr>
<th></th>
</tr>
</thead>
-- Repeating content --
<tbody style="break-inside: avoid;">
-- First row from group --
<tr>
<td> Only shown once per group </td>
</tr>
-- Repeating rows --
<tr>
<td> Shown multiple times per group </td>
</tr>
</tbody>
В результате получается таблица с несколькими
<tbody>
но это совершенно нормально, так как многие люди используют именно этот шаблон для группировки строк.
Это работает для меня:
<td>
<div class="avoid">
Cell content.
</div>
</td>
...
<style type="text/css">
.avoid {
page-break-inside: avoid !important;
margin: 4px 0 4px 0; /* to keep the page break from cutting too close to the text in the div */
}
</style>
Из этой темы: избегайте разрыва страницы внутри строки таблицы
Если вы знаете, сколько вы хотите на странице, вы всегда можете сделать это. Он начнет новую страницу после каждого 20-го элемента.
.row-item:nth-child(20n) {
page-break-after: always;
page-break-inside: avoid;
}
В конце концов я понял, что мой объемный контент, который переполняет таблицу и не ломается должным образом, просто не обязательно должен находиться внутри таблицы.
Хотя это не техническое решение, мою проблему решило просто закрыть таблицу, когда она мне больше не нужна; затем начал новую для нижнего колонтитула.
Надеюсь, это кому-то поможет... удачи!
Мы пробовали множество различных решений, упомянутых здесь и в других местах, и ничего не помогло нам. Однако в конце концов мы нашли решение, которое сработало для нас, и для нас это каким-то образом кажется проблемой Angular. Я не понимаю, почему это работает, но для нас это работает, и в конце концов нам не понадобился какой-либо css для разрыва страницы.
@media print {
ng-component {
float: left;
}
}
Так что просто надеюсь, что это поможет кому-то еще, поскольку нам потребовались дни, чтобы исправить.
Вот пример:
Через css:
<style>
.my-table {
page-break-before: always;
page-break-after: always;
}
.my-table tr {
page-break-inside: avoid;
}
</style>
или непосредственно на элементе:
<table style="page-break-before: always; page-break-after: always;">
<tr style="page-break-inside: avoid;">
..
</tr>
</table>
Вы должны использовать
<tbody>
<tr>
first page content here
</tr>
<tr>
..
</tr>
</tbody>
<tbody>
next page content...
</tbody>
И CSS:
tbody { display: block; page-break-before: avoid; }
tbody { display: block; page-break-after: always; }