【发布时间】:2017-05-17 21:32:15
【问题描述】:
不能说这是一个真正的问题还是我只是偏执,但媒体查询的这种行为真的让我在过去的几个小时里发疯了。
让我们考虑一下这个非常简单的 CSS。
body {background:yellow}
@media (max-width:399px) {
body {background:red}
}
@media (min-width:400px) {
body {background:blue}
}
当宽度为 399.333px 时会出现问题!(或任何介于 399 和 400 整数之间的浮点值)
我的逻辑是,使用这种 CSS 样式页面永远不会变黄,对吧?当视口大小小于 400px 宽度时它应该是红色的,当它大于 400px 时它应该是蓝色的。
当页面放大时,Windows 上的 Opera 浏览器(我目前使用的是 36.0)会发生奇怪的行为。我知道视口宽度是使用实际视口宽度和当前缩放级别计算的,此值应始终为整数。但是……
看起来 Opera 不会对影响整个页面的值进行舍入/下限/上限。当 Opera 发现 viewport-width 不是 399px 或 400px 但 它是 399.333px 时,我得到黄色背景!?所以没有一个媒体查询满足条件。
我已经尝试在这里和网络范围内找到答案,但没有什么能解决这个问题。当我使用em 单位时,这个问题已经发生在我身上,所以我可以解决并将它们转换为像素,但我不能影响用户对使用浏览器缩放功能的决定。
我能做些什么来防止这种情况发生吗?
模拟这种行为的最简单方法是点击CTRL,+ 三次,而不是在对象检查器中轻松移动垂直滑块。
更新:
是的,我可以通过将每个媒体断点链接到前一个断点来使用“移动/桌面优先”的方法来修复它,但这不是我的问题的一部分。此外,默认的body 样式在这里仅作为视觉辅助,更改并不能真正解决问题。
【问题讨论】:
-
确保不会出现这种情况的一种方法是简单地设计移动优先(首先声明小屏幕的样式,然后在下面将更宽屏幕的样式放在一系列递增的@ 987654325@ 查询)或桌面优先(反之:从最宽屏幕的样式开始,然后在其下方一系列递减的
@media (max-width...查询)。 -
这个问题有实际应用吗?您可以删除
background:yellow,并将background:red置于其媒体查询之外。 -
@MrLister 是的,我正在使用这种方法,但是对于每个断点都有很多 css 需要以这种方式重写,所以我的想法是在范围级别上编写整个 css 以改进表演。这当然是 B 计划。为什么 Opera 不舍入这个值真的让我很生气。
-
移动/桌面优先是当前开发实践中的最佳实践。这是避免此问题的唯一方法。
-
@zsawaf 请您用一些相关来源备份您的声明。我只需要 100% 确定这一点,并且在 Opera 的文档中找不到任何内容。也许我错过了什么。
标签: css media-queries zooming