A4 kağıt boyutunu ayarlamak için CSS


233

Web'de bir A4 kağıdı simüle etmem ve bu sayfayı tarayıcıda gösterildiği gibi yazdırmaya izin vermem gerekiyor (özellikle Chrome). Öğe boyutunu 21cm x 29.7cm olarak ayarladım, ancak yazdırmak (veya baskı önizleme) için gönderdiğimde sayfamı kırpıyor.

Bu Canlı örneğe bakın !

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>

Sanırım bir şey unutuyorum. Ama ne olurdu?

  • Chrome : kırpma sayfası, çift sayfa ( çalışmak için ihtiyacım olan şey bu )
  • Firefox : mükemmel çalışıyor.
  • IE10 : ister inan ister inanma, mükemmel!
  • Opera : baskı önizlemesinde çok adamcağız

11
Şablon için teşekkürler, harika.
Vektör

1
unom


Yanıtlar:


241

Bunu biraz daha inceledim ve asıl sorun medya kuralı altında initialsayfaya atama ile ilgili gibi görünüyor . Bu Chrome'da gibi görünüyor üzerinde öğesi sonuçları ölçekleme belirli uzunluk değeri için tanımlanan eğer sayfa içeriğinin (ana unsurlarının herhangi için bu durum giderir içinde altında tanımlanmış boyutundan daha doğrusu herhangi bir değer daha küçük ... amawidthprintwidth: initial.pagewidthwidth: initialwidth: auto@page kural aynı soruna neden olur).

Bu nedenle, yalnızca içerik artık sayfa için çok uzun değil (yaklaşık olarak 2cm), aynı zamanda sayfa dolgusu başlangıçtan biraz daha fazla olacak 2cmve bu şekilde devam edecek (içeriği width: autogenişliğin altına koyuyor ~196mmve ardından tüm içeriği ölçeklendiriyor gibi görünüyor) genişliğine kadar 210mmancak genişliğinden daha küçük herhangi bir içeriğe garip bir şekilde tam olarak aynı ölçeklendirme faktörü uygulanır.210mm ).

Bu sorunu gidermek için, yalnızca printmedya kuralında A4 kağıt genişliğini ve yüksekliğini atar html, bodyveya doğrudan atar .pageve bu durumda initialanahtar kelimeden kaçınabilirsiniz .

DEMO

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

Bu, diğer her şeyi orijinal CSS'nizdeki gibi tutar ve sorunu Chrome'da (Windows, OS X ve Ubuntu altındaki Chrome'un farklı sürümlerinde test edilmiştir) giderir.


Elemana nasıl 256mm(ve 237mmnihayetinde) ulaştınız .subpage?
gak

@MarcoW. Ben OP's 256mmsayfa doldurma olmadan A4 kağıt yüksekliği biraz yuvarlanır inanıyorum : 297mm - 2*20mm... belki 257mmbiraz daha açık olurdu ;-) Ve önceki 237mmörneğimde ~2cm"çok uzun" içerik için hesaplanan ... ama sadece yüzeysel olarak çözüldü sorun. Gerçek çözüm için yukarıdaki güncellenmiş cevabıma bakın.
Martin Turjak

10
Hey @MartinTurjak, herkesin ilgilenmesi durumunda kemanınızı bir ABD Mektubu sürümüne ayarladım. jsfiddle.net/2wk6Q/2957 Şerefe!
Ben

Bir sayfa yazdırırken nasıl tüm alanların eşit boyutu bölümlemek için 4 alan yaşıyorum .. pxl yazdırma sayfasının boyutu nedir
Vikram

2
@Brad: benim için çalışmadı. Yine de her sayfa arasında boş bir sayfa oluşturuluyor.
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
Çalışıyor gibi görünüyor. Ancak box-shadow: 0;çalışmıyor (en azından Chrome'da), olması gerekiyor box-shadow: none;. İki marj beyanı da birleştirilebilir margin: 0 auto 0.5cm;.
mts knn

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.