本文详细介绍如何利用 window.print() 实现前端网页打印功能。内容涵盖基础调用流程、打印样式表的配置方法(包括 media 属性、媒介查询及 @import)、指定区域打印的实现逻辑,以及分页控制、布局设置和页眉页脚去除等高级技巧,并提供完整的代码示例供参考。
前言
在前端开发场景中,常需赋予用户将网页特定区域输出为纸质文档的能力。
尽管浏览器内置打印预览功能,但借助 JavaScript 的 window.print() 接口可更精细地管控打印内容与样式表现。
下文由洲洲详解 window.print() 的具体应用方式,并附代码实例。
一、打印基础知识
实施前需明确基础打印流程:
1、用户发起打印动作,例如通过按钮点击事件触发。
2、JavaScript 监听该事件并执行 window.print()。
3、浏览器弹出打印预览界面,用户可配置参数后执行打印。
print() 函数负责输出当前窗口内容。
执行 print() 会唤起打印预览对话框,允许用户配置打印请求。
最简方案为直接调用 window.print(),此外 document.execCommand(‘print’) 亦可达成相同目的。
默认状态下,打印范围覆盖 body 内的全部元素。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>打印-洲洲</title>
</head>
<body>
<input type="button" value="打印此页面" onclick="printpage()" />
<div>内容</div>
<script>
function printpage() {
window.print()
}
</script>
</body>
</html>
若采用上述代码进行简单测试:

然而直接调用 print() 存在局限,即预先设定的布局与样式无法生效,故需探讨优化打印体验的策略。
二、打印控制
2.1 使用打印样式表
构建独立的打印样式表 print.css 并引入 HTML,在标签中设置 media=“print” 以标识仅打印机生效的样式,从而在打印时自动应用该样式表。
<link href="/path/print.css" rel="external nofollow" media="print" rel="stylesheet" />
2.2 使用媒介查询
当需调整的样式较少时,无需单独编写样式表,利用媒介查询即可实现同等效果,例如:
@media print {
h1 {
font-size: 20px;
color: red;
}
}
2.3 内联样式使用media属性
<style type="text/css" media="print">
// 打印样式
</style>
2.4 css中使用@import引入打印样式表
@import url("/path/print.css") print;
2.5 打印指定区域
在待打印正文的 HTML 起始与结束位置添加标识符,截取两标识间的内容替换 body 内容后调用 print()。
<body>
<input type="button" value="打印此页面" onclick="printpage()" />
<!--startprint-->
<div id="printContent">打印内容</div>
<!--endprint-->
<script>
function printpage() {
let oldStr = window.document.body.innerHTML; // 获取body的内容
let start = "<!--startprint-->"; // 开始打印标识, 17个字符
let end = "<!--endprint-->"; // 结束打印标识
let newStr = oldStr.substr(oldStr.indexOf(start) + 17); // 截取开始打印标识之后的内容
newStr = newStr.substring(0, newStr.indexOf(end)); // 截取开始打印标识和结束打印标识之间的内容
window.document.body.innerHTML = newStr; // 把需要打印的指定内容赋给body
window.print(); // 调用浏览器的打印功能打印指定区域
window.document.body.innerHTML = oldStr; // body替换为原来的内容
}
</script>
</body>
亦可将待打印内容包裹于大型 div 中,打印时将 body 内容替换为该 div 内容,随后调用 print()。
<body>
<input type="button" value="打印此页面" onclick="printpage()" />
<div id="printContent">打印内容</div>
<script>
function printpage() {
let newstr = document.getElementById("printContent").innerHTML;
let oldstr = document.body.innerHTML;
document.body.innerHTML = newstr;
window.print();
document.body.innerHTML = oldstr;
return false;
}
</script>
</body>
此外,可在打印前利用 JavaScript 隐藏无需打印的元素。
function printContent() {
// 隐藏不需要打印的元素
document.body.style.display = 'none';
// 调用打印
window.print();
// 打印完成后恢复显示
window.onfocus = function() {
document.body.style.display = '';
window.onfocus = null; // 清除事件监听
};
}
2.6 插入分页
/* 在h1元素前始终插入分页符 */
@media print {
h1 {page-break-before: always;}
}
/* 在 .footer 元素后始终插入分页符 */
@media print {
.footer {page-break-after: always;}
}
/* 避免在 <pre> 与 <blockquote> 元素中插入分页符 */
@media print {
pre, blockquote {page-break-inside: avoid;}
}
2.7 设置打印布局
@media print {
@page {
/* 纵向 */
size: portrait;
/* 横向 */
size: landscape;
/* 边距 上右下左 */
margin: 1cm 2cm 1cm 2cm;
}
}
2.8 去除页眉页脚
若页眉默认包含页眉页脚信息且超出页面外边距,可通过移除 page 模型的外边距防止内容溢出,并设置 body 的 margin 以确保 A4 打印页面保留外边距。
@media print {
@page {
margin: 0;
}
body {
margin: 1cm;
}
}
三、示例代码打印方法
于 utils 目录下创建 print.js 文件:
export default function printHtml(html) {
let style = getStyle();
let container = getContainer(html);
document.body.appendChild(style);
document.body.appendChild(container);
getLoadPromise(container).then(() => {
window.print();
document.body.removeChild(style);
document.body.removeChild(container);
});
}
// 设置打印样式
function getStyle() {
let styleContent = `#print-container {
display: none;
}
@media print {
body > :not(.print-container) {
display: none;
}
html,
body {
display: block !important;
}
#print-container {
display: block;
}
}`;
let style = document.createElement("style");
style.innerHTML = styleContent;
return style;
}
// 清空打印内容
function cleanPrint() {
let div = document.getElementById('print-container')
if (!!div) {
document.querySelector('body').removeChild(div)
}
}
// 新建DOM,将需要打印的内容填充到DOM
function getContainer(html) {
cleanPrint()
let container = document.createElement("div");
container.setAttribute("id", "print-container");
container.innerHTML = html;
return container;
}
// 图片完全加载后再调用打印方法
function getLoadPromise(dom) {
let imgs = dom.querySelectorAll("img");
imgs = [].slice.call(imgs);
if (imgs.length === 0) {
return Promise.resolve();
}
let finishedCount = 0;
return new Promise(resolve => {
function check() {
finishedCount++;
if (finishedCount === imgs.length) {
resolve();
}
}
imgs.forEach(img => {
img.addEventListener("load", check);
img.addEventListener("error", check);
})
});
}
引入 print 模块,传入目标 DOM 元素即可:
import printHtml from "@/utils/print.js"
export default {
methods: {
print() {
let printData = `<div>打印内容</div>`
printHtml(printData)
}
},
}
总结
至此,关于利用 window.print() 在前端实现网页打印的教程结束,更多相关 window.print() 前端网页打印内容请检索本站历史文章或浏览后续相关文章,期望大家今后继续支持本站!