CSS для встановлення формату паперу формату A4


233

Мені потрібно імітувати папір формату А4 в Інтернеті і дозволити друкувати цю сторінку так, як це відображається в браузері (зокрема в 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
Дякую за шаблон, це приголомшливо.
вектор

1
Правильна відповідь тут: stackoverflow.com/a/34018790/293856
Unom


Відповіді:


241

Я розглядав це трохи більше, і справжня проблема, мабуть, пов’язана з призначенням initialсторінки widthпід printправилами медіа. Схоже, що в Chrome width: initialна .pageелементі відбувається результат масштабування вмісту сторінки, якщо для widthжодного з батьківських елементів не визначено значення конкретної довжини ( width: initialу цьому випадку дорівнює width: auto..., але насправді будь-яке значення менше розміру, визначеного @pageправилом викликає те саме питання).

Таким чином, не тільки вміст тепер занадто довгий для сторінки (приблизно 2cm), але й накладення сторінок буде трохи більше, ніж початкове 2cmтощо. Це здається, що вміст виводиться width: autoна ширину, ~196mmа потім масштабує весь вміст до ширини 210mm~, але, як не дивно, точно такий же коефіцієнт масштабування застосовується до вмісту з будь-якою шириною менше 210mm).

Щоб вирішити цю проблему, ви можете просто в printмедіа-праві призначити ширину та висоту паперу формату А4 html, bodyбезпосередньо та безпосередньо, .pageі в цьому випадку уникнути initialключового слова.

DEMO

@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. Я вважаю, що ОП 256mmтрохи закруглені вгору по висоті паперу формату A4 без прокладки сторінки: 297mm - 2*20mm... можливо, це 257mmбуло б трохи очевидніше ;-) І в моєму попередньому прикладі 237mmприпадало на ~2cm"занадто довгий" вміст ..., але лише поверхнево проблема. Дивіться мою оновлену відповідь вище щодо фактичного рішення.
Мартін Туряк

10
Ей, @MartinTurjak, я переробив твою загадку до версії американського листа, на випадок, коли хтось зацікавився. jsfiddle.net/2wk6Q/2957 Привіт !
Бен

У мене є 4 поля для друку сторінки, як розділити рівний розмір усіх полів .. який розмір сторінки для друку в pxl
Вікрам

2
@Brad: не працював для мене. Все ще створюється порожня сторінка між кожною сторінкою.
Себастьян Фархем

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>

DEMO



2
Здається, працює. Але box-shadow: 0;не працює (принаймні, в Chrome), це повинно бути box-shadow: none;. Дві декларації маржі також можуть бути об'єднані margin: 0 auto 0.5cm;.
mts knn

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.