近期在做一个需要局部打印页面考试成绩的功能,总体来说有两个思路:
-
dom替换
-
新窗口打印
dom替换会导致事件失效,如果重新加载的话又会影响到体验;而新窗口缺因为样式问题也不好解决,都不满足项目的需求,于是把自己的方法贴上来:
<template>
<div id="printcontent"> //给需要打印的区域一个id
<div @click="report">打印考试结果</div>
</div>
</template>
<script>
export default {
methods: {
report(){
let printDiv = document.createElement('div')//创建一个新的div
printDiv.innerHTML = document.getElementById("printcontent").innerHTML//把要打印的内容放到一个新的div里
printDiv.style.position = 'fixed'//div宽高设置100%;position设为fixed或者absolute占满屏幕,把当前页面内容全部覆盖住
printDiv.style.left = '0'
printDiv.style.top = '0'
printDiv.style.width = '100%'
printDiv.style.height = '100%'
printDiv.style.zIndex = '100000'
printDiv.style.background = '#fff'
printDiv.style.overflow = 'auto'
document.body.appendChild(printDiv)//在body中添加创建的新结点
window.print()
document.body.removeChild(printDiv)//打印成功后删除创建的这个节点
}
}
}
</script>
<style lang="stylus" scoped>
@page { //css @page 设置 纸张方向
size: a4 //定义为a4纸
margin: 0mm 0mm //页面的边距,主要是用来去掉页眉页脚的
}
</style>
代码很简单,把要打印的内容放到一个新的div里,div宽高设置100%;position设为fixed或者absolute占满屏幕,把当前页面内容全部覆盖住,调用window.print()之后再把该div删除。这样既会使本来的样式生效,也不会有替换dom产生的各种问题。