CSS เพื่อตั้งค่าขนาดกระดาษ A4


233

ฉันต้องการจำลองกระดาษ A4 ในเว็บและอนุญาตให้พิมพ์หน้านี้ตามที่ปรากฏในเบราว์เซอร์ (Chrome, โดยเฉพาะ) ฉันตั้งขนาดองค์ประกอบเป็น 21 ซม. x 29.7 ซม. แต่เมื่อฉันส่งไปที่การพิมพ์ (หรือตัวอย่างก่อนพิมพ์) มันคลิปหน้าของฉัน

ดูตัวอย่างสดนี้!

body {
  margin: 0;
  padding: 0;
  background-color: #FAFAFA;
  font: 12pt "Tahoma";
}

* {
  box-sizing: border-box;
  -moz-box-sizing: border-box;
}

.page {
  width: 21cm;
  min-height: 29.7cm;
  padding: 2cm;
  margin: 1cm auto;
  border: 1px #D3D3D3 solid;
  border-radius: 5px;
  background: white;
  box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
}

.subpage {
  padding: 1cm;
  border: 5px red solid;
  height: 256mm;
  outline: 2cm #FFEAEA solid;
}

@page {
  size: A4;
  margin: 0;
}

@media print {
  .page {
    margin: 0;
    border: initial;
    border-radius: initial;
    width: initial;
    min-height: initial;
    box-shadow: initial;
    background: initial;
    page-break-after: always;
  }
}
<div class="book">
  <div class="page">
    <div class="subpage">Page 1/2</div>
  </div>
  <div class="page">
    <div class="subpage">Page 2/2</div>
  </div>
</div>

ฉันคิดว่าฉันลืมบางสิ่งบางอย่าง แต่มันจะเป็นอะไร?

  • Chrome : หน้าการตัด, หน้าคู่ ( เป็นเพียงสิ่งที่ฉันต้องการใช้งาน )
  • Firefox : มันทำงานได้อย่างสมบูรณ์
  • IE10 : เชื่อหรือไม่มันสมบูรณ์แบบ!
  • Opera : รถบั๊กกี้บนหน้าตัวอย่างก่อนพิมพ์

11
ขอบคุณสำหรับเทมเพลตมันยอดเยี่ยมมาก
vektor

1
คำตอบที่ถูกต้องอยู่ที่นี่: stackoverflow.com/a/34018790/293856
unom

1
ล่อคู่หูที่เป็นไปได้ของ: stackoverflow.com/questions/3341485/…
Mark Boulder

รายงานข้อผิดพลาดเกี่ยวกับเรื่องนี้
Eugen Konkov

คำตอบ:


241

ฉันมองเข้าไปในนี้อีกเล็กน้อยและปัญหาที่เกิดขึ้นจริงดูเหมือนว่าจะมีการกำหนดinitialให้หน้าwidthภายใต้printกฎสื่อ ดูเหมือนว่าใน Chrome width: initialบน.pageองค์ประกอบผลในการปรับขนาดของเนื้อหาหน้าถ้าไม่มีการกำหนดค่าความยาวที่เฉพาะเจาะจงสำหรับwidthในองค์ประกอบหลักใด ๆ ( width: initialในกรณีนี้แก้ไขให้width: auto... แต่จริง ๆ แล้วค่าใด ๆ ที่เล็กกว่าขนาดที่กำหนดภายใต้@pageกฎ ทำให้เกิดปัญหาเดียวกัน)

ดังนั้นไม่เพียง แต่เนื้อหาจะยาวเกินไปสำหรับหน้า (ประมาณ2cm) แต่การขยายหน้าจะเล็กน้อยกว่าเริ่มต้น2cmและอื่น ๆ เล็กน้อย(ดูเหมือนว่าจะแสดงเนื้อหาภายใต้width: autoความกว้าง~196mmแล้วปรับขนาดเนื้อหาทั้งหมด จนถึงความกว้างของ210mm~ แต่ใช้สัดส่วนการปรับเดียวกันกับเนื้อหาที่มีความกว้างน้อยกว่า210mm)

ในการแก้ไขปัญหานี้คุณสามารถทำได้ง่ายๆในprintกฎสื่อกำหนดความกว้างกระดาษ A4 และสูงถึงhtml, bodyหรือโดยตรงไปยัง.pageและในกรณีนี้หลีกเลี่ยงinitialคำหลัก

การสาธิต

@page {
  size: A4;
  margin: 0;
}
@media print {
  html, body {
    width: 210mm;
    height: 297mm;
  }
  /* ... the rest of the rules ... */
}

สิ่งนี้ดูเหมือนจะทำให้ทุกอย่างเป็นไปอย่างที่เป็นเดิมใน CSS ดั้งเดิมของคุณและแก้ไขปัญหาใน Chrome (ทดสอบใน Chrome รุ่นต่างๆใน Windows, OS X และ Ubuntu)


คุณมาถึงองค์ประกอบ256mm(และดังนั้น237mmในที่สุด) ได้.subpageอย่างไร
caw

@MarcoW ฉันเชื่อว่า OP ของ256mmมันถูกปัดลงความสูงของกระดาษ A4 เล็กน้อยโดยไม่มีการขยายหน้า: 297mm - 2*20mm... อาจ257mmจะชัดเจนกว่า ;-) และในตัวอย่างก่อนหน้าของฉันการ237mmคิด~2cmเนื้อหา "ยาวเกินไป" ... แต่แก้ไขเพียงผิวเผินเท่านั้น ปัญหา. ดูคำตอบที่อัปเดตของฉันสำหรับวิธีแก้ปัญหาจริง
Martin Turjak

10
สวัสดี @MartinTurjak ฉันปรับซอของคุณเป็นเวอร์ชั่น US Letter ในกรณีที่ทุกคนสนใจ jsfiddle.net/2wk6Q/2957 ไชโย!
Ben

ฉันมี 4 เขตข้อมูลในการพิมพ์หน้าวิธีแบ่งพาร์ติชันขนาดเท่ากันของเขตข้อมูลทั้งหมด .. ขนาดของหน้าพิมพ์ใน pxl คืออะไร
Vikram

2
@Brad: ไม่ได้ผลสำหรับฉัน ยังคงสร้างหน้าว่างในระหว่างแต่ละหน้า
Sebastian Farham

37

CSS

body {
  background: rgb(204,204,204); 
}
page[size="A4"] {
  background: white;
  width: 21cm;
  height: 29.7cm;
  display: block;
  margin: 0 auto;
  margin-bottom: 0.5cm;
  box-shadow: 0 0 0.5cm rgba(0,0,0,0.5);
}
@media print {
  body, page[size="A4"] {
    margin: 0;
    box-shadow: 0;
  }
}

HTML

<page size="A4"></page>
<page size="A4"></page>
<page size="A4"></page>

การสาธิต



2
ดูเหมือนว่าจะทำงาน แต่box-shadow: 0;ไม่ได้ผล (อย่างน้อยใน Chrome) ควรเป็นbox-shadow: none;เช่นนั้น การประกาศมาร์จิ้นทั้งสองยังสามารถนำมารวมกันmargin: 0 auto 0.5cm;ได้
เอ็มทีเอ knn

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