Разрыв страницы внутри Chrome не работает?
У меня есть куча параграфов на странице:
<p> ... </p>
<p> ... </p>
<p> ... </p>
Правило CSS для этих абзацев:
p {
margin: 20px 0;
page-break-inside: avoid;
}
Демоверсия в реальном времени: http://jsfiddle.net/KE9je/2/show/
Если я понимаю page-break-inside
свойство правильно, выше следует убедиться, что ни один абзац не разделен между двумя страницами. (Абзац либо отображается на "текущей" странице, либо, если он не помещается полностью, он перемещается на следующую страницу.)
Это не похоже на работу в Chrome. Откройте демо, щелкните правой кнопкой мыши страницу, выберите "Печать...". Вы увидите предварительный просмотр - пятый абзац разделен на страницы 1 и 2.
Что я делаю неправильно? Как я могу заставить это работать в Chrome?
16 ответов
На самом деле, он работает в Chrome, и решение действительно глупо!
И родитель, и элемент, для которого вы хотите управлять разрывом страницы, должны быть объявлены как:
position: relative;
Проверьте эту скрипку (или в полноэкранном режиме)
Это верно для:
page-break-before
page-break-after
page-break-inside
Тем не менее, контролируя page-break-inside
в Safari не работает (в 5.1.7, как минимум)
Надеюсь, это поможет!!!
Это сработало лучше для меня:
.no-page-break {
display: inline-block;
width: 100%;
page-break-inside: avoid;
}
Вы также можете указать height
если нужно.
Я боролся с этим некоторое время, а также следовал советам в других ответах. Мне нужно было убедиться, что элемент и все родительские элементы имеют стиль Display: block;
,
Я знаю, что это старый вопрос, но Chrome изменился, так как на него изначально был дан ответ, и это может помочь.
Это выглядит как page-break-inside:avoid
работает в Chrome, основываясь на высоте элемента, поэтому, если вы перемещаете кучу элементов в div, page-break-inside:avoid
не будет работать.
Можно обойти это, явно указав высоту элемента, который вы не хотите разбивать. Пример jQuery:
$('#page_break_inside_avoid_element').height($('#page_break_inside_avoid_element').height());
Недавно я работал над историей загрузки pdf, в которой были динамические строки данных в формате таблицы, которые включают в себя различные изображения диаграмм (используемые технологии =>Angular + Spring + Thymleaf + Puppeteer). Некоторые из ключевых моментов для обработки разрывов страниц.
Попробуй использовать
<div></div>
блоки вместо HTML-таблицНе использовать
display: flex
в родительском контейнере, на котором вы хотитеpage-break-inside: avoid
(использоватьfloat
в дочернем элементе).child1 {float: left; }
3. Если вы визуализируете div in loop и page-break-inside: избегайте; не работает Вы должны использовать этот CSS-хак для работы с определенным div
<div class="parent-container">
<div class="child1"></div>
<div class="child2"></div>
</div>
.parent-container{
position: relative;
page-break-inside: avoid;
}
.parent-container::after {
content: "";
display: block;
height: 200px;
margin-bottom: -200px;
}
Согласно SitePoint, Chrome здесь не поддерживается, только Opera (и IE 8 глючит)...
http://reference.sitepoint.com/css/page-break-inside
Другие ссылки:
http://www.reddit.com/r/css/comments/jdeim/pagebreakinside_avoid_doesnt_work/
Переполнение стека темы:
Кросс-браузерная поддержка `page-break-inside: избежать;`
"page-break-inside: избежать"- не работает
Google Chrome Printing Разрывы страниц
Форум Google Chrome:
http://www.google.com/support/forum/p/Chrome/thread?tid=20090828aa91bc90&hl=en
Я не буду публиковать ссылку на W3Schools (из-за общей ненадежности), но они также заявляют, что она поддерживается только в Opera, во что бы то ни стало.
Проверьте, не является ли отображение родительского контейнера встроенным ! Если так, то никогда не получится! Я трачу несколько часов, чтобы понять это.
Работает в Chrome 87
Я решил это: моей проблемой был "родительский" div (а не "родительский" div), установленный как display:flex. Я установил его на display:block, и он работает.
Для Bootstrappers, имейте в виду, что page-break-inside
или другие не могут (высоко) работать под container
или же row
или другие классы начальной загрузки, даже если вы вручную измените свойство position. Когда я исключаю container
а также row
, Оно работало завораживающе!
Что сработало для меня (в FFox и Chrome, то есть)
.container {
column-gap: .4em;
columns: 3;
padding: .4em;
}
.contained {
page-break-before: avoid;
page-break-inside: avoid;
page-break-after: always;
}
И это все; Мне не нужно position
,
Вот как я решил эту проблему при написании CSS для печати.
Например, вы помещаете несколько изображений в файл HTML следующим образом:
<div class="bottom">
<figure>
<img src="img01.jpg" alt="Front View">
<figcaption>Front View</figcaption>
</figure>
<figure>
<img src="img02.jpg" alt="Rear View">
<figcaption>Rear View</figcaption>
</figure>
</div>
И напишите css так:
.bottom figure{
page-break-inside: avoid;
}
Иногда это не сработает так, как вы ожидаете, потому что значение отображения по умолчанию для большинства элементов - блочное или встроенное, что не является "дружественным к разрыву страницы". Я обычно меняю это так:
.bottom{
display: contents;
}
Это нацелено на то, чтобы удалить контейнер, сделав дочерние элементы дочерними по отношению к элементу на следующий уровень выше в DOM.
Что касается вашего вопроса, я предлагаю вам взглянуть на режим отображения контейнера абзаца, чтобы узнать, установлен ли он на блокировку. Если да, измените его на содержимое и попробуйте еще раз.
Надеюсь, это поможет.
Я только что проверил это с большим абзацем в IE9, Chrome 14 и Firefox 7, и похоже, что только IE9 работает как положено. Возможно, вам придется прибегнуть к добавлению разрывов страниц вручную, где вы хотите их с
page-break-after:always
Конечно, это хорошо для вас, если вы заранее знаете длину контента.
После огромных копаний это кажется очень глупой, раздражающей и простой проблемой. Ключом к решению этой проблемы является:
Во-первых, давайте определим, что является родителем и дочерним элементом.
- Ребенок: Это элемент, который нам нужен, чтобы предотвратить/избежать вырезания промежуточных страниц PDF.
- Родитель: это прямой родитель/контейнер дочернего элемента.
Теперь у нас есть родитель и дочерний элемент, которые очень очевидны, следующим шагом будет дать и родителю, и дочернему элементу несколько простых в реализации правил. так что давайте сделаем это
Родительские правила
display: block;
Дочерние правила
display: block; position: relative: page-break-inside: avoid;
Вот и все!
Проверьте , если родительский (или контейнер верхнего уровня) дисплей flex
; удалите его и попробуйте снова ; у меня работает в chrome71
Также
page-break-inside: avoid
может не работать, если один из родительских элементов имеет фиксированную высоту (скажем,
height: 1000px
). Я думаю, это потому, что браузер сначала пытается уместить контент по указанной высоте и только потом думает о разрыве страницы.
Переход на
height: 100%
исправил это для меня.
Это работает для меня, как это:
.print{position: absolute;}
.print p{page-break-inside: avoid}