首页IT科技vue打印功能实现(vue使用Print.js打印页面样式不出现的解决)

vue打印功能实现(vue使用Print.js打印页面样式不出现的解决)

时间2025-04-30 20:21:58分类IT科技浏览4437
导读:vue Print.js打印页面样式不出现 解决方案...

vue Print.js打印页面样式不出现

解决方案

加上这句就好了!完美!

vue-print-nb打印问题总结

1            、表格的列缺失(element-ui table组件)

原因:table-layout: fixed导致的            ,出现部分列没有被打印

让表table布局更加符合预期                    ,普通使用table时       ,其table-layout 默认值是 auto            ,导致表格第二行和第一行不一样宽                   ,也就是两行的宽度不对齐            。而使用:

table { table-layout: fixed; }

则会让表的布局以第一行为准       ,设置表格的宽度      ,然后其他行的表格宽度就按照第一行为准                    。一般表格第一行是表头标题                   ,第二行以后是数据行             ,也就是让数据行的每列宽度向第一行列宽度看齐       。

这种样式的表格布局在性能上也快得多      ,这是因为整个表格的内容不需要花费进行分析                   ,以便知道列的宽度            。

解决方法:

<style lang="less" scoped>     /deep/ table{         table-layout: auto !important;     }     /deep/ .el-table__header-wrapper .el-table__header{         width: 100% !important;     }     /deep/ .el-table__body-wrapper .el-table__body{         width: 100% !important;     } </style>

注意点:

/deep/ table{         table-layout: auto !important;     }

可能会造成样式错乱             ,比如你页面有table,打印弹出层的table                   ,这样修改样式有可能会导致页面表格行错位                    ,解决办法:在页面的<el-table>标签上加id,比如pagetable,修改less样式如下

<style lang="less" scoped>     /deep/ table{         table-layout: auto !important;     }     /deep/ .el-table__header-wrapper .el-table__header{         width: 100% !important;     }     /deep/ .el-table__body-wrapper .el-table__body{         width: 100% !important;     }     /deep/ #pagetable table{         table-layout: fixed !important;     } </style>

2                    、打印内容缺失(print.js/print-js独有            ,固定高度导致)

原因:一般为了好看                    ,会固定高度       ,然后超出内容出现滚动条            ,但是打印的时候                   ,只会打印固定高度的内容       ,导致打印内容缺失

解决方法:

<style scoped>     @media print {         #box{             height: 100%;         }     } </style>

或者这样:

找到print.js的getStyle方法      ,加入一行代码

str += "<style>html,body,div{height: auto !important;}</style>"; getStyle: function () {         var str = "",             styles = document.querySelectorAll(style,link);         for (var i = 0; i < styles.length; i++) {             str += styles[i].outerHTML;         }         str += "<style>" + (this.options.noPrint ? this.options.noPrint : .no-print) + "{display:none;}</style>";         str += "<style>html,body,div{height: auto !important;}</style>";           return str;     },

注意点:

1       、box是你固定高度标签的id                   ,当然你也可以换成class或者其他             ,使样式生效即可

2            、@media print只影响打印的样式      ,不会影响页面样式

3                   、表格内容缺失(表格滚动导致                   ,只打印显示区域内容)

原因:不管是print.js还是vue-print-nb插件             ,都有这个问题,因为表格滚动导致

解决方法:

用一个隐藏div包裹你要打印的表格或者还有其他内容                   ,总体包裹

<div id="boxbox">         <el-table :data="formList" border  width="100%">             <el-table-column align="center"   prop="prop"  label="列名"></el-table-column>             <el-table-column label="是否启用" >                 <template slot-scope="scope">                     <el-switch v-model="scope.row.show" :active-value="1" :inactive-value="2" active-color="#409eff" inactive-color="#B9B9B9"                     @change="changeSwitch(scope.row)"/>                 </template>             </el-table-column>             <el-table-column label="是否必填" >                 <template slot-scope="scope">                     <el-switch v-model="scope.row.required" :active-value="1" :inactive-value="2" active-color="#409eff" inactive-color="#B9B9B9"                     @change="changeSwitch(scope.row)"/>                 </template>             </el-table-column>             <el-table-column align="center"  prop="sort"  label="排序"></el-table-column>             <el-table-column label="操作"  align="center"  >                 <template slot-scope="scope">                     <span v-if="scope.row.sort!=0" class="editrow" @click="up(scope.row)">上升</span>                     <span v-if="scope.row.sort!=formList.length-1" class="editrow" @click="down(scope.row)">下降</span>                     <span v-if="scope.row.sort!=0" class="editrow" @click="upToZero(scope.row)">置顶</span>                                      </template>             </el-table-column>         </el-table>       </div>

注意点:

1       、经过测试                    ,A4纸大小宽度大致在650px,所以你隐藏的table列            ,要自己设置宽度                    ,整体宽度在750左右       ,大于750            ,列会超出                   ,不打印       ,小于750      ,右边会留有空白

2      、<el-table>不能固定高度                   ,所以不要设置高度

4                   、不能分页

原因:不管你是下载print.js保存到本地             ,还是npm下载print-js      ,只能打印一页                   ,可能太菜了

解决方法:

使用插件:vue-print-nb             ,使用方法:vue-print-nb

此插件会根据打印内容的高度,自己分页                   ,如果想自定义分页的话                    ,方法如下:

1             、在末尾的最后一个标签,加入样式 style="page-break-after: always;"

<div>我是本页的末尾哦</div>

2      、定义打印样式            ,原理同上                    ,但是方便需要       ,只需要统一定义class即可

@media print {         @page{             size:  auto;             margin: 3mm;         }         .footer {page-break-after: always;} }

以上为个人经验            ,希望能给大家一个参考                   ,也希望大家多多支持本站                   。

声明:本站所有文章       ,如无特殊说明或标注      ,均为本站原创发布       。任何个人或组织                   ,在未征得本站同意时             ,禁止复制                   、盗用             、采集、发布本站内容到任何网站                   、书籍等各类媒体平台      。如若本站内容侵犯了原著者的合法权益      ,可联系我们进行处理                   。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
小程序 自带弹框(小程序开发实战指南之封装自定义弹窗组件) windows 11 build 22000.51(Win11 Build 22000.168 (KB5005191) 预览版发布(附更新内容汇总+安装))