先记住这个答案
screen 和 print 回答“输出到哪里”,width、hover 等特性回答“当前环境满足什么条件”。在 @media screen and (min-width: 800px) 中,两者都满足才会启用规则;只写宽度特性时,不要忘记打印环境也可能匹配。选择是否限定媒体类型,要看这套样式是否应出现在纸面等其他介质。
screen、print是媒体类型width、hover是媒体特性- 类型和特性可用
and组合 - 打印不等于一个窄屏断点
订单页分别处理屏幕与打印
电商页面在屏幕上用三列商品卡,打印订单时要隐藏导航、保留明细。三列布局可以写 @media (min-width: 800px),让规则按视口宽度触发;打印样式单独用 @media print。不要认为 print 只是“另一种屏幕宽度”:打印还有分页、背景色和链接地址等独立需求。把类型与特性分清,可以避免把手机、桌面和打印混为一类。
@media screen and (min-width: 800px) {
.catalog { grid-template-columns: repeat(3, 1fr); }
}
@media print {
.site-nav { display: none; } /* 仅打印输出隐藏 */
.order { color: black; }
}媒体查询先判断整条条件是否匹配,匹配的规则才进入 CSS 级联。
类型限定介质,特性限定条件
类型可以省略;省略时不会自动只限定 screen。特性需要括号包裹,多个条件用 and 串联;逗号则给出备选查询。不同输出介质可以具有相同宽度,所以仅按宽度不能可靠识别“正在打印”。现代布局还有容器查询,它看组件容器而非输出介质或视口,适用于组件局部尺寸变化。
打印一份订单时,宽纸也可能满足 (min-width: 800px)。若宽屏规则无条件让内容变成双栏,纸面可能出现不必要的窄列。可为打印单独写 @media print 覆盖,或让原宽屏规则限定 screen;选哪种取决于默认样式更适合哪种介质。调试时切换打印预览,不要只拖动桌面窗口。
all 表示所有媒体类型,也是许多规则省略媒体类型时的默认语义。它并不表示“特性条件一律为真”;例如只写 (hover: hover) 仍要在当前设备具备悬停能力时才匹配。开发者常把“屏幕设备”与“可悬停输入”当成同一件事,但触屏电脑和触屏手机说明它们是不同维度,交互规则应按能力而非设备名写。
容易答错的地方
- 说
screen就等于桌面电脑 - 手机和平板浏览器通常也是屏幕介质;设备类别要看尺寸和能力等条件。
- 把
print当作一个小屏断点 - 打印涉及纸张和分页等输出特性,不能只靠视口宽度代替。
面试官还会怎么问?
@media (min-width: 800px) 会在打印时匹配吗?
它未限定 screen;若打印环境的查询宽度满足条件,也可能匹配。打印专属规则应用 print 明确限定。
all 有什么用?
它表示所有媒体类型,很多时候省略类型就能达到相同目的。
hover 是媒体类型吗?
不是,它是媒体特性,用来查询主要输入机制是否能方便地悬停。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。