CSS per impostare il formato carta A4


233

Ho bisogno di simulare un foglio A4 nel web e consentire di stampare questa pagina come viene mostrata sul browser (Chrome, in particolare). Ho impostato le dimensioni dell'elemento su 21 cm x 29,7 cm, ma quando invio per stampare (o stampare l'anteprima), ritagli la mia pagina.

Guarda questo esempio dal vivo !

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>

Penso di dimenticare qualcosa. Ma quale sarebbe?

  • Chrome : pagina di ritaglio, doppia pagina ( è proprio quello di cui ho bisogno per funzionare )
  • Firefox : funziona perfettamente.
  • IE10 : che ci crediate o no, è perfetto!
  • Opera : molto buggy sull'anteprima di stampa

11
Grazie per il modello, è fantastico.
Vektor,

1
La risposta corretta è qui: stackoverflow.com/a/34018790/293856
UNom


Risposte:


241

Ho esaminato un po 'di più questo e il vero problema sembra essere con l'assegnazione initialalla pagina widthsotto la printregola dei media. Sembra che in Chrome width: initialsui .pagerisultati degli elementi in scala del contenuto della pagina se nessun valore di lunghezza specifica è definito per widthuno qualsiasi dei elementi padre ( width: initialin questo caso si risolve a width: auto... ma in realtà qualsiasi valore più piccole rispetto alla dimensione definita sotto il @pagedominio causa lo stesso problema).

Quindi non solo il contenuto è ora troppo lungo per la pagina (di circa 2cm), ma anche il riempimento della pagina sarà leggermente più dell'iniziale 2cme così via (sembra rendere il contenuto width: autoalla larghezza di ~196mme quindi ridimensionare l'intero contenuto fino alla larghezza di 210mm~ ma stranamente esattamente lo stesso fattore di ridimensionamento viene applicato ai contenuti con qualsiasi larghezza inferiore a 210mm).

Per risolvere questo problema, è possibile semplicemente nella printregola dei supporti assegnare la larghezza della carta A4 e aumentare html, bodyo direttamente a .pagee in questo caso evitare la initialparola chiave.

DEMO

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

Questo sembra mantenere tutto il resto com'è nel CSS originale e risolvere il problema in Chrome (testato in diverse versioni di Chrome in Windows, OS X e Ubuntu).


Come sei arrivato al 256mm(e quindi 237mm, eventualmente) per l' .subpageelemento?
Caw,

@MarcoW. Credo che l'OP 256mmsia leggermente arrotondato all'altezza della carta A4 senza l'imbottitura della pagina: 297mm - 2*20mm... forse 257mmsarebbe un po 'più ovvio ;-) E nel mio esempio precedente il 237mmconto ha rappresentato il contenuto ~2cm"troppo lungo" ... ma risolto solo superficialmente il problema. Vedi la mia risposta aggiornata sopra per la soluzione effettiva.
Martin Turjak,

10
Ehi @MartinTurjak, ho modificato il tuo violino in una versione Letter USA, nel caso qualcuno fosse interessato. jsfiddle.net/2wk6Q/2957 Cheers!
Ben

Sto stampando 4 campi per stampare una pagina su come partizionare le stesse dimensioni di tutti i campi .. qual è la dimensione della pagina di stampa in pxl
Vikram

2
@Brad: non ha funzionato per me. Crea ancora una pagina vuota tra ogni pagina.
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>

DEMO



2
Sembra funzionare. Ma box-shadow: 0;non funziona (almeno in Chrome), dovrebbe essere box-shadow: none;. Le due dichiarazioni di margine possono anche essere combinate in margin: 0 auto 0.5cm;.
martedì

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.