在Web开发中,打印功能是一个常见但容易被忽视的需求。传统的打印方式往往会导致页面布局混乱、样式丢失等问题。这个Vue2打印模板提供了一套完整的解决方案,特别适合处理表格类数据的打印需求。
这个模板的核心在于实现了三个关键功能点:
print-container类将打印内容与页面其他元素隔离,确保打印时只输出指定区域@media print媒体查询专门针对打印场景优化样式提示:这种设计模式特别适合需要打印表单、合同、报表等场景,避免了传统打印方式常见的样式错乱问题。
选择Vue2作为实现框架有几个明显优势:
javascript复制// 数据响应式示例
data() {
return {
formData: {
name: '', // 自动同步到打印内容
department: '',
// 其他字段...
}
}
}
模板采用语义化的HTML结构,主要分为三个部分:
<table>展示核心信息<div class="notes">展示补充信息<div class="confirm-sign>用于签字确认html复制<div class="print-container" id="print-content">
<table class="print-table">
<!-- 表格内容 -->
</table>
<div class="notes">
<!-- 备注内容 -->
</div>
<div class="confirm-sign">
<!-- 签字区域 -->
</div>
</div>
样式设计上特别注意了打印适配:
width: 210mm匹配A4纸标准宽度@media print消除页边距css复制.print-container {
width: 210mm; /* A4标准宽度 */
margin: 0 auto;
}
@media print {
body {
margin: 0; /* 消除打印边距 */
}
}
.print-table {
border-collapse: collapse; /* 表格边框合并 */
}
handlePrint方法实现了打印的核心逻辑:
javascript复制handlePrint() {
const printContent = document.getElementById('print-content').innerHTML
const oldContent = document.body.innerHTML
document.body.innerHTML = printContent
window.print()
document.body.innerHTML = oldContent
window.location.reload()
}
在实际使用中发现几个优化点:
onafterprint事件javascript复制// 改进后的打印方法
handlePrint() {
this.isPrinting = true // 加载状态
const scrollTop = document.documentElement.scrollTop
const printContent = document.getElementById('print-content').innerHTML
const oldContent = document.body.innerHTML
document.body.innerHTML = printContent
window.print()
window.onafterprint = () => {
document.body.innerHTML = oldContent
document.documentElement.scrollTop = scrollTop
this.isPrinting = false
}
}
在实际项目中,数据通常来自API接口而非硬编码:
javascript复制export default {
data() {
return {
formData: {
name: '',
department: '',
// 其他字段初始为空
}
}
},
async created() {
const res = await axios.get('/api/print-data')
this.formData = res.data
}
}
可以通过props实现多模板支持:
javascript复制props: {
templateType: {
type: String,
default: 'resignation' // 默认离职模板
}
},
computed: {
templateComponent() {
return () => import(`./templates/${this.templateType}.vue`)
}
}
问题现象:打印时样式丢失或不符合预期
排查步骤:
@media print是否正确定义解决方案:
css复制@media print {
* {
-webkit-print-color-adjust: exact !important;
print-color-adjust: exact !important;
}
}
问题现象:表格被意外分页截断
解决方案:
css复制.print-table {
page-break-inside: avoid; /* 避免表格内部分页 */
}
.print-table tr {
page-break-inside: avoid;
}
不同浏览器对打印的支持有差异:
| 浏览器 | 支持情况 | 解决方案 |
|---|---|---|
| Chrome | 优秀 | 无需特殊处理 |
| Firefox | 良好 | 需要测试分页 |
| Edge | 良好 | 注意字体渲染 |
| Safari | 一般 | 需要测试样式 |
通过CSS伪元素实现:
css复制@page {
@top-left {
content: "公司名称";
font-size: 10pt;
}
@bottom-right {
content: "第" counter(page) "页";
font-size: 10pt;
}
}
结合打印功能实现PDF导出:
javascript复制exportToPDF() {
this.handlePrint() // 先触发打印
setTimeout(() => {
window.printToPDF() // 需要浏览器支持或PDF库
}, 1000)
}
针对不同尺寸纸张优化:
css复制@media print and (max-width: 150mm) {
.print-container {
width: 148mm; /* A5宽度 */
font-size: 12px;
}
}
在实际项目中,我发现这套模板最实用的地方在于它的可扩展性。通过简单的修改,可以适配各种表格打印需求,从离职证明到合同协议都能很好支持。特别是在需要批量处理的场景下,结合Vue的循环渲染可以极大提高开发效率。