首页 > 其他分享 >window.print 实现简单浏览器打印功能

window.print 实现简单浏览器打印功能

时间:2024-10-31 15:50:47浏览次数:5  
标签:body 浏览器 打印 window iframe print document

前言

一般信息填写类的需求页面,都会增设「预览」和「打印」功能。我们会通过编写 DOM 及样式来绘制出预览视图,而打印则是基于预览来生成 PDF 文件。

浏览器原生 API window.print() 可以用于打印当前窗口(window.document)视图内容。调用此方法会产生一个打印预览弹框,用户可以根据具体设置来得到打印结果。

接下来将从代码层面带领大家熟悉「打印」的使用。

一、打印样式

默认情况下,基于页面上的内容,会将元素,布局和样式都进行打印;

如果仅想在打印上设置特殊样式,可以通过以下方式:

1.使用打印样式表:

<link href="print.css" media="print" rel="stylesheet" />

2.使用媒介查询:

@media print {
  p{
    color: lavender;
    background: #ccc;
  }
  h1{
    color: lightblue;
    background: #ccc;
  }
}

3.使用内联 media 属性

<style media="print">
  p{
    color: lavender;
    background: #ccc;
  }
  h1{
    color: lightblue;
    background: #ccc;
  }
</style>

默认情况下,元素的背景色不会被打印,可通过设置属性来支持:

div{
  // Chrome、Safari 等 webkit 浏览器内核
  -webkit-print-color-adjust: exact;
  // 火狐
  print-color-adjust: exact;
  color-adjust: exact;
}

二、打印指定区域内容

默认情况下,调用 window.print() 会对整个 document.body 进行打印,当需要打印指定容器内容时,可以通过以下几种方式:

1.对容器内全部内容进行打印

<body>
  <div id="container">
    <p>这是一个段落</p>
    <h1>这是一个标题</h1>
  </div>
  
  <input type="button" value="打印此页面" onclick="printpage()" />

  <script>
    const printpage = () => {
      let newstr = document.getElementById("container").innerHTML;
      let oldstr = document.body.innerHTML;
      document.body.innerHTML = newstr;
      window.print();
      document.body.innerHTML = oldstr;
    }
  </script>
</body>

2.对容器内的部分内容进行打印

当只需要打印容器内某一部分内容时,可以通过注释标识进行截取。

<body>
  <div id="container">
    <!--startprint-->
    <p>这是一个段落</p>
    <!--endprint-->
    <h1>这是一个标题</h1>
  </div>
  <input type="button" value="打印此页面" onclick="printpage()" />

  <script>
    const 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>

3.监听打印事件

通过监听打印前后事件,对不需要进行打印的元素进行隐藏和放开隐藏。

<body>
  <div id="container">
    <p>这是一个段落</p>
    <h1 id="title">这是一个标题</h1>
  </div>
  
  <input type="button" value="打印此页面" onclick="printpage()" />

  <script>
    const printpage = () => {
      window.print();
    }

    window.onbeforeprint = function() {
      // 将一些不需要被打印的元素隐藏
      document.getElementById('title').style.display = 'none';
    }
    window.onafterprint = function() {
      // 放开隐藏的元素
      document.getElementById('title').style.display = 'block';
    }
  </script>
</body>

4. iframe实现打印

上面几种方式都在当前窗口进行打印,并且都需要更改 document.body 内容,这会出现视图切换,带来的体验不是太好。

下面我们借助 iframe 来实现打印,并且不影响当前视窗的内容展示。

<body>
  <div id="container">
    <p>这是一个段落</p>
    <h1 id="title">这是一个标题</h1>
  </div>
  
  <input type="button" value="打印此页面" onclick="printpage()" />

  <script>
    const printpage = () => {
      const printContent = document.querySelector('#container').innerHTML;
      const iframe = document.createElement('iframe');
      iframe.setAttribute('style', 'position: absolute; width: 0; height: 0;');
      document.body.appendChild(iframe);
      const iframeDoc = iframe.contentWindow.document;
      // 设置打印展示方式 - 横向展示
      iframeDoc.write('<style media="print">@page {size: landscape;}</style>');
      // 向 iframe 中注入 printContent 样式
      iframeDoc.write(`<link href="./print.css" media="print" rel="stylesheet" />`);
      // 写入内容
      iframeDoc.write('<div>' + printContent + '</div>');
      setTimeout(function(){
        iframe.contentWindow?.print();
        document.body.removeChild(iframe);
      }, 50);
    }
  </script>
</body>

值得注意的是,iframe 是一个新的 window 窗口,不会复用当前窗口的样式,需要为 iframe 注入打印内容所需的样式。

三、自定义分页

当需要自定义打印分页时机时,可通过如下方式将指定 DOM 设为分割点。

1.在指定元素前添加分页符

@media print {
  h1 {
    page-break-before: always;
  }
}

2.在指定元素后添加分页符

@media print {
  h1 {
    page-break-after: always;
  }
}

四、打印设置

设置打印布局

@media print {
  @page {
    /* 纵向展示(高度展示内容更多) */
    /* size: portrait;  */

    /* 横向(宽度展示内容更大) */
    size: landscape;

    /* 打印的边距 上右下左 */
    margin: 1cm 2cm 1cm 2cm;
  }
}

注意,一旦设置为 size: landscape,在打印时将不能切换展示模式,包括纸张类的设置。

标签:body,浏览器,打印,window,iframe,print,document
From: https://blog.csdn.net/qq_24956515/article/details/143403478

相关文章

  • Windows安全加固
    一、账号和口令管理账号分配compmgmt.msc>计算机管理>本地用户和组​结合要求和实际业务情况判断符合要求,根据系统的要求,设定不同的账户和账户组,管理员用户,数据库用户,审计用户,来宾用户如存在与设备运行、维护等与工作无关的账号,可进行删除或锁定重命名Administrato......
  • 了解日常开发中常用的浏览器
        嗨,我是小路。今天主要和大家分享的主题是“了解日常开发中常用的浏览器”。     今天主要介绍常用为苹果手机、安卓手机、鸿蒙手机、微信、微信开发者工具自带的浏览器名称,了解了浏览器的类型,才能更好的进行兼容性处理。1.检查属性对浏览器的支持网站:Ca......
  • Windows11系统iisetw.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个iisetw.dll文件(挑选合适的版本文件)把它放......
  • 浏览器输入URL整个响应过程
    当你在浏览器中输入一个URL时,整个过程涉及多个步骤,通常可以分为以下几个阶段:1、DNS解析:浏览器首先需要将URL中的域名(如www.example.com)转换为对应的IP地址。这个过程通过DNS(域名系统)完成。浏览器会检查本地缓存,如果没有找到,则向DNS服务器发送请求。2、建立TCP连接:一旦获......
  • Adobe Animate 2025 v25.0 (macOS, Windows) - 动画制作
    AdobeAnimate2025v25.0(macOS,Windows)-动画制作Acrobat、AfterEffects、Animate、Audition、Bridge、CharacterAnimator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、LightroomClassic、MediaEncoder、Photoshop、PremierePro、AdobeXD请访问原文链......
  • Adobe After Effects 2025 v25.0 (macOS, Windows) - 后期特效
    AdobeAfterEffects2025v25.0(macOS,Windows)-后期特效Acrobat、AfterEffects、Animate、Audition、Bridge、CharacterAnimator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、LightroomClassic、MediaEncoder、Photoshop、PremierePro、AdobeXD请访问......
  • Adobe Illustrator 2025 v29.0 (macOS, Windows) - 矢量绘图
    AdobeIllustrator2025v29.0(macOS,Windows)-矢量绘图Acrobat、AfterEffects、Animate、Audition、Bridge、CharacterAnimator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、LightroomClassic、MediaEncoder、Photoshop、PremierePro、AdobeXD请访问原......
  • Adobe Character Animator 2025 v25.0 (macOS, Windows) - 动作捕获动画软件
    AdobeCharacterAnimator2025v25.0(macOS,Windows)-动作捕获动画软件Acrobat、AfterEffects、Animate、Audition、Bridge、CharacterAnimator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、LightroomClassic、MediaEncoder、Photoshop、PremierePro、Ad......
  • Adobe Bridge 2025 v15.0 (macOS, Windows) - 集中管理创意资源
    AdobeBridge2025v15.0(macOS,Windows)-集中管理创意资源Acrobat、AfterEffects、Animate、Audition、Bridge、CharacterAnimator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、LightroomClassic、MediaEncoder、Photoshop、PremierePro、AdobeXD请访......
  • Adobe Audition 2025 v25.0 (macOS, Windows) - 音频录制和编辑软件
    AdobeAudition2025v25.0(macOS,Windows)-音频录制和编辑软件Acrobat、AfterEffects、Animate、Audition、Bridge、CharacterAnimator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、LightroomClassic、MediaEncoder、Photoshop、PremierePro、AdobeXD......