จะหลีกเลี่ยงหน้าว่างส่วนท้ายขณะพิมพ์ได้อย่างไร?


91

ฉันใช้คุณสมบัติ CSS

ถ้าฉันใช้page-break-after: always;=> มันจะพิมพ์หน้าว่างส่วนเกินมาก่อน

ถ้าฉันใช้page-break-before: always;=> มันจะพิมพ์หน้าว่างเพิ่มเติมตามหลัง จะหลีกเลี่ยงสิ่งนี้ได้อย่างไร?

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
.print{
    page-break-after: always;

}
</style>
<script type="text/javascript">
window.print();
</script>
</head>
<body>
<div class="print">fd</div>
<div class="print">fdfd</div>
</body>
</html>

ระดับการพิมพ์สูงเท่าไหร่
juankysmith

1
เนื่องจากสำหรับใบแจ้งหนี้ความสูงจึงเป็นแบบไดนามิกตามจำนวนรายการ
Angelin Nadar

6
นี่คือวิธีที่เราทำในสงครามเย็น:<div>This page intentionally left blank.</div>
Bob Stein

คำตอบ:


72

คุณอาจจะเพิ่ม

.print:last-child {
     page-break-after: auto;
}

ดังนั้นprintองค์ประกอบสุดท้ายจะไม่ได้รับการแบ่งหน้าเพิ่มเติม

โปรดทราบว่า IE8 ไม่รองรับ: ตัวเลือกลูกสุดท้ายหากคุณกำหนดเป้าหมายเบราว์เซอร์ที่เลวร้ายนั้น


90
ตกลงเป็น "ไม่รองรับใน IE" เป็นคุณลักษณะ dafault ของ IE
Angelin Nadar

1
สำหรับผู้อ่านคนอื่น ๆ สิ่งนี้ไม่ได้ผลสำหรับฉัน แต่คำตอบด้านล่างของการตั้งค่าความสูงอัตโนมัติใน HTML และองค์ประกอบของร่างกายทำงานได้อย่างมีเสน่ห์
Cody

102

คุณลองสิ่งนี้แล้วหรือยัง?

@media print {
    html, body {
        height: 99%;    
    }
}

2
สำหรับฉันทำงาน: @media print {html {height: 99%; }} ด้วยเนื้อหาเอกสารที่สร้างขึ้นมีขนาดใหญ่ขึ้น
Gustavo

11
ในกรณีของฉันZurb Foundationตั้งค่า html และ body เป็นheight: 100%. ฉันสามารถลบล้างสิ่งนี้ได้ด้วยheight: auto
zacharydl

5
ยืนยันว่าความคิดเห็นของ @ zacharydl ใช้ได้กับฉันและนั่นheight: auto;ก็สวยหรูกว่าheight: 99%;
jontsai

ฉันมีปัญหานี้เนื่องจากฉันตั้งค่าความสูงของ html เป็น 101% เพื่อบังคับให้แถบเลื่อนแสดงเสมอ (กำจัดการข้ามไปมาระหว่างหน้า) - ใช่แล้วความสูง 100% ในรูปแบบการพิมพ์เป็นวิธีที่น่ารับประทาน - ไชโย
rob_james

@rob_james เพื่อหลีกเลี่ยงการใช้ 101% คุณสามารถตั้งค่า overflow-y: scroll; เพื่อให้แถบเลื่อนมองเห็นได้เสมอ
user161592

47

โซลูชันที่อธิบายไว้ที่นี่ช่วยฉันได้ ( ลิงก์ webarchive )

ก่อนอื่นคุณสามารถเพิ่มเส้นขอบให้กับองค์ประกอบทั้งหมดเพื่อดูว่าอะไรเป็นสาเหตุให้มีการต่อท้ายหน้าใหม่ (อาจมีระยะขอบการพายเรือ ฯลฯ )

div { border: 1px solid black;}

และวิธีแก้ปัญหาก็คือการเพิ่มสไตล์ต่อไปนี้:

html, body { height: auto; }

9
ว้าวนี่เป็นบล็อกเก่าของฉัน! ฉันเพิ่งมีปัญหาเดียวกันและคิดว่าจะแก้ไขไปแล้วครั้งหนึ่ง ^^ โลกใบเล็ก
มิเกลสตีเวนส์

3
บวก 1 สำหรับการเพิ่มเส้นขอบ div
Iftikhar Ali Ansari

การเพิ่มเส้นขอบเป็นความคิดที่ดีมาก !! มันช่วยให้ฉันรู้ว่ามีการตั้งค่าความสูงต่ำสุดบนกระดาษห่อหน้าของฉันที่ทำให้หน้าเพิ่มเติมปรากฏ ฉันกำลังต่อสู้กับสิ่งนี้อยู่พักหนึ่ง ขอบคุณมาก!
erichunt

34

หากไม่มีผลงานเหล่านั้นให้ลองทำเช่นนี้

@media print {

    html, body {
      height:100vh; 
      margin: 0 !important; 
      padding: 0 !important;
      overflow: hidden;
    }

}

ตรวจสอบให้แน่ใจว่าเป็น 100vh


4
การตั้งค่าความสูงเป็น 100vh ช่วยแก้ปัญหาของฉันได้ ขอบคุณ
user2398069

1
"@media print {* {overflow: hidden! important;}}" สำคัญมากสำหรับฉัน
shinriyo

1
ในที่สุดคำตอบของปัญหาที่คลุมเครือ! Safari บน OSX กำลังแสดงหน้าว่างเปล่าอย่างสมบูรณ์ในขณะที่ Chrome, FF และ Edge ซึ่งเป็นสิ่งที่ดีในการแสดงตัวอย่าง ขอบคุณมาก!
ป๊อป

1
การตั้งค่าความสูงไว้ที่ 100vh ดูเหมือนว่าจะป้องกันไม่ให้โหลดมากกว่าหนึ่งหน้าดังนั้นหากเอกสารมีมากกว่าหนึ่งหน้าเฉพาะหน้าแรกที่โหลดในหน้าตัวอย่าง
Filipe


5

หากคุณต้องการใช้ CSS และต้องการหลีกเลี่ยงการแบ่งหน้าให้ใช้

.print{
    page-break-after: avoid;

}

ดูสื่อเพจ

คุณสามารถใช้ scripting equivalents สำหรับ pageBreakBefore และ pageBreakAfter กำหนดค่าแบบไดนามิก ตัวอย่างเช่นแทนที่จะบังคับให้มีการแบ่งหน้าแบบกำหนดเองสำหรับผู้เยี่ยมชมของคุณคุณสามารถสร้างสคริปต์เพื่อทำให้เป็นทางเลือกได้ ที่นี่ฉันจะสร้างช่องทำเครื่องหมายที่สลับระหว่างการแบ่งส่วนหน้าที่ส่วนหัว (h2) และตามดุลยพินิจของเครื่องพิมพ์ (ค่าเริ่มต้น):

<form name="myform">
<input type="checkbox" name="mybox" onClick="breakeveryheader()">
</form>

<script type="text/javascript">
 function breakeveryheader(){
 var thestyle=(document.forms.myform.mybox.checked)? "always" : "auto"
 for (i=0; i<document.getElementsByTagName("H2").length; i++)
 document.getElementsByTagName("H2")[i].style.pageBreakBefore=thestyle
 }

คลิกที่นี่เพื่อดูตัวอย่างที่ใช้สิ่งนี้ คุณสามารถแทนที่ H2 ภายในสคริปต์ด้วยแท็กอื่นเช่น P หรือ DIV

http://www.javascriptkit.com/dhtmltutors/pagebreak.shtml


4

ตั้งค่าdisplay:noneสำหรับองค์ประกอบอื่น ๆ ทั้งหมดที่ไม่ใช่สำหรับงานพิมพ์ การตั้งค่าvisibility:hiddenจะซ่อนไว้ แต่ทั้งหมดยังคงอยู่ที่นั่นและใช้พื้นที่สำหรับพวกเขา หน้าว่างมีไว้สำหรับองค์ประกอบที่ซ่อนอยู่


ขอบคุณหากคุณมีเนื้อหาแบบไดนามิกคุณสามารถใช้:notตัวเลือกเพื่อตั้งค่าทุกอย่างเป็นdisplay: noneแต่ไม่ใช่ระดับการพิมพ์เช่นbody > :not(.print) { display: none !important; }
Putzi San

4

ไม่รู้ว่าทำไม (ตอนนี้) แต่อันนี้ช่วยได้:

   @media print {
        html, body {
            border: 1px solid white;
            height: 99%;
            page-break-after: avoid;
            page-break-before: avoid;
        }
    }

หวังว่าใครบางคนจะช่วยผมของเขาในขณะที่ต่อสู้กับปัญหา ... ;)


4

ดูเหมือนว่าจะมีสาเหตุหลายอย่างที่เป็นไปได้โดยประเด็นที่เป็นไปได้คือแท็กร่างกายจะลงเอยด้วยความสูงที่ถือว่าใหญ่เกินไปสำหรับเหตุผลที่ไม่มีเหตุผล

สาเหตุของฉัน: min-height: 100%ในสไตล์ชีตพื้นฐาน

วิธีแก้ปัญหาของฉัน: min-height: autoใน@media printคำสั่ง

หมายเหตุautoดูเหมือนจะไม่ใช่ค่าที่ถูกต้องตาม PhpStorm อย่างไรก็ตามมันถูกต้องตามเอกสารของ Mozilla เกี่ยวกับความสูงต่ำสุด :

auto
ขนาดต่ำสุดที่เป็นค่าเริ่มต้นสำหรับรายการแบบยืดหยุ่นซึ่งให้ค่าเริ่มต้นที่สมเหตุสมผลมากกว่า 0 สำหรับโครงร่างอื่น ๆ


ฉันใส่แค่ 'min-height: initial! important;' และมันได้ผลสำหรับฉัน
Siby Thomas

@SibyThomas ฉันหลีกเลี่ยงการประกาศที่สำคัญถ้าเป็นไปได้ ทำให้สิ่งต่างๆยากขึ้นสำหรับการลบล้างคุณสมบัติ ฉันไม่ได้พิจารณาด้วยซ้ำinitialเพราะฉันคิดว่ามันน่าจะเป็นปัญหาสำหรับองค์ประกอบที่มีขนาดไดนามิก โปรดทราบว่าค่าเริ่มต้นคือ 0 ดังนั้นฉันยังคงคิดว่าautoโดยทั่วไปมีประโยชน์มากกว่า
George Marian

4

ฉันมีปัญหาที่คล้ายกัน แต่สาเหตุเกิดจากฉันมีระยะขอบ 40px ที่ด้านล่างของหน้าดังนั้นแถวสุดท้ายจะรวมอยู่เสมอแม้ว่าจะมีที่ว่างสำหรับมันในหน้าสุดท้ายก็ตาม ไม่ใช่เพราะpage-break-*คำสั่ง css ใด ๆ ฉันแก้ไขโดยการลบขอบในการพิมพ์และทำงานได้ดี แค่อยากจะเพิ่มวิธีแก้ปัญหาของฉันเผื่อว่ามีคนอื่นที่คล้ายกัน


3

ในกรณีของฉันการตั้งค่าความกว้างให้กับ div ทั้งหมดช่วย:

.page-content div {
    width: auto !important;
    max-width: 99%;
}


2

หลังจากต่อสู้กับการตั้งค่าและความสูงของตัวแบ่งหน้าและกฎ CSS ที่หลากหลายบนแท็กเนื้อหาในที่สุดฉันก็แก้ไขได้ในอีกหนึ่งปีต่อมา

ฉันมี div ซึ่งควรจะเป็นสิ่งเดียวในหน้าที่พิมพ์ออกมา แต่ฉันได้รับหน้าว่างหลายหน้าหลังจากนั้น แท็กร่างกายของฉันถูกตั้งค่าเป็นvisibility:hidden;แต่นั่นยังไม่เพียงพอ องค์ประกอบของหน้าที่สูงในแนวตั้งยังคงใช้พื้นที่ 'ว่าง' ดังนั้นฉันจึงเพิ่มสิ่งนี้ในกฎ CSS การพิมพ์ของฉัน:

#header, #menu, #sidebar{ height:1px; display:none;}

เพื่อกำหนดเป้าหมาย div เฉพาะตามรหัสซึ่งมีองค์ประกอบเค้าโครงหน้าสูง ฉันหดความสูงแล้วลบออกจากเค้าโครง ไม่มีหน้าว่างอีกต่อไป หลายปีต่อมาฉันยินดีที่จะบอกลูกค้าว่าฉันทุบมันทิ้ง หวังว่านี่จะช่วยใครบางคนได้


ใช่หากคุณใช้visibility: hidden;จะยังคงใช้พื้นที่ หากคุณใช้display: none;พื้นที่จะถูกลบออก เมื่อถึงจุดนั้นคุณไม่จำเป็นต้องกำหนดความสูงโดยเฉพาะเพียงแค่ FYI
chapeljuice

2

Chrome ดูเหมือนจะมีข้อบกพร่องที่ในบางสถานการณ์การซ่อนองค์ประกอบหลังการโหลดด้วยการแสดงผล: ไม่มีเลยทำให้มีพื้นที่ว่างมากมายอยู่ข้างหลัง ฉันเดาว่าพวกเขากำลังคำนวณความสูงของเอกสารก่อนที่เอกสารจะเสร็จสิ้น Chrome ยังทำให้เกิดเหตุการณ์การเปลี่ยนแปลงสื่อ 2 รายการและไม่รองรับ onbeforeprint เป็นต้นโดยพื้นฐานแล้วจะเป็นการพิมพ์ นี่คือวิธีแก้ปัญหาของฉัน:

@media print {
    body {
        display: none;
    }
}

body.printing {
    display: block;
}

คุณให้ body class = "printing" บน doc พร้อมและเปิดใช้งานรูปแบบการพิมพ์ ระบบนี้ช่วยให้สามารถปรับเปลี่ยนรูปแบบการพิมพ์และดูตัวอย่างก่อนพิมพ์ในเบราว์เซอร์ได้



1

เพิ่ม css นี้ในเพจเดียวกันเพื่อขยายไฟล์ css

<style type="text/css">
   <!--
   html, body {
    height: 95%; 
    margin: 0 0 0 0;
     }
   -->
</style>

1

ฉันลองวิธีแก้ปัญหาทั้งหมดแล้วสิ่งนี้ใช้ได้กับฉัน:

<style>
    @page {
        size: A4;
        margin: 1cm;
    }

    .print {
        display: none;
    }

    @media print {
        div.fix-break-print-page {
            page-break-inside: avoid;
        }

        .print {
            display: block;
        }
    }

    .print:last-child {
        page-break-after: auto;
    }
</style>


1

การตั้งค่าเส้นขอบโปร่งใสที่แปลกประหลาดช่วยแก้ปัญหานี้ให้ฉัน:

@media print {
  div {
    border: 1px solid rgba(0,0,0,0)
  }
}

บางทีอาจจะเพียงพอที่จะกำหนดเส้นขอบบนองค์ประกอบคอนเทนเนอร์ <- Untestet


0

ไม่มีคำตอบใดที่ใช้ได้กับฉัน แต่หลังจากอ่านทั้งหมดฉันพบว่าปัญหาคืออะไรในกรณีของฉันฉันมี 1 หน้า Html ที่ฉันต้องการพิมพ์ แต่มันกำลังพิมพ์ด้วยหน้าว่างสีขาวพิเศษ ฉันใช้ AdminLTE ธีม bootstrap 3 สำหรับหน้าของรายงานเพื่อพิมพ์และอยู่ในแท็กส่วนท้ายฉันต้องการวางข้อความนี้ไว้ที่ด้านล่างขวาของหน้า:

พิมพ์โดยคุณคน

ฉันใช้ jquery เพื่อใส่ข้อความนั้นแทนส่วนท้าย "Copy Rights" ก่อนหน้าด้วย

$("footer").html("Printed by Mr. Someone");

และโดยค่าเริ่มต้นในธีมส่วนท้ายของแท็กจะใช้ class .main-footer ซึ่งมีแอตทริบิวต์

padding: 15px;
border-top: 1px solid 

นั่นทำให้เกิดพื้นที่สีขาวเพิ่มขึ้นดังนั้นหลังจากทราบปัญหาแล้วฉันจึงมีตัวเลือกต่าง ๆ และตัวเลือกที่ดีที่สุดคือใช้

$( "footer" ).removeClass( "main-footer" );

ในหน้าเฉพาะนั้น


0

ใส่สิ่งที่คุณต้องการบนหน้าใน div และใช้ page-break-inside: หลีกเลี่ยงใน div นั้น div ของคุณจะอยู่ในหน้าเดียวและไปยังหน้าที่สองหรือสามหากจำเป็น แต่ div ถัดไปควรจะต้องแบ่งหน้าควรเริ่มในหน้าถัดไป


0

ตรวจสอบว่ามีช่องว่างหลังแท็ก html ที่ด้านล่างหรือไม่ ลบช่องว่างด้านล่างช่วยฉันได้


0

ขั้นแรกเลียนแบบสไตล์ชีตการพิมพ์ผ่านทาง devtools ของเบราว์เซอร์ของคุณ คำแนะนำสามารถพบได้ที่นี่

จากนั้นคุณจะต้องมองหาช่องว่างเพิ่มเติมระยะขอบขอบและอื่น ๆ ที่สามารถขยายขนาดของหน้าเว็บของคุณได้เกิน 8.5 นิ้ว x 11 นิ้ว ให้ความสนใจเป็นพิเศษกับช่องว่างเนื่องจากจะไม่สามารถตรวจพบผ่านกล่องโต้ตอบตัวอย่างก่อนพิมพ์ หากมีช่องว่างที่ไม่ควรอยู่ที่นั่นการคลิกขวาและตรวจสอบองค์ประกอบใต้เคอร์เซอร์ควรเน้นปัญหา (เว้นแต่ว่าจะเป็นขอบที่ทำให้เกิด)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.