CSS để đặt khổ giấy A4


233

Tôi cần mô phỏng một tờ giấy A4 trong web và cho phép in trang này vì nó được hiển thị trên trình duyệt (cụ thể là Chrome). Tôi đặt kích thước phần tử là 21cm x 29,7cm, nhưng khi tôi gửi để in (hoặc in xem trước) nó sẽ cắt trang của tôi.

Xem ví dụ trực tiếp này !

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>

Tôi nghĩ rằng tôi đang quên một cái gì đó. Nhưng nó sẽ là gì?

  • Chrome : cắt trang, trang kép ( đó chỉ là những gì tôi cần để hoạt động )
  • Firefox : nó hoạt động hoàn hảo.
  • IE10 : tin hay không, nó hoàn hảo!
  • Opera : rất có lỗi khi xem trước bản in

11
Cảm ơn về mẫu, nó thật tuyệt vời.
vektor

1
Câu trả lời đúng là ở đây: stackoverflow.com/a
432018790/293856

1
Bản sao có thể có của: stackoverflow.com/questions/3341485/NH
Mark Boulder

báo cáo lỗi về điều này
Eugen Konkov

Câu trả lời:


241

Tôi đã xem xét vấn đề này nhiều hơn một chút và vấn đề thực tế dường như là việc gán initialcho trang widththeo printquy tắc truyền thông. Có vẻ như trong Chrome width: initialvề .pagephần tử dẫn đến việc chia tỷ lệ nội dung trang nếu không xác định giá trị độ dài cụ thể cho widthbất kỳ phần tử cha nào ( width: initialtrong trường hợp này sẽ giải quyết width: auto... nhưng thực tế là bất kỳ giá trị nào nhỏ hơn kích thước được xác định theo @pagequy tắc gây ra vấn đề tương tự).

Vì vậy, không chỉ nội dung bây giờ quá dài đối với trang (khoảng 2cm), mà cả phần đệm trang sẽ hơi nhiều so với ban đầu 2cmvà cứ thế (dường như hiển thị nội dung theo width: autochiều rộng ~196mmvà sau đó thu nhỏ toàn bộ nội dung lên đến chiều rộng của 210mm~ nhưng chính xác một cách chính xác hệ số tỷ lệ tương tự được áp dụng cho các nội dung có chiều rộng nhỏ hơn 210mm).

Để khắc phục vấn đề này, bạn có thể chỉ cần trong printquy tắc phương tiện chỉ định chiều rộng giấy A4 và cao html, bodyhoặc trực tiếp đến .pagevà trong trường hợp này tránh initialtừ khóa.

BẢN GIỚI THIỆU

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

Điều này dường như giữ mọi thứ khác như trong CSS gốc của bạn và khắc phục sự cố trong Chrome (được thử nghiệm trong các phiên bản Chrome khác nhau trong Windows, OS X và Ubuntu).


Làm thế nào bạn đến 256mm(và do đó 237mm, cuối cùng) cho các .subpageyếu tố?
caw

@MarcoW. Tôi tin rằng OP của 256mmhơi tròn xuống chiều cao giấy A4 mà không có đệm page: 297mm - 2*20mm... có lẽ 257mmsẽ rõ ràng ;-) Và trong ví dụ trước đây của tôi là nhiều hơn một chút 237mmchiếm ~2cm"quá dài" nội dung ... nhưng chỉ một cách hời hợt giải quyết vấn đề. Xem câu trả lời cập nhật của tôi ở trên cho các giải pháp thực tế.
Martin Turjak

10
Xin chào @MartinTurjak, tôi đã điều chỉnh fiddle của bạn thành phiên bản Thư Hoa Kỳ, trong trường hợp có ai quan tâm. jsfiddle.net/2wk6Q/2957 Chúc mừng!
Ben

Tôi đang có 4 trường in một trang làm thế nào để phân vùng kích thước bằng nhau của tất cả các trường .. kích thước của trang in trong pxl
Vikram

2
@Brad: không làm việc cho tôi. Vẫn đang tạo một trang trống ở giữa mỗi trang.
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>

BẢN GIỚI THIỆU


2
lưu ý phụ: <page>không phải là tên thành phần HTML tùy chỉnh hợp lệ
Martin Schneider

2
Có vẻ để làm việc. Nhưng box-shadow: 0;không hoạt động (ít nhất là trong Chrome), nó nên như vậy box-shadow: none;. Hai khai báo lề cũng có thể được kết hợp thành margin: 0 auto 0.5cm;.
mts knn

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.