浏览器默认禁用打印背景色以省墨保可读,需在@media print中用!important显式覆盖,如.alert-danger{background-color:#dc3545!important}。

打印时背景色消失,不是你代码写错了,是浏览器和 CSS 框架(比如 Bootstrap)主动“抹掉”的——这是默认行为,而且有明确目的:省墨、保可读、跨浏览器一致。
为什么打印时 background-color 会自动变透明
主流浏览器(Chrome、Firefox、Edge)默认禁用背景色打印,除非用户手动在打印对话框里勾选“背景图形”。这个开关藏得深,多数人根本不会点。CSS 框架如 Bootstrap 更进一步,在 @media print 里直接写死:background: transparent !important,连用户开关都绕过去了。
这么做的核心原因有两个:
- 避免在白色纸张上打印白色文字(比如黑底白字页面),结果印出来一片空白
- 节省彩色墨水/碳粉——黑色文字 + 白色纸 = 最经济、最可靠
想保留特定元素的背景色,必须显式覆盖 @media print
不能指望删掉 Bootstrap 的打印样式(CDN 不允许),也不能靠 background: inherit 或 initial 撤销——CSS 没有“取消声明”这回事,只有“覆盖”。唯一可行路径是用更高优先级的 @media print 规则,单独给要留色的类加背景。
例如你想让 .alert-danger 打印时仍是红底白字:
@media print {
.alert-danger {
background-color: #dc3545 !important;
color: #fff !important;
}
}
注意几点:
- 必须加
!important,否则 Bootstrap 的background: transparent !important仍会赢 - 只覆盖真正需要的颜色元素,别全量覆盖
*,否则可能破坏其他打印优化(如阴影、边框) - 如果用了主题 CSS(如 united.css),它也可能带自己的
@media print,你的规则得放在它后面加载
表格单元格背景色清不干净?问题出在内联样式优先级
如果你用 JS 动态设置了 cell.style.background = "#f00",再试图用 table.style.backgroundColor = "#fff" 清除,是无效的。因为内联样式(style="...")优先级永远高于父级 CSS 或 JS 设置的容器样式。
要真正清除,必须操作到每个单元格本身:
- 遍历所有
<td> 和 <code><th>,执行 <code>cell.style.background = ""或cell.style.backgroundColor = "" - 或者统一用 class 控制(如
.has-bg),打印时用@media print { .has-bg { background: none !important; } } - 避免混合使用内联样式和 CSS 类,否则清理逻辑会不可控
最常被忽略的一点:你以为改了 CSS 就行,但实际生效依赖于加载顺序和 specificity。哪怕只差一个 !important,或规则写在了 Bootstrap CSS 前面,背景色照样不会出现。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











