Tôi có thể buộc ngắt trang khi in HTML không?


187

Tôi đang tạo một báo cáo HTML sẽ có thể in được và nó có "các phần" sẽ bắt đầu trong một trang mới.

Có cách nào để đưa một cái gì đó vào HTML / CSS sẽ báo hiệu cho trình duyệt rằng nó cần phải ngắt trang (bắt đầu một trang mới) tại thời điểm đó không?

Tôi không cần cái này để hoạt động ở mọi trình duyệt ngoài kia, tôi nghĩ tôi có thể bảo mọi người sử dụng một bộ trình duyệt cụ thể để in cái này.

Câu trả lời:


334

Thêm một lớp CSS gọi là "pagebreak" (hoặc "pb"), như vậy:

@media print {
    .pagebreak { page-break-before: always; } /* page-break-after works, as well */
}

Sau đó thêm thẻ DIV trống ( hoặc bất kỳ thành phần khối nào tạo hộp ) nơi bạn muốn ngắt trang.

<div class="pagebreak"> </div>

Nó sẽ không hiển thị trên trang, nhưng sẽ phá vỡ trang khi in.

PS Có lẽ điều này chỉ áp dụng khi sử dụng -after(và cả những gì bạn có thể làm với các trang khác <div>trên trang), nhưng tôi thấy rằng tôi phải tăng lớp CSS như sau:

@media print {
    .pagebreak {
        clear: both;
        page-break-after: always;
    }
}

7
Nhưng giống như tất cả những điều tốt đẹp trong CSS, điều này không phải lúc nào cũng hoạt động ổn định trên bảng, vì vậy hãy kiểm tra ánh sáng ban ngày của nó, vì bạn sẽ khiến người dùng tức giận tự hỏi tại sao trang web của bạn lại in ra vô số trang trống!
Zoe

13
Theo MDN, page-break-after"áp dụng cho các phần tử khối tạo hộp", vì vậy sử dụng <span>phần tử trống sẽ không hoạt động. Đó là một ý tưởng tốt hơn để áp dụng nó cho một phần nội dung của bạn. Xem developer.mozilla.org/en-US/docs/Web/CSS/page-break-after
nullable

1
@nullability: Bắt tốt. Tôi đã chủ yếu sử dụng điều này trong công việc cũ của mình trong điều khiển WebBrowser trong WinForms sử dụng IE, tiêu chuẩn vàng theo các tiêu chuẩn sau.
Chris Doggett

1
Điều này không hoạt động với tôi trong Chrome ... Tôi đang cố gắng thực hiện ngắt trang bên trong sau khi <tr> bên trong <bảng>, nó có hoạt động trong trường hợp này không?
delphirules

3
Vì một số lý do, khi sử dụng thủ thuật này trong Chrome, 1 hàng pixel của trang tiếp theo đã bị rò rỉ vào trang trước đó (đáng chú ý khi sử dụng màu nền). Tôi đã sửa nó bằng cách sử dụng.pagebreak { min-height: 1px; page-break-before: always; }
pzmarzly

44

Hãy thử liên kết này

<style>
@media print
{
h1 {page-break-before:always}
}
</style>

Tôi nghĩ rằng đây là một câu trả lời tốt hơn vì nó không liên quan đến việc xáo trộn HTML để đạt được hiệu ứng hình ảnh.
FinnNk

Tôi thực sự thích cái khác tốt hơn, vì nó cho tôi nhiều quyền kiểm soát hơn. Tôi luôn có thể chỉ định lớp "ngắt trang" cho lớp H1 để làm cho trang nhảy. Nhưng nó vẫn là một giải pháp tốt. +1 cho @media, mặc dù màn hình nên bỏ qua ngắt trang trước, tôi đoán vậy. Cảm ơn!
Daniel Magliola

h1 là một ví dụ về những gì bạn có thể sử dụng làm thẻ cho thời gian in. Bạn có thể thay thế và gắn thẻ tên bạn thích. bạn cũng có thể sử dụng ngắt trang sau: luôn luôn
jfarrell

1
h1không phải là một ví dụ hay, vì nó có nghĩa là một tiêu đề cấp 1 và một trang thường chỉ có một tiêu đề như vậy.
Jukka K. Korpela

6
Nếu bạn muốn bỏ qua tiêu đề đầu tiên trên trang đầu tiên, hãy thửh1:not(:first-child) { page-break-before:always; }
Jeff Atwood

10

Chỉ muốn đặt một bản cập nhật. page-break-afterlà một tài sản kế thừa bây giờ.

Chính thức trang bang

Khách sạn này đã được thay thế bằng tài sản sau khi phá vỡ .


Cần lưu ý rằng thuộc tính này chỉ được hỗ trợ bởi trình duyệt Microsoft IE và Edge. caniuse.com/ Quảng cáo
Benjamin

7

Bạn có thể sử dụng thuộc tính CSS page-break-before(hoặc page-break-after). Chỉ cần thiết lập page-break-before: alwaystrên những yếu tố khối cấp (ví dụ, tiêu đề, div, p, hoặc tablecác yếu tố) mà nên bắt đầu trên một dòng mới.

Ví dụ: để ngắt dòng trước bất kỳ tiêu đề cấp 2 nào và trước bất kỳ phần tử nào trong lớp newpage(ví dụ: <div class=newpage>...), bạn sẽ sử dụng

h2, .newpage { page-break-before: always }

5

First page (scroll down to see the second page)
<div style="break-after:page"></div>
Second page
<br>
<br>
<button onclick="window.print();return false;" />Print (to see the result) </button>

Chỉ cần thêm cái này vào nơi bạn cần trang để đến trang tiếp theo (văn bản "trang 1" sẽ ở trang 1 và văn bản "trang 2" sẽ ở trang thứ hai).

Page 1
<div style='page-break-after:always'></div>
Page 2

Điều này cũng hoạt động:

First page (there is a break after this)
<div style="break-after:page"></div>
Second page (This will be printed in the second page)

1

Giả sử bạn có một blog với các bài viết như thế này:

<div class="article"> ... </div>

Chỉ cần thêm nó vào CSS đã làm việc cho tôi:

@media print {
  .article { page-break-after: always; }
}

(đã thử nghiệm và hoạt động trên Chrome 69 và Firefox 62).

Tài liệu tham khảo:


0
  • Chúng tôi có thể thêm thẻ ngắt trang với kiểu " ngắt trang sau: luôn luôn " tại điểm chúng tôi muốn giới thiệu ngắt trang trong trang html.
  • " ngắt trang trước " cũng hoạt động

Thí dụ:

HTML_BLOCK_1
<p style="page-break-after: always"></p>
HTML_BLOCK_2
<p style="page-break-after: always"></p>
HTML_BLOCK_3

Trong khi in tệp html bằng mã ở trên, bản xem trước in sẽ hiển thị ba trang (một cho mỗi khối html " HTML_BLOCK_n ") trong đó như trong trình duyệt, tất cả ba khối lần lượt xuất hiện lần lượt.


0

Tôi cần ngắt trang sau mỗi hàng thứ 3 trong khi chúng tôi sử dụng lệnh in trên trình duyệt.

Tôi đã thêm <div style = 'page-break-before: always;'> </ div>

sau mỗi hàng thứ 3 và div cha mẹ của tôi có màn hình: flex; vì vậy tôi loại bỏ hiển thị: flex; và nó đã hoạt động như tôi muốn.


0

CSS

@media print {
  .pagebreak { 
     page-break-before: always; 
  }
}

HTML

<div class="pagebreak"></div>

-7

@ Chris Doggett có ý nghĩa hoàn hảo. Mặc dù, tôi đã tìm thấy một mẹo vui trên lvsys.com , và nó thực sự hoạt động trên firefox và chrome. Chỉ cần đặt bình luận này bất cứ nơi nào bạn muốn ngắt trang được chèn. Bạn cũng có thể thay thế <p>thẻ bằng bất kỳ thành phần khối nào.

<p><!-- pagebreak --></p>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.