最近接到了一个PC打印需求,实现网页特定内容打印功能。据我所知,打印是直接调用 window.print()
就能唤起浏览器打印功能的。MDN上的描述及其简洁:调用打印,不能传参,不属于任何标准。也就是说,网页是啥样,打印估计就是傻样。一番调研,找到了几种解决办法列举如下。
CSS Media print
对于定制性不高,结构较为简单的页面来说,使用CSS的Media type属性较为合适。
腾讯CDC有一篇 《Print —— 被埋没的Media Type》对 @media print
的用法讲述的十分清晰,可前往查阅,本文不再赘述。
简单来说,我们可以在 @media print
中书写打印所需的样式,无关内容可以直接 display: none
掉。示例如下:
<!-- css -->
@media print {
<!-- code your style -->
}
我们还可以外链一个单独的样式文件来存储打印样式,如下:
<link rel="stylesheet" href="print.css" media="print"/>
补充说明:样式归样式,打印还得靠 widnow.print()
。
Iframe
如果定制化较高,基于当前页面改动太大的话,使用@media print
就不太合适了。这时我们可以使用嵌套 iframe 的方法来实现另类的打印。
我们可以动态创建 iframe 元素,将想要打印的内容及样式注入其中,再将iframe元素隐藏到当前页面,然后等iframe里的内容加载完后,直接调用 iframe.contentWindow.document.print()
即可。
说起来简单,实际操作还是挺复杂的,好在github上已经有做好的轮子了 —— Print.js。 不过,个人觉得它支持的格式虽多,但有一些局限性,所以我fork做了一些简单的修改,即html-print,目前主要用于打印html内容。
话说Print.js
的源码清晰明了,如果直接用不方便的话,可以fork定制自己的内容。
结语
以上是纯粹的网页开发者可以做的那些事儿,更强大省事儿的解决方法是用插件,前提是你的内容值得用户默默的装!