як уникнути зайвої порожньої сторінки в кінці під час друку?


88

Я використовую властивість CSS,

Якщо я використовую page-break-after: always;=> Це надрукує зайву порожню сторінку раніше

Якщо я використовую page-break-before: always;=> Він друкує додаткову порожню сторінку після. Як цього уникнути?

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
.print{
    page-break-after: always;

}
</style>
<script type="text/javascript">
window.print();
</script>
</head>
<body>
<div class="print">fd</div>
<div class="print">fdfd</div>
</body>
</html>

яка висота класу друку?
juankysmith

1
Оскільки це стосується рахунків-фактур, висота буде динамічною відповідно до кількості елементів.
Angelin Nadar

5
Ось як ми це зробили в холодну війну:<div>This page intentionally left blank.</div>
Боб Штейн

Відповіді:


72

Можна, можливо, додати

.print:last-child {
     page-break-after: auto;
}

так що останній printелемент не отримає зайвого розриву сторінки.

Зверніть увагу, що селектор: last-child не підтримується в IE8, якщо ви націлюєтеся на цього нещастя браузера.


88
Це нормально, оскільки "Не підтримується в IE" - це стандартна функція IE
Анжелін Надар

Для інших читачів це не спрацювало для мене, але наведена нижче відповідь про автоматичне встановлення висоти для HTML та елементів тіла працювала як шарм.
Коді,

101

Ви пробували це?

@media print {
    html, body {
        height: 99%;    
    }
}

2
Для мене працював: @media print {html {висота: 99%; }}, з тілом створений документ був більшим
Густаво,

10
У моєму випадку Zurb Foundation встановлював html і body на height: 100%. Я зміг це відмінитиheight: auto
zacharydl

4
Підтверджуючи, що коментар @ zacharydl працює для мене, а також height: auto;це більш елегантно, ніжheight: 99%;
jontsai

У мене виникла ця проблема, оскільки я встановлював висоту html на 101%, щоб змусити смугу прокрутки завжди відображатися. (Виключає перехід між сторінками) - так що так, 100% висота у стилі друку - це смачне виправлення! - ура.
rob_james

@rob_james, щоб уникнути використання 101%, ви можете встановити overflow-y: scroll; завжди мати видиму смугу прокрутки
user161592

46

Описане тут рішення допомогло мені ( посилання на веб-архів ).

Перш за все, ви можете додати межу до всіх елементів, щоб побачити, що спричиняє додавання нової сторінки (можливо, деякі поля, відступи тощо).

div { border: 1px solid black;}

І саме рішення було додати такі стилі:

html, body { height: auto; }

9
Ого, це був мій старий блог! Я просто мав ту саму проблему і думав, що вже виправив цей колись ^^ маленький світ
Мігель Стівенс

3
плюс 1 для додавання межі div.
Іфтіхар Алі Ансарі,

Додавання кордону було такою чудовою ідеєю !! Це допомогло мені зрозуміти, що на обгортці моєї сторінки встановлено мінімальну висоту, через яку з’являється додаткова сторінка. Я деякий час бився об це головою. Дуже дякую!
erichunt

33

якщо жодна з цих робіт не працює, спробуйте це

@media print {

    html, body {
      height:100vh; 
      margin: 0 !important; 
      padding: 0 !important;
      overflow: hidden;
    }

}

переконайтеся, що він становить 100 в год


4
встановлення висоти 100vh вирішило мою проблему. Дякую
user2398069

1
"@media print {* {overflow: hidden! important;}}" дуже важливий для мене.
shinriyo

1
Нарешті відповідь на незрозумілу проблему! Safari на OSX показував абсолютно порожню сторінку, тоді як Chrome, FF та Edge де все добре з попереднім переглядом. Дуже дякую!
поп

Якщо встановити висоту 100vhh, здається, це заважає йому завантажувати більше однієї сторінки, так що якщо документ має більше однієї сторінки, лише перша сторінка завантажується в попередній перегляд
Філіпе


5

Якщо ви просто хочете використовувати CSS і хочете уникнути розриву сторінки, тоді використовуйте

.print{
    page-break-after: avoid;

}

Погляньте на сторінкові носії інформації

Ви можете використовувати еквіваленти сценаріїв для pageBreakBefore та pageBreakAfter, динамічно призначати їх значення. Наприклад, замість того, щоб примушувати відвідувачів користувацькі розриви сторінок, ви можете створити сценарій, щоб зробити це необов’язковим. Тут я створю прапорець, який перемикається між нарізанням сторінки в заголовках (h2) та на власний розсуд принтера (за замовчуванням):

<form name="myform">
<input type="checkbox" name="mybox" onClick="breakeveryheader()">
</form>

<script type="text/javascript">
 function breakeveryheader(){
 var thestyle=(document.forms.myform.mybox.checked)? "always" : "auto"
 for (i=0; i<document.getElementsByTagName("H2").length; i++)
 document.getElementsByTagName("H2")[i].style.pageBreakBefore=thestyle
 }

Клацніть тут для прикладу, який використовує це. Ви можете замінити H2 всередині сценарію іншим тегом, таким як P або DIV.

http://www.javascriptkit.com/dhtmltutors/pagebreak.shtml


4

Не знаю (на даний момент) чому, але цей допоміг:

   @media print {
        html, body {
            border: 1px solid white;
            height: 99%;
            page-break-after: avoid;
            page-break-before: avoid;
        }
    }

Сподіваюся, хтось збереже його волосся, борючись із проблемою ...;)


4

Здається, існує багато можливих причин, імовірно, тема полягає в тому, що тег тіла закінчується висотою, яка вважається занадто великою з причини.

Моя причина: min-height: 100%у базовій таблиці стилів.

Моє рішення: min-height: autoв @media printдирективі.

Зверніть увагу, на autoдумку PhpStorm, здавалося , це не правильне значення. Однак це правильно згідно з документацією Mozilla щодо мінімальної висоти :

auto
Мінімальний розмір за замовчуванням для гнучких елементів, забезпечуючи більш розумне значення за замовчуванням, ніж 0 для інших макетів.


Я просто поставив "min-height: початковий! Важливий;" і це спрацювало для мене.
Сібі Томас

@SibyThomas Я уникаю важливої ​​декларації, якщо це можливо. Це ускладнює заміщення властивостей. Я навіть не розглядав, initialоскільки припускав, що це буде проблематично для елементів, що динамічно розмірюються. Зверніть увагу, що початкове значення дорівнює 0, тому я все ще вважаю, що autoце, як правило, більш корисно.
George Marian

3

набір display:noneдля всіх інших елементів, які не призначені для відбитків. налаштування visibility:hiddenбуде тримати їх прихованими, але всі вони все ще там і зайняли для них місце. порожня сторінка призначена для тих прихованих елементів.


3

У моєму випадку допомогло встановлення ширини для всіх div:

.page-content div {
    width: auto !important;
    max-width: 99%;
}


3

У мене була подібна проблема, але причина полягала в тому, що у мене було 40 пікселів поля внизу сторінки, тому найостанніший рядок завжди обертався, навіть якщо на останній сторінці було місце для нього. Не через якусь page-break-*команду css. Я виправив, видаливши поля на друці, і він працював нормально. Просто хотів додати своє рішення на випадок, якщо хтось ще щось подібне!


2

Після боротьби з різними налаштуваннями та висотою розриву сторінки та мільйоном різноманітних правил CSS для тегу body, я нарешті вирішив це через рік.

У мене є div, який повинен бути єдиним на сторінці, який друкується, але я отримував кілька порожніх сторінок після нього. Для мого тегу встановлено значення, visibility:hidden;але цього було недостатньо. Вертикально високі елементи сторінки все одно займають "простір". Тож я додав це у свої правила друку CSS:

#header, #menu, #sidebar{ height:1px; display:none;}

націлювати конкретні div за їх ідентифікаторами, які містять високі елементи макета сторінки. Я зменшив висоту, а потім видалив їх із макета. Більше немає порожніх сторінок. Через роки я із задоволенням повідомляю своєму клієнту, що я його зламав. Сподіваюся, це комусь допомагає.


Так, якщо ви використовуєте, visibility: hidden;це все одно займе місце. Якщо ви використовуєте, display: none;простір буде видалено. На той момент вам не потрібно буде спеціально встановлювати висоту, а просто FYI.
chapeljuice

2

Здається, у Chrome є помилка, коли в певних ситуаціях приховування елементів після завантаження з дисплеєм: жоден не залишає позаду багато зайвого місця. Я гадаю, вони обчислюють висоту документа ще до того, як документ буде зроблений. Chrome також запускає 2 події зміни засобів масової інформації та не підтримує попередній друк тощо. Вони в основному є елементом друку. Ось моє рішення:

@media print {
    body {
        display: none;
    }
}

body.printing {
    display: block;
}

Ви надаєте body class = "printing" на документ готовий, і це дозволяє стилі друку. Ця система забезпечує модуляризацію стилів друку та попередній перегляд друку в браузері.


1

Додайте цей css на ту саму сторінку, щоб продовжити файл css.

<style type="text/css">
   <!--
   html, body {
    height: 95%; 
    margin: 0 0 0 0;
     }
   -->
</style>

1

Я випробував усі рішення, це мені підходить:

<style>
    @page {
        size: A4;
        margin: 1cm;
    }

    .print {
        display: none;
    }

    @media print {
        div.fix-break-print-page {
            page-break-inside: avoid;
        }

        .print {
            display: block;
        }
    }

    .print:last-child {
        page-break-after: auto;
    }
</style>

1

Я щойно зіткнувся з випадком, коли змінюється з

    </div>
    <script src="addressofjavascriptfile.js"></script>
</body>
</html>

до

        <script src="addressofjavascriptfile.js"></script>
    </div>
</body>
</html>

вирішено цю проблему.


1
.print:last-child{
    page-break-after: avoid;
    page-break-inside: avoid;
    margin-bottom: 0px;
}

Це спрацювало для мене.


1

Дивне встановлення прозорої межі вирішило це для мене:

@media print {
  div {
    border: 1px solid rgba(0,0,0,0)
  }
}

Можливо, буде достатньо встановити межу для елемента контейнера. <- Нетестет.


0

Жодна з відповідей не працювала зі мною, але, прочитавши всі, я зрозумів, у чому проблема в моєму випадку. У мене є сторінка розміром 1 HTML, яку я хочу надрукувати, але вона друкувала разом із нею додаткову білу порожню сторінку. Я використовую AdminLTE тему bootstrap 3 для друку сторінки звіту, і в ньому тег нижнього колонтитула я хотів розмістити цей текст у нижньому правому куті сторінки:

Надруковано паном Хтось

Я використав jquery, щоб розмістити цей текст замість попереднього колонтитула "Копіювати права" за допомогою

$("footer").html("Printed by Mr. Someone");

і за замовчуванням у темі нижній колонтитул тегу використовує клас .main-footer, який має атрибути

padding: 15px;
border-top: 1px solid 

це спричинило додатковий пробіл, тому, дізнавшись про проблему, у мене були різні варіанти, і найкращим варіантом було використовувати

$( "footer" ).removeClass( "main-footer" );

Просто на цій конкретній сторінці


0

Помістіть необхідні речі на сторінку в div і використовуйте розбиття сторінки: уникайте цього div. Ваш div залишиться на одній сторінці і перейде на другу або третю сторінку, якщо це потрібно, але наступний div, якщо йому потрібно зробити розрив сторінки, повинен розпочатися на наступній сторінці.


0

Перевірте, чи немає пробілу після тегу html внизу. Видалити пробіли нижче допомогло мені

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.