How do I avoid a page break immediately after a heading

前端 未结 3 2048
灰色年华
灰色年华 2021-02-05 01:36

I have an HTML 4.01/CSS 2.1 document that includes an H3 heading followed by a short (one line) paragraph block and then an unordered list with several items:

&l         


        
相关标签:
3条回答
  • 2021-02-05 02:00

    Since the CSS property page-break-after: avoid doesn't work in any WebKit or Mozilla based browsers, use the page-break-inside: avoid over the heading and an acceptable amount of the text:

    CSS

    <style type="text/css">
        .nobreak {
            page-break-inside: avoid;
        }
    </style>
    

    HTML

    <div class="nobreak">
        <h3>Heading!</h3>
    
        <p>Some things:</p>
    
    </div>
    
        <ul>
          <li>Thing one</li>
          <li>Thing B</li>
          <li>Thing 4</li>
        </ul>
    
    0 讨论(0)
  • 2021-02-05 02:10

    This is an extremely hacky solution, but it works for me:

    h1 {
        page-break-inside: avoid;
    }
    h1::after {
        content: "";
        display: block;
        height: 100px;
        margin-bottom: -100px;
    }
    

    Basically I create an invisible element that increases the size of the <h1> without affecting the content after it. When page-break-inside: avoid is applied and the whole <h1> (including the hacky element cannot fit into the page) the browser is forced to carry the <h1> to the next page.

    0 讨论(0)
  • 2021-02-05 02:21

    When dealing only with lines inside a Paragraph, you could use the widows and orphans attributes in CSS. But unfortunately this will not bind your header to the Paragraph or the List. This because widows and orphans are not applied on block-like elements (like headers). See Should CSS "orphan" operate at line or block level?

    I tried it since I've got stuck with the same problem. It seems to work when I print the Page from the Browser (Opera in my case) but not when I export the PDF with wkhtmltopdf.

    Looks like putting all the elements that we don't want to be separated into a div and style this one with page-break-inside: avoid, like suggested in the accepted answer.

    In my case where I have to display some headers and tabular data, I had to build a routine that finds the headers and then counts a certain amount of table-rows ahead and relocates the header and the table(s) into one div.

    0 讨论(0)
提交回复
热议问题