CSS @media print媒体查询特性

目录

核心用途

基本语法

常用打印样式优化

1. 隐藏不需要打印的元素

2. 调整字体和颜色

3. 控制分页

4. 显示链接的 URL

5. 优化表格和图片

打印相关属性

示例:完整的打印样式表

注意事项

总结

@media print设置页面边距

1.设置页面边距

2.设置页眉和页脚

3.使用 CSS 计数器实现页码

4.高级技巧:从元素内容生成页眉

5.完整示例

6.注意事项

7.替代方案(针对不支持的浏览器)


@media print 是 CSS 中的一个媒体查询特性,用于定义当文档被打印或预览打印效果时应用的样式。通过它,你可以优化打印内容的布局、排版和显示效果,提升纸质文档的可读性和专业性。

核心用途

  1. 隐藏非必要元素:如导航栏、广告、动态效果等。

  2. 调整排版:优化字体、间距、分页符等。

  3. 显示打印专用内容:如 URL、页码、版权信息。

  4. 节省墨水:避免大面积深色背景,改用黑白显示。

基本语法

 /* 方法一:内联媒体查询 */
 @media print {
   /* 打印时应用的样式 */
   body {
     font-size: 12pt;
   }
   .no-print {
     display: none;
   }
 }
 ​
 /* 方法二:外部打印样式表 */
 <link rel="stylesheet" href="print.css" media="print">

常用打印样式优化

1. 隐藏不需要打印的元素
@media print {
   nav, footer, .sidebar, .ad-banner {
     display: none !important;
   }
 }
2. 调整字体和颜色
 @media print {
   body {
     font-family: Georgia, "Times New Roman", serif; /* 衬线字体更适合阅读 */
     color: #000;
     background: transparent;
   }
   a {
     color: #000;
     text-decoration: underline;
   }
 }
3. 控制分页
 @media print {
   .page-break {
     page-break-before: always; /* 强制分页 */
   }
   h1, h2, h3 {
     page-break-after: avoid; /* 避免标题与内容分开 */
   }
   table, img {
     page-break-inside: avoid; /* 避免元素跨页 */
   }
 }
4. 显示链接的 URL
@media print {
   a[href]:after {
     content: " (" attr(href) ")"; /* 在链接后显示URL */
   }
   a[href^="#"]:after {
     content: ""; /* 跳过内部锚点链接 */
   }
 }
5. 优化表格和图片
 @media print {
   table {
     border-collapse: collapse;
   }
   img {
     max-width: 100% !important; /* 确保图片不溢出页面 */
   }
 }

打印相关属性

属性描述
page-break-before在元素前强制分页(值:alwaysavoidleftright)。
page-break-after在元素后强制分页。
page-break-inside避免元素内部被分页(值:avoid)。
orphans控制页面底部的最小行数(如 orphans: 3)。
widows控制页面顶部的最小行数。
print-color-adjust控制是否保留颜色(值:economyexact)。

示例:完整的打印样式表

 @media print {
   /* 重置样式 */
   * {
     background: transparent !important;
     color: #000 !important;
     box-shadow: none !important;
     text-shadow: none !important;
   }
 ​
   /* 隐藏导航和广告 */
   header, nav, footer, .sidebar, .ad {
     display: none;
   }
 ​
   /* 优化字体 */
   body {
     font-family: "Times New Roman", serif;
     font-size: 12pt;
     line-height: 1.5;
     width: 100%;
     margin: 0;
     padding: 0;
   }
 ​
   /* 显示链接URL */
   a {
     text-decoration: underline;
   }
   a[href]:after {
     content: " (" attr(href) ")";
   }
 ​
   /* 调整标题 */
   h1, h2, h3 {
     page-break-after: avoid;
   }
   h1 {
     font-size: 24pt;
   }
   h2 {
     font-size: 18pt;
   }
 ​
   /* 优化表格和图片 */
   table {
     width: 100%;
     border: 1px solid #000;
   }
   th, td {
     border: 1px solid #000;
     padding: 4px;
   }
   img {
     max-width: 100%;
     height: auto;
   }
 ​
   /* 强制分页 */
   .page-break {
     page-break-before: always;
   }
 ​
   /* 添加打印页脚 */
   @page {
     margin: 2cm;
   }
   @page :footer {
     content: "© 2025 公司名称 | 第 " counter(page) " 页,共 " counter(pages) " 页";
   }
 }

注意事项

  1. 测试打印效果 使用浏览器的打印预览功能(如 Ctrl+P 或 Command+P)测试样式,不同浏览器的打印表现可能略有差异。

  2. 慎用 !important 尽量通过提高选择器优先级来覆盖样式,避免使用 !important

  3. 颜色与背景 默认情况下,浏览器可能不打印背景色和图像,用户需手动勾选 “打印背景颜色和图像” 选项。可通过 print-color-adjust: exact 尝试强制打印。

  4. 分页控制 page-break-* 属性是建议性的,浏览器可能不完全遵守,尤其是复杂布局。

  5. 性能考虑 复杂的打印样式可能增加渲染时间,尽量保持简洁。

总结

@media print 是提升用户打印体验的重要工具,通过针对性的样式优化,可以:

  • 减少打印内容的冗余信息

  • 提高纸质文档的可读性

  • 节省打印成本(如减少彩色墨水使用)

@media print设置页面边距

@media print 中设置页面边距、页眉和页脚需要结合 @page 规则和 CSS 计数器功能。以下是详细的实现方法:

1.设置页面边距

使用 @page 规则的 margin 属性定义打印区域的边距:

@media print {
   @page {
     margin: 2cm; /* 全边距 2 厘米 */
   }
   
   /* 或单独设置各边 */
   @page {
     margin-top: 1.5cm;
     margin-bottom: 2cm;
     margin-left: 2cm;
     margin-right: 2cm;
   }
 }

支持的单位mmcmin(英寸)、pt(点,1pt=1/72 英寸)。

2.设置页眉和页脚

通过 @page@top-left@top-center@top-right@bottom-left 等区域,可以定义静态页眉页脚:

@media print {
   @page {
     margin-top: 3cm; /* 为页眉留出空间 */
     margin-bottom: 3cm; /* 为页脚留出空间 */
     
     /* 页眉 */
     @top-center {
       content: "公司名称 | 机密文档";
       font-size: 10pt;
       color: #555;
     }
     
     /* 页脚 */
     @bottom-center {
       content: "第 " counter(page) " 页,共 " counter(pages) " 页";
       font-size: 9pt;
     }
   }
 }
3.使用 CSS 计数器实现页码

通过 counter() 函数自动生成页码:

 @media print {
   @page {
     @bottom-right {
       content: "Page " counter(page); /* 简单页码 */
     }
   }
   
   /* 重置页面计数器 */
   body {
     counter-reset: page;
   }
   
   /* 自定义页码格式 */
   @page :left {
     @bottom-left {
       content: "文档标题 | " counter(page);
     }
   }
   
   @page :right {
     @bottom-right {
       content: counter(page) " | 修订版 A";
     }
   }
 }
4.高级技巧:从元素内容生成页眉

如果需要从页面元素(如 <h1>)提取内容作为页眉,可以使用 element() 函数(需浏览器支持):

/* 标记用于页眉的元素 */
 .header-content {
   display: none;
 }
 ​
 @media print {
   @page {
     @top-center {
       content: element(header); /* 使用 element() 引用内容 */
     }
   }
   
   /* 将页面中的 h1 内容作为页眉 */
   h1 {
     float: running(header);
   }
 }
5.完整示例

以下是一个包含边距、页眉、页脚和页码的完整打印样式:

@media print {
   /* 设置边距 */
   @page {
     margin: 2.5cm 2cm; /* 上下 2.5cm,左右 2cm */
     
     /* 页眉:左侧显示文档标题,右侧显示日期 */
     @top-left {
       content: "2025 年度财务报告";
       font-weight: bold;
     }
     @top-right {
       content: "打印日期: " attr(data-date);
       font-size: 9pt;
     }
     
     /* 页脚:左侧显示公司信息,右侧显示页码 */
     @bottom-left {
       content: "© 2025 公司名称 | 机密";
       font-size: 9pt;
     }
     @bottom-right {
       content: "第 " counter(page) " 页,共 " counter(pages) " 页";
     }
   }
   
   /* 隐藏非打印元素 */
   nav, footer, .sidebar {
     display: none;
   }
   
   /* 优化内容区域 */
   body {
     font-family: Georgia, serif;
     font-size: 12pt;
   }
   
   /* 强制章节标题不与内容分开 */
   h2, h3 {
     page-break-after: avoid;
   }
   
   /* 表格不跨页 */
   table {
     page-break-inside: avoid;
   }
 }
6.注意事项
  1. 浏览器兼容性

    • @page 规则在现代浏览器中基本支持,但对 @top-*@bottom-* 的支持有限(如 Firefox 不支持)。

    • element() 函数目前仅 Safari 支持。

  2. 内容限制

    • 页眉页脚中不能使用复杂元素(如图片、链接),只能包含文本和计数器。

    • 避免在页眉页脚中使用绝对定位或浮动元素。

  3. 边距与内容冲突 确保 margin 值足够大,避免页眉页脚与正文内容重叠。

  4. 测试方法 使用浏览器的打印预览功能(Ctrl+P 或 Command+P)检查效果,不同浏览器的渲染可能略有差异。

7.替代方案(针对不支持的浏览器)

对于不支持 @page 区域的浏览器,可以通过在页面中添加占位元素并在打印时显示:

html

预览

<style>
   .print-header, .print-footer {
     display: none;
   }
   
   @media print {
     .print-header {
       display: block;
       position: fixed;
       top: 0;
       width: 100%;
       border-bottom: 1px solid #ccc;
     }
     
     .print-footer {
       display: block;
       position: fixed;
       bottom: 0;
       width: 100%;
       border-top: 1px solid #ccc;
     }
     
     /* 调整正文位置避免重叠 */
     body {
       padding-top: 3cm;
       padding-bottom: 3cm;
     }
   }
 </style>
 ​
 <body>
   <div class="print-header">公司名称 | 文档标题</div>
   
   <!-- 主要内容 -->
   
   <div class="print-footer">
     <span class="page-number"></span>
   </div>
   
   <script>
     // 使用 JavaScript 填充页码
     window.onload = function() {
       if (window.matchMedia('print').matches) {
         document.querySelectorAll('.page-number').forEach(el => {
           el.textContent = `第 ${window.pageNum} 页,共 ${window.totalPages} 页`;
         });
       }
     };
   </script>
 </body>

这种方法的缺点是无法精确控制分页,需要结合 page-break-* 属性手动调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值