您的当前位置:首页正文

JS利用window.print()实现网页打印功能

来源:步旅网
JS利⽤window.print()实现⽹页打印功能

⽬录

前⾔

⼀、print()⽅法⼆、打印样式

1.使⽤打印样式表2.使⽤媒介查询3.内联样式使⽤media属性4.在css中使⽤@import引⼊打印样式表三、打印指定区域部分内容

1.⽅法⼀2.⽅法⼆3.⽅法三四、强制插⼊分页

五、设置打印布局(横向、纵向、边距)六、去除浏览器默认页眉页脚七、打印⽅法封装前⾔

print作为浏览已经⽐较成熟的技术可以经常被⽤来打印页⾯的部分内容,我们可以在MDN上查看到相关的简单介绍。

⼀、print()⽅法

print() ⽅法⽤于打印当前窗⼝的内容。调⽤ print() ⽅法会产⽣⼀个打印预览弹框,让⽤户可以设置打印请求。最简单的打印就是直接调⽤window.print(),当然⽤ document.execCommand('print') 也可以达到同样的效果。默认打印页⾯中body⾥的所有内容。

printDemo

内容

⼆、打印样式

直接调⽤print()⽅法去打印⽹页内容,我们会发现,事先调整好的布局和样式都没法实现,那么有哪些⽅法可以帮助我们改善打印的⽤户体验呢?

1.使⽤打印样式表

配置⼀份打印样式表print.css,引⼊到HTML⽂档,在 上加上⼀个 media=\"print\" 来标识这是打印机才会应⽤的样式表,这样打印的时候,就会默认将该样式表应⽤到⽂档中

2.使⽤媒介查询

当我们要修改的样式没有很多的时候,其实完全不需要重新写个样式表,只要写上⼀个媒介查询也可以达到同样的效果,如:

@media print { h1 {

font-size: 20px; color: red; }}

3.内联样式使⽤media属性

4.在css中使⽤@import引⼊打印样式表

@import url(\"/path/print.css\") print;

三、打印指定区域部分内容

1.⽅法⼀

在需要打印的正⽂内容所对应的html开始处加上 标识,结尾处加上 标识,截取打印标识之间的内容替换body的内容,调⽤打印print()⽅法。

打印内容

2.⽅法⼆

将需要打印的内容⽤⼀个⼤的div包裹,打印时将body的内容替换为该div的内容,调⽤打印print()⽅法。

打印内容

3.⽅法三

有两个事件可以监听到到打印事件,⼀个是onbeforeprint(),⼀个是onafterprint(),分别表⽰打印事件触发前后。

检测打印请求,提供⼀个打印前的处理事件onbeforeprint() 将⼀些不需要打印的元素隐藏,和打印后的处理事件 onafterprint()

放开隐藏的元素

window.onbeforeprint = function(event) { //将⼀些不需要打印的元素隐藏 };

window.onafterprint = function(event) { //放开隐藏的元素 };

四、强制插⼊分页

1.page-break-before(指定元素前添加分页符)值auto

描述

默认值。如果必要则在元素前插⼊分页符。

always在元素前插⼊分页符。avoid避免在元素前插⼊分页符。leftright

在元素之前⾜够的分页符,⼀直到⼀张空⽩的左页为⽌。在元素之前⾜够的分页符,⼀直到⼀张空⽩的右页为⽌。

inherit规定应该从⽗元素继承 page-break-before 属性的设置。

/* 在h1元素前始终插⼊分页符 */@media print {

h1 {page-break-before: always;}}

2.page-break-after(指定元素后添加分页符)值auto

描述

默认值。如果必要则在元素后插⼊分页符。

always在元素后插⼊分页符。avoid避免在元素后插⼊分页符。leftright

在元素之后⾜够的分页符,⼀直到⼀张空⽩的左页为⽌。在元素之后⾜够的分页符,⼀直到⼀张空⽩的右页为⽌。

inherit规定应该从⽗元素继承 page-break-after 属性的设置。

/* 在 .footer 元素后始终插⼊分页符 */@media print {

.footer {page-break-after: always;}}

3.page-break-inside(⽤于设置是否在指定元素中插⼊分页符)值auto

描述

默认。如果必要则在元素内部插⼊分页符。

avoid 避免在元素内部插⼊分页符。

inherit 规定应该从⽗元素继承 page-break-inside 属性的设置。

/* 避免在

元素中插⼊分页符 */@media print {

pre, blockquote {page-break-inside: avoid;}}

4.注意

不能对绝对定位的元素使⽤以上三种分页属性。

请尽可能少地使⽤分页属性,并且避免在表格、浮动元素、带有边框的块元素中使⽤分页属性。

五、设置打印布局(横向、纵向、边距)

@media print { @page { /* 纵向 */

size: portrait;

/* 横向 */

size: landscape;

/* 边距 上右下左 */

margin: 1cm 2cm 1cm 2cm; } }

六、去除浏览器默认页眉页脚

页眉打印默认有页眉页脚信息,展现到页⾯外边距范围,我们可以通过去除页⾯模型page的外边距,使得内容不会延伸到页⾯的边缘,再通过设置 body 元素的 margin 来保证 A4 纸打印出来的页⾯带有外边距

@media print { @page { margin: 0; }

body {

margin: 1cm; }}

七、打印⽅法封装

1.封装:在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,将需要打印的内容填充到DOMfunction getContainer(html) { cleanPrint()

let container = document.createElement(\"div\"); container.setAttribute(\"id\ 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\ img.addEventListener(\"error\ }) });}

2.使⽤: 引⼊print⽂件,传⼊需要打印的DOM元素

import printHtml from \"@/utils/print.js\"

export default { methods: { print() {

let printData = `

打印内容
` printHtml(printData) } },}

到此这篇关于JS利⽤window.print()实现⽹页打印功能的⽂章就介绍到这了,更多相关window.print()⽹页打印内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

因篇幅问题不能全部显示,请点此查看更多更全内容