以防您像我一样,经常对 CSS 媒体查询中的逻辑感到困惑。
如果
这就是媒体查询的含义:逻辑上的 if
语句。“如果”浏览器满足这些条件,则使用其中的 CSS。
/* IF the viewport is 550px or smaller, do this */
@media (max-width: 550px) {
html { background: hsl(0 0% 0% / 0.5); }
}
媒体查询级别 4 允许使用类似这样的比较语法,但浏览器支持目前要低得多。
@media (width <= 30em) {
html { background: rgb(0 0 0 / 0.5); }
}
并且
关键字 and
。
/* IF the viewport is 550px or smaller, do this */
@media (min-width: 600px) and (max-width: 800px) {
html { background: red; }
}
媒体查询级别 4 语法在这里非常出色。
@media (600px <= width <= 800px) {
html { background: red; }
}
或
用逗号分隔。
@media (max-width: 600px), (min-width: 800px) {
html { background: red; }
}
从技术上讲,这些被视为两个独立的媒体查询,但实际上是 or
。
不是
使用关键字 not
反转逻辑。
@media not all and (max-width: 600px) {
html { background: red; }
}
仅仅使用 not (max-width: 600px)
对我来说似乎不起作用,因此上面采用了稍微奇怪的语法。也许有人可以向我解释一下。请注意,not 仅适用于当前媒体查询,因此如果用逗号分隔,它只会影响其所在的媒体查询。另外请注意,not
会反转整个媒体查询的逻辑,而不是其各个部分。not x and y = not (x and y) ≠ (not x) and y。
独占
要确保一次只生效一个媒体查询,请确保数字(或其他任何内容)能够实现这一点。以这种方式,您可能更容易在脑海中管理它们。
@media (max-width: 400px) {
html { background: red; }
}
@media (min-width: 401px) and (max-width: 800px) {
html { background: green; }
}
@media (min-width: 801px) {
html { background: blue; }
}
从逻辑上讲,这有点像 switch
语句,只是没有简单的方法来实现类似于 default
的“如果这些都不匹配,则执行此操作”。
这是未来的 CSS 功能,但@when
语法将有助于改进这一点。
@when media(min-width: 600px) {
/* ... */
}
@else {
/* ... */
}
覆盖
没有任何东西可以阻止多个媒体查询同时为真。在某些情况下,使用它可能比将它们全部设置为独占更有效。
@media (min-width: 400px) {
html { background: red; }
}
@media (min-width: 600px) {
html { background: green; }
}
@media (min-width: 800px) {
html { background: blue; }
}
媒体查询不会为其包含的选择器添加任何特殊性,但源顺序仍然很重要。以上示例将起作用,因为它们的顺序正确。交换该顺序,在浏览器窗口宽度大于 800 像素时,背景将变为红色,这可能违反直觉。
移动优先
您的小型屏幕样式位于常规屏幕 CSS 中,然后随着屏幕变大,您会覆盖需要覆盖的部分。因此,一般来说,使用 min-width
媒体查询。
html { background: red; }
@media (min-width: 600px) {
html { background: green; }
}
桌面优先
您的大型屏幕样式位于常规屏幕 CSS 中,然后随着屏幕变小,您会覆盖需要覆盖的部分。因此,一般来说,使用 max-width
媒体查询。
html { background: red; }
@media (max-width: 600px) {
html { background: green; }
}
变得古怪
您可以根据需要使用它来实现复杂的效果。
@media
only screen and (min-width: 100px),
not all and (min-width: 100px),
not print and (min-height: 100px),
(color),
(min-height: 100px) and (max-height: 1000px),
handheld and (orientation: landscape)
{
html { background: red; }
}
注意:only
关键字的目的是防止不支持媒体查询的浏览器加载样式表或使用样式。我不确定这在过去或现在是否有用。
这太棒了,我也偶尔会对这件事感到困惑!谢谢 :D
一如既往,这是一篇很棒的逐步指南。一篇关于脑洞大开的文章,让我更加了解媒体查询。
not
的用例是什么?用@media not all and (max-width: 600px)
可以实现用@media (min-width: 801px)
无法实现的功能吗?我想,也许在像文章最后示例那样逐条构建复杂查询时,您需要它。但真的需要吗?
逻辑是一个奇怪的东西。有时,用语言明确说明您 **没有** 做什么更有意义。
我还认为,可能有一些布尔关键字需要 not 来表示相反的意思,比如
not (color)
- 但我不太确定。我知道有monochrome
,但我不知道它是否与 color not 完全相反。吉普赛人: “也许有一种方法。您听说过 Deshuba 的僧侣吗?”
弗莱: “我... **没有** 听说过他们...”
[audio src="http://www.gotfuturama.com/Multimedia/EpisodeSounds/3ACV20/24.mp3" /]
精彩的汇总!我之前曾使用特定的高度来测试视网膜图形。
第一个 @media 参数只是高度(而不是 min 或 max),这使得测试变得容易得多。
我的许多响应式设计问题可以通过根据元素容器的宽度/高度而不是视口来改变布局来解决。我希望有一天能实现这一点。
您可能想研究一下比例媒体查询。
您并不孤单,谁在乎视口?!总之,这里有一个开始:http://blog.andyhume.net/responsive-containers/
我一直使用移动优先方法,但我讨厌必须为 IE8 基本上重新创建我的样式表这一事实,因为它会忽略媒体查询。有没有什么技巧可以改善工作流程?
实际上可以,反过来做。在您的主要工作流程中,假设您正在为不支持媒体查询的网站(例如:桌面、IE8)进行设计,然后仅在需要时使用媒体查询,并将它们放在样式表底部。它不完全是移动优先设计,但我发现它非常易于使用,因为我只需要修改特定设备、宽度等的需要更改的内容。至少,它可以阻止您在每个媒体查询中复制所有代码,因为假设最糟糕的情况(IE7、IE8),然后应用逐步改进,调整以适应。
@Stephen 当然,移动优先方法更多地是关于您创建媒体查询的顺序(较小的视口 -> 较大的视口),而不是查询在文档中的实际位置?
每当我要做响应式工作时,我总是把所有东西放在样式表底部的同一个锁中,而不是将每个元素放在与相关选择器等相邻的位置。
我在 HTML 元素上使用条件注释,然后使用 LESS 来包含所有我的媒体查询,然后也将其提供给 IE7 和 IE8。
这样我只需要编写一次媒体查询,而 IE 仍然可以获得良好的桌面体验。
我想,为 IE 单独创建一个样式表,然后有条件地将其包含进来以避免在主 CSS 文件中重复,这可能更高效,但这只是理论上的想法。
请查看 CSS 媒体查询实时演示和速查表。
希望对开发人员和设计师有所帮助。
https://github.com/AndreLion/mediaquery
很棒的文章!我真的很想学习一些关于支持大多数移动设备的常用 CSS 媒体查询的教程,包括小型/大型智能手机、平板电脑、不同的视口方向等等……我不想要支持 *每个* 设备的视口,而是最常见的那些……有什么建议吗?
Chris,很棒的文章,简单直白!
非常感谢,尤其是对 "not" 的讲解。
感谢您在媒体查询混乱中提供这种简洁明了的解释。排他性和覆盖性的例子正中下怀!
再一次,您证明了为什么开发者在 CSS 方面会蜂拥而至。您将事情简化得非常好。
我很想知道打印机如何响应媒体查询。打印机的 "min-width" 是什么?!
您好,
我正在使用媒体查询来创建响应式网站。我从桌面到更小的设备使用自上而下的方法,但在 Android 设备上进行测试时真的令人头疼。例如,分辨率为 800×480 的 Android 设备会与分辨率为 768×1024 的 iPad 产生冲突。
我尝试过对两者都使用 "min-device-width" 到 "max-device width",但结果也一样。
这种情况下有什么解决方案吗?请帮忙……。
一般来说,解决方案是移动优先样式。通过使用移动优先的方式,您会更关注内容,并随着功能(和大小)的增加添加样式,而不是当视口过小时尝试去除某些东西。
比例媒体查询 也有助于解决问题,因为它们不再关心像素尺寸(这有助于解决 Kindle Fire 或投影仪等边缘情况)。
嗨,Vipul,
你能指导我如何更改样式表以合并响应式网页设计的媒体查询更改吗?
任何帮助都将不胜感激。
您好,Sach,
试试这样,
感谢您的解释,我现在终于明白了。
这里有两个可能非常有用的链接。
http://www.mobitest.me/ 介绍了支持的屏幕和功能。
http://www.mobitest.me/devices/ 列出了常见的移动设备值。
您的链接无法使用。
我想这都取决于项目的限制,以及您所介绍的哪种方法最有效率、代码效率最高。
@media not, (max-width: 600px) {
html { background: red; }
}
添加逗号似乎在我的 "not" 媒体查询中有效。
@media (min-width: 801px) and (max-width: 1365px){
/* 样式在此处 */
}
我正在使用这个媒体查询。它没有达到 "max-width:1365px",只工作到 "1224px"。
请帮忙!!!
您确定没有被其他查询覆盖吗?
一个小建议,大家在使用在线 CSS 压缩器时要小心,因为有些压缩器会破坏 @media 代码 :)
是的,我确定它没有被其他媒体查询覆盖。
如何在媒体查询中使用 "max" 或 "min-height",请举个例子,以及 "@media(max-width:etc)"
和 "@media screen and(max-width:etc)"
以及 "@media all" ?
我正在使用媒体查询来创建响应式网站,我们通常会使用这样的媒体查询
@media (min-width: 1024px) and (max-width: 1280px){
/* 样式在此处 */
}
这很好……。
我的问题是,如果要通过媒体查询控制高度,该怎么办?
众所周知,一些用户使用 1280-768 的分辨率,一些使用 1280-960/1024 的分辨率,还有一些使用更高的分辨率。我们开发人员在这种情况下陷入了困境。我需要帮助,希望从大家那里得到解决方案……。
您好,我正在为视网膜和 "mon-width" 堆叠一些媒体查询,如下所示。
我的问题是最后一个媒体查询覆盖了所有内容。我无法弄清楚为什么。我以为它的前一个查询应该在宽度匹配的情况下覆盖它。
有人知道为什么吗?
干杯
我还没有尝试过,但是您不能以 "not" 开头。据我所知,"not" 逻辑是用来从初始组中减去元素。因此,您应该从剩余部分开始,然后添加 "not" 减法。您的技巧可能有效,因为您正在强制定义整个组(除了 "not" 的位置),以便有东西可以从中减去。
我只是想要……。
:-)
我不明白它们是如何相互覆盖的,有人能解释一下吗?
最好的祝福,
Karl
以上 3 种样式都在我的网站中,如何只让其中 2 种用于桌面加载?
同样,在移动设备中,我需要调用一种样式。
来自 Arkadiusz Czekajski 的电子邮件