vue使用Print.js打印页面样式不出现的解决

目录
  • vue Print.js打印页面样式不出现
    • 解决方案
  • vue-print-nb打印问题总结
    • 1、表格的列缺失(element-ui table组件)
    • 2、打印内容缺失(print.js/print-js独有,固定高度导致)
    • 4、不能分页

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" style="display:none;">
        <el-table :data="formList" style="width: 100%" border  width="100%">
            <el-table-column align="center"  width="200" prop="prop"  label="列名"></el-table-column>
            <el-table-column label="是否启用" width="100">
                <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="是否必填" width="100">
                <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" width="150"  label="排序"></el-table-column>
            <el-table-column label="操作"  align="center"  width="200">
                <template slot-scope="scope">
                    <span v-if="scope.row.sort!=0" class="editrow" @click="up(scope.row)" style="margin-right:10px">上升</span>
                    <span v-if="scope.row.sort!=formList.length-1" class="editrow" style="margin-right:10px" @click="down(scope.row)">下降</span>
                    <span v-if="scope.row.sort!=0" class="editrow" @click="upToZero(scope.row)" style="margin-right:10px">置顶</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 style="page-break-after: always;">我是本页的末尾哦</div>

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

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

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

(0)

相关推荐

  • JS实现页面打印功能

    打印整个页面 示例1. 可直接在按钮添加调用打印方法: <input type='button' value='打印整页' onclick='javascript:window.print();' /> 示例2. 也可调用JS方法 <html> <head> <script type="text/javascript"> function printpage() { window.print() } </script> <

  • Vue中使用Printjs插件实现打印功能

    目录 前言 一.Print.js介绍 二.安装/引入 方法1.下载print.js 方法2.使用npm安装print插件 三.使用-“html”类型 四.其他Type示例 总结 前言 客户需求: 表单支持在线打印实现思路: 百度…百度…百度之后,printjs 这款插件比较满足需求,无需下载,无需写打印模板,并且兼容Element-ui中el-form表单的打印. 一.Print.js介绍 Print.js官网 Print.js 主要是为了帮助我们直接在我们的应用程序中打印 PDF 文件,无需离

  • vue 使用print-js 打印渲染不出来问题

    目录 使用print-js 打印渲染不出来 vue中printjs使用指南 使用攻略 参数 使用print-js 打印渲染不出来 vue 使用print-js  打印渲染不出来, 实际数据已经加载出来了. 遇到这问题,解决方向 1.是否是数据未赋值上 2.打印加载js是否渲染上 所以:在vue中可以使用id的形式和ref的形式进行绑定,如果id绑定渲染不成功的话可以尝试 <div id="printDiv"  ref="printDiv"/> this.

  • JavaScript图片打印方案实例详解

    最近有个页面打印图片的小需求.就是系统界面展示有一些证件照片,我们希望可以点击图片旁边的打印小按钮,就可以将这张图片直接打印到A4纸张上,例如下图效果: 其实浏览器 window 对象提供了 print 方法,就可以对整个页面进行打印.只需要点击按钮执行以下方法即可. window.print() 调用此方法,会打印出整个 html 里的内容,即 document 对象下所有的页面节点.而我们需要的是只打印页面的某个元素部分,即只打印图片. 很遗憾,浏览器在 具体的dom 节点上并没有部署 pr

  • js实现简单的打印表格

    本文实例为大家分享了js实现打印表格的具体代码,供大家参考,具体内容如下 效果如下: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>打印表格</title> </head> <body> <script> var data=[ {id:1001,icon:

  • vue print.js打印支持Echarts图表操作

    网上找的print.js做了修改,支持Echarts图表这里记录一下,不知道是哪家的代码了,我看都一样 这里是看到了两个源码 https://github.com/xyl66/vuePlugs_printjs/blob/master/print.js https://github.com/denghao123/Print.js 以下是我修改过的 print.js // 打印类属性.方法定义 /* eslint-disable */ const Print = function (dom, opt

  • vue 返回上一页,页面样式错乱的解决

    vue项目,返回上一个,页面样式错乱,就是页面之间的样式干扰了,虽然vue 是单页面开发,但是如果不注意样式并不是说写在哪个页面上就是哪个页面的样式,想要页面样式不冲突,一定要在最外面添加class或者id用来区分 以上这篇vue 返回上一页,页面样式错乱的解决就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • vue 中使用print.js导出pdf操作

    1.print.js // 打印类属性.方法定义 /* eslint-disable */ const Print = function (dom, options) { if (!(this instanceof Print)) return new Print(dom, options); this.options = this.extend({ 'noPrint': '.no-print' }, options); if ((typeof dom) === "string") {

  • vue引入elementUi后打开页面报错Uncaught TypeError的解决方式

    vue引入elementUi后打开页面报错 本人在用idea创建vue项目并引入elemenUi之后网页报错:Uncaught TypeError: Cannot read properties of undefined(reading ‘prototype’). 百度了很多办法都说是因为在vue3中引入了elementUi,vue3.0之后是不支持elementUi的,要使用element plus,但是因为我想用若依偷懒,所以必须得用elementUi,很多文章说是vue - V命令查看vu

  • js调用iframe实现打印页面内容的方法

    1.程序说明 1) 此程序可以实现选择页面中的区域进行打印,以iframe方式进行打印:2) 与原生态的print() 区别在于,取消打印页面后可以完整保留当前访问页面的内容. 2.代码部分 1) JS 函数: 复制代码 代码如下: function do_print(id_str)//id-str 打印区域的id{var el = document.getElementById(id_str);var iframe = document.createElement('IFRAME');var

  • JS实现页面打印(整体、局部)

    我们在网页开发过程中经常会有打印页面的需求,通过JS来实现的方法有很多,这里我做了一个整理,供大家参考. 方式一:window.print() 整体打印 <a href="javascrīpt:window.print()" rel="external nofollow" target="_self">打印</a> 现在就轻松实现了页面的打印,但是这种方式会将整个页面打印,如果想要实现指定区域的打印需要通过下面的设置 局部

  • 关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案

    关于Lodop打印是个很牛逼的打印插件,但是打印Bootstrap的样式的时候很恶心 比如:页面是这样 打印之后的效果恶心的不要不要的 单独修改后的样式 出现这样的问题就是可能是bs把这个插件当做手机显示了,也可能是这样插件对bs集成不行 lodop对常规html+css还是不错的,下面丢上bs版的代码 控件对应html+js使用代码 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind=&qu

  • vue+element实现打印页面功能

    项目中遇到了要打印页面的功能,我感觉我这个方法不太好,欢迎各位来改善指导 使用print插件  https://github.com/xyl66/vuePlugs_printjs 1.在min.js中引入 2.import Print from '@/plugs/print' 3.Vue.use(Print) // 注册 <template> <section ref="print"> <要打印内容/> <div class="no-

  • 利用vue实现打印页面的几种方法总结

    目录 1.第一种就是直接调用 window.print()方法 2.第二种使用v-print 3.第三种使用print.js 总结 1.第一种就是直接调用 window.print()方法 这种方法的坏处就是 默认打印整个页面,不能打印局部页面. 2.第二种使用v-print 首先先下载 npm install vue-print-nb --save 然后在main.js中引入 main.js中引入 import Print from 'vue-print-nb' Vue.user(Print)

  • 使用vue.js在页面内组件监听scroll事件的方法

    思路:scroll在哪儿个组件内,就在获取那个dom元素.网上好多思路是 window.addEventListener("scroll", function(){ console.log('scrolling'); }); 这是监听不到的!如果你整个网页可以滑动,或许还可以试试! 对于像我这样,只在页面的内的一个div内要监听的. 实现代码如下: 第一步:滑动的组件外层的div加 ref="viewBox" 为了通过$refs获取dom元素 <!--设备列表

随机推荐