我目前正在开发一个JS / HTML应用程序,我需要打印一个HTML页面。页面的布局看起来像
<div class="customerOffer">
<div class="buttonHeader"><span class="backButton">Back</span><span class="printButton">Print</span></div>
<div class="panel">
<div class="panelTitle"><span class="text">Title</span></div>
<div class="panelBox">
<div class="column">
<div class="row"><span class="label b">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row"><span class="label b">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row"><span class="label b">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row"><span class="label b">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row"><span class="label b">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row"><span class="label b">Text</span><span class="inputValueF">£0.00</span></div>
</div>
<div class="column right">
<div class="row"><span class="label b">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row"><span class="label b">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row"><span class="label b">Text</span><span class="inputValueF">£0.00</span></div>
</div>
</div>
</div>
<div class="panel">
<div class="panelTitle"><span class="text">Title</span></div>
<div class="panelBox">
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="separator"></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row important"><span class="label b">Text</span><span class="inputValueF b">£0.00</span></div>
</div>
</div>
<div class="panel">
<div class="panelTitle"><span class="text">Title</span></div>
<div class="panelBox">
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="separator"></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row coloured"><span class="label">Text</span><span class="inputValueF">£0.00</span></div>
<div class="row important"><span class="label b">Text</span><span class="inputValueF b">£0.00</span></div>
</div>
</div>
</div>
正如您所看到的,该页面由许多&#34; Panels&#34;组成。它有一个标题栏和一些信息。为了防止网页破坏&#39;在打印时,在其中一个面板中,我将page-break-inside: avoid;
添加到此页面的@media print
标记中的这些面板中。这是此HTML页面的LESS
@import url(https://fonts.googleapis.com/css?family=Roboto);
@accent: #5280B8;
@secondary: #1e518d;
@background-blue: #4e96e7;
@panel: #FFFFFF;
//@rowOdd: #EFF2F6;
@rowOdd: lighten(@accent, 38%);
@rowEven: #FFFFFF;
@input-background: #e4e4e4;
@button-grey: #c6c7c8;
.button-template{
height: 30px;
border: 2px solid #fff;
border-radius: 5px;
font-family: Roboto;
padding: 1px 8px;
cursor: pointer;
background-color: @accent;
color: #fff;
line-height: 25px;
&:hover{
background-color: darken(@accent, 10%);
}
&:active{
background-color: darken(@accent, 20%);
}
&:focus{
outline: none;
}
}
* {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
body {
font-family: 'Roboto', sans-serif;
font-weight: 400;
margin: 0;
overflow: hidden;
width: 100%;
height: 100%;
}
.wrapper{
position: absolute;
left: 50%;
width: 1024px;
height: 768px;
transform: translate(-50%, 0);
overflow: hidden;
background-image: url(http://media.ca-a.com/MEDIA/OEM/NISSAN/GB/BG/NissanBG.png);
&:before{
width: 100%;
height: 100%;
content: ' ';
position: absolute;
background-color: @background-blue;
top: 0;
left: 0;
z-index: -1;
opacity: 0.66;
}
.customerOffer{
width: 100%;
background-color: gray;
position: absolute;
left: 200%;
top: 0px;
z-index: 1;
&:before{
width: 100%;
height: 100%;
content: ' ';
position: absolute;
background-color: @background-blue;
top: 0;
left: 0;
z-index: -1;
opacity: 0.66;
}
.buttonHeader{
margin-top: 10px;
margin-bottom: 10px;
position: relative;
.backButton{
.button-template;
left: 20px;
position: relative;
}
.printButton{
.button-template;
margin-right: 10px;
left: calc(~"89% - 20px");
position: relative;
}
}
.panel{
width: calc(~"100% - 40px");
overflow: hidden;
border-radius: 10px;
position: relative;
margin-left: 20px;
margin-right: 20px;
margin-bottom: 20px;
.panelTitle{
width: 100%;
height: 38px;
background-color: @accent;
.text{
line-height: 38px;
font-size: 18px;
font-weight: 500;
color: #fff;
position: relative;
left: 30px;
}
}
.panelBox{
height: auto;
width: 100%;
text-align: justify;
background-color: @panel;
border-radius: 0px 0px 10px 10px;
.column{
padding-right: 0px;
height: 100%;
padding-left: 0px;
width: 50%;
vertical-align: top;
display: inline-block;
margin-top: 5px;
&.right{
float: right;
}
}
.row{
margin-bottom: 8px;
&:last-child{
border-radius: 0px 0px 8px 8px;
}
&.coloured{
margin-bottom: 0px;
padding: 4px 0px 4px 0px;
&:nth-child(odd){
background-color: @rowOdd;
}
&:nth-child(even){
background-color: @rowEven;
}
.label{
width: auto;
}
.inputValueF{
float: right;
margin-right: 10px;
&.b{
font-weight: bold;
}
}
}
&.important{
margin-bottom: 0px;
padding: 4px 0px 4px 0px;
background-color: @secondary;
.label{
color: @panel;
width: auto;
}
.inputValueF{
color: @panel;
float: right;
margin-right: 10px;
&.b{
font-weight: bold;
}
}
}
.label{
vertical-align: top;
display: inline-block;
width: 100px;
margin-left: 20px;
&.b{
font-weight: bold;
}
}
.inputValueF{
display: inline-block;
}
}
.separator{
height: 2px;
background-color: #212121;
width: 98%;
margin-left: 1%;
}
}
}
}
}
@media print{
div{
page-break-inside: avoid;
}
.wrapper{
overflow: visible;
width: 210mm;
height: 100%;
background-color: transparent;
background-image: none;
//-webkit-print-color-adjust: exact;
&:before{
display: none;
}
.customerOffer{
background-color: transparent;
background-image: none;
position: initial;
overflow: visible;
&:before{
display: none;
}
.buttonHeader{
display: none;
}
.panelTitle{
//box-shadow: inset 0 0 0 1000px @accent;
border: 2px solid @accent
}
.panelBox{
border: 2px solid @accent;
.row{
&.coloured{
&:nth-child(odd){
box-shadow: inset 0 0 0 1000px @rowOdd;
}
&:nth-child(even){
box-shadow: inset 0 0 0 1000px @rowEven;
}
}
&.important{
box-shadow: inset 0 0 0 1000px @secondary;
.label{
color: @panel;
}
.inputValueF{
color: @panel;
}
}
}
}
}
}
}
但是当我在Chrome中打印它时,您可以在第一页的最底部看到一个幻影panelTitle元素。我只能使用page-break-inside: avoid;
CSS重现这一点,否则打印将在其中一个面板内部中断。
有没有人有任何想法如何删除这个幻像元素?
答案 0 :(得分:0)
事实证明,使用带有margin
指令的@page
属性时会出现此问题。
在我的CSS底部我有
@page{
size: auto; /* auto is the initial value */
/* this affects the margin in the printer settings */
margin: 5mm 0mm 5mm 0mm;
}
如果我将保证金减少到5mm 0mm 0mm 0mm
,那么问题就会消失,但这显然会产生其他问题。幸运的是,我测试过的打印机似乎不会打印(默认情况下至少)距离页面边缘5mm,因此在物理打印文档时不会出现。
答案 1 :(得分:-1)
看起来默认的页边距是不同的,并且元素之间的间距在firefox和chrome print之间也不一致。
也许使用page-break来确保新表在新页面上开始,而不是在两个页面之间拆分。