`page-break-after: избежать`, когда разрыв происходит на полях

При печати из Chrome я хотел бы избежать разрыва страницы между заголовком и следующим абзацем.

Я достиг этого для большинства документов с помощью:

h1 {
   page-break-inside: avoid;
   page-break-after: avoid;
}

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

Однако это кажется неудачным, когда разрыв происходит в пределах поля заголовка.

Я могу воспроизвести так:

<html>
   <head>
     <style>
         h1 {
           border-style: solid;
           margin: 30px;
           page-break-inside: avoid;
           page-break-after: avoid;
         }
         p {
           background-color: grey;
         }
     </style>
   </head>
   <body>
     <h1>Lorem ipsum dolor sit amet</h1>
     <p>... consectetur adipiscing elit (etc)...</p>
     (Repeat to fill a page)
</html>

... сокращать/удлинять текст абзаца до тех пор, пока предварительный просмотр печати не покажет нежелательный разрыв страницы:

`page-break-after: избежать`, когда разрыв происходит на полях

Спецификация CSS, кажется, говорит, что этого не должно происходить:

In the normal flow, page breaks can occur at the following places:

1) In the vertical margin between block-level boxes. When an unforced page break occurs here, the used values of the relevant 'margin-top' and 'margin-bottom' properties are set to '0'. When a forced page break occurs here, the used value of the relevant 'margin-bottom' property is set to '0'; the relevant 'margin-top' used value may either be set to '0' or retained.

...

  • Rule A: Breaking at (1) is allowed only if the 'page-break-after' and 'page-break-before' properties of all the elements generating boxes that meet at this margin allow it, which is when at least one of them has the value 'always', 'left', or 'right', or when all of them are 'auto'.

Это работает как надо? Или ошибка в CSS Chrome? Или недоразумение с моей стороны?

Могу ли я как-то обойти это?

Что, если вы обернете оба тега h1 и p в div и добавите в этот div элементы page-break-..?

Rick 25.06.2019 11:48

Возможно, этот вопрос также может дать некоторые ответы.

Rick 25.06.2019 11:56

Проверьте эту ссылку, надеюсь, вам помогут. здесь

Gonzalo 25.06.2019 12:03
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
1
3
1 216
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первое (простое и безопасное) решение: Добавьте элемент section/div вокруг h1 и первого абзаца и установите на нем page-break-inside: avoid. В примере:

    <body>
       <div class = "headline">
          <h1>A sample title</h1>
          <p>First paragraph bla bla blac....</p>
       </div>
       <p>Second paragraph...</p>
    </body>

с CSS:

    .headline {
        page-break-inside: avoid;
    }

Второе решение: с небольшими изменениями в html и семантике section можно сделать что-то вроде:

  <body>
    <div class = "page">
      <section>
        <h1>
          A Simple Title
        </h1>
        <p>
          Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
          eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
          minim veniam, quis nostrud exercitation ullamco laboris nisi ut
          aliquip ex ea commodo consequat. Duis aute irure dolor in
          reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
          pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
          culpa qui officia deserunt mollit anim id est laborum.
        </p>
        ...
        <h1>Second title</h1>
        <p>Lorem....</p>
    </section>
  </body>

С CSS:

body {
  font: sans-serif;
}
.page {
  padding: 1em;
}
section {
  page-break-before: always;
}
section > p + h1 {
  page-break-before: always;
  page-break-after: avoid;
}
section > h1* + p {
  page-break-before: avoid;
}

Вы можете увидеть пример здесь: https://codesandbox.io/s/test-print-avoid-page-break-after-title-l4kbq

Итак, в этом ответе подразумевается, что обработка разрыва страницы после разрыва страницы в Chrome нарушена?

slim 25.06.2019 16:29

Вероятно, да. Я думаю, что происходит что-то вроде этого: Chrome пытается напечатать каждый элемент отдельно, а когда пытается напечатать H1, места достаточно. и так следующий элемент. Но это подразумевает множество других проверок: если следующий элемент НЕ МОЖЕТ быть напечатан без разрыва (большой, как страница), это еще один особый случай, который следует учитывать, и так далее...

g.annunziata 25.06.2019 16:37

Другие вопросы по теме