CSS打印设置页眉页脚

之前写过一篇文章CSS实现自动分页打印同时每页保留重复的自定义内容,可以实现window.print()打印时多张页面保留相同的内容(如header、footer),但其并不是真正意义上的页眉页脚,footer内容在最后一张页面未撑满时不能置于页面底部。为了实现打印使用CSS自定义页眉页脚,解决之前遗留的问题,本文对之前的办法做了改进,提出了一种解决方案。

效果图

在这里插入图片描述

在这里插入图片描述

基本原理

  1. 在要打印的内容中,页眉页脚元素使用position: fixed,并设定各自的高度。
  2. 正文内容使用table元素,table的开头(thead)和结尾(tfoot)各使用一个设定高度(大于等于页眉页脚高度)的空DOM元素,防止页眉页脚与正文内容重叠。

此时即可实现自定义页眉页脚,调用window.print()时多张页面具有相同的页眉页脚,且页眉页脚可自定义内容,包括插入logo等图片。

示例代码

只打印指定dom内容,要打印的内容在#printDom中,页面在非打印模式不会显示其内容,只有在点击打印按钮调用window.print()时才会显示打印内容。

下方两个示例代码一样,根据个人阅读方式喜好查看。

示例代码-github:github

示例代码:

<html>
  <head>
    <title>print demo</title>
    <meta name="description" content="CSS打印,支持自定义页眉页脚" />
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
    <meta
      name="viewport"
      id="WebViewport"
      content="initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"
    />
    <style>
      @media print {
        @page {
          size: A4 portrait;
          /* 调整页边距 */
          margin: 1cm 1cm 1cm;
        }

        #printDom {
          display: block !important;
        }
      }

      #printDom {
        /* 打印区域在非打印时不显示 */
        display: none;
        position: relative;
        font-size: 16px;
        font-family: SimSun, Songti SC;
      }

      #printDom .page-header {
        /* 页眉高度 */
        height: 2cm;
        display: flex;
        align-items: center;
        position: fixed;
        top: 0mm;
        width: 100%;
        border-bottom: 1px solid #ddd;
        z-index: 2000;
      }

      #printDom .page-header-space {
        /* 控制内容区距离顶部的距离,防止与页眉重叠 */
        height: 2cm;
      }

      #printDom .page-footer {
        /* 页脚高度 */
        height: 1cm;
        position: fixed;
        bottom: 0;
        width: 100%;
        border-top: 1px solid grey;
        z-index: 2000;
      }

      #printDom .page-footer-space {
        /* 控制内容区距离底部的距离,防止与页脚重叠 */
        height: 1.5cm;
      }

      #printDom > table {
        width: 100%;
      }
      
      #printDom .content table {
        width: 100%;
        font-size: 30px;
      }

      #printDom .content .header {
        text-align: center;
      }
    </style>
  </head>
  <body>
    <button onclick="handlePrint()">打 印</button>
    <div id="printDom">
      <!-- 页眉 -->
      <div class="page-header">Logo</div>
      <table>
        <!-- 占位,给页眉留出位置 -->
        <thead>
          <tr>
            <td><div class="page-header-space"></div></td>
          </tr>
        </thead>
        <!-- start: 正文 -->
        <tbody>
          <tr>
            <td>
              <div class="content">
                <!-- 正文的标题 -->
                <h1 class="header">H1</h1>
                <div>
                  <!-- 正文内容,可随意写,demo是表格 -->
                  <table>
                    <thead>
                      <tr>
                        <td>Index</td>
                        <td>Name</td>
                      </tr>
                    </thead>
                    <tbody id="tableBody">
                    </tbody>
                    <tfoot></tfoot>
                  </table>
                </div>
              </div>
            </td>
          </tr>
        </tbody>
        <!-- end: 正文 -->
        <!-- 占位,给页脚留出位置 -->
        <tfoot>
          <tr>
            <td><div class="page-footer-space"></div></td>
          </tr>
        </tfoot>
      </table>
      <!-- 页脚 -->
      <div class="page-footer">Footer</div>
    </div>

    <script>
      /**
       * 打印指定元素
       * @param {string} element 需要打印的元素选择器
       */
      function printElement(element) {
        var printContents = document.querySelector(element).cloneNode(true);
        
        var popupWin = window.open('', '_blank');
        popupWin.document.open();
        
        const styles = document.head.innerHTML;
        popupWin.document.write(`<html><head><title>Print Title</title>${styles}</head><body οnlοad="window.print(); window.close();">`);
        popupWin.document.body.appendChild(printContents);
        popupWin.document.write('</body></html>');
        
        popupWin.document.close();
      }

      function handlePrint() {
        printElement('#printDom');
      }

      const tempTableData = document.querySelector('#tableBody');
      const tempFragument = document.createDocumentFragment();

      // mock data
      for (let i = 0; i < 30; i++) {
        const _tr = document.createElement('tr');
        const _td1 = document.createElement('td');
        _td1.appendChild(document.createTextNode(`No${i + 1}`));
        const _td2 = document.createElement('td');
        _td2.appendChild(document.createTextNode(new Date().getTime()));
        _tr.appendChild(_td1);
        _tr.appendChild(_td2);
        tempFragument.appendChild(_tr);
      }

      tempTableData.appendChild(tempFragument);
    </script>
  </body>
</html>

<think>好的,用户现在问的是关于CSS打印边距样本的内容。我需要先回顾之前的对话历史,看看用户之前问了什么。之前用户问的是如何创建和修改CSS文件,现在他们可能想进一步了解如何控制打印时的页面样式,特别是边距。 首先,我需要确定用户的需求。他们可能是在开发一个需要打印友好格式的网页,比如报告、发票或者简历。打印边距的问题在网页开发中比较常见,因为屏幕显示和打印输出的样式可能不同,尤其是边距设置会影响打印后的布局。 接下来,我需要考虑用户可能的背景。他们可能是零基础或者有一定基础的开发者,但之前的问题是关于创建CSS文件,所以可能需要从基础开始解释。需要确保解释清晰,步骤详细,并提供示例代码。 然后,要回答如何设置打印边距,需要涵盖以下几个方面: 1. 使用@page规则来设置打印页面的边距。 2. 如何为不同页面设置不同的边距(比如首页与其他页)。 3. 使用相对单位(如cm、mm)还是绝对单位(如px),并解释为什么在打印中使用物理单位更合适。 4. 提供具体的示例代码,并说明如何将这些代码添加到CSS文件中。 5. 可能还需要提到如何排除页眉页脚的影响,比如使用margin: 0,并配合padding来调整内容区域。 此外,用户可能遇到的问题包括边距设置不生效,这时候需要检查是否正确使用了@page规则,或者是否有其他CSS规则覆盖了设置。还要提醒用户测试打印预览,并清除浏览器缓存。 另外,用户可能希望了解如何适配不同纸张尺寸,比如A4,所以需要给出设置size属性的例子。同时,可能需要注意浏览器兼容性,但大多数现代浏览器支持@page规则的基本用法,所以可以简要提到这一点。 最后,要确保回答结构清晰,分步骤说明,并提供常见问题解决方案,帮助用户逐步解决问题。可能还需要给出最佳实践建议,比如使用物理单位、首屏特殊处理等,以及如何通过开发者工具调试打印样式。</think>以下是针对CSS打印边距设置的详细指南,包含实用代码模板和调试方法: --- ### **一、基础打印边距设置** #### **全局页面边距** ```css @page { margin: 2cm; /* 四边统一边距 */ } ``` #### **分方向控制** ```css @page { margin-top: 1.5cm; margin-right: 2cm; margin-bottom: 3cm; margin-left: 2cm; } ``` --- ### **二、进阶应用场景** #### **1. 首页特殊边距** ```css @page :first { /* 仅作用于第一页 */ margin-top: 5cm; /* 适合封面页设计 */ } ``` #### **2. 左右页对称边距** ```css @page :left { /* 左侧页 */ margin-left: 3cm; margin-right: 1.5cm; } @page :right { /* 右侧页 */ margin-left: 1.5cm; margin-right: 3cm; } ``` #### **3. 去除页眉页脚占用** ```css @page { margin: 0; /* 彻底清空默认边距 */ padding: 2cm; /* 改用内边距控制 */ size: A4 portrait; /* 明确纸张规格 */ } ``` --- ### **三、单位选择建议** | 单位类型 | 适用场景 | 示例 | |---------|--------|-----| | `cm/mm` | 物理打印 | `margin: 2cm` | | `in` | 英美标准 | `margin: 1in` | | `pt` | 精确排版 | `margin: 72pt`(1英寸) | | `%` | 相对比例 | `margin: 10%`(不推荐) | --- ### **四、适配不同纸张尺寸** ```css /* A4纵向标准 */ @page { size: A4 portrait; margin: 2.54cm; /* 1英寸换算值 */ } /* 美国信纸横向 */ @page { size: letter landscape; margin: 1in; } ``` --- ### **五、调试技巧** 1. **浏览器模拟测试**: - Chrome:按`Ctrl+P` → 选择**目标打印机**为**另存为PDF** - Firefox:右键页面 → **查看打印预览** 2. **实时调试工具**: - Edge/Chrome:按`F12` → 打开控制台 → 进入**Rendering**标签 - 勾选`Emulate print media` 3. **强制生效代码**: ```css @media print { @page { margin: 2cm !important; } } ``` --- ### **六、常见问题解决** 1. **边距设置无效**: - 确认CSS文件已通过`<link rel="stylesheet" media="print" href="print.css">`关联 - 检查是否被其他`@media screen`样式覆盖 2. **内容溢出边界**: ```css @page { margin: 2cm; padding: 1cm; /* 创建安全区域 */ } body { max-width: calc(100% - 2cm); /* 动态适配 */ } ``` 3. **页眉页码干扰**: ```css @page { marks: none; /* 禁用裁剪标记 */ } ``` --- ### **七、最佳实践建议** 1. **安全边距参考值**: - **最小可打印边距**:多数打印机需至少`0.5cm` - **推荐安全边距**:常规文档建议`1.5cm-2.5cm` 2. **多版本配置方案**: ```css /* 基础版 */ @page { margin: 1.5cm; } /* 紧凑版 */ @media print and (width: 21cm) { @page { margin: 1cm; } } /* 演示版 */ @media print and (width: 29.7cm) { @page { margin: 3cm; } } ``` 3. **PDF优化技巧**: ```css @page { prince-shrink-to-fit: auto; /* PDF自适应 */ bleed: 3mm; /* 出血区域 */ } ``` --- 通过以上设置,您可以精确控制打印输出的版面效果。实际应用中建议先用普通A4纸进行测试打印,确认无误后再使用正式纸张输出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值