CSS, чтобы установить размер бумаги A4

233

Мне нужно смоделировать бумагу формата А4 в Интернете и разрешить распечатывать эту страницу так, как она отображается в браузере (в частности, Chrome). Я установил размер элемента на 21 см х 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
1
Возможный обман: stackoverflow.com/questions/3341485/…
Марк Боулдер
сообщение об ошибке об этом
Евгений Коньков

Ответы:

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. Я полагаю, что OP 256mmслегка округлен до высоты бумаги формата А4 без отступов: 297mm - 2*20mm... возможно, 257mmэто было бы немного более очевидно ;-) И в моем предыдущем примере 237mmучитывалось ~2cm"слишком длинное" содержимое ... но только поверхностно решенное эта проблема. См. Мой обновленный ответ выше для фактического решения.
Мартин Турджак,
10
Привет @MartinTurjak, я настроил твою скрипку на версию US Letter, на случай, если кому-то будет интересно. 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

MaxEcho
источник
2
примечание: <page>недопустимое имя пользовательского элемента HTML
Мартин Шнайдер,
2
Кажется, работает. Но box-shadow: 0;не работает (по крайней мере, в Chrome), так и должно быть box-shadow: none;. Две декларации полей также могут быть объединены в margin: 0 auto 0.5cm;.
МТС КНН
28

https://github.com/cognitom/paper-css, кажется, решает все мои потребности.

Бумага CSS для счастливой печати

Фронтальное решение для печати - предварительный просмотр и возможность повторной загрузки!

Марк Боулдер
источник