如何在打印时通过媒体查询,根据动态设定的方向来调整CSS?

前端开发 2026-07-12

我在页面为横向(landscape)时,尝试在某个元素之后通过媒体查询添加分页符:

@media print and (orientation: landscape) {
  .item2 {
    break-after: page;
  }
}

当在打印对话框中选择方向时,这样做可以正常工作。

然而,当页面尺寸通过css提供时,分页符就不会出现:

@page {
  size: a4 landscape;
}

示例:

body {  
  print-color-adjust: exact;
}

.item1,
.item2,
.item3 {
  width: 100%;
  height: 200px;
}

.item1, .item3 {  
  background-color: gray;
}
.item2 {  
  background-color: red;
}

@page {
  /* remove this line to see it work */
  size: a4 landscape;
}

@media print and (orientation: landscape) {
  .item2 {
    break-after: page;
  }
}
<!doctype html>
<html>
  <head>
    <link rel="stylesheet" href="styles.css">
  </head>
  <body>
    <div class="item1"></div>
    <div class="item2"></div>
    <div class="item3"></div>
  </body>
</html>

在Chrome和 Firefox中测试过。
这是一个bug吗,还是我做错了什么?

编辑:
我想在打开打印对话框之前动态设置 @page 规则,因为我需要根据方向通过JS更新某些SVG。

解决方案

这是不可能的,因为 规范 清楚地指出:

媒体查询不遵循size:它们假设如果没有 @page 规则时会选择的纸张大小。

有趣的事实:

  • Edge违背规范,因此它能够工作,甚至通过下面的操作让它进入无限循环:

```css @page { size: a4 landscape; }

@media print and (orientation: landscape) { @page { size: a4 portrait; } } ``` * Firefox也违反了规范,在你改变如打印页数或颜色模式等设置时,会对媒体查询环境进行一次更新。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章