最近做了个需求需要做的是在使用浏览器打印的时候要加上页码 比如当前第几页、打印的总页数。但是看了网上很多的方法都是采用
@media print {
/* 添加页脚 */
@page
{
/* 在底部居中显示页码 */
@bottom-center {
content: "Page " counter(page) " of " counter(pages);
}
}
}
这个方法,但是经过大量的方法实践之后 浏览器根本不支持此方法
要实现下方这种显示页码的效果
自然的显示又不影响页面展示的效果 费了我九牛二虎之力
最开始的想法是识别高度然后自然根据JS和css配合 显示页面的页数以及总页数 赋值给新建的标签插入到dom中 但是后面发现 计算结果根据内容的增多 而不准确 而且显示的页码标签 会遮挡部分内容 感觉不够美观
经过几天的苦思冥想 找出了 一个解决方案
1:首先在浏览器中打印中调用window.print()方法的话要打开更多设置 勾选出页眉页脚等内容
2: @media print {
@page {
margin-top: 6mm;
}
}
设置css的主要原因是我只需要页码不需要页眉信息所以设置外边距之后 可以隐藏页眉的内容
3.页脚的内容要保存 但是页脚内容左侧会展示当前浏览器的地址链接这时候就要配合JS了,以下代码核心就是不要展示地址 于是新开了个页面将浏览器地址栏赋值为空或者‘·’这样打印的时候就不会出现地址栏地址了,但是于此同事页面的样式没有带过去 所以将原页面的style里的内容和引用的link内容页一并带过去 这样就能保证和原有样式是一样的了
<div style="text-align: center">
<button type="button" id="print-id">打印</button>
</div>
<script>
function printdiv(printpage)
{
var newstr = printpage.innerHTML;
var oldstr = document.body.innerHTML;
document.body.innerHTML = newstr;
var printWindow = window.open('·', '_blank');
var newstr = printpage.innerHTML;
printWindow.document.write('<html><head><title></title>');
var styles = document.head.getElementsByTagName('style');
var links = document.head.getElementsByTagName('link');
// Copy over style elements
for (var i = 0; i < styles.length; i++) {
printWindow.document.write(styles[i].outerHTML);
}
// Copy over link elements (stylesheets)
for (var i = 0; i < links.length; i++) {
printWindow.document.write(links[i].outerHTML);
}
printWindow.document.write('</head><body>');
printWindow.document.write(newstr);
printWindow.document.write('</body></html>');
printWindow.document.close();
printWindow.print();
}
!function () {
$("#print-id").on('click', function () {
var div_print = document.getElementById("print-all");
printdiv(div_print);
});
}();
<script>
结尾 因为当前项目是用的原生js写的所以都在统一一个页面在vue、react当中同理一样是可以使用的 只是写的方法略作修改 思路就上面的思路了 做个记录 当然也有很多优秀的插件可以进行处理但是在这里就没有使用了 因为插件不一定有这个方法好 如果有需要的同学 可以点赞收藏+关注