前端实现网页打印:window.print() 详解与实战技巧

作者:工具松鼠时间:2026-11-01 02:52:14浏览:432

本文详细介绍如何利用 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() 前端网页打印内容请检索本站历史文章或浏览后续相关文章,期望大家今后继续支持本站!

作者最新文章