Друк CSS: уникати розрізнених DIV-сторінок між сторінками?


199

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

DIV, які він робить, мають динамічну висоту, але вони не дуже варіюються. Вони зазвичай близько 200 пікселів. У будь-якому випадку, маючи приблизно шістсот цих предметів на документ, у мене дуже важкий час, щоб його надрукувати. Якщо мені не пощастить, внизу та вгорі кожної сторінки є запис, порубаний навпіл, і це робить насправді використання роздруківки дуже складно.

Я спробував перерив сторінки, раніше, перерив сторінки, перерив сторінки, а також комбінації трьох безрезультатно. Я думаю, що це може бути те, що WebKit не надає належним чином інструкцій, або, можливо, це моє нерозуміння, як ними користуватися. У будь-якому випадку мені потрібна допомога. Як я можу запобігти розрізанню половини своїх DIV-файлів під час друку?


Надайте зразок документа з проблемою, яку ви бачите, і, можливо, ми можемо допомогти!
X-Istence

Я відповів на дуже подібне запитання про те, щоб уникнути розрізання дівок навпіл: stackoverflow.com/a/14348953/1026459
Travis J

1
Примітка: Цю властивість НЕ можна використовувати на абсолютно розміщених (і мабуть, також на вбудованих блоках) елементах.
Ujjwal Singh

Відповіді:


335

Це має працювати:

@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 :), який зараз у перегляді розробника
Linus Unnebäck

1
Працює в Chrome V 27.0.1453.116
Т. Брайан Джонс

4
Працює і в Netscape. Дякую!

2
Для чого потрібен друк у ЗМІ? Це те ж саме, якщо друк на медіа не використовується і правило застосовується безпосередньо на div?
FrenkyB

21

Лише часткове рішення: Єдиний спосіб, як я міг змусити це працювати для IE, - це загортати кожен div у свою власну таблицю і встановлювати розбиття сторінки на стіл, щоб уникнути.


@easwee: спасибі Оцінка, що сталася в той же час, допитливий_web_developer поставив щедру питання. Я здогадуюсь, що це / йому не сподобалось. ;)
NotMe

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

2
Тестований прорив сторінки у wkhtmltopdf у версії 0.11, і він працює.
cmc

Тестовано з wkhtmltopdf 0.12.2.1. Дайвінг всередині таблиць більше не потрібен, просто покладіть розділ сторінки: уникайте перемикача. Працює!
Пол Марті

12

page-break-inside: avoid; створив мені проблеми з використанням wkhtmltopdf.

Щоб уникнути розривів тексту, додайте display: table;до CSS тексту, що містить текст div.

Я сподіваюся, що це працює і для вас. Спасибі Джонс.


Я майже махнули на незрозумілі просторах, що з'явилися тут і там при використанні page-break-before: always;на <div>елементах. Шукали через океан SO Posts, статті, офіційні документи та інше. Ніщо не допомогло. Але ти, друже мій, нарешті прийшов із тим, що мені точно потрібно! Не можу подякувати тобі, чоловіче !! Я б хотів, щоб я міг тобі випити кави принаймні, кохання з Індії!
Джей Даданія

6

розбиття сторінки: уникати; Однозначно не працює у веб-програмі, насправді це відома проблема вже 5 років https://bugs.webkit.org/show_bug.cgi?id=5097

Наскільки моє дослідження пішло, не існує відомого методу для досягнення цього (я працюю над з'ясуванням власного хаку)

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

На жаль, FF - це єдиний браузер, якому мені вдалося це виконати, а веб-кет - це той, про кого я більше переживаю.


5

Можливі значення для розбиття сторінки: auto, always, avoid, left, right

Я вважаю, що ви не можете використовувати властивість розбиття сторінки на абсолютно розміщених елементах.


1
Мабуть, це не працює і на inline-blocks
Ujjwal Singh

5

У мене ж проблема ще немає рішення. Розбиття сторінок працює не в браузерах, а в Opera. Альтернативою може бути використання переривання сторінки: уникати; на всіх дочірніх елементах div, щоб зберегти тогетер ... але в моїх тестах, Avoid-Atribut не працює, наприклад. у Firefox ...

Що працює у всіх популярних браузерах, це вимушені розриви сторінок за допомогою напр. перерив сторінки після: завжди


Це має працювати з Webkit. Однак вам може знадобитися ввести кілька додаткових дивок, розроблених для друку із переходом сторінки: завжди; after ~ півдюжини ваших звичайних дівок.
ʍǝɥʇɐɯ

3

Одне підводне каміння, на яке я зіткнувся, був батьківським елементом, у якого атрибут 'overflow' встановлений на 'auto'. Це заперечує дочірні елементи div з атрибутом прориву сторінки у версії для друку. В іншому випадку page-break-inside: avoidдля мене відмінно працює Chrome.


2

У моєму випадку мені вдалося виправити труднощі з розривом сторінки у веб-програмі, встановивши вибрані вами диви на прорив сторінки: уникнути, а також встановивши всі елементи для відображення: inline. Так ось так:

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

}

Здається, властивості розбиття сторінки можуть застосовуватися лише до вбудованих елементів (у веб-програмі). Я намагався застосувати лише display: inline до потрібних мені елементів, але це не вийшло. Єдине, що працювало - це застосувати inline до всіх елементів. Я здогадуюсь, це один з великих контейнерів, які псують речі.

Можливо, хтось міг би розширитись з цього приводу.


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.