Печать CSS: Избегать разрезания пополам DIV между страницами?


199

Я пишу плагин для части программного обеспечения, которая берет большую коллекцию элементов и вставляет их в HTML в WebView в Какао (который использует WebKit в качестве средства визуализации, поэтому в основном вы можете предположить, что этот файл HTML открывается в Сафари).

DIVs, которые он делает, имеют динамическую высоту, но они не сильно различаются. Они обычно около 200 пикселей. Во всяком случае, из-за примерно шести сотен этих предметов в документе у меня очень трудное время, чтобы его напечатать. Если мне не повезет, есть запись, разрезанная пополам внизу и вверху каждой страницы, и это фактически затрудняет использование распечаток.

Я пробовал разрывы страниц до, разрыв страниц после, разрыв страниц внутри и их комбинации безрезультатно. Я думаю, что это может быть WebKit, неправильно отображающий инструкции, или, может быть, это мое непонимание того, как их использовать. Во всяком случае, мне нужна помощь. Как я могу предотвратить сокращение моих DIV при печати?


Предоставьте образец документа с проблемой, которую вы видите, и, возможно, мы можем помочь!
X-Istence

Я ответил на очень похожий вопрос о том, как избежать разрезания делителей пополам здесь: stackoverflow.com/a/14348953/1026459
Travis J

1
Примечание. Это свойство нельзя использовать для абсолютно позиционированных (и, по-видимому, также для встроенных блоков) элементов.
Уджвал Сингх

Ответы:


336

Это должно работать:

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

Обратите внимание на текущую поддержку браузера (12-03-2014) :

  • Chrome - 1.0+
  • Firefox (Gecko) - 19.0+
  • Internet Explorer - 8.0+
  • Опера - 7.0+
  • Сафари - 1,3+ (312)

7
Это должно работать. Но это не так. Смотрите en.wikipedia.org/wiki/… для поддержки браузера.
Грег

1
Работает в Safari 6 :), который сейчас находится в предварительном просмотре для разработчиков
Линус Уннебек

1
Работает в Chrome V 27.0.1453.116
T. Brian Jones

4
Работает и в Netscape. Спасибо!

2
Зачем вам медиа-печать? То же самое, если печатный носитель не используется и правило применяется непосредственно к div?
FrenkyB

21

Только частичное решение: Единственный способ, которым я мог заставить это работать для IE, - это обернуть каждый элемент div в его собственную таблицу и установить внутри таблицы разрыв страницы, чтобы избежать этого.


@easwee: спасибо. Понижение произошло в то же время, что inquisitive_web_developer вознаградил за этот вопрос. Я думаю, что ему / ей это не понравилось. ;)
NotMe

3
Прекрасный! Ты чемпион; Я искал способ сделать это в wkhtmltopdf , который не поддерживает page-break-inside: avoid;должным образом. Наконец-то у меня есть достойное решение.
Дейв

2
Протестировал разрыв страницы в wkhtmltopdf в версии 0.11 и все работает.
CMC

Протестировано с помощью wkhtmltopdf 0.12.2.1. Div внутри таблиц больше не нужен, просто вставьте разрыв страницы внутри: избегайте выбора Div. Работает!
Пол Марти

12

page-break-inside: avoid; дал мне проблемы с использованием wkhtmltopdf.

Чтобы избежать разрывов в тексте, добавьте display: table;в CSS текст-содержащий div.

Я надеюсь, что это работает и для вас. Спасибо JohnS.


Я почти махнули на необъяснимые пространствах, появившихся здесь и там при использовании page-break-before: always;на <div>элементах. Поиск в океане SO сообщений, статей, официальных документов и еще много чего. Ничего не помогло Но ты, мой друг, наконец-то пришел с тем, что мне точно нужно! Не могу отблагодарить тебя достаточно, чувак !! Хотел бы я принести тебе кофе хотя бы, много любви из Индии!
Джей Дадхания

6

разрыв страницы: избегать; определенно не работает в webkit, на самом деле это известная проблема уже более 5 лет https://bugs.webkit.org/show_bug.cgi?id=5097

Что касается моего исследования, то нет никакого известного способа сделать это (я работаю над выяснением своего собственного хака)

Совет, который я могу дать вам, чтобы выполнить эту функцию в FF, оберните содержимое, которое вы не хотите разбивать внутри DIV (или любого контейнера), переполнением: auto (просто будьте осторожны, чтобы не вызвать странные полосы прокрутки Покажите размер контейнера слишком мал).

К сожалению, FF - единственный браузер, в котором мне удалось это сделать, и я больше беспокоюсь о webkit.


5

Возможные значения для разрыва страницы: auto, always, avoid, left, right

Я считаю, что вы не можете использовать свойство page-break-after для абсолютно позиционированных элементов.


1
По-видимому, он также не работает на inline-blockS
Ujjwal Singh

5

У меня та же проблема, но пока нет решения. разрыв страницы не работает в браузерах, но работает в Opera. Альтернативой может быть использование разрыва страницы: избежать; на всех дочерних элементах div, чтобы они оставались вместе ... но в моих тестах атрибут-избежать не работает, например. в Firefox ...

То, что работает во всех популярных браузерах, - это принудительные разрывы страниц, например. разрыв страницы после: всегда


Это должно работать с Webkit. Однако вам может понадобиться добавить несколько дополнительных элементов div для стиля печати с разрыва страницы: всегда; после ~ полдюжины ваших регулярных дел.
ʍǝɥʇɐɯ

3

Одна ловушка, с которой я столкнулся, была родительским элементом, у которого атрибут 'overflow' установлен в 'auto'. Это сводит на нет дочерние элементы div с атрибутом page-break-inside в версии для печати. В остальном page-break-inside: avoidу меня нормально работает на Chrome.


2

В моем случае мне удалось исправить трудности с разрывом страниц в веб-наборе, установив для выбранных элементов div значение разрыва страницы: избежать, а также настроить отображение всех элементов: inline. Ну вот так:

@media print{
* {
    display:inline;
}
script, style { 
    display:none; 
}
div {
    page-break-inside:avoid;
}

}

Кажется, что свойства разрыва страницы могут быть применены только к встроенным элементам (в webkit). Я пытался применить только отображение: встроенный в конкретные элементы, которые мне нужны, но это не сработало. Единственное, что сработало, - это применение встроенных элементов ко всем элементам. Я предполагаю, что это один из больших контейнеров, который портит вещи.

Может быть, кто-то мог бы расширить это.


1
@media print{
    /* use your css selector */    
    div{ 
        page-break-inside: avoid;
    }
}

Для всех новых браузеров это решение работает. См. Caniuse.com/#search=page-break-inside


1

page-break-inside: avoid;Кажется, не всегда работает. Кажется, принимать во внимание высоту и расположение элементов контейнера.

Например, inline-blockэлементы, которые выше страницы, будут обрезаны.

Мне удалось восстановить работоспособность page-break-inside: avoid;, идентифицировав элемент контейнера с помощью display: inline-blockи добавив:

@media print {
    .container { display: block; } /* this is key */

    div, p, ..etc { page-break-inside: avoid; }
}

Надеюсь, что это помогает людям, которые жалуются, что «разрыв страницы не работает».

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.